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;
|
},
|
}));
|