line_push/node_modules/hard-source-webpack-plugin/lib/util/serial.js
2022-07-17 13:16:16 +08:00

221 lines
6.5 KiB
JavaScript

const relateContext = require('./relate-context');
const pipe = (exports.pipe = (...fns) => ({
freeze(arg, module, extra, methods) {
for (const fn of fns) {
arg = fn.freeze(arg, module, extra, methods);
}
return arg;
},
thaw(arg, frozen, extra, methods) {
for (const fn of fns) {
arg = fn.thaw(arg, frozen, extra, methods);
}
return arg;
},
}));
const serialMap = (exports.map = (keyOp, valueOp) => ({
freeze(arg, module, extra) {
const resolved = [];
for (const key in arg) {
resolved.push([
keyOp.freeze(key, key, extra),
valueOp.freeze(arg[key], arg[key], extra),
]);
}
return resolved;
},
thaw(arg, frozen, extra) {
const resolved = {};
for (const item of arg) {
const key = keyOp.thaw(item[0], item[0], extra);
const value = valueOp.thaw(item[1], item[1], extra);
resolved[key] = value;
}
return resolved;
},
}));
const contextual = (exports.contextual = fnname => {
const relate = relateContext[`relateNormal${fnname}`];
const context = relateContext[`contextNormal${fnname}`];
return {
freeze: (arg, module, { compiler, compilation }, methods) =>
arg ? relate(compiler || compilation.compiler, arg) : arg,
thaw: (arg, module, { compiler, compilation }, methods) =>
arg ? context(compiler || compilation.compiler, arg) : arg,
};
});
const archetype = (exports.archetype = type => ({
freeze: (arg, module, extra, { freeze }) => freeze(type, null, arg, extra),
thaw: (arg, module, extra, { thaw }) => thaw(type, null, arg, extra),
}));
const mapArchetype = (exports.mapArchetype = type => ({
freeze: (arg, module, extra, { mapFreeze }) =>
mapFreeze(type, null, arg, extra),
thaw: (arg, module, extra, { mapThaw }) => mapThaw(type, null, arg, extra),
}));
const path = (exports.path = contextual('Path'));
const pathArray = (exports.pathArray = contextual('PathArray'));
const pathSet = (exports.pathSet = contextual('PathSet'));
const request = (exports.request = contextual('Request'));
const _loaders = (exports._loaders = contextual('Loaders'));
const loaders = (exports.loaders = {
freeze: _loaders.freeze,
thaw(arg, frozen, extra, methods) {
return _loaders.thaw(arg, frozen, extra, methods).map(loader => {
if (loader.ident) {
let ruleSet =
extra.normalModuleFactory && extra.normalModuleFactory.ruleSet;
if (!ruleSet) {
ruleSet = extra.compiler.__hardSource_ruleSet;
if (!ruleSet) {
const RuleSet = require('webpack/lib/RuleSet');
if (extra.compiler.options.module.defaultRules) {
// webpack 4
ruleSet = extra.compiler.__hardSource_ruleSet = new RuleSet(
extra.compiler.options.module.defaultRules.concat(
extra.compiler.options.module.rules,
),
);
} else {
// webpack <4
ruleSet = extra.compiler.__hardSource_ruleSet = new RuleSet(
extra.compiler.options.module.rules ||
extra.compiler.options.module.loaders,
);
}
}
}
return {
loader: loader.loader,
ident: loader.ident,
options: ruleSet.findOptionsByIdent(loader.ident),
};
}
return loader;
});
},
});
const regExp = (exports.regExp = {
freeze: arg => (arg ? arg.source : false),
thaw: arg => (arg ? new RegExp(arg) : false),
});
const parser = (exports.parser = archetype('Parser'));
const generator = (exports.generator = archetype('Generator'));
const source = (exports.source = archetype('Source'));
const moduleAssets = (exports.moduleAssets = archetype('ModuleAssets'));
const moduleError = (exports.moduleError = mapArchetype('ModuleError'));
const moduleWarning = (exports.moduleWarning = mapArchetype('ModuleWarning'));
const dependencyBlock = (exports.dependencyBlock = {
freeze: (arg, module, extra, { freeze }) =>
freeze('DependencyBlock', null, arg, extra),
thaw: (arg, module, extra, { thaw }) =>
thaw('DependencyBlock', arg, module, extra),
});
const _null = (exports.null = {
freeze: () => null,
thaw: () => null,
});
const identity = (exports.identity = {
freeze: (arg, module, extra, methods) => arg,
thaw: (arg, module, extra, methods) => arg,
});
const assigned = (exports.assigned = members => ({
freeze(arg, module, extra, methods) {
const out = {};
for (const key in members) {
out[key] = members[key].freeze(arg[key], module, extra, methods);
}
return out;
},
thaw(arg, frozen, extra, methods) {
for (const key in members) {
arg[key] = members[key].thaw(frozen[key], frozen, extra, methods);
}
return arg;
},
}));
const created = (exports.created = members => ({
freeze(arg, module, extra, methods) {
if (!arg) {
return null;
}
const out = {};
for (const key in members) {
out[key] = members[key].freeze(arg[key], module, extra, methods);
}
return out;
},
thaw(arg, frozen, extra, methods) {
if (!arg) {
return null;
}
const out = {};
for (const key in members) {
out[key] = members[key].thaw(arg[key], frozen, extra, methods);
}
return out;
},
}));
const objectAssign = (exports.objectAssign = opts => ({
freeze(arg, module, extra) {
const out = Object.assign({}, arg);
for (const key in opts) {
out[key] = opts[key].freeze(arg[key], arg, extra);
}
return out;
},
thaw(arg, frozen, extra) {
const out = Object.assign({}, arg);
for (const key in opts) {
out[key] = opts[key].thaw(arg[key], arg, extra);
}
return out;
},
}));
const constructed = (exports.constructed = (Type, args) => ({
freeze(arg, module, extra, methods) {
const out = {};
for (const key in args) {
out[key] = args[key].freeze(arg[key], module, extra, methods);
}
return out;
},
thaw(arg, frozen, extra, methods) {
const newArgs = [];
for (const key in args) {
newArgs.push(args[key].thaw(frozen[key], frozen, extra, methods));
}
return new Type(...newArgs);
},
}));
const serial = (exports.serial = (name, stages) => ({
freeze(arg, module, extra, methods) {
const out = {
type: name,
};
for (const key in stages) {
out[key] = stages[key].freeze(module, module, extra, methods);
}
return out;
},
thaw(arg, frozen, extra, methods) {
let out = arg;
for (const key in stages) {
out = stages[key].thaw(out, frozen[key], extra, methods);
}
return out;
},
}));