123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- const relateContext = require('./util/relate-context');
- const pluginCompat = require('./util/plugin-compat');
- const SourceSchemas3 = [
- ['CachedSource', 'source'],
- ['ConcatSource'],
- ['LineToLineMappedSource', 'value', 'name', 'originalSource'],
- ['OriginalSource', 'value', 'name'],
- ['RawSource', 'value'],
- ['ReplaceSource', 'source', 'name'],
- [
- 'SourceMapSource',
- 'value',
- 'name',
- 'sourceMap',
- 'originalSource',
- 'innerSourceMap',
- ],
- ];
- try {
- SourceSchemas3[0].Source = require('webpack-sources/lib/CachedSource');
- } catch (_) {}
- try {
- SourceSchemas3[1].Source = require('webpack-sources/lib/ConcatSource');
- } catch (_) {}
- try {
- SourceSchemas3[2].Source = require('webpack-sources/lib/LineToLineMappedSource');
- } catch (_) {}
- try {
- SourceSchemas3[3].Source = require('webpack-sources/lib/OriginalSource');
- } catch (_) {}
- try {
- SourceSchemas3[4].Source = require('webpack-sources/lib/RawSource');
- } catch (_) {}
- try {
- SourceSchemas3[5].Source = require('webpack-sources/lib/ReplaceSource');
- } catch (_) {}
- try {
- SourceSchemas3[6].Source = require('webpack-sources/lib/SourceMapSource');
- } catch (_) {}
- const freezeArgument = {
- value(arg, { _value }, extra, methods) {
- return _value;
- },
- name(arg, { _name }, { compilation }, methods) {
- try {
- return relateContext.relateNormalPath(compilation.compiler, _name);
- } catch (e) {
- console.error(e.stack);
- process.exit();
- }
- },
- sourceMap(arg, { _sourceMap }, extra, methods) {
- return _sourceMap;
- },
- originalSource(arg, { _originalSource }, extra, methods) {
- return _originalSource;
- },
- innerSourceMap(arg, { _innerSourceMap }, extra, methods) {
- return _innerSourceMap;
- },
- source(arg, { constructor, _source }, extra, methods) {
- if (constructor.name === 'ReplaceSource') {
- return;
- }
- return methods.freeze('Source', null, _source, extra);
- },
- };
- const thawArgument = {
- name(arg, source, { compilation }, methods) {
- try {
- return relateContext.contextNormalPath(compilation.compiler, arg);
- } catch (e) {
- console.error(e.stack);
- process.exit();
- }
- },
- source(arg, { type }, extra, methods) {
- if (type === 'ReplaceSource') {
- return extra.source;
- }
- return methods.thaw('Source', null, arg, extra);
- },
- value(arg, frozen, extra, methods) {
- if (arg && arg.type === 'Buffer') {
- return new Buffer(arg.data);
- }
- return arg;
- },
- };
- function freezeSource(source, extra, methods) {
- const schemas = extra.schemas;
- for (let i = 0; i < schemas.length; i++) {
- if (source.constructor.name === schemas[i].Source.name) {
- const frozen = {
- type: schemas[i][0],
- };
- for (let j = 1; j < schemas[i].length; j++) {
- let arg = source[schemas[i][j]];
- if (freezeArgument[schemas[i][j]]) {
- arg = freezeArgument[schemas[i][j]](arg, source, extra, methods);
- }
- frozen[schemas[i][j]] = arg;
- }
- return frozen;
- }
- }
- throw new Error(`Unfrozen ${source.constructor.name}.`);
- }
- function thawSource(frozen, extra, methods) {
- const schemas = extra.schemas;
- for (let i = 0; i < schemas.length; i++) {
- if (frozen.type === schemas[i][0]) {
- const Source = schemas[i].Source;
- const args = [];
- for (let j = 1; j < schemas[i].length; j++) {
- let arg = frozen[schemas[i][j]];
- if (thawArgument[schemas[i][j]]) {
- arg = thawArgument[schemas[i][j]](arg, frozen, extra, methods);
- }
- args.push(arg);
- }
- try {
- return new Source(...args);
- } catch (_) {
- return new (Function.prototype.bind.apply(
- Source,
- [null].concat(args),
- ))();
- }
- }
- }
- }
- class TransformSourcePlugin {
- apply(compiler) {
- let methods;
- pluginCompat.tap(
- compiler,
- '_hardSourceMethods',
- 'TransformSourcePlugin',
- _methods => {
- methods = _methods;
- },
- );
- pluginCompat.tap(
- compiler,
- '_hardSourceFreezeSource',
- 'TransformSourcePlugin freeze',
- (frozen, source, extra) => {
- if (typeof source === 'string') {
- return {
- type: 'String',
- value: source,
- };
- } else if (Buffer.isBuffer && Buffer.isBuffer(source)) {
- // Serialization layer might transform it into JSON or handle it as binary
- // data
- return source;
- }
- extra.schemas = SourceSchemas3;
- frozen = freezeSource(source, extra, methods);
- if (frozen.type === 'ReplaceSource') {
- frozen.replacements = source.replacements;
- } else if (frozen.type === 'CachedSource') {
- frozen.cachedSource = source._cachedSource;
- frozen.cachedSize = source._cachedSize;
- frozen.cachedMaps = source._cachedMaps;
- } else if (frozen.type === 'ConcatSource') {
- frozen.children = methods.mapFreeze(
- 'Source',
- null,
- source.children,
- extra,
- );
- }
- return frozen;
- },
- );
- pluginCompat.tap(
- compiler,
- '_hardSourceThawSource',
- 'TransformSourcePlugin thaw',
- (source, frozen, extra) => {
- if (frozen.type === 'String') {
- return frozen.value;
- } else if (frozen.type === 'Buffer') {
- return new Buffer(frozen.data);
- } else if (Buffer.isBuffer && Buffer.isBuffer(frozen)) {
- return frozen;
- }
- extra.schemas = SourceSchemas3;
- source = thawSource(frozen, extra, methods);
- if (frozen.type === 'ReplaceSource') {
- source.replacements = frozen.replacements;
- } else if (frozen.type === 'CachedSource') {
- source._cachedSource = frozen.cachedSource;
- source._cachedSize = frozen.cachedSize;
- source._cachedMaps = frozen.cachedMaps;
- } else if (frozen.type === 'ConcatSource') {
- source.children = methods.mapThaw(
- 'Source',
- null,
- frozen.children,
- extra,
- );
- }
- return source;
- },
- );
- }
- }
- module.exports = TransformSourcePlugin;
|