X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2Findex.js;h=be809c685ac5959cc011388259cea1026578102c;hb=c69d78d9010e224f1a31b1acfa24db346d535cb6;hp=fce6394a85bd9978eebead971a428976c6934d76;hpb=f9d5f2faaa11b31661de1a1fcdad4ab51e8ef5fe;p=github%2Ffretlink%2Fpurs-loader.git diff --git a/src/index.js b/src/index.js index fce6394..be809c6 100644 --- a/src/index.js +++ b/src/index.js @@ -190,16 +190,31 @@ module.exports = function purescriptLoader(source, map) { }, 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) line (\d+), column (\d+) - line (\d+), column (\d+)/; + 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; @@ -217,9 +232,26 @@ module.exports = function purescriptLoader(source, map) { 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); } - CACHE_VAR.errors.push(pscMessage); + CACHE_VAR.errors.push(new utils.PscError(pscMessage, modules)); } } }