- cache.bundle = stderr
- resolve(fs.appendFileAsync('output/bundle.js', `module.exports = ${options.bundleNamespace}`))
- })
- }))
-}
-
-// map of PS module names to their source path
-function psModuleMap(globs, cache) {
- if (cache.psModuleMap) return Promise.resolve(cache.psModuleMap)
-
- return globby(globs).then(paths => {
- return Promise
- .props(paths.reduce((map, file) => {
- map[file] = fs.readFileAsync(file, 'utf8')
- return map
- }, {}))
- .then(srcMap => {
- cache.psModuleMap = Object.keys(srcMap).reduce((map, file) => {
- const source = srcMap[file]
- const psModuleName = match(psModuleRegex, source)
- map[psModuleName] = path.resolve(file)
- return map
- }, {})
- return cache.psModuleMap
- })
- })
-}
-
-function connectIdeServer(psModule) {
- const options = psModule.options
- const cache = psModule.cache
-
- if (cache.ideServer) return Promise.resolve(psModule)
+ },
+ emitError: pscMessage => {
+ if (pscMessage.length) {
+ const modules = [];
+
+ const matchErrorsSeparator = /\n(?=Error)/;
+ const errors = pscMessage.split(matchErrorsSeparator);
+ for (const error of errors) {
+ const matchErrLocation = /at (.+\.purs):(\d+):(\d+) - (\d+):(\d+) \(line \2, column \3 - line \4, column \5\)/;
+ const [, filename] = matchErrLocation.exec(error) || [];
+ if (!filename) continue;
+
+ const baseModulePath = path.join(this.rootContext, filename);
+ this.addDependency(baseModulePath);
+
+ const foreignModulesErrorCodes = [
+ 'ErrorParsingFFIModule',
+ 'MissingFFIImplementations',
+ 'UnusedFFIImplementations',
+ 'MissingFFIModule'
+ ];
+ for (const code of foreignModulesErrorCodes) {
+ if (error.includes(code)) {
+ const resolved = utils.resolveForeignModule(baseModulePath);
+ this.addDependency(resolved);
+ }
+ }
+
+ const matchErrModuleName = /in module ((?:\w+\.)*\w+)/;
+ const [, baseModuleName] = matchErrModuleName.exec(error) || [];
+ if (!baseModuleName) continue;
+
+ const matchMissingModuleName = /Module ((?:\w+\.)*\w+) was not found/;
+ const matchMissingImportFromModuleName = /Cannot import value \w+ from module ((?:\w+\.)*\w+)/;
+ for (const re of [matchMissingModuleName, matchMissingImportFromModuleName]) {
+ const [, targetModuleName] = re.exec(error) || [];
+ if (targetModuleName) {
+ const resolved = utils.resolvePursModule({
+ baseModulePath,
+ baseModuleName,
+ targetModuleName
+ });
+ this.addDependency(resolved);
+ }
+ }
+
+ const desc = {
+ name: baseModuleName,
+ filename: baseModulePath
+ };
+
+ if (typeof this.describePscError === 'function') {
+ const { dependencies = [], details } = this.describePscError(error, desc);
+
+ for (const dep of dependencies) {
+ this.addDependency(dep);
+ }
+
+ Object.assign(desc, details);
+ }
+
+ modules.push(desc);
+ }