casterly
Version:
CLI for Casterly
70 lines (69 loc) • 3.73 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const webpack_1 = require("webpack");
// @ts-ignore: no declaration file
const ImportDependency_1 = __importDefault(require("webpack/lib/dependencies/ImportDependency"));
// @ts-ignore: no declaration file
const runtime_1 = require("webpack/lib/util/runtime");
const paths_1 = __importDefault(require("../../../paths"));
const RouteImportDependencyTemplate_1 = __importDefault(require("./RouteImportDependencyTemplate"));
const { ReplaceSource } = webpack_1.sources;
const { JavascriptModulesPlugin } = webpack_1.javascript;
const PLUGIN_NAME = 'RouteAssetsChildPlugin';
class RouteAssetsChildPlugin {
apply(compiler) {
compiler.hooks.compilation.tap({ name: PLUGIN_NAME, stage: Infinity }, (compilation) => {
compilation.dependencyTemplates = compiler.parentCompilation.dependencyTemplates.clone();
compilation.dependencyTemplates.set(ImportDependency_1.default, new RouteImportDependencyTemplate_1.default(compiler.parentCompilation));
});
compiler.hooks.thisCompilation.tap(PLUGIN_NAME, (compilation) => {
// Set the main template to return the exports value in
// the main IIFE, so we can export it in the hook below
compilation.hooks.additionalModuleRuntimeRequirements.tap(PLUGIN_NAME, (_, set) => {
set.add(webpack_1.RuntimeGlobals.returnExportsFromRuntime);
});
compilation.hooks.optimizeDependencies.tap(PLUGIN_NAME, (modules) => {
let runtime = undefined;
for (const [name, { options }] of compilation.entries) {
runtime = runtime_1.mergeRuntimeOwned(runtime, runtime_1.getEntryRuntime(compilation, name, options));
}
for (const module of modules) {
if (module instanceof webpack_1.NormalModule &&
module.userRequest === paths_1.default.appRoutesJs) {
// Mark the exports of the routes files as used (in an unknown way)
// so they don't get optimized away from the final build
const exportsInfo = compilation.moduleGraph.getExportsInfo(module);
exportsInfo.setUsedInUnknownWay(runtime);
break;
}
}
});
// Add exports to the main template
JavascriptModulesPlugin.getCompilationHooks(compilation).renderMain.tap(PLUGIN_NAME, (source) => {
const replaceSource = new ReplaceSource(source, 'export return');
replaceSource.insert(0, 'module.exports = ', 'export return');
return replaceSource;
});
// Remove chunks generated from the dynamic imports
// of the routes.js file, as so to not conflict with
// the chunks generated in the parent compiler
compilation.hooks.chunkAsset.tap(PLUGIN_NAME, (chunk) => {
var _a;
if (chunk.isOnlyInitial()) {
return;
}
(_a = compilation.chunkGraph) === null || _a === void 0 ? void 0 : _a.disconnectChunk(chunk);
chunk.files.forEach((file) => {
compilation.deleteAsset(file);
});
chunk.auxiliaryFiles.forEach((file) => {
compilation.deleteAsset(file);
});
});
});
}
}
exports.default = RouteAssetsChildPlugin;
;