threads-plugin
Version:
Webpack plugin to bundle threads.js workers automagically.
103 lines (87 loc) • 3.91 kB
JavaScript
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var Types = require('@babel/types');
var path = _interopDefault(require('path'));
var WORKER_PLUGIN_SYMBOL = _interopDefault(require('./symbol.js'));
/**
* Copyright 2018 Google LLC
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
var ParserHelpers;
try {
ParserHelpers = require('webpack/lib/javascript/JavascriptParserHelpers'); // Webpack 5
} catch (e) {}
ParserHelpers = ParserHelpers || require('webpack/lib/ParserHelpers'); // Webpack 4
var NAME = 'WorkerPlugin';
var JS_TYPES = ['auto', 'esm', 'dynamic'];
var workerLoader = path.resolve(__dirname, 'loader.js');
var WorkerPlugin = function WorkerPlugin(options) {
this.options = options || {};
this[WORKER_PLUGIN_SYMBOL] = true;
};
WorkerPlugin.prototype.apply = function apply (compiler) {
var workerId = 0;
compiler.hooks.normalModuleFactory.tap(NAME, function (factory) {
for (var i = 0, list = JS_TYPES; i < list.length; i += 1) {
var type = list[i];
factory.hooks.parser.for(("javascript/" + type)).tap(NAME, function (parser) {
parser.hooks.new.for('imported var').tap(NAME, function (expr) {
if (expr.callee.name !== 'Worker') { return false; }
var dep = parser.evaluateExpression(expr.arguments[0]);
if (!dep.isString()) {
parser.state.module.warnings.push({
message: 'new Worker() will only be bundled if passed a String.'
});
return false;
}
if (/^(https?:)?\/\//i.test(dep.string)) {
// Ignore absolute URL workers
return false;
}
var optsExpr = expr.arguments[1];
var typeModuleExpr = Types.objectProperty(Types.identifier("type"), Types.stringLiteral("module"));
typeModuleExpr.range = [0, 0];
var opts = {};
if (optsExpr) {
opts = {};
for (var i = optsExpr.properties.length; i--;) {
var prop = optsExpr.properties[i];
if (prop.type === 'Property' && !prop.computed && !prop.shorthand && !prop.method) {
opts[prop.key.name] = parser.evaluateExpression(prop.value).string;
if (prop.key.name === 'type') {
typeModuleExpr = prop;
}
}
}
}
var loaderOptions = {
name: opts.name || workerId + ''
};
var req = "require(" + (JSON.stringify(workerLoader + '?' + JSON.stringify(loaderOptions) + '!' + dep.string)) + ")";
var id = "__webpack__worker__" + (workerId++);
ParserHelpers.toConstantDependency(parser, id)(expr.arguments[0]);
ParserHelpers.addParsedVariableToModule(parser, id, req);
});
});
}
});
compiler.hooks.afterEmit.tap(NAME, function (compilation) {
if (workerId === 0) {
compilation.warnings.push({
message: 'No instantiations of threads.js workers found.\n' + 'Please check that:\n' + ' 1. You have configured Babel / TypeScript to not transpile ES modules\n' + ' 2. You import `Worker` from `threads` where you use it\n\n' + 'For more details see: https://github.com/andywer/threads-plugin\n'
});
}
});
};
module.exports = WorkerPlugin;
//# sourceMappingURL=threads-plugin.js.map