UNPKG

@eaglesong/task-panorama

Version:
125 lines 5.87 kB
"use strict"; /* eslint-disable eslint-comments/no-unlimited-disable, unicorn/no-abusive-eslint-disable */ /* eslint-disable */ const { ConcatSource } = require('webpack-sources'); const ModuleFilenameHelpers = require('webpack/lib/ModuleFilenameHelpers'); const NormalModule = require('webpack/lib/NormalModule'); const SourceMapDevToolModuleOptionsPlugin = require('webpack/lib/SourceMapDevToolModuleOptionsPlugin'); const JavascriptModulesPlugin = require('webpack/lib/javascript/JavascriptModulesPlugin'); const ConcatenatedModule = require('webpack/lib/optimize/ConcatenatedModule'); const { absolutify } = require('webpack/lib/util/identifier'); /** @typedef {import("webpack-sources").Source} Source */ /** @typedef {import("./Compiler")} Compiler */ /** @type {WeakMap<Source, Source>} */ const cache = new WeakMap(); class InjectSourceMapDevToolPlugin { /** * @param {TODO} options Options object */ constructor(options = {}) { if (typeof options === 'string') { options = { append: options, }; } this.variableName = options.variableName || '__webpack_sources__'; this.moduleFilenameTemplate = options.moduleFilenameTemplate || 'webpack://[namespace]/[resource-path]?[hash]'; this.namespace = options.namespace || ''; this.options = options; } /** * Apply the plugin * @param {Compiler} compiler the compiler instance * @returns {void} */ apply(compiler) { const options = this.options; compiler.hooks.compilation.tap('InjectSourceMapDevToolPlugin', compilation => { const hooks = JavascriptModulesPlugin.getCompilationHooks(compilation); new SourceMapDevToolModuleOptionsPlugin(options).apply(compilation); const matchModule = ModuleFilenameHelpers.matchObject.bind(ModuleFilenameHelpers, options); hooks.renderModuleContent.tap('InjectSourceMapDevToolPlugin', (source, m, { runtimeTemplate, chunkGraph }) => { const cachedSource = cache.get(source); if (cachedSource !== undefined) { return cachedSource; } if (m instanceof NormalModule) { const module = /** @type {NormalModule} */ m; if (!matchModule(module.resource)) { return source; } } else if (m instanceof ConcatenatedModule) { const concatModule = /** @type {ConcatenatedModule} */ m; if (concatModule.rootModule instanceof NormalModule) { const module = /** @type {NormalModule} */ concatModule.rootModule; if (!matchModule(module.resource)) { return source; } } else { return source; } } else { return source; } /** @type {{ [key: string]: TODO; }} */ let sourceMap; let content; if (source.sourceAndMap) { const sourceAndMap = source.sourceAndMap(options); sourceMap = sourceAndMap.map; content = sourceAndMap.source; } else { sourceMap = source.map(options); content = source.source(); } if (!sourceMap) { return source; } // Clone (flat) the sourcemap to ensure that the mutations below do not persist. sourceMap = { ...sourceMap }; const context = compiler.options.context; const root = compiler.root; const modules = sourceMap.sources.map(source => { if (!source.startsWith('webpack://')) return source; source = absolutify(context, source.slice(10), root); const module = compilation.findModule(source); return module || source; }); let moduleFilenames = modules.map(module => { return ModuleFilenameHelpers.createFilename(module, { moduleFilenameTemplate: this.moduleFilenameTemplate, namespace: this.namespace, }, { requestShortener: runtimeTemplate.requestShortener, chunkGraph, }); }); moduleFilenames = ModuleFilenameHelpers.replaceDuplicates(moduleFilenames, (filename, i, n) => { for (let j = 0; j < n; j++) filename += '*'; return filename; }); sourceMap.sources = moduleFilenames; sourceMap.sourceRoot = options.sourceRoot || ''; const moduleId = chunkGraph.getModuleId(m); sourceMap.file = `${moduleId}.js`; const header = `if (typeof ${this.variableName} === undefined) ${this.variableName} = {};${this.variableName}[${moduleId}] = ${JSON.stringify(sourceMap)}`; const evalSource = new ConcatSource(header, content); cache.set(source, evalSource); return evalSource; }); hooks.chunkHash.tap('InjectSourceMapDevToolPlugin', (chunk, hash) => { hash.update('InjectSourceMapDevToolPlugin'); hash.update('2'); }); }); } } module.exports = InjectSourceMapDevToolPlugin; //# sourceMappingURL=InjectSourceMapDevToolPlugin.5.js.map