From 9cba2e1aacd7ab3be7c87a1edd420f80d18af7fc Mon Sep 17 00:00:00 2001 From: Mike Calvanese Date: Sun, 26 Nov 2017 23:21:26 -0500 Subject: [PATCH] add config to solcLoader to allow resolution of missing imports adds `findImports` and `importResolves` options to solcLoader config `findImports` can be used to define a callback function that will be executed when solc compiler encounters a missing import path `importResolves` can be used to define an array of fallback paths for missing imports --- src/loaders/solc/index.js | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/loaders/solc/index.js b/src/loaders/solc/index.js index 22f2520..73b708f 100644 --- a/src/loaders/solc/index.js +++ b/src/loaders/solc/index.js @@ -1,4 +1,5 @@ const solc = require('solc'); +const fs = require('fs'); // detect error type from error messages function errortype(message) { @@ -10,6 +11,23 @@ function filterErrorWarnings(errors) { return (errors || []).filter(error => errortype(error) === 'error'); } +function findImportsFn (importResolves) { + return (path) => { + let contents + importResolves.some((fallbackPath) => { + try { + contents = fs.readFileSync(`${fallbackPath}/${path}`).toString(); + return true; + } catch (err) { } + }) + if (contents) { + return { contents }; + } else { + return { error: 'File not found' }; + } + } +} + /** * Compiles solidity files in sourcemap, returns contracts. * @@ -23,6 +41,8 @@ module.exports = function solcLoader(sourceMap, loaderConfig, environment) { const adjustBase = loaderConfig.base; const filterWarnings = loaderConfig.filterWarnings; const filterFilenames = loaderConfig.filterFilenames; + const importResolves = loaderConfig.importResolves; + const findImports = loaderConfig.findImports ? loaderConfig.findImports : (importResolves ? findImportsFn(importResolves) : undefined); const adjustedSourceMap = {}; if (adjustBase) { @@ -31,7 +51,7 @@ module.exports = function solcLoader(sourceMap, loaderConfig, environment) { }); } - const output = solc.compile({ sources: (adjustBase ? adjustedSourceMap : sourceMap) }, (loaderConfig.optimize || 0)); + const output = solc.compile({ sources: (adjustBase ? adjustedSourceMap : sourceMap) }, (loaderConfig.optimize || 0), findImports); const errors = (filterWarnings ? filterErrorWarnings(output.errors) : output.errors) || []; const outputContracts = Object.assign({}, output.contracts);