| Index: webpack_runner.js |
| diff --git a/webpack.config.js b/webpack_runner.js |
| similarity index 58% |
| rename from webpack.config.js |
| rename to webpack_runner.js |
| index 3e061af1b2a4a25c60a261bd31ba91db127f05f5..61aef524c3071be3e47d253781ef6c4937156c1a 100644 |
| --- a/webpack.config.js |
| +++ b/webpack_runner.js |
| @@ -16,14 +16,60 @@ |
| */ |
| const path = require("path"); |
| +const process = require("process"); |
| + |
| +const MemoryFS = require("memory-fs"); |
| +const webpack = require("webpack"); |
| let {EXTENSION_PATH, ENTRY_POINTS, OUTPUT_PATH, BUNDLE_NAME, |
| - RESOLVE_PATHS, INFO_PATH} = require("process").env; |
| + RESOLVE_PATHS} = require("process").env; |
| + |
| +// Copied from adblockpluscore/test_runner.js |
| +function webpackInMemory(bundleFilename, options) |
| +{ |
| + return new Promise((resolve, reject) => |
| + { |
| + // Based on this example |
| + // https://webpack.js.org/api/node/#custom-file-systems |
| + let memoryFS = new MemoryFS(); |
| + |
| + options.output = {filename: bundleFilename, path: "/"}; |
| + let webpackCompiler = webpack(options); |
| + webpackCompiler.outputFileSystem = memoryFS; |
| + |
| + webpackCompiler.run((err, stats) => |
| + { |
| + // Error handling is based on this example |
| + // https://webpack.js.org/api/node/#error-handling |
| + if (err) |
| + { |
| + let reason = err.stack || err; |
| + if (err.details) |
| + reason += "\n" + err.details; |
| + reject(reason); |
| + } |
| + else if (stats.hasErrors()) |
| + reject(stats.toJson().errors); |
| + else |
| + { |
| + let bundle = memoryFS.readFileSync("/" + bundleFilename, "utf-8"); |
| + memoryFS.unlinkSync("/" + bundleFilename); |
| + resolve(bundle); |
| + } |
| + }); |
| + }); |
| +} |
| -module.exports = { |
| +webpackInMemory(BUNDLE_NAME, { |
| context: EXTENSION_PATH, |
| - devtool: "source-map", |
| + devtool: "inline-source-map", |
| entry: ENTRY_POINTS.split(" "), |
| + module: { |
| + rules: [{ |
| + include: path.join(EXTENSION_PATH, "lib", "info.js"), |
| + use: ["info-loader"] |
| + }] |
| + }, |
| output: { |
| path: OUTPUT_PATH, |
| filename: BUNDLE_NAME |
| @@ -31,7 +77,6 @@ module.exports = { |
| resolve: { |
| modules: RESOLVE_PATHS.split(" "), |
| alias: { |
| - info$: INFO_PATH, |
| // Prevent builtin Node.js modules from being used instead of our own when |
| // the names clash. Once relative paths are used this won't be necessary. |
| url$: "url.js", |
| @@ -71,6 +116,9 @@ module.exports = { |
| } |
| ] |
| }, |
| + resolveLoader: { |
| + modules: [path.resolve(__dirname)] |
| + }, |
| stats: { |
| assets: false, |
| children: false, |
| @@ -86,4 +134,14 @@ module.exports = { |
| version: false, |
| warnings: true |
| } |
| -}; |
| +}).then(console.log, e => |
| +{ |
| + // I would prefer to simply leave the exception unhandled, since we want the |
| + // script to end in that case. Unfortunatley though Node.js displays a |
| + // deprecation warning if we do: |
| + // "[DEP0018] DeprecationWarning: Unhandled promise rejections are |
| + // deprecated. In the future, promise rejections that are not handled |
| + // will terminate the Node.js process with a non-zero exit code." |
| + console.error(e.join("\n")); |
| + process.exit(1); |
| +}); |