first commit
This commit is contained in:
323
app_vue/node_modules/webpack/lib/css/CssGenerator.js
generated
vendored
Normal file
323
app_vue/node_modules/webpack/lib/css/CssGenerator.js
generated
vendored
Normal file
@ -0,0 +1,323 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Sergey Melyukov @smelukov
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const { ReplaceSource, RawSource, ConcatSource } = require("webpack-sources");
|
||||
const { UsageState } = require("../ExportsInfo");
|
||||
const Generator = require("../Generator");
|
||||
const InitFragment = require("../InitFragment");
|
||||
const {
|
||||
JS_AND_CSS_EXPORT_TYPES,
|
||||
JS_AND_CSS_TYPES,
|
||||
CSS_TYPES,
|
||||
JS_TYPE,
|
||||
CSS_TYPE
|
||||
} = require("../ModuleSourceTypesConstants");
|
||||
const RuntimeGlobals = require("../RuntimeGlobals");
|
||||
const Template = require("../Template");
|
||||
|
||||
/** @typedef {import("webpack-sources").Source} Source */
|
||||
/** @typedef {import("../../declarations/WebpackOptions").CssAutoGeneratorOptions} CssAutoGeneratorOptions */
|
||||
/** @typedef {import("../../declarations/WebpackOptions").CssGlobalGeneratorOptions} CssGlobalGeneratorOptions */
|
||||
/** @typedef {import("../../declarations/WebpackOptions").CssModuleGeneratorOptions} CssModuleGeneratorOptions */
|
||||
/** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */
|
||||
/** @typedef {import("../Dependency")} Dependency */
|
||||
/** @typedef {import("../DependencyTemplate").CssData} CssData */
|
||||
/** @typedef {import("../DependencyTemplate").CssDependencyTemplateContext} DependencyTemplateContext */
|
||||
/** @typedef {import("../Generator").GenerateContext} GenerateContext */
|
||||
/** @typedef {import("../Generator").UpdateHashContext} UpdateHashContext */
|
||||
/** @typedef {import("../Module").BuildInfo} BuildInfo */
|
||||
/** @typedef {import("../Module").BuildMeta} BuildMeta */
|
||||
/** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
|
||||
/** @typedef {import("../Module").SourceTypes} SourceTypes */
|
||||
/** @typedef {import("../ModuleGraph")} ModuleGraph */
|
||||
/** @typedef {import("../NormalModule")} NormalModule */
|
||||
/** @typedef {import("../util/Hash")} Hash */
|
||||
|
||||
class CssGenerator extends Generator {
|
||||
/**
|
||||
* @param {CssAutoGeneratorOptions | CssGlobalGeneratorOptions | CssModuleGeneratorOptions} options options
|
||||
* @param {ModuleGraph} moduleGraph the module graph
|
||||
*/
|
||||
constructor(options, moduleGraph) {
|
||||
super();
|
||||
this.convention = options.exportsConvention;
|
||||
this.localIdentName = options.localIdentName;
|
||||
this.exportsOnly = options.exportsOnly;
|
||||
this.esModule = options.esModule;
|
||||
this._moduleGraph = moduleGraph;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {NormalModule} module module for which the bailout reason should be determined
|
||||
* @param {ConcatenationBailoutReasonContext} context context
|
||||
* @returns {string | undefined} reason why this module can't be concatenated, undefined when it can be concatenated
|
||||
*/
|
||||
getConcatenationBailoutReason(module, context) {
|
||||
if (!this.esModule) {
|
||||
return "Module is not an ECMAScript module";
|
||||
}
|
||||
|
||||
return undefined;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {NormalModule} module module for which the code should be generated
|
||||
* @param {GenerateContext} generateContext context for generate
|
||||
* @returns {Source | null} generated code
|
||||
*/
|
||||
generate(module, generateContext) {
|
||||
const source =
|
||||
generateContext.type === "javascript"
|
||||
? new ReplaceSource(new RawSource(""))
|
||||
: new ReplaceSource(/** @type {Source} */ (module.originalSource()));
|
||||
|
||||
/** @type {InitFragment<GenerateContext>[]} */
|
||||
const initFragments = [];
|
||||
/** @type {CssData} */
|
||||
const cssData = {
|
||||
esModule: /** @type {boolean} */ (this.esModule),
|
||||
exports: new Map()
|
||||
};
|
||||
|
||||
/** @type {InitFragment<GenerateContext>[] | undefined} */
|
||||
let chunkInitFragments;
|
||||
/** @type {DependencyTemplateContext} */
|
||||
const templateContext = {
|
||||
runtimeTemplate: generateContext.runtimeTemplate,
|
||||
dependencyTemplates: generateContext.dependencyTemplates,
|
||||
moduleGraph: generateContext.moduleGraph,
|
||||
chunkGraph: generateContext.chunkGraph,
|
||||
module,
|
||||
runtime: generateContext.runtime,
|
||||
runtimeRequirements: generateContext.runtimeRequirements,
|
||||
concatenationScope: generateContext.concatenationScope,
|
||||
codeGenerationResults:
|
||||
/** @type {CodeGenerationResults} */
|
||||
(generateContext.codeGenerationResults),
|
||||
initFragments,
|
||||
cssData,
|
||||
get chunkInitFragments() {
|
||||
if (!chunkInitFragments) {
|
||||
const data =
|
||||
/** @type {NonNullable<GenerateContext["getData"]>} */
|
||||
(generateContext.getData)();
|
||||
chunkInitFragments = data.get("chunkInitFragments");
|
||||
if (!chunkInitFragments) {
|
||||
chunkInitFragments = [];
|
||||
data.set("chunkInitFragments", chunkInitFragments);
|
||||
}
|
||||
}
|
||||
|
||||
return chunkInitFragments;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* @param {Dependency} dependency dependency
|
||||
*/
|
||||
const handleDependency = dependency => {
|
||||
const constructor =
|
||||
/** @type {new (...args: EXPECTED_ANY[]) => Dependency} */
|
||||
(dependency.constructor);
|
||||
const template = generateContext.dependencyTemplates.get(constructor);
|
||||
if (!template) {
|
||||
throw new Error(
|
||||
`No template for dependency: ${dependency.constructor.name}`
|
||||
);
|
||||
}
|
||||
|
||||
template.apply(dependency, source, templateContext);
|
||||
};
|
||||
|
||||
for (const dependency of module.dependencies) {
|
||||
handleDependency(dependency);
|
||||
}
|
||||
|
||||
switch (generateContext.type) {
|
||||
case "javascript": {
|
||||
/** @type {BuildInfo} */
|
||||
(module.buildInfo).cssData = cssData;
|
||||
|
||||
generateContext.runtimeRequirements.add(RuntimeGlobals.module);
|
||||
|
||||
if (generateContext.concatenationScope) {
|
||||
const source = new ConcatSource();
|
||||
const usedIdentifiers = new Set();
|
||||
for (const [name, v] of cssData.exports) {
|
||||
const usedName = generateContext.moduleGraph
|
||||
.getExportInfo(module, name)
|
||||
.getUsedName(name, generateContext.runtime);
|
||||
if (!usedName) {
|
||||
continue;
|
||||
}
|
||||
let identifier = Template.toIdentifier(usedName);
|
||||
const { RESERVED_IDENTIFIER } = require("../util/propertyName");
|
||||
if (RESERVED_IDENTIFIER.has(identifier)) {
|
||||
identifier = `_${identifier}`;
|
||||
}
|
||||
const i = 0;
|
||||
while (usedIdentifiers.has(identifier)) {
|
||||
identifier = Template.toIdentifier(name + i);
|
||||
}
|
||||
usedIdentifiers.add(identifier);
|
||||
generateContext.concatenationScope.registerExport(name, identifier);
|
||||
source.add(
|
||||
`${
|
||||
generateContext.runtimeTemplate.supportsConst()
|
||||
? "const"
|
||||
: "var"
|
||||
} ${identifier} = ${JSON.stringify(v)};\n`
|
||||
);
|
||||
}
|
||||
return source;
|
||||
}
|
||||
|
||||
if (
|
||||
cssData.exports.size === 0 &&
|
||||
!(/** @type {BuildMeta} */ (module.buildMeta).isCSSModule)
|
||||
) {
|
||||
return new RawSource("");
|
||||
}
|
||||
|
||||
const needNsObj =
|
||||
this.esModule &&
|
||||
generateContext.moduleGraph
|
||||
.getExportsInfo(module)
|
||||
.otherExportsInfo.getUsed(generateContext.runtime) !==
|
||||
UsageState.Unused;
|
||||
|
||||
if (needNsObj) {
|
||||
generateContext.runtimeRequirements.add(
|
||||
RuntimeGlobals.makeNamespaceObject
|
||||
);
|
||||
}
|
||||
|
||||
const exports = [];
|
||||
|
||||
for (const [name, v] of cssData.exports) {
|
||||
exports.push(`\t${JSON.stringify(name)}: ${JSON.stringify(v)}`);
|
||||
}
|
||||
|
||||
return new RawSource(
|
||||
`${needNsObj ? `${RuntimeGlobals.makeNamespaceObject}(` : ""}${
|
||||
module.moduleArgument
|
||||
}.exports = {\n${exports.join(",\n")}\n}${needNsObj ? ")" : ""};`
|
||||
);
|
||||
}
|
||||
case "css": {
|
||||
if (module.presentationalDependencies !== undefined) {
|
||||
for (const dependency of module.presentationalDependencies) {
|
||||
handleDependency(dependency);
|
||||
}
|
||||
}
|
||||
|
||||
generateContext.runtimeRequirements.add(RuntimeGlobals.hasCssModules);
|
||||
|
||||
return InitFragment.addToSource(source, initFragments, generateContext);
|
||||
}
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Error} error the error
|
||||
* @param {NormalModule} module module for which the code should be generated
|
||||
* @param {GenerateContext} generateContext context for generate
|
||||
* @returns {Source | null} generated code
|
||||
*/
|
||||
generateError(error, module, generateContext) {
|
||||
switch (generateContext.type) {
|
||||
case "javascript": {
|
||||
return new RawSource(
|
||||
`throw new Error(${JSON.stringify(error.message)});`
|
||||
);
|
||||
}
|
||||
case "css": {
|
||||
return new RawSource(`/**\n ${error.message} \n**/`);
|
||||
}
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {NormalModule} module fresh module
|
||||
* @returns {SourceTypes} available types (do not mutate)
|
||||
*/
|
||||
getTypes(module) {
|
||||
// TODO, find a better way to prevent the original module from being removed after concatenation, maybe it is a bug
|
||||
if (this.exportsOnly) {
|
||||
return JS_AND_CSS_EXPORT_TYPES;
|
||||
}
|
||||
const sourceTypes = new Set();
|
||||
const connections = this._moduleGraph.getIncomingConnections(module);
|
||||
for (const connection of connections) {
|
||||
if (!connection.originModule) {
|
||||
continue;
|
||||
}
|
||||
if (connection.originModule.type.split("/")[0] !== CSS_TYPE)
|
||||
sourceTypes.add(JS_TYPE);
|
||||
}
|
||||
if (sourceTypes.has(JS_TYPE)) {
|
||||
return JS_AND_CSS_TYPES;
|
||||
}
|
||||
return CSS_TYPES;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {NormalModule} module the module
|
||||
* @param {string=} type source type
|
||||
* @returns {number} estimate size of the module
|
||||
*/
|
||||
getSize(module, type) {
|
||||
switch (type) {
|
||||
case "javascript": {
|
||||
const cssData = /** @type {BuildInfo} */ (module.buildInfo).cssData;
|
||||
if (!cssData) {
|
||||
return 42;
|
||||
}
|
||||
if (cssData.exports.size === 0) {
|
||||
if (/** @type {BuildMeta} */ (module.buildMeta).isCSSModule) {
|
||||
return 42;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
const exports = cssData.exports;
|
||||
const stringifiedExports = JSON.stringify(
|
||||
Array.from(exports).reduce((obj, [key, value]) => {
|
||||
obj[key] = value;
|
||||
return obj;
|
||||
}, /** @type {Record<string, string>} */ ({}))
|
||||
);
|
||||
|
||||
return stringifiedExports.length + 42;
|
||||
}
|
||||
case "css": {
|
||||
const originalSource = module.originalSource();
|
||||
|
||||
if (!originalSource) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return originalSource.size();
|
||||
}
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Hash} hash hash that will be modified
|
||||
* @param {UpdateHashContext} updateHashContext context for updating hash
|
||||
*/
|
||||
updateHash(hash, { module }) {
|
||||
hash.update(/** @type {boolean} */ (this.esModule).toString());
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = CssGenerator;
|
506
app_vue/node_modules/webpack/lib/css/CssLoadingRuntimeModule.js
generated
vendored
Normal file
506
app_vue/node_modules/webpack/lib/css/CssLoadingRuntimeModule.js
generated
vendored
Normal file
@ -0,0 +1,506 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const { SyncWaterfallHook } = require("tapable");
|
||||
const Compilation = require("../Compilation");
|
||||
const RuntimeGlobals = require("../RuntimeGlobals");
|
||||
const RuntimeModule = require("../RuntimeModule");
|
||||
const Template = require("../Template");
|
||||
const compileBooleanMatcher = require("../util/compileBooleanMatcher");
|
||||
const { chunkHasCss } = require("./CssModulesPlugin");
|
||||
|
||||
/** @typedef {import("../../declarations/WebpackOptions").Environment} Environment */
|
||||
/** @typedef {import("../Chunk")} Chunk */
|
||||
/** @typedef {import("../ChunkGraph")} ChunkGraph */
|
||||
/** @typedef {import("../Compilation").RuntimeRequirementsContext} RuntimeRequirementsContext */
|
||||
/** @typedef {import("../Module").ReadOnlyRuntimeRequirements} ReadOnlyRuntimeRequirements */
|
||||
|
||||
/**
|
||||
* @typedef {object} CssLoadingRuntimeModulePluginHooks
|
||||
* @property {SyncWaterfallHook<[string, Chunk]>} createStylesheet
|
||||
* @property {SyncWaterfallHook<[string, Chunk]>} linkPreload
|
||||
* @property {SyncWaterfallHook<[string, Chunk]>} linkPrefetch
|
||||
*/
|
||||
|
||||
/** @type {WeakMap<Compilation, CssLoadingRuntimeModulePluginHooks>} */
|
||||
const compilationHooksMap = new WeakMap();
|
||||
|
||||
class CssLoadingRuntimeModule extends RuntimeModule {
|
||||
/**
|
||||
* @param {Compilation} compilation the compilation
|
||||
* @returns {CssLoadingRuntimeModulePluginHooks} hooks
|
||||
*/
|
||||
static getCompilationHooks(compilation) {
|
||||
if (!(compilation instanceof Compilation)) {
|
||||
throw new TypeError(
|
||||
"The 'compilation' argument must be an instance of Compilation"
|
||||
);
|
||||
}
|
||||
let hooks = compilationHooksMap.get(compilation);
|
||||
if (hooks === undefined) {
|
||||
hooks = {
|
||||
createStylesheet: new SyncWaterfallHook(["source", "chunk"]),
|
||||
linkPreload: new SyncWaterfallHook(["source", "chunk"]),
|
||||
linkPrefetch: new SyncWaterfallHook(["source", "chunk"])
|
||||
};
|
||||
compilationHooksMap.set(compilation, hooks);
|
||||
}
|
||||
return hooks;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {ReadOnlyRuntimeRequirements} runtimeRequirements runtime requirements
|
||||
*/
|
||||
constructor(runtimeRequirements) {
|
||||
super("css loading", 10);
|
||||
|
||||
this._runtimeRequirements = runtimeRequirements;
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {string | null} runtime code
|
||||
*/
|
||||
generate() {
|
||||
const { _runtimeRequirements } = this;
|
||||
const compilation = /** @type {Compilation} */ (this.compilation);
|
||||
const chunk = /** @type {Chunk} */ (this.chunk);
|
||||
const {
|
||||
chunkGraph,
|
||||
runtimeTemplate,
|
||||
outputOptions: {
|
||||
crossOriginLoading,
|
||||
uniqueName,
|
||||
chunkLoadTimeout: loadTimeout,
|
||||
charset
|
||||
}
|
||||
} = compilation;
|
||||
const fn = RuntimeGlobals.ensureChunkHandlers;
|
||||
const conditionMap = chunkGraph.getChunkConditionMap(
|
||||
/** @type {Chunk} */ (chunk),
|
||||
/**
|
||||
* @param {Chunk} chunk the chunk
|
||||
* @param {ChunkGraph} chunkGraph the chunk graph
|
||||
* @returns {boolean} true, if the chunk has css
|
||||
*/
|
||||
(chunk, chunkGraph) =>
|
||||
Boolean(chunkGraph.getChunkModulesIterableBySourceType(chunk, "css"))
|
||||
);
|
||||
const hasCssMatcher = compileBooleanMatcher(conditionMap);
|
||||
|
||||
const withLoading =
|
||||
_runtimeRequirements.has(RuntimeGlobals.ensureChunkHandlers) &&
|
||||
hasCssMatcher !== false;
|
||||
/** @type {boolean} */
|
||||
const withHmr = _runtimeRequirements.has(
|
||||
RuntimeGlobals.hmrDownloadUpdateHandlers
|
||||
);
|
||||
/** @type {Set<number | string | null>} */
|
||||
const initialChunkIds = new Set();
|
||||
for (const c of /** @type {Chunk} */ (chunk).getAllInitialChunks()) {
|
||||
if (chunkHasCss(c, chunkGraph)) {
|
||||
initialChunkIds.add(c.id);
|
||||
}
|
||||
}
|
||||
|
||||
if (!withLoading && !withHmr) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const environment =
|
||||
/** @type {Environment} */
|
||||
(compilation.outputOptions.environment);
|
||||
const isNeutralPlatform = runtimeTemplate.isNeutralPlatform();
|
||||
const withPrefetch =
|
||||
this._runtimeRequirements.has(RuntimeGlobals.prefetchChunkHandlers) &&
|
||||
(environment.document || isNeutralPlatform) &&
|
||||
chunk.hasChildByOrder(chunkGraph, "prefetch", true, chunkHasCss);
|
||||
const withPreload =
|
||||
this._runtimeRequirements.has(RuntimeGlobals.preloadChunkHandlers) &&
|
||||
(environment.document || isNeutralPlatform) &&
|
||||
chunk.hasChildByOrder(chunkGraph, "preload", true, chunkHasCss);
|
||||
|
||||
const { linkPreload, linkPrefetch } =
|
||||
CssLoadingRuntimeModule.getCompilationHooks(compilation);
|
||||
|
||||
const withFetchPriority = _runtimeRequirements.has(
|
||||
RuntimeGlobals.hasFetchPriority
|
||||
);
|
||||
|
||||
const { createStylesheet } =
|
||||
CssLoadingRuntimeModule.getCompilationHooks(compilation);
|
||||
|
||||
const stateExpression = withHmr
|
||||
? `${RuntimeGlobals.hmrRuntimeStatePrefix}_css`
|
||||
: undefined;
|
||||
|
||||
const code = Template.asString([
|
||||
"link = document.createElement('link');",
|
||||
charset ? "link.charset = 'utf-8';" : "",
|
||||
`if (${RuntimeGlobals.scriptNonce}) {`,
|
||||
Template.indent(
|
||||
`link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});`
|
||||
),
|
||||
"}",
|
||||
uniqueName
|
||||
? 'link.setAttribute("data-webpack", uniqueName + ":" + key);'
|
||||
: "",
|
||||
withFetchPriority
|
||||
? Template.asString([
|
||||
"if(fetchPriority) {",
|
||||
Template.indent(
|
||||
'link.setAttribute("fetchpriority", fetchPriority);'
|
||||
),
|
||||
"}"
|
||||
])
|
||||
: "",
|
||||
"link.setAttribute(loadingAttribute, 1);",
|
||||
'link.rel = "stylesheet";',
|
||||
"link.href = url;",
|
||||
crossOriginLoading
|
||||
? crossOriginLoading === "use-credentials"
|
||||
? 'link.crossOrigin = "use-credentials";'
|
||||
: Template.asString([
|
||||
"if (link.href.indexOf(window.location.origin + '/') !== 0) {",
|
||||
Template.indent(
|
||||
`link.crossOrigin = ${JSON.stringify(crossOriginLoading)};`
|
||||
),
|
||||
"}"
|
||||
])
|
||||
: ""
|
||||
]);
|
||||
|
||||
return Template.asString([
|
||||
"// object to store loaded and loading chunks",
|
||||
"// undefined = chunk not loaded, null = chunk preloaded/prefetched",
|
||||
"// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded",
|
||||
`var installedChunks = ${
|
||||
stateExpression ? `${stateExpression} = ${stateExpression} || ` : ""
|
||||
}{`,
|
||||
Template.indent(
|
||||
Array.from(initialChunkIds, id => `${JSON.stringify(id)}: 0`).join(
|
||||
",\n"
|
||||
)
|
||||
),
|
||||
"};",
|
||||
"",
|
||||
uniqueName
|
||||
? `var uniqueName = ${JSON.stringify(
|
||||
runtimeTemplate.outputOptions.uniqueName
|
||||
)};`
|
||||
: "// data-webpack is not used as build has no uniqueName",
|
||||
withLoading || withHmr
|
||||
? Template.asString([
|
||||
'var loadingAttribute = "data-webpack-loading";',
|
||||
`var loadStylesheet = ${runtimeTemplate.basicFunction(
|
||||
`chunkId, url, done${
|
||||
withFetchPriority ? ", fetchPriority" : ""
|
||||
}${withHmr ? ", hmr" : ""}`,
|
||||
[
|
||||
'var link, needAttach, key = "chunk-" + chunkId;',
|
||||
withHmr ? "if(!hmr) {" : "",
|
||||
'var links = document.getElementsByTagName("link");',
|
||||
"for(var i = 0; i < links.length; i++) {",
|
||||
Template.indent([
|
||||
"var l = links[i];",
|
||||
`if(l.rel == "stylesheet" && (${
|
||||
withHmr
|
||||
? 'l.href.startsWith(url) || l.getAttribute("href").startsWith(url)'
|
||||
: 'l.href == url || l.getAttribute("href") == url'
|
||||
}${
|
||||
uniqueName
|
||||
? ' || l.getAttribute("data-webpack") == uniqueName + ":" + key'
|
||||
: ""
|
||||
})) { link = l; break; }`
|
||||
]),
|
||||
"}",
|
||||
"if(!done) return link;",
|
||||
withHmr ? "}" : "",
|
||||
"if(!link) {",
|
||||
Template.indent([
|
||||
"needAttach = true;",
|
||||
createStylesheet.call(code, /** @type {Chunk} */ (this.chunk))
|
||||
]),
|
||||
"}",
|
||||
`var onLinkComplete = ${runtimeTemplate.basicFunction(
|
||||
"prev, event",
|
||||
Template.asString([
|
||||
"link.onerror = link.onload = null;",
|
||||
"link.removeAttribute(loadingAttribute);",
|
||||
"clearTimeout(timeout);",
|
||||
'if(event && event.type != "load") link.parentNode.removeChild(link)',
|
||||
"done(event);",
|
||||
"if(prev) return prev(event);"
|
||||
])
|
||||
)};`,
|
||||
"if(link.getAttribute(loadingAttribute)) {",
|
||||
Template.indent([
|
||||
`var timeout = setTimeout(onLinkComplete.bind(null, undefined, { type: 'timeout', target: link }), ${loadTimeout});`,
|
||||
"link.onerror = onLinkComplete.bind(null, link.onerror);",
|
||||
"link.onload = onLinkComplete.bind(null, link.onload);"
|
||||
]),
|
||||
"} else onLinkComplete(undefined, { type: 'load', target: link });", // We assume any existing stylesheet is render blocking
|
||||
withHmr && withFetchPriority
|
||||
? 'if (hmr && hmr.getAttribute("fetchpriority")) link.setAttribute("fetchpriority", hmr.getAttribute("fetchpriority"));'
|
||||
: "",
|
||||
withHmr ? "hmr ? document.head.insertBefore(link, hmr) :" : "",
|
||||
"needAttach && document.head.appendChild(link);",
|
||||
"return link;"
|
||||
]
|
||||
)};`
|
||||
])
|
||||
: "",
|
||||
withLoading
|
||||
? Template.asString([
|
||||
`${fn}.css = ${runtimeTemplate.basicFunction(
|
||||
`chunkId, promises${withFetchPriority ? " , fetchPriority" : ""}`,
|
||||
[
|
||||
"// css chunk loading",
|
||||
`var installedChunkData = ${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;`,
|
||||
'if(installedChunkData !== 0) { // 0 means "already installed".',
|
||||
Template.indent([
|
||||
"",
|
||||
'// a Promise means "currently loading".',
|
||||
"if(installedChunkData) {",
|
||||
Template.indent(["promises.push(installedChunkData[2]);"]),
|
||||
"} else {",
|
||||
Template.indent([
|
||||
hasCssMatcher === true
|
||||
? "if(true) { // all chunks have CSS"
|
||||
: `if(${hasCssMatcher("chunkId")}) {`,
|
||||
Template.indent([
|
||||
"// setup Promise in chunk cache",
|
||||
`var promise = new Promise(${runtimeTemplate.expressionFunction(
|
||||
"installedChunkData = installedChunks[chunkId] = [resolve, reject]",
|
||||
"resolve, reject"
|
||||
)});`,
|
||||
"promises.push(installedChunkData[2] = promise);",
|
||||
"",
|
||||
"// start chunk loading",
|
||||
`var url = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkCssFilename}(chunkId);`,
|
||||
"// create error before stack unwound to get useful stacktrace later",
|
||||
"var error = new Error();",
|
||||
`var loadingEnded = ${runtimeTemplate.basicFunction(
|
||||
"event",
|
||||
[
|
||||
`if(${RuntimeGlobals.hasOwnProperty}(installedChunks, chunkId)) {`,
|
||||
Template.indent([
|
||||
"installedChunkData = installedChunks[chunkId];",
|
||||
"if(installedChunkData !== 0) installedChunks[chunkId] = undefined;",
|
||||
"if(installedChunkData) {",
|
||||
Template.indent([
|
||||
'if(event.type !== "load") {',
|
||||
Template.indent([
|
||||
"var errorType = event && event.type;",
|
||||
"var realHref = event && event.target && event.target.href;",
|
||||
"error.message = 'Loading css chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realHref + ')';",
|
||||
"error.name = 'ChunkLoadError';",
|
||||
"error.type = errorType;",
|
||||
"error.request = realHref;",
|
||||
"installedChunkData[1](error);"
|
||||
]),
|
||||
"} else {",
|
||||
Template.indent([
|
||||
"installedChunks[chunkId] = 0;",
|
||||
"installedChunkData[0]();"
|
||||
]),
|
||||
"}"
|
||||
]),
|
||||
"}"
|
||||
]),
|
||||
"}"
|
||||
]
|
||||
)};`,
|
||||
isNeutralPlatform
|
||||
? "if (typeof document !== 'undefined') {"
|
||||
: "",
|
||||
Template.indent([
|
||||
`loadStylesheet(chunkId, url, loadingEnded${
|
||||
withFetchPriority ? ", fetchPriority" : ""
|
||||
});`
|
||||
]),
|
||||
isNeutralPlatform
|
||||
? "} else { loadingEnded({ type: 'load' }); }"
|
||||
: ""
|
||||
]),
|
||||
"} else installedChunks[chunkId] = 0;"
|
||||
]),
|
||||
"}"
|
||||
]),
|
||||
"}"
|
||||
]
|
||||
)};`
|
||||
])
|
||||
: "// no chunk loading",
|
||||
"",
|
||||
withPrefetch && hasCssMatcher !== false
|
||||
? `${
|
||||
RuntimeGlobals.prefetchChunkHandlers
|
||||
}.s = ${runtimeTemplate.basicFunction("chunkId", [
|
||||
`if((!${
|
||||
RuntimeGlobals.hasOwnProperty
|
||||
}(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && ${
|
||||
hasCssMatcher === true ? "true" : hasCssMatcher("chunkId")
|
||||
}) {`,
|
||||
Template.indent([
|
||||
"installedChunks[chunkId] = null;",
|
||||
isNeutralPlatform
|
||||
? "if (typeof document === 'undefined') return;"
|
||||
: "",
|
||||
linkPrefetch.call(
|
||||
Template.asString([
|
||||
"var link = document.createElement('link');",
|
||||
charset ? "link.charset = 'utf-8';" : "",
|
||||
crossOriginLoading
|
||||
? `link.crossOrigin = ${JSON.stringify(
|
||||
crossOriginLoading
|
||||
)};`
|
||||
: "",
|
||||
`if (${RuntimeGlobals.scriptNonce}) {`,
|
||||
Template.indent(
|
||||
`link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});`
|
||||
),
|
||||
"}",
|
||||
'link.rel = "prefetch";',
|
||||
'link.as = "style";',
|
||||
`link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkCssFilename}(chunkId);`
|
||||
]),
|
||||
chunk
|
||||
),
|
||||
"document.head.appendChild(link);"
|
||||
]),
|
||||
"}"
|
||||
])};`
|
||||
: "// no prefetching",
|
||||
"",
|
||||
withPreload && hasCssMatcher !== false
|
||||
? `${
|
||||
RuntimeGlobals.preloadChunkHandlers
|
||||
}.s = ${runtimeTemplate.basicFunction("chunkId", [
|
||||
`if((!${
|
||||
RuntimeGlobals.hasOwnProperty
|
||||
}(installedChunks, chunkId) || installedChunks[chunkId] === undefined) && ${
|
||||
hasCssMatcher === true ? "true" : hasCssMatcher("chunkId")
|
||||
}) {`,
|
||||
Template.indent([
|
||||
"installedChunks[chunkId] = null;",
|
||||
isNeutralPlatform
|
||||
? "if (typeof document === 'undefined') return;"
|
||||
: "",
|
||||
linkPreload.call(
|
||||
Template.asString([
|
||||
"var link = document.createElement('link');",
|
||||
charset ? "link.charset = 'utf-8';" : "",
|
||||
`if (${RuntimeGlobals.scriptNonce}) {`,
|
||||
Template.indent(
|
||||
`link.setAttribute("nonce", ${RuntimeGlobals.scriptNonce});`
|
||||
),
|
||||
"}",
|
||||
'link.rel = "preload";',
|
||||
'link.as = "style";',
|
||||
`link.href = ${RuntimeGlobals.publicPath} + ${RuntimeGlobals.getChunkCssFilename}(chunkId);`,
|
||||
crossOriginLoading
|
||||
? crossOriginLoading === "use-credentials"
|
||||
? 'link.crossOrigin = "use-credentials";'
|
||||
: Template.asString([
|
||||
"if (link.href.indexOf(window.location.origin + '/') !== 0) {",
|
||||
Template.indent(
|
||||
`link.crossOrigin = ${JSON.stringify(
|
||||
crossOriginLoading
|
||||
)};`
|
||||
),
|
||||
"}"
|
||||
])
|
||||
: ""
|
||||
]),
|
||||
chunk
|
||||
),
|
||||
"document.head.appendChild(link);"
|
||||
]),
|
||||
"}"
|
||||
])};`
|
||||
: "// no preloaded",
|
||||
withHmr
|
||||
? Template.asString([
|
||||
"var oldTags = [];",
|
||||
"var newTags = [];",
|
||||
`var applyHandler = ${runtimeTemplate.basicFunction("options", [
|
||||
`return { dispose: ${runtimeTemplate.basicFunction("", [
|
||||
"while(oldTags.length) {",
|
||||
Template.indent([
|
||||
"var oldTag = oldTags.pop();",
|
||||
"if(oldTag.parentNode) oldTag.parentNode.removeChild(oldTag);"
|
||||
]),
|
||||
"}"
|
||||
])}, apply: ${runtimeTemplate.basicFunction("", [
|
||||
"while(newTags.length) {",
|
||||
Template.indent([
|
||||
"var newTag = newTags.pop();",
|
||||
"newTag.sheet.disabled = false"
|
||||
]),
|
||||
"}"
|
||||
])} };`
|
||||
])}`,
|
||||
`var cssTextKey = ${runtimeTemplate.returningFunction(
|
||||
`Array.from(link.sheet.cssRules, ${runtimeTemplate.returningFunction(
|
||||
"r.cssText",
|
||||
"r"
|
||||
)}).join()`,
|
||||
"link"
|
||||
)};`,
|
||||
`${
|
||||
RuntimeGlobals.hmrDownloadUpdateHandlers
|
||||
}.css = ${runtimeTemplate.basicFunction(
|
||||
"chunkIds, removedChunks, removedModules, promises, applyHandlers, updatedModulesList",
|
||||
[
|
||||
isNeutralPlatform
|
||||
? "if (typeof document === 'undefined') return;"
|
||||
: "",
|
||||
"applyHandlers.push(applyHandler);",
|
||||
`chunkIds.forEach(${runtimeTemplate.basicFunction("chunkId", [
|
||||
`var filename = ${RuntimeGlobals.getChunkCssFilename}(chunkId);`,
|
||||
`var url = ${RuntimeGlobals.publicPath} + filename;`,
|
||||
"var oldTag = loadStylesheet(chunkId, url);",
|
||||
"if(!oldTag) return;",
|
||||
`promises.push(new Promise(${runtimeTemplate.basicFunction(
|
||||
"resolve, reject",
|
||||
[
|
||||
`var link = loadStylesheet(chunkId, url + (url.indexOf("?") < 0 ? "?" : "&") + "hmr=" + Date.now(), ${runtimeTemplate.basicFunction(
|
||||
"event",
|
||||
[
|
||||
'if(event.type !== "load") {',
|
||||
Template.indent([
|
||||
"var errorType = event && event.type;",
|
||||
"var realHref = event && event.target && event.target.href;",
|
||||
"error.message = 'Loading css hot update chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realHref + ')';",
|
||||
"error.name = 'ChunkLoadError';",
|
||||
"error.type = errorType;",
|
||||
"error.request = realHref;",
|
||||
"reject(error);"
|
||||
]),
|
||||
"} else {",
|
||||
Template.indent([
|
||||
"try { if(cssTextKey(oldTag) == cssTextKey(link)) { if(link.parentNode) link.parentNode.removeChild(link); return resolve(); } } catch(e) {}",
|
||||
"link.sheet.disabled = true;",
|
||||
"oldTags.push(oldTag);",
|
||||
"newTags.push(link);",
|
||||
"resolve();"
|
||||
]),
|
||||
"}"
|
||||
]
|
||||
)}, ${withFetchPriority ? "undefined," : ""} oldTag);`
|
||||
]
|
||||
)}));`
|
||||
])});`
|
||||
]
|
||||
)}`
|
||||
])
|
||||
: "// no hmr"
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = CssLoadingRuntimeModule;
|
921
app_vue/node_modules/webpack/lib/css/CssModulesPlugin.js
generated
vendored
Normal file
921
app_vue/node_modules/webpack/lib/css/CssModulesPlugin.js
generated
vendored
Normal file
@ -0,0 +1,921 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const { SyncWaterfallHook, SyncHook } = require("tapable");
|
||||
const {
|
||||
ConcatSource,
|
||||
PrefixSource,
|
||||
ReplaceSource,
|
||||
CachedSource,
|
||||
RawSource
|
||||
} = require("webpack-sources");
|
||||
const Compilation = require("../Compilation");
|
||||
const CssModule = require("../CssModule");
|
||||
const { tryRunOrWebpackError } = require("../HookWebpackError");
|
||||
const HotUpdateChunk = require("../HotUpdateChunk");
|
||||
const {
|
||||
CSS_MODULE_TYPE,
|
||||
CSS_MODULE_TYPE_GLOBAL,
|
||||
CSS_MODULE_TYPE_MODULE,
|
||||
CSS_MODULE_TYPE_AUTO
|
||||
} = require("../ModuleTypeConstants");
|
||||
const NormalModule = require("../NormalModule");
|
||||
const RuntimeGlobals = require("../RuntimeGlobals");
|
||||
const SelfModuleFactory = require("../SelfModuleFactory");
|
||||
const Template = require("../Template");
|
||||
const WebpackError = require("../WebpackError");
|
||||
const CssIcssExportDependency = require("../dependencies/CssIcssExportDependency");
|
||||
const CssIcssImportDependency = require("../dependencies/CssIcssImportDependency");
|
||||
const CssIcssSymbolDependency = require("../dependencies/CssIcssSymbolDependency");
|
||||
const CssImportDependency = require("../dependencies/CssImportDependency");
|
||||
const CssLocalIdentifierDependency = require("../dependencies/CssLocalIdentifierDependency");
|
||||
const CssSelfLocalIdentifierDependency = require("../dependencies/CssSelfLocalIdentifierDependency");
|
||||
const CssUrlDependency = require("../dependencies/CssUrlDependency");
|
||||
const StaticExportsDependency = require("../dependencies/StaticExportsDependency");
|
||||
const JavascriptModulesPlugin = require("../javascript/JavascriptModulesPlugin");
|
||||
const { compareModulesByIdOrIdentifier } = require("../util/comparators");
|
||||
const createSchemaValidation = require("../util/create-schema-validation");
|
||||
const createHash = require("../util/createHash");
|
||||
const { getUndoPath } = require("../util/identifier");
|
||||
const memoize = require("../util/memoize");
|
||||
const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
|
||||
const removeBOM = require("../util/removeBOM");
|
||||
const CssGenerator = require("./CssGenerator");
|
||||
const CssParser = require("./CssParser");
|
||||
|
||||
/** @typedef {import("webpack-sources").Source} Source */
|
||||
/** @typedef {import("../../declarations/WebpackOptions").HashFunction} HashFunction */
|
||||
/** @typedef {import("../../declarations/WebpackOptions").OutputNormalized} OutputOptions */
|
||||
/** @typedef {import("../Chunk")} Chunk */
|
||||
/** @typedef {import("../ChunkGraph")} ChunkGraph */
|
||||
/** @typedef {import("../CodeGenerationResults")} CodeGenerationResults */
|
||||
/** @typedef {import("../Compilation").ChunkHashContext} ChunkHashContext */
|
||||
/** @typedef {import("../Compiler")} Compiler */
|
||||
/** @typedef {import("../CssModule").Inheritance} Inheritance */
|
||||
/** @typedef {import("../Module")} Module */
|
||||
/** @typedef {import("../Module").BuildInfo} BuildInfo */
|
||||
/** @typedef {import("../Template").RuntimeTemplate} RuntimeTemplate */
|
||||
/** @typedef {import("../TemplatedPathPlugin").TemplatePath} TemplatePath */
|
||||
/** @typedef {import("../util/Hash")} Hash */
|
||||
/** @typedef {import("../util/memoize")} Memoize */
|
||||
|
||||
/**
|
||||
* @typedef {object} RenderContext
|
||||
* @property {Chunk} chunk the chunk
|
||||
* @property {ChunkGraph} chunkGraph the chunk graph
|
||||
* @property {CodeGenerationResults} codeGenerationResults results of code generation
|
||||
* @property {RuntimeTemplate} runtimeTemplate the runtime template
|
||||
* @property {string} uniqueName the unique name
|
||||
* @property {string} undoPath undo path to css file
|
||||
* @property {CssModule[]} modules modules
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {object} ChunkRenderContext
|
||||
* @property {Chunk} chunk the chunk
|
||||
* @property {ChunkGraph} chunkGraph the chunk graph
|
||||
* @property {CodeGenerationResults} codeGenerationResults results of code generation
|
||||
* @property {RuntimeTemplate} runtimeTemplate the runtime template
|
||||
* @property {string} undoPath undo path to css file
|
||||
*/
|
||||
|
||||
/**
|
||||
* @typedef {object} CompilationHooks
|
||||
* @property {SyncWaterfallHook<[Source, Module, ChunkRenderContext]>} renderModulePackage
|
||||
* @property {SyncHook<[Chunk, Hash, ChunkHashContext]>} chunkHash
|
||||
*/
|
||||
|
||||
const getCssLoadingRuntimeModule = memoize(() =>
|
||||
require("./CssLoadingRuntimeModule")
|
||||
);
|
||||
|
||||
/**
|
||||
* @param {string} name name
|
||||
* @returns {{ oneOf: [{ $ref: string }], definitions: import("../../schemas/WebpackOptions.json")["definitions"] }} schema
|
||||
*/
|
||||
const getSchema = name => {
|
||||
const { definitions } = require("../../schemas/WebpackOptions.json");
|
||||
return {
|
||||
definitions,
|
||||
oneOf: [{ $ref: `#/definitions/${name}` }]
|
||||
};
|
||||
};
|
||||
|
||||
const generatorValidationOptions = {
|
||||
name: "Css Modules Plugin",
|
||||
baseDataPath: "generator"
|
||||
};
|
||||
const validateGeneratorOptions = {
|
||||
css: createSchemaValidation(
|
||||
require("../../schemas/plugins/css/CssGeneratorOptions.check.js"),
|
||||
() => getSchema("CssGeneratorOptions"),
|
||||
generatorValidationOptions
|
||||
),
|
||||
"css/auto": createSchemaValidation(
|
||||
require("../../schemas/plugins/css/CssAutoGeneratorOptions.check.js"),
|
||||
() => getSchema("CssAutoGeneratorOptions"),
|
||||
generatorValidationOptions
|
||||
),
|
||||
"css/module": createSchemaValidation(
|
||||
require("../../schemas/plugins/css/CssModuleGeneratorOptions.check.js"),
|
||||
() => getSchema("CssModuleGeneratorOptions"),
|
||||
generatorValidationOptions
|
||||
),
|
||||
"css/global": createSchemaValidation(
|
||||
require("../../schemas/plugins/css/CssGlobalGeneratorOptions.check.js"),
|
||||
() => getSchema("CssGlobalGeneratorOptions"),
|
||||
generatorValidationOptions
|
||||
)
|
||||
};
|
||||
|
||||
const parserValidationOptions = {
|
||||
name: "Css Modules Plugin",
|
||||
baseDataPath: "parser"
|
||||
};
|
||||
const validateParserOptions = {
|
||||
css: createSchemaValidation(
|
||||
require("../../schemas/plugins/css/CssParserOptions.check.js"),
|
||||
() => getSchema("CssParserOptions"),
|
||||
parserValidationOptions
|
||||
),
|
||||
"css/auto": createSchemaValidation(
|
||||
require("../../schemas/plugins/css/CssAutoParserOptions.check.js"),
|
||||
() => getSchema("CssAutoParserOptions"),
|
||||
parserValidationOptions
|
||||
),
|
||||
"css/module": createSchemaValidation(
|
||||
require("../../schemas/plugins/css/CssModuleParserOptions.check.js"),
|
||||
() => getSchema("CssModuleParserOptions"),
|
||||
parserValidationOptions
|
||||
),
|
||||
"css/global": createSchemaValidation(
|
||||
require("../../schemas/plugins/css/CssGlobalParserOptions.check.js"),
|
||||
() => getSchema("CssGlobalParserOptions"),
|
||||
parserValidationOptions
|
||||
)
|
||||
};
|
||||
|
||||
/** @type {WeakMap<Compilation, CompilationHooks>} */
|
||||
const compilationHooksMap = new WeakMap();
|
||||
|
||||
const PLUGIN_NAME = "CssModulesPlugin";
|
||||
|
||||
class CssModulesPlugin {
|
||||
/**
|
||||
* @param {Compilation} compilation the compilation
|
||||
* @returns {CompilationHooks} the attached hooks
|
||||
*/
|
||||
static getCompilationHooks(compilation) {
|
||||
if (!(compilation instanceof Compilation)) {
|
||||
throw new TypeError(
|
||||
"The 'compilation' argument must be an instance of Compilation"
|
||||
);
|
||||
}
|
||||
let hooks = compilationHooksMap.get(compilation);
|
||||
if (hooks === undefined) {
|
||||
hooks = {
|
||||
renderModulePackage: new SyncWaterfallHook([
|
||||
"source",
|
||||
"module",
|
||||
"renderContext"
|
||||
]),
|
||||
chunkHash: new SyncHook(["chunk", "hash", "context"])
|
||||
};
|
||||
compilationHooksMap.set(compilation, hooks);
|
||||
}
|
||||
return hooks;
|
||||
}
|
||||
|
||||
constructor() {
|
||||
/** @type {WeakMap<Source, { undoPath: string, inheritance: Inheritance, source: CachedSource }>} */
|
||||
this._moduleFactoryCache = new WeakMap();
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply the plugin
|
||||
* @param {Compiler} compiler the compiler instance
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(compiler) {
|
||||
compiler.hooks.compilation.tap(
|
||||
PLUGIN_NAME,
|
||||
(compilation, { normalModuleFactory }) => {
|
||||
const hooks = CssModulesPlugin.getCompilationHooks(compilation);
|
||||
const selfFactory = new SelfModuleFactory(compilation.moduleGraph);
|
||||
compilation.dependencyFactories.set(
|
||||
CssImportDependency,
|
||||
normalModuleFactory
|
||||
);
|
||||
compilation.dependencyTemplates.set(
|
||||
CssImportDependency,
|
||||
new CssImportDependency.Template()
|
||||
);
|
||||
compilation.dependencyFactories.set(
|
||||
CssUrlDependency,
|
||||
normalModuleFactory
|
||||
);
|
||||
compilation.dependencyTemplates.set(
|
||||
CssUrlDependency,
|
||||
new CssUrlDependency.Template()
|
||||
);
|
||||
compilation.dependencyTemplates.set(
|
||||
CssLocalIdentifierDependency,
|
||||
new CssLocalIdentifierDependency.Template()
|
||||
);
|
||||
compilation.dependencyFactories.set(
|
||||
CssSelfLocalIdentifierDependency,
|
||||
selfFactory
|
||||
);
|
||||
compilation.dependencyTemplates.set(
|
||||
CssSelfLocalIdentifierDependency,
|
||||
new CssSelfLocalIdentifierDependency.Template()
|
||||
);
|
||||
compilation.dependencyFactories.set(
|
||||
CssIcssImportDependency,
|
||||
normalModuleFactory
|
||||
);
|
||||
compilation.dependencyTemplates.set(
|
||||
CssIcssImportDependency,
|
||||
new CssIcssImportDependency.Template()
|
||||
);
|
||||
compilation.dependencyTemplates.set(
|
||||
CssIcssExportDependency,
|
||||
new CssIcssExportDependency.Template()
|
||||
);
|
||||
compilation.dependencyTemplates.set(
|
||||
CssIcssSymbolDependency,
|
||||
new CssIcssSymbolDependency.Template()
|
||||
);
|
||||
compilation.dependencyTemplates.set(
|
||||
StaticExportsDependency,
|
||||
new StaticExportsDependency.Template()
|
||||
);
|
||||
for (const type of [
|
||||
CSS_MODULE_TYPE,
|
||||
CSS_MODULE_TYPE_GLOBAL,
|
||||
CSS_MODULE_TYPE_MODULE,
|
||||
CSS_MODULE_TYPE_AUTO
|
||||
]) {
|
||||
normalModuleFactory.hooks.createParser
|
||||
.for(type)
|
||||
.tap(PLUGIN_NAME, parserOptions => {
|
||||
validateParserOptions[type](parserOptions);
|
||||
const { url, import: importOption, namedExports } = parserOptions;
|
||||
|
||||
switch (type) {
|
||||
case CSS_MODULE_TYPE:
|
||||
return new CssParser({
|
||||
importOption,
|
||||
url,
|
||||
namedExports
|
||||
});
|
||||
case CSS_MODULE_TYPE_GLOBAL:
|
||||
return new CssParser({
|
||||
defaultMode: "global",
|
||||
importOption,
|
||||
url,
|
||||
namedExports
|
||||
});
|
||||
case CSS_MODULE_TYPE_MODULE:
|
||||
return new CssParser({
|
||||
defaultMode: "local",
|
||||
importOption,
|
||||
url,
|
||||
namedExports
|
||||
});
|
||||
case CSS_MODULE_TYPE_AUTO:
|
||||
return new CssParser({
|
||||
defaultMode: "auto",
|
||||
importOption,
|
||||
url,
|
||||
namedExports
|
||||
});
|
||||
}
|
||||
});
|
||||
normalModuleFactory.hooks.createGenerator
|
||||
.for(type)
|
||||
.tap(PLUGIN_NAME, generatorOptions => {
|
||||
validateGeneratorOptions[type](generatorOptions);
|
||||
|
||||
return new CssGenerator(
|
||||
generatorOptions,
|
||||
compilation.moduleGraph
|
||||
);
|
||||
});
|
||||
normalModuleFactory.hooks.createModuleClass
|
||||
.for(type)
|
||||
.tap(PLUGIN_NAME, (createData, resolveData) => {
|
||||
if (resolveData.dependencies.length > 0) {
|
||||
// When CSS is imported from CSS there is only one dependency
|
||||
const dependency = resolveData.dependencies[0];
|
||||
|
||||
if (dependency instanceof CssImportDependency) {
|
||||
const parent =
|
||||
/** @type {CssModule} */
|
||||
(compilation.moduleGraph.getParentModule(dependency));
|
||||
|
||||
if (parent instanceof CssModule) {
|
||||
/** @type {import("../CssModule").Inheritance | undefined} */
|
||||
let inheritance;
|
||||
|
||||
if (
|
||||
parent.cssLayer !== undefined ||
|
||||
parent.supports ||
|
||||
parent.media
|
||||
) {
|
||||
if (!inheritance) {
|
||||
inheritance = [];
|
||||
}
|
||||
|
||||
inheritance.push([
|
||||
parent.cssLayer,
|
||||
parent.supports,
|
||||
parent.media
|
||||
]);
|
||||
}
|
||||
|
||||
if (parent.inheritance) {
|
||||
if (!inheritance) {
|
||||
inheritance = [];
|
||||
}
|
||||
|
||||
inheritance.push(...parent.inheritance);
|
||||
}
|
||||
|
||||
return new CssModule({
|
||||
...createData,
|
||||
cssLayer: dependency.layer,
|
||||
supports: dependency.supports,
|
||||
media: dependency.media,
|
||||
inheritance
|
||||
});
|
||||
}
|
||||
|
||||
return new CssModule({
|
||||
...createData,
|
||||
cssLayer: dependency.layer,
|
||||
supports: dependency.supports,
|
||||
media: dependency.media
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return new CssModule(createData);
|
||||
});
|
||||
|
||||
NormalModule.getCompilationHooks(compilation).processResult.tap(
|
||||
PLUGIN_NAME,
|
||||
(result, module) => {
|
||||
if (module.type === type) {
|
||||
const [source, ...rest] = result;
|
||||
|
||||
return [removeBOM(source), ...rest];
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
JavascriptModulesPlugin.getCompilationHooks(
|
||||
compilation
|
||||
).renderModuleContent.tap(PLUGIN_NAME, (source, module) => {
|
||||
if (module instanceof CssModule && module.hot) {
|
||||
const cssData = /** @type {BuildInfo} */ (module.buildInfo).cssData;
|
||||
if (!cssData) {
|
||||
return source;
|
||||
}
|
||||
const exports = cssData.exports;
|
||||
const stringifiedExports = JSON.stringify(
|
||||
JSON.stringify(
|
||||
Array.from(exports).reduce((obj, [key, value]) => {
|
||||
obj[key] = value;
|
||||
return obj;
|
||||
}, /** @type {Record<string, string>} */ ({}))
|
||||
)
|
||||
);
|
||||
|
||||
const hmrCode = Template.asString([
|
||||
"",
|
||||
`var __webpack_css_exports__ = ${stringifiedExports};`,
|
||||
"// only invalidate when locals change",
|
||||
"if (module.hot.data && module.hot.data.__webpack_css_exports__ && module.hot.data.__webpack_css_exports__ != __webpack_css_exports__) {",
|
||||
Template.indent("module.hot.invalidate();"),
|
||||
"} else {",
|
||||
Template.indent("module.hot.accept();"),
|
||||
"}",
|
||||
"module.hot.dispose(function(data) { data.__webpack_css_exports__ = __webpack_css_exports__; });"
|
||||
]);
|
||||
|
||||
return new ConcatSource(source, "\n", new RawSource(hmrCode));
|
||||
}
|
||||
|
||||
return source;
|
||||
});
|
||||
const orderedCssModulesPerChunk = new WeakMap();
|
||||
compilation.hooks.afterCodeGeneration.tap(PLUGIN_NAME, () => {
|
||||
const { chunkGraph } = compilation;
|
||||
for (const chunk of compilation.chunks) {
|
||||
if (CssModulesPlugin.chunkHasCss(chunk, chunkGraph)) {
|
||||
orderedCssModulesPerChunk.set(
|
||||
chunk,
|
||||
this.getOrderedChunkCssModules(chunk, chunkGraph, compilation)
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
compilation.hooks.chunkHash.tap(PLUGIN_NAME, (chunk, hash, context) => {
|
||||
hooks.chunkHash.call(chunk, hash, context);
|
||||
});
|
||||
compilation.hooks.contentHash.tap(PLUGIN_NAME, chunk => {
|
||||
const {
|
||||
chunkGraph,
|
||||
codeGenerationResults,
|
||||
moduleGraph,
|
||||
runtimeTemplate,
|
||||
outputOptions: {
|
||||
hashSalt,
|
||||
hashDigest,
|
||||
hashDigestLength,
|
||||
hashFunction
|
||||
}
|
||||
} = compilation;
|
||||
const hash = createHash(/** @type {HashFunction} */ (hashFunction));
|
||||
if (hashSalt) hash.update(hashSalt);
|
||||
hooks.chunkHash.call(chunk, hash, {
|
||||
chunkGraph,
|
||||
codeGenerationResults,
|
||||
moduleGraph,
|
||||
runtimeTemplate
|
||||
});
|
||||
const modules = orderedCssModulesPerChunk.get(chunk);
|
||||
if (modules) {
|
||||
for (const module of modules) {
|
||||
hash.update(chunkGraph.getModuleHash(module, chunk.runtime));
|
||||
}
|
||||
}
|
||||
const digest = /** @type {string} */ (hash.digest(hashDigest));
|
||||
chunk.contentHash.css = nonNumericOnlyHash(
|
||||
digest,
|
||||
/** @type {number} */
|
||||
(hashDigestLength)
|
||||
);
|
||||
});
|
||||
compilation.hooks.renderManifest.tap(PLUGIN_NAME, (result, options) => {
|
||||
const { chunkGraph } = compilation;
|
||||
const { hash, chunk, codeGenerationResults, runtimeTemplate } =
|
||||
options;
|
||||
|
||||
if (chunk instanceof HotUpdateChunk) return result;
|
||||
|
||||
/** @type {CssModule[] | undefined} */
|
||||
const modules = orderedCssModulesPerChunk.get(chunk);
|
||||
if (modules !== undefined) {
|
||||
const { path: filename, info } = compilation.getPathWithInfo(
|
||||
CssModulesPlugin.getChunkFilenameTemplate(
|
||||
chunk,
|
||||
compilation.outputOptions
|
||||
),
|
||||
{
|
||||
hash,
|
||||
runtime: chunk.runtime,
|
||||
chunk,
|
||||
contentHashType: "css"
|
||||
}
|
||||
);
|
||||
const undoPath = getUndoPath(
|
||||
filename,
|
||||
/** @type {string} */
|
||||
(compilation.outputOptions.path),
|
||||
false
|
||||
);
|
||||
result.push({
|
||||
render: () =>
|
||||
this.renderChunk(
|
||||
{
|
||||
chunk,
|
||||
chunkGraph,
|
||||
codeGenerationResults,
|
||||
uniqueName:
|
||||
/** @type {string} */
|
||||
(compilation.outputOptions.uniqueName),
|
||||
undoPath,
|
||||
modules,
|
||||
runtimeTemplate
|
||||
},
|
||||
hooks
|
||||
),
|
||||
filename,
|
||||
info,
|
||||
identifier: `css${chunk.id}`,
|
||||
hash: chunk.contentHash.css
|
||||
});
|
||||
}
|
||||
return result;
|
||||
});
|
||||
const globalChunkLoading = compilation.outputOptions.chunkLoading;
|
||||
/**
|
||||
* @param {Chunk} chunk the chunk
|
||||
* @returns {boolean} true, when enabled
|
||||
*/
|
||||
const isEnabledForChunk = chunk => {
|
||||
const options = chunk.getEntryOptions();
|
||||
const chunkLoading =
|
||||
options && options.chunkLoading !== undefined
|
||||
? options.chunkLoading
|
||||
: globalChunkLoading;
|
||||
return chunkLoading === "jsonp" || chunkLoading === "import";
|
||||
};
|
||||
const onceForChunkSet = new WeakSet();
|
||||
/**
|
||||
* @param {Chunk} chunk chunk to check
|
||||
* @param {Set<string>} set runtime requirements
|
||||
*/
|
||||
const handler = (chunk, set) => {
|
||||
if (onceForChunkSet.has(chunk)) return;
|
||||
onceForChunkSet.add(chunk);
|
||||
if (!isEnabledForChunk(chunk)) return;
|
||||
|
||||
set.add(RuntimeGlobals.makeNamespaceObject);
|
||||
|
||||
const CssLoadingRuntimeModule = getCssLoadingRuntimeModule();
|
||||
compilation.addRuntimeModule(chunk, new CssLoadingRuntimeModule(set));
|
||||
};
|
||||
compilation.hooks.runtimeRequirementInTree
|
||||
.for(RuntimeGlobals.hasCssModules)
|
||||
.tap(PLUGIN_NAME, handler);
|
||||
compilation.hooks.runtimeRequirementInTree
|
||||
.for(RuntimeGlobals.ensureChunkHandlers)
|
||||
.tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => {
|
||||
if (!isEnabledForChunk(chunk)) return;
|
||||
if (
|
||||
!chunkGraph.hasModuleInGraph(
|
||||
chunk,
|
||||
m =>
|
||||
m.type === CSS_MODULE_TYPE ||
|
||||
m.type === CSS_MODULE_TYPE_GLOBAL ||
|
||||
m.type === CSS_MODULE_TYPE_MODULE ||
|
||||
m.type === CSS_MODULE_TYPE_AUTO
|
||||
)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
set.add(RuntimeGlobals.hasOwnProperty);
|
||||
set.add(RuntimeGlobals.publicPath);
|
||||
set.add(RuntimeGlobals.getChunkCssFilename);
|
||||
});
|
||||
compilation.hooks.runtimeRequirementInTree
|
||||
.for(RuntimeGlobals.hmrDownloadUpdateHandlers)
|
||||
.tap(PLUGIN_NAME, (chunk, set, { chunkGraph }) => {
|
||||
if (!isEnabledForChunk(chunk)) return;
|
||||
if (
|
||||
!chunkGraph.hasModuleInGraph(
|
||||
chunk,
|
||||
m =>
|
||||
m.type === CSS_MODULE_TYPE ||
|
||||
m.type === CSS_MODULE_TYPE_GLOBAL ||
|
||||
m.type === CSS_MODULE_TYPE_MODULE ||
|
||||
m.type === CSS_MODULE_TYPE_AUTO
|
||||
)
|
||||
) {
|
||||
return;
|
||||
}
|
||||
set.add(RuntimeGlobals.publicPath);
|
||||
set.add(RuntimeGlobals.getChunkCssFilename);
|
||||
});
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Chunk} chunk chunk
|
||||
* @param {Iterable<Module>} modules unordered modules
|
||||
* @param {Compilation} compilation compilation
|
||||
* @returns {Module[]} ordered modules
|
||||
*/
|
||||
getModulesInOrder(chunk, modules, compilation) {
|
||||
if (!modules) return [];
|
||||
|
||||
/** @type {Module[]} */
|
||||
const modulesList = [...modules];
|
||||
|
||||
// Get ordered list of modules per chunk group
|
||||
// Lists are in reverse order to allow to use Array.pop()
|
||||
const modulesByChunkGroup = Array.from(chunk.groupsIterable, chunkGroup => {
|
||||
const sortedModules = modulesList
|
||||
.map(module => ({
|
||||
module,
|
||||
index: chunkGroup.getModulePostOrderIndex(module)
|
||||
}))
|
||||
.filter(item => item.index !== undefined)
|
||||
.sort(
|
||||
(a, b) =>
|
||||
/** @type {number} */ (b.index) - /** @type {number} */ (a.index)
|
||||
)
|
||||
.map(item => item.module);
|
||||
|
||||
return { list: sortedModules, set: new Set(sortedModules) };
|
||||
});
|
||||
|
||||
if (modulesByChunkGroup.length === 1)
|
||||
return modulesByChunkGroup[0].list.reverse();
|
||||
|
||||
const boundCompareModulesByIdOrIdentifier = compareModulesByIdOrIdentifier(
|
||||
compilation.chunkGraph
|
||||
);
|
||||
|
||||
/**
|
||||
* @param {{ list: Module[] }} a a
|
||||
* @param {{ list: Module[] }} b b
|
||||
* @returns {-1 | 0 | 1} result
|
||||
*/
|
||||
const compareModuleLists = ({ list: a }, { list: b }) => {
|
||||
if (a.length === 0) {
|
||||
return b.length === 0 ? 0 : 1;
|
||||
}
|
||||
if (b.length === 0) return -1;
|
||||
return boundCompareModulesByIdOrIdentifier(
|
||||
a[a.length - 1],
|
||||
b[b.length - 1]
|
||||
);
|
||||
};
|
||||
|
||||
modulesByChunkGroup.sort(compareModuleLists);
|
||||
|
||||
/** @type {Module[]} */
|
||||
const finalModules = [];
|
||||
|
||||
for (;;) {
|
||||
const failedModules = new Set();
|
||||
const list = modulesByChunkGroup[0].list;
|
||||
if (list.length === 0) {
|
||||
// done, everything empty
|
||||
break;
|
||||
}
|
||||
/** @type {Module} */
|
||||
let selectedModule = list[list.length - 1];
|
||||
let hasFailed;
|
||||
outer: for (;;) {
|
||||
for (const { list, set } of modulesByChunkGroup) {
|
||||
if (list.length === 0) continue;
|
||||
const lastModule = list[list.length - 1];
|
||||
if (lastModule === selectedModule) continue;
|
||||
if (!set.has(selectedModule)) continue;
|
||||
failedModules.add(selectedModule);
|
||||
if (failedModules.has(lastModule)) {
|
||||
// There is a conflict, try other alternatives
|
||||
hasFailed = lastModule;
|
||||
continue;
|
||||
}
|
||||
selectedModule = lastModule;
|
||||
hasFailed = false;
|
||||
continue outer; // restart
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (hasFailed) {
|
||||
// There is a not resolve-able conflict with the selectedModule
|
||||
// TODO print better warning
|
||||
compilation.warnings.push(
|
||||
new WebpackError(
|
||||
`chunk ${chunk.name || chunk.id}\nConflicting order between ${
|
||||
/** @type {Module} */
|
||||
(hasFailed).readableIdentifier(compilation.requestShortener)
|
||||
} and ${selectedModule.readableIdentifier(
|
||||
compilation.requestShortener
|
||||
)}`
|
||||
)
|
||||
);
|
||||
selectedModule = /** @type {Module} */ (hasFailed);
|
||||
}
|
||||
// Insert the selected module into the final modules list
|
||||
finalModules.push(selectedModule);
|
||||
// Remove the selected module from all lists
|
||||
for (const { list, set } of modulesByChunkGroup) {
|
||||
const lastModule = list[list.length - 1];
|
||||
if (lastModule === selectedModule) list.pop();
|
||||
else if (hasFailed && set.has(selectedModule)) {
|
||||
const idx = list.indexOf(selectedModule);
|
||||
if (idx >= 0) list.splice(idx, 1);
|
||||
}
|
||||
}
|
||||
modulesByChunkGroup.sort(compareModuleLists);
|
||||
}
|
||||
return finalModules;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Chunk} chunk chunk
|
||||
* @param {ChunkGraph} chunkGraph chunk graph
|
||||
* @param {Compilation} compilation compilation
|
||||
* @returns {Module[]} ordered css modules
|
||||
*/
|
||||
getOrderedChunkCssModules(chunk, chunkGraph, compilation) {
|
||||
return [
|
||||
...this.getModulesInOrder(
|
||||
chunk,
|
||||
/** @type {Iterable<Module>} */
|
||||
(
|
||||
chunkGraph.getOrderedChunkModulesIterableBySourceType(
|
||||
chunk,
|
||||
"css-import",
|
||||
compareModulesByIdOrIdentifier(chunkGraph)
|
||||
)
|
||||
),
|
||||
compilation
|
||||
),
|
||||
...this.getModulesInOrder(
|
||||
chunk,
|
||||
/** @type {Iterable<Module>} */
|
||||
(
|
||||
chunkGraph.getOrderedChunkModulesIterableBySourceType(
|
||||
chunk,
|
||||
"css",
|
||||
compareModulesByIdOrIdentifier(chunkGraph)
|
||||
)
|
||||
),
|
||||
compilation
|
||||
)
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {CssModule} module css module
|
||||
* @param {ChunkRenderContext} renderContext options object
|
||||
* @param {CompilationHooks} hooks hooks
|
||||
* @returns {Source} css module source
|
||||
*/
|
||||
renderModule(module, renderContext, hooks) {
|
||||
const { codeGenerationResults, chunk, undoPath } = renderContext;
|
||||
const codeGenResult = codeGenerationResults.get(module, chunk.runtime);
|
||||
const moduleSourceContent =
|
||||
/** @type {Source} */
|
||||
(
|
||||
codeGenResult.sources.get("css") ||
|
||||
codeGenResult.sources.get("css-import")
|
||||
);
|
||||
const cacheEntry = this._moduleFactoryCache.get(moduleSourceContent);
|
||||
|
||||
/** @type {Inheritance} */
|
||||
const inheritance = [[module.cssLayer, module.supports, module.media]];
|
||||
if (module.inheritance) {
|
||||
inheritance.push(...module.inheritance);
|
||||
}
|
||||
|
||||
let source;
|
||||
if (
|
||||
cacheEntry &&
|
||||
cacheEntry.undoPath === undoPath &&
|
||||
cacheEntry.inheritance.every(([layer, supports, media], i) => {
|
||||
const item = inheritance[i];
|
||||
if (Array.isArray(item)) {
|
||||
return layer === item[0] && supports === item[1] && media === item[2];
|
||||
}
|
||||
return false;
|
||||
})
|
||||
) {
|
||||
source = cacheEntry.source;
|
||||
} else {
|
||||
const moduleSourceCode =
|
||||
/** @type {string} */
|
||||
(moduleSourceContent.source());
|
||||
const publicPathAutoRegex = new RegExp(
|
||||
CssUrlDependency.PUBLIC_PATH_AUTO,
|
||||
"g"
|
||||
);
|
||||
/** @type {Source} */
|
||||
let moduleSource = new ReplaceSource(moduleSourceContent);
|
||||
let match;
|
||||
while ((match = publicPathAutoRegex.exec(moduleSourceCode))) {
|
||||
/** @type {ReplaceSource} */ (moduleSource).replace(
|
||||
match.index,
|
||||
(match.index += match[0].length - 1),
|
||||
undoPath
|
||||
);
|
||||
}
|
||||
|
||||
for (let i = 0; i < inheritance.length; i++) {
|
||||
const layer = inheritance[i][0];
|
||||
const supports = inheritance[i][1];
|
||||
const media = inheritance[i][2];
|
||||
|
||||
if (media) {
|
||||
moduleSource = new ConcatSource(
|
||||
`@media ${media} {\n`,
|
||||
new PrefixSource("\t", moduleSource),
|
||||
"}\n"
|
||||
);
|
||||
}
|
||||
|
||||
if (supports) {
|
||||
moduleSource = new ConcatSource(
|
||||
`@supports (${supports}) {\n`,
|
||||
new PrefixSource("\t", moduleSource),
|
||||
"}\n"
|
||||
);
|
||||
}
|
||||
|
||||
// Layer can be anonymous
|
||||
if (layer !== undefined && layer !== null) {
|
||||
moduleSource = new ConcatSource(
|
||||
`@layer${layer ? ` ${layer}` : ""} {\n`,
|
||||
new PrefixSource("\t", moduleSource),
|
||||
"}\n"
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (moduleSource) {
|
||||
moduleSource = new ConcatSource(moduleSource, "\n");
|
||||
}
|
||||
|
||||
source = new CachedSource(moduleSource);
|
||||
this._moduleFactoryCache.set(moduleSourceContent, {
|
||||
inheritance,
|
||||
undoPath,
|
||||
source
|
||||
});
|
||||
}
|
||||
|
||||
return tryRunOrWebpackError(
|
||||
() => hooks.renderModulePackage.call(source, module, renderContext),
|
||||
"CssModulesPlugin.getCompilationHooks().renderModulePackage"
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {RenderContext} renderContext the render context
|
||||
* @param {CompilationHooks} hooks hooks
|
||||
* @returns {Source} generated source
|
||||
*/
|
||||
renderChunk(
|
||||
{
|
||||
undoPath,
|
||||
chunk,
|
||||
chunkGraph,
|
||||
codeGenerationResults,
|
||||
modules,
|
||||
runtimeTemplate
|
||||
},
|
||||
hooks
|
||||
) {
|
||||
const source = new ConcatSource();
|
||||
for (const module of modules) {
|
||||
try {
|
||||
const moduleSource = this.renderModule(
|
||||
module,
|
||||
{
|
||||
undoPath,
|
||||
chunk,
|
||||
chunkGraph,
|
||||
codeGenerationResults,
|
||||
runtimeTemplate
|
||||
},
|
||||
hooks
|
||||
);
|
||||
source.add(moduleSource);
|
||||
} catch (err) {
|
||||
/** @type {Error} */
|
||||
(err).message += `\nduring rendering of css ${module.identifier()}`;
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
chunk.rendered = true;
|
||||
return source;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Chunk} chunk chunk
|
||||
* @param {OutputOptions} outputOptions output options
|
||||
* @returns {TemplatePath} used filename template
|
||||
*/
|
||||
static getChunkFilenameTemplate(chunk, outputOptions) {
|
||||
if (chunk.cssFilenameTemplate) {
|
||||
return chunk.cssFilenameTemplate;
|
||||
} else if (chunk.canBeInitial()) {
|
||||
return /** @type {TemplatePath} */ (outputOptions.cssFilename);
|
||||
}
|
||||
return /** @type {TemplatePath} */ (outputOptions.cssChunkFilename);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Chunk} chunk chunk
|
||||
* @param {ChunkGraph} chunkGraph chunk graph
|
||||
* @returns {boolean} true, when the chunk has css
|
||||
*/
|
||||
static chunkHasCss(chunk, chunkGraph) {
|
||||
return (
|
||||
Boolean(chunkGraph.getChunkModulesIterableBySourceType(chunk, "css")) ||
|
||||
Boolean(
|
||||
chunkGraph.getChunkModulesIterableBySourceType(chunk, "css-import")
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = CssModulesPlugin;
|
1622
app_vue/node_modules/webpack/lib/css/CssParser.js
generated
vendored
Normal file
1622
app_vue/node_modules/webpack/lib/css/CssParser.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1627
app_vue/node_modules/webpack/lib/css/walkCssTokens.js
generated
vendored
Normal file
1627
app_vue/node_modules/webpack/lib/css/walkCssTokens.js
generated
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user