push the uni-demo project
This commit is contained in:
139
uni-demo/node_modules/webpack/lib/css/CssExportsGenerator.js
generated
vendored
Normal file
139
uni-demo/node_modules/webpack/lib/css/CssExportsGenerator.js
generated
vendored
Normal file
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
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 RuntimeGlobals = require("../RuntimeGlobals");
|
||||
const Template = require("../Template");
|
||||
|
||||
/** @typedef {import("webpack-sources").Source} Source */
|
||||
/** @typedef {import("../Dependency")} Dependency */
|
||||
/** @typedef {import("../Generator").GenerateContext} GenerateContext */
|
||||
/** @typedef {import("../Generator").UpdateHashContext} UpdateHashContext */
|
||||
/** @typedef {import("../Module").ConcatenationBailoutReasonContext} ConcatenationBailoutReasonContext */
|
||||
/** @typedef {import("../NormalModule")} NormalModule */
|
||||
/** @typedef {import("../util/Hash")} Hash */
|
||||
|
||||
const TYPES = new Set(["javascript"]);
|
||||
|
||||
class CssExportsGenerator extends Generator {
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
|
||||
// TODO add getConcatenationBailoutReason to allow concatenation
|
||||
// but how to make it have a module id
|
||||
|
||||
/**
|
||||
* @param {NormalModule} module module for which the code should be generated
|
||||
* @param {GenerateContext} generateContext context for generate
|
||||
* @returns {Source} generated code
|
||||
*/
|
||||
generate(module, generateContext) {
|
||||
const source = new ReplaceSource(new RawSource(""));
|
||||
const initFragments = [];
|
||||
const cssExports = new Map();
|
||||
|
||||
generateContext.runtimeRequirements.add(RuntimeGlobals.module);
|
||||
|
||||
const runtimeRequirements = new Set();
|
||||
|
||||
const templateContext = {
|
||||
runtimeTemplate: generateContext.runtimeTemplate,
|
||||
dependencyTemplates: generateContext.dependencyTemplates,
|
||||
moduleGraph: generateContext.moduleGraph,
|
||||
chunkGraph: generateContext.chunkGraph,
|
||||
module,
|
||||
runtime: generateContext.runtime,
|
||||
runtimeRequirements: runtimeRequirements,
|
||||
concatenationScope: generateContext.concatenationScope,
|
||||
codeGenerationResults: generateContext.codeGenerationResults,
|
||||
initFragments,
|
||||
cssExports
|
||||
};
|
||||
|
||||
const handleDependency = dependency => {
|
||||
const constructor = /** @type {new (...args: 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);
|
||||
};
|
||||
module.dependencies.forEach(handleDependency);
|
||||
|
||||
if (generateContext.concatenationScope) {
|
||||
const source = new ConcatSource();
|
||||
const usedIdentifiers = new Set();
|
||||
for (const [k, v] of cssExports) {
|
||||
let identifier = Template.toIdentifier(k);
|
||||
let i = 0;
|
||||
while (usedIdentifiers.has(identifier)) {
|
||||
identifier = Template.toIdentifier(k + i);
|
||||
}
|
||||
usedIdentifiers.add(identifier);
|
||||
generateContext.concatenationScope.registerExport(k, identifier);
|
||||
source.add(
|
||||
`${
|
||||
generateContext.runtimeTemplate.supportsConst ? "const" : "var"
|
||||
} ${identifier} = ${JSON.stringify(v)};\n`
|
||||
);
|
||||
}
|
||||
return source;
|
||||
} else {
|
||||
const otherUsed =
|
||||
generateContext.moduleGraph
|
||||
.getExportsInfo(module)
|
||||
.otherExportsInfo.getUsed(generateContext.runtime) !==
|
||||
UsageState.Unused;
|
||||
if (otherUsed) {
|
||||
generateContext.runtimeRequirements.add(
|
||||
RuntimeGlobals.makeNamespaceObject
|
||||
);
|
||||
}
|
||||
return new RawSource(
|
||||
`${otherUsed ? `${RuntimeGlobals.makeNamespaceObject}(` : ""}${
|
||||
module.moduleArgument
|
||||
}.exports = {\n${Array.from(
|
||||
cssExports,
|
||||
([k, v]) => `\t${JSON.stringify(k)}: ${JSON.stringify(v)}`
|
||||
).join(",\n")}\n}${otherUsed ? ")" : ""};`
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {NormalModule} module fresh module
|
||||
* @returns {Set<string>} available types (do not mutate)
|
||||
*/
|
||||
getTypes(module) {
|
||||
return TYPES;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {NormalModule} module the module
|
||||
* @param {string=} type source type
|
||||
* @returns {number} estimate size of the module
|
||||
*/
|
||||
getSize(module, type) {
|
||||
return 42;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Hash} hash hash that will be modified
|
||||
* @param {UpdateHashContext} updateHashContext context for updating hash
|
||||
*/
|
||||
updateHash(hash, { module }) {}
|
||||
}
|
||||
|
||||
module.exports = CssExportsGenerator;
|
||||
109
uni-demo/node_modules/webpack/lib/css/CssGenerator.js
generated
vendored
Normal file
109
uni-demo/node_modules/webpack/lib/css/CssGenerator.js
generated
vendored
Normal file
@@ -0,0 +1,109 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Sergey Melyukov @smelukov
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const { ReplaceSource } = require("webpack-sources");
|
||||
const Generator = require("../Generator");
|
||||
const InitFragment = require("../InitFragment");
|
||||
const RuntimeGlobals = require("../RuntimeGlobals");
|
||||
|
||||
/** @typedef {import("webpack-sources").Source} Source */
|
||||
/** @typedef {import("../Dependency")} Dependency */
|
||||
/** @typedef {import("../Generator").GenerateContext} GenerateContext */
|
||||
/** @typedef {import("../Generator").UpdateHashContext} UpdateHashContext */
|
||||
/** @typedef {import("../NormalModule")} NormalModule */
|
||||
/** @typedef {import("../util/Hash")} Hash */
|
||||
|
||||
const TYPES = new Set(["css"]);
|
||||
|
||||
class CssGenerator extends Generator {
|
||||
constructor() {
|
||||
super();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {NormalModule} module module for which the code should be generated
|
||||
* @param {GenerateContext} generateContext context for generate
|
||||
* @returns {Source} generated code
|
||||
*/
|
||||
generate(module, generateContext) {
|
||||
const originalSource = module.originalSource();
|
||||
const source = new ReplaceSource(originalSource);
|
||||
const initFragments = [];
|
||||
const cssExports = new Map();
|
||||
|
||||
generateContext.runtimeRequirements.add(RuntimeGlobals.hasCssModules);
|
||||
|
||||
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: generateContext.codeGenerationResults,
|
||||
initFragments,
|
||||
cssExports
|
||||
};
|
||||
|
||||
const handleDependency = dependency => {
|
||||
const constructor = /** @type {new (...args: 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);
|
||||
};
|
||||
module.dependencies.forEach(handleDependency);
|
||||
if (module.presentationalDependencies !== undefined)
|
||||
module.presentationalDependencies.forEach(handleDependency);
|
||||
|
||||
if (cssExports.size > 0) {
|
||||
const data = generateContext.getData();
|
||||
data.set("css-exports", cssExports);
|
||||
}
|
||||
|
||||
return InitFragment.addToSource(source, initFragments, generateContext);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {NormalModule} module fresh module
|
||||
* @returns {Set<string>} available types (do not mutate)
|
||||
*/
|
||||
getTypes(module) {
|
||||
return TYPES;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {NormalModule} module the module
|
||||
* @param {string=} type source type
|
||||
* @returns {number} estimate size of the module
|
||||
*/
|
||||
getSize(module, type) {
|
||||
const originalSource = module.originalSource();
|
||||
|
||||
if (!originalSource) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return originalSource.size();
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {Hash} hash hash that will be modified
|
||||
* @param {UpdateHashContext} updateHashContext context for updating hash
|
||||
*/
|
||||
updateHash(hash, { module }) {}
|
||||
}
|
||||
|
||||
module.exports = CssGenerator;
|
||||
440
uni-demo/node_modules/webpack/lib/css/CssLoadingRuntimeModule.js
generated
vendored
Normal file
440
uni-demo/node_modules/webpack/lib/css/CssLoadingRuntimeModule.js
generated
vendored
Normal file
@@ -0,0 +1,440 @@
|
||||
/*
|
||||
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("../Chunk")} Chunk */
|
||||
|
||||
/**
|
||||
* @typedef {Object} JsonpCompilationPluginHooks
|
||||
* @property {SyncWaterfallHook<[string, Chunk]>} createStylesheet
|
||||
*/
|
||||
|
||||
/** @type {WeakMap<Compilation, JsonpCompilationPluginHooks>} */
|
||||
const compilationHooksMap = new WeakMap();
|
||||
|
||||
class CssLoadingRuntimeModule extends RuntimeModule {
|
||||
/**
|
||||
* @param {Compilation} compilation the compilation
|
||||
* @returns {JsonpCompilationPluginHooks} 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"])
|
||||
};
|
||||
compilationHooksMap.set(compilation, hooks);
|
||||
}
|
||||
return hooks;
|
||||
}
|
||||
|
||||
constructor(runtimeRequirements, runtimeOptions) {
|
||||
super("css loading", 10);
|
||||
|
||||
this._runtimeRequirements = runtimeRequirements;
|
||||
this.runtimeOptions = runtimeOptions;
|
||||
}
|
||||
|
||||
/**
|
||||
* @returns {string} runtime code
|
||||
*/
|
||||
generate() {
|
||||
const { compilation, chunk, _runtimeRequirements } = this;
|
||||
const {
|
||||
chunkGraph,
|
||||
runtimeTemplate,
|
||||
outputOptions: {
|
||||
crossOriginLoading,
|
||||
uniqueName,
|
||||
chunkLoadTimeout: loadTimeout
|
||||
}
|
||||
} = compilation;
|
||||
const fn = RuntimeGlobals.ensureChunkHandlers;
|
||||
const conditionMap = chunkGraph.getChunkConditionMap(
|
||||
chunk,
|
||||
(chunk, chunkGraph) =>
|
||||
!!chunkGraph.getChunkModulesIterableBySourceType(chunk, "css")
|
||||
);
|
||||
const hasCssMatcher = compileBooleanMatcher(conditionMap);
|
||||
|
||||
const withLoading =
|
||||
_runtimeRequirements.has(RuntimeGlobals.ensureChunkHandlers) &&
|
||||
hasCssMatcher !== false;
|
||||
const withHmr = _runtimeRequirements.has(
|
||||
RuntimeGlobals.hmrDownloadUpdateHandlers
|
||||
);
|
||||
const initialChunkIdsWithCss = new Set();
|
||||
const initialChunkIdsWithoutCss = new Set();
|
||||
for (const c of chunk.getAllInitialChunks()) {
|
||||
(chunkHasCss(c, chunkGraph)
|
||||
? initialChunkIdsWithCss
|
||||
: initialChunkIdsWithoutCss
|
||||
).add(c.id);
|
||||
}
|
||||
|
||||
if (!withLoading && !withHmr && initialChunkIdsWithCss.size === 0) {
|
||||
return null;
|
||||
}
|
||||
|
||||
const { createStylesheet } =
|
||||
CssLoadingRuntimeModule.getCompilationHooks(compilation);
|
||||
|
||||
const stateExpression = withHmr
|
||||
? `${RuntimeGlobals.hmrRuntimeStatePrefix}_css`
|
||||
: undefined;
|
||||
|
||||
const code = Template.asString([
|
||||
"link = document.createElement('link');",
|
||||
uniqueName
|
||||
? 'link.setAttribute("data-webpack", uniqueName + ":" + key);'
|
||||
: "",
|
||||
"link.setAttribute(loadingAttribute, 1);",
|
||||
'link.rel = "stylesheet";',
|
||||
"link.href = url;",
|
||||
crossOriginLoading
|
||||
? Template.asString([
|
||||
"if (link.src.indexOf(window.location.origin + '/') !== 0) {",
|
||||
Template.indent(
|
||||
`link.crossOrigin = ${JSON.stringify(crossOriginLoading)};`
|
||||
),
|
||||
"}"
|
||||
])
|
||||
: ""
|
||||
]);
|
||||
|
||||
const cc = str => str.charCodeAt(0);
|
||||
|
||||
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} || ` : ""
|
||||
}{${Array.from(
|
||||
initialChunkIdsWithoutCss,
|
||||
id => `${JSON.stringify(id)}:0`
|
||||
).join(",")}};`,
|
||||
"",
|
||||
uniqueName
|
||||
? `var uniqueName = ${JSON.stringify(
|
||||
runtimeTemplate.outputOptions.uniqueName
|
||||
)};`
|
||||
: "// data-webpack is not used as build has no uniqueName",
|
||||
`var loadCssChunkData = ${runtimeTemplate.basicFunction(
|
||||
"target, link, chunkId",
|
||||
[
|
||||
`var data, token = "", token2, exports = {}, exportsWithId = [], exportsWithDashes = [], ${
|
||||
withHmr ? "moduleIds = [], " : ""
|
||||
}i = 0, cc = 1;`,
|
||||
"try { if(!link) link = loadStylesheet(chunkId); data = link.sheet.cssRules; data = data[data.length - 1].style; } catch(e) { data = getComputedStyle(document.head); }",
|
||||
`data = data.getPropertyValue(${
|
||||
uniqueName
|
||||
? runtimeTemplate.concatenation(
|
||||
"--webpack-",
|
||||
{ expr: "uniqueName" },
|
||||
"-",
|
||||
{ expr: "chunkId" }
|
||||
)
|
||||
: runtimeTemplate.concatenation("--webpack-", { expr: "chunkId" })
|
||||
});`,
|
||||
"if(!data) return [];",
|
||||
"for(; cc; i++) {",
|
||||
Template.indent([
|
||||
"cc = data.charCodeAt(i);",
|
||||
`if(cc == ${cc("(")}) { token2 = token; token = ""; }`,
|
||||
`else if(cc == ${cc(
|
||||
")"
|
||||
)}) { exports[token2.replace(/^_/, "")] = token.replace(/^_/, ""); token = ""; }`,
|
||||
`else if(cc == ${cc("/")} || cc == ${cc(
|
||||
"%"
|
||||
)}) { token = token.replace(/^_/, ""); exports[token] = token; exportsWithId.push(token); if(cc == ${cc(
|
||||
"%"
|
||||
)}) exportsWithDashes.push(token); token = ""; }`,
|
||||
`else if(!cc || cc == ${cc(
|
||||
","
|
||||
)}) { token = token.replace(/^_/, ""); exportsWithId.forEach(${runtimeTemplate.expressionFunction(
|
||||
`exports[x] = ${
|
||||
uniqueName
|
||||
? runtimeTemplate.concatenation(
|
||||
{ expr: "uniqueName" },
|
||||
"-",
|
||||
{ expr: "token" },
|
||||
"-",
|
||||
{ expr: "exports[x]" }
|
||||
)
|
||||
: runtimeTemplate.concatenation({ expr: "token" }, "-", {
|
||||
expr: "exports[x]"
|
||||
})
|
||||
}`,
|
||||
"x"
|
||||
)}); exportsWithDashes.forEach(${runtimeTemplate.expressionFunction(
|
||||
`exports[x] = "--" + exports[x]`,
|
||||
"x"
|
||||
)}); ${
|
||||
RuntimeGlobals.makeNamespaceObject
|
||||
}(exports); target[token] = (${runtimeTemplate.basicFunction(
|
||||
"exports, module",
|
||||
`module.exports = exports;`
|
||||
)}).bind(null, exports); ${
|
||||
withHmr ? "moduleIds.push(token); " : ""
|
||||
}token = ""; exports = {}; exportsWithId.length = 0; }`,
|
||||
`else if(cc == ${cc("\\")}) { token += data[++i] }`,
|
||||
`else { token += data[i]; }`
|
||||
]),
|
||||
"}",
|
||||
`${
|
||||
withHmr ? `if(target == ${RuntimeGlobals.moduleFactories}) ` : ""
|
||||
}installedChunks[chunkId] = 0;`,
|
||||
withHmr ? "return moduleIds;" : ""
|
||||
]
|
||||
)}`,
|
||||
'var loadingAttribute = "data-webpack-loading";',
|
||||
`var loadStylesheet = ${runtimeTemplate.basicFunction(
|
||||
"chunkId, url, done" + (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, 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 ? "hmr ? document.head.insertBefore(link, hmr) :" : "",
|
||||
"needAttach && document.head.appendChild(link);",
|
||||
"return link;"
|
||||
]
|
||||
)};`,
|
||||
initialChunkIdsWithCss.size > 2
|
||||
? `${JSON.stringify(
|
||||
Array.from(initialChunkIdsWithCss)
|
||||
)}.forEach(loadCssChunkData.bind(null, ${
|
||||
RuntimeGlobals.moduleFactories
|
||||
}, 0));`
|
||||
: initialChunkIdsWithCss.size > 0
|
||||
? `${Array.from(
|
||||
initialChunkIdsWithCss,
|
||||
id =>
|
||||
`loadCssChunkData(${
|
||||
RuntimeGlobals.moduleFactories
|
||||
}, 0, ${JSON.stringify(id)});`
|
||||
).join("")}`
|
||||
: "// no initial css",
|
||||
"",
|
||||
withLoading
|
||||
? Template.asString([
|
||||
`${fn}.css = ${runtimeTemplate.basicFunction("chunkId, promises", [
|
||||
"// 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 realSrc = event && event.target && event.target.src;",
|
||||
"error.message = 'Loading css chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';",
|
||||
"error.name = 'ChunkLoadError';",
|
||||
"error.type = errorType;",
|
||||
"error.request = realSrc;",
|
||||
"installedChunkData[1](error);"
|
||||
]),
|
||||
"} else {",
|
||||
Template.indent([
|
||||
`loadCssChunkData(${RuntimeGlobals.moduleFactories}, link, chunkId);`,
|
||||
"installedChunkData[0]();"
|
||||
]),
|
||||
"}"
|
||||
]),
|
||||
"}"
|
||||
]),
|
||||
"}"
|
||||
]
|
||||
)};`,
|
||||
"var link = loadStylesheet(chunkId, url, loadingEnded);"
|
||||
]),
|
||||
"} else installedChunks[chunkId] = 0;"
|
||||
]),
|
||||
"}"
|
||||
]),
|
||||
"}"
|
||||
])};`
|
||||
])
|
||||
: "// no chunk loading",
|
||||
"",
|
||||
withHmr
|
||||
? Template.asString([
|
||||
"var oldTags = [];",
|
||||
"var newTags = [];",
|
||||
`var applyHandler = ${runtimeTemplate.basicFunction("options", [
|
||||
`return { dispose: ${runtimeTemplate.basicFunction(
|
||||
"",
|
||||
[]
|
||||
)}, apply: ${runtimeTemplate.basicFunction("", [
|
||||
"var moduleIds = [];",
|
||||
`newTags.forEach(${runtimeTemplate.expressionFunction(
|
||||
"info[1].sheet.disabled = false",
|
||||
"info"
|
||||
)});`,
|
||||
"while(oldTags.length) {",
|
||||
Template.indent([
|
||||
"var oldTag = oldTags.pop();",
|
||||
"if(oldTag.parentNode) oldTag.parentNode.removeChild(oldTag);"
|
||||
]),
|
||||
"}",
|
||||
"while(newTags.length) {",
|
||||
Template.indent([
|
||||
`var info = newTags.pop();`,
|
||||
`var chunkModuleIds = loadCssChunkData(${RuntimeGlobals.moduleFactories}, info[1], info[0]);`,
|
||||
`chunkModuleIds.forEach(${runtimeTemplate.expressionFunction(
|
||||
"moduleIds.push(id)",
|
||||
"id"
|
||||
)});`
|
||||
]),
|
||||
"}",
|
||||
"return moduleIds;"
|
||||
])} };`
|
||||
])}`,
|
||||
`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",
|
||||
[
|
||||
"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 realSrc = event && event.target && event.target.src;",
|
||||
"error.message = 'Loading css hot update chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';",
|
||||
"error.name = 'ChunkLoadError';",
|
||||
"error.type = errorType;",
|
||||
"error.request = realSrc;",
|
||||
"reject(error);"
|
||||
]),
|
||||
"} else {",
|
||||
Template.indent([
|
||||
"try { if(cssTextKey(oldTag) == cssTextKey(link)) { if(link.parentNode) link.parentNode.removeChild(link); return resolve(); } } catch(e) {}",
|
||||
"var factories = {};",
|
||||
"loadCssChunkData(factories, link, chunkId);",
|
||||
`Object.keys(factories).forEach(${runtimeTemplate.expressionFunction(
|
||||
"updatedModulesList.push(id)",
|
||||
"id"
|
||||
)})`,
|
||||
"link.sheet.disabled = true;",
|
||||
"oldTags.push(oldTag);",
|
||||
"newTags.push([chunkId, link]);",
|
||||
"resolve();"
|
||||
]),
|
||||
"}"
|
||||
]
|
||||
)}, oldTag);`
|
||||
]
|
||||
)}));`
|
||||
])});`
|
||||
]
|
||||
)}`
|
||||
])
|
||||
: "// no hmr"
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = CssLoadingRuntimeModule;
|
||||
462
uni-demo/node_modules/webpack/lib/css/CssModulesPlugin.js
generated
vendored
Normal file
462
uni-demo/node_modules/webpack/lib/css/CssModulesPlugin.js
generated
vendored
Normal file
@@ -0,0 +1,462 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const { ConcatSource } = require("webpack-sources");
|
||||
const HotUpdateChunk = require("../HotUpdateChunk");
|
||||
const RuntimeGlobals = require("../RuntimeGlobals");
|
||||
const SelfModuleFactory = require("../SelfModuleFactory");
|
||||
const CssExportDependency = require("../dependencies/CssExportDependency");
|
||||
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 { compareModulesByIdentifier } = require("../util/comparators");
|
||||
const createSchemaValidation = require("../util/create-schema-validation");
|
||||
const createHash = require("../util/createHash");
|
||||
const memoize = require("../util/memoize");
|
||||
const nonNumericOnlyHash = require("../util/nonNumericOnlyHash");
|
||||
const CssExportsGenerator = require("./CssExportsGenerator");
|
||||
const CssGenerator = require("./CssGenerator");
|
||||
const CssParser = require("./CssParser");
|
||||
|
||||
/** @typedef {import("webpack-sources").Source} Source */
|
||||
/** @typedef {import("../../declarations/WebpackOptions").CssExperimentOptions} CssExperimentOptions */
|
||||
/** @typedef {import("../Chunk")} Chunk */
|
||||
/** @typedef {import("../Compiler")} Compiler */
|
||||
/** @typedef {import("../Module")} Module */
|
||||
|
||||
const getCssLoadingRuntimeModule = memoize(() =>
|
||||
require("./CssLoadingRuntimeModule")
|
||||
);
|
||||
|
||||
const getSchema = name => {
|
||||
const { definitions } = require("../../schemas/WebpackOptions.json");
|
||||
return {
|
||||
definitions,
|
||||
oneOf: [{ $ref: `#/definitions/${name}` }]
|
||||
};
|
||||
};
|
||||
|
||||
const validateGeneratorOptions = createSchemaValidation(
|
||||
require("../../schemas/plugins/css/CssGeneratorOptions.check.js"),
|
||||
() => getSchema("CssGeneratorOptions"),
|
||||
{
|
||||
name: "Css Modules Plugin",
|
||||
baseDataPath: "parser"
|
||||
}
|
||||
);
|
||||
const validateParserOptions = createSchemaValidation(
|
||||
require("../../schemas/plugins/css/CssParserOptions.check.js"),
|
||||
() => getSchema("CssParserOptions"),
|
||||
{
|
||||
name: "Css Modules Plugin",
|
||||
baseDataPath: "parser"
|
||||
}
|
||||
);
|
||||
|
||||
const escapeCss = (str, omitOptionalUnderscore) => {
|
||||
const escaped = `${str}`.replace(
|
||||
// cspell:word uffff
|
||||
/[^a-zA-Z0-9_\u0081-\uffff-]/g,
|
||||
s => `\\${s}`
|
||||
);
|
||||
return !omitOptionalUnderscore && /^(?!--)[0-9_-]/.test(escaped)
|
||||
? `_${escaped}`
|
||||
: escaped;
|
||||
};
|
||||
|
||||
const plugin = "CssModulesPlugin";
|
||||
|
||||
class CssModulesPlugin {
|
||||
/**
|
||||
* @param {CssExperimentOptions} options options
|
||||
*/
|
||||
constructor({ exportsOnly = false }) {
|
||||
this._exportsOnly = exportsOnly;
|
||||
}
|
||||
/**
|
||||
* Apply the plugin
|
||||
* @param {Compiler} compiler the compiler instance
|
||||
* @returns {void}
|
||||
*/
|
||||
apply(compiler) {
|
||||
compiler.hooks.compilation.tap(
|
||||
plugin,
|
||||
(compilation, { normalModuleFactory }) => {
|
||||
const selfFactory = new SelfModuleFactory(compilation.moduleGraph);
|
||||
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.dependencyTemplates.set(
|
||||
CssExportDependency,
|
||||
new CssExportDependency.Template()
|
||||
);
|
||||
compilation.dependencyFactories.set(
|
||||
CssImportDependency,
|
||||
normalModuleFactory
|
||||
);
|
||||
compilation.dependencyTemplates.set(
|
||||
CssImportDependency,
|
||||
new CssImportDependency.Template()
|
||||
);
|
||||
compilation.dependencyTemplates.set(
|
||||
StaticExportsDependency,
|
||||
new StaticExportsDependency.Template()
|
||||
);
|
||||
normalModuleFactory.hooks.createParser
|
||||
.for("css")
|
||||
.tap(plugin, parserOptions => {
|
||||
validateParserOptions(parserOptions);
|
||||
return new CssParser();
|
||||
});
|
||||
normalModuleFactory.hooks.createParser
|
||||
.for("css/global")
|
||||
.tap(plugin, parserOptions => {
|
||||
validateParserOptions(parserOptions);
|
||||
return new CssParser({
|
||||
allowPseudoBlocks: false,
|
||||
allowModeSwitch: false
|
||||
});
|
||||
});
|
||||
normalModuleFactory.hooks.createParser
|
||||
.for("css/module")
|
||||
.tap(plugin, parserOptions => {
|
||||
validateParserOptions(parserOptions);
|
||||
return new CssParser({
|
||||
defaultMode: "local"
|
||||
});
|
||||
});
|
||||
normalModuleFactory.hooks.createGenerator
|
||||
.for("css")
|
||||
.tap(plugin, generatorOptions => {
|
||||
validateGeneratorOptions(generatorOptions);
|
||||
return this._exportsOnly
|
||||
? new CssExportsGenerator()
|
||||
: new CssGenerator();
|
||||
});
|
||||
normalModuleFactory.hooks.createGenerator
|
||||
.for("css/global")
|
||||
.tap(plugin, generatorOptions => {
|
||||
validateGeneratorOptions(generatorOptions);
|
||||
return this._exportsOnly
|
||||
? new CssExportsGenerator()
|
||||
: new CssGenerator();
|
||||
});
|
||||
normalModuleFactory.hooks.createGenerator
|
||||
.for("css/module")
|
||||
.tap(plugin, generatorOptions => {
|
||||
validateGeneratorOptions(generatorOptions);
|
||||
return this._exportsOnly
|
||||
? new CssExportsGenerator()
|
||||
: new CssGenerator();
|
||||
});
|
||||
const orderedCssModulesPerChunk = new WeakMap();
|
||||
compilation.hooks.afterCodeGeneration.tap("CssModulesPlugin", () => {
|
||||
const { chunkGraph } = compilation;
|
||||
for (const chunk of compilation.chunks) {
|
||||
if (CssModulesPlugin.chunkHasCss(chunk, chunkGraph)) {
|
||||
orderedCssModulesPerChunk.set(
|
||||
chunk,
|
||||
this.getOrderedChunkCssModules(chunk, chunkGraph, compilation)
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
compilation.hooks.contentHash.tap("CssModulesPlugin", chunk => {
|
||||
const {
|
||||
chunkGraph,
|
||||
outputOptions: {
|
||||
hashSalt,
|
||||
hashDigest,
|
||||
hashDigestLength,
|
||||
hashFunction
|
||||
}
|
||||
} = compilation;
|
||||
const modules = orderedCssModulesPerChunk.get(chunk);
|
||||
if (modules === undefined) return;
|
||||
const hash = createHash(hashFunction);
|
||||
if (hashSalt) hash.update(hashSalt);
|
||||
for (const module of modules) {
|
||||
hash.update(chunkGraph.getModuleHash(module, chunk.runtime));
|
||||
}
|
||||
const digest = /** @type {string} */ (hash.digest(hashDigest));
|
||||
chunk.contentHash.css = nonNumericOnlyHash(digest, hashDigestLength);
|
||||
});
|
||||
compilation.hooks.renderManifest.tap(plugin, (result, options) => {
|
||||
const { chunkGraph } = compilation;
|
||||
const { hash, chunk, codeGenerationResults } = options;
|
||||
|
||||
if (chunk instanceof HotUpdateChunk) return result;
|
||||
|
||||
const modules = orderedCssModulesPerChunk.get(chunk);
|
||||
if (modules !== undefined) {
|
||||
result.push({
|
||||
render: () =>
|
||||
this.renderChunk({
|
||||
chunk,
|
||||
chunkGraph,
|
||||
codeGenerationResults,
|
||||
uniqueName: compilation.outputOptions.uniqueName,
|
||||
modules
|
||||
}),
|
||||
filenameTemplate: CssModulesPlugin.getChunkFilenameTemplate(
|
||||
chunk,
|
||||
compilation.outputOptions
|
||||
),
|
||||
pathOptions: {
|
||||
hash,
|
||||
runtime: chunk.runtime,
|
||||
chunk,
|
||||
contentHashType: "css"
|
||||
},
|
||||
identifier: `css${chunk.id}`,
|
||||
hash: chunk.contentHash.css
|
||||
});
|
||||
}
|
||||
return result;
|
||||
});
|
||||
const enabledChunks = new WeakSet();
|
||||
const handler = (chunk, set) => {
|
||||
if (enabledChunks.has(chunk)) {
|
||||
return;
|
||||
}
|
||||
enabledChunks.add(chunk);
|
||||
|
||||
set.add(RuntimeGlobals.publicPath);
|
||||
set.add(RuntimeGlobals.getChunkCssFilename);
|
||||
set.add(RuntimeGlobals.hasOwnProperty);
|
||||
set.add(RuntimeGlobals.moduleFactoriesAddOnly);
|
||||
set.add(RuntimeGlobals.makeNamespaceObject);
|
||||
|
||||
const CssLoadingRuntimeModule = getCssLoadingRuntimeModule();
|
||||
compilation.addRuntimeModule(chunk, new CssLoadingRuntimeModule(set));
|
||||
};
|
||||
compilation.hooks.runtimeRequirementInTree
|
||||
.for(RuntimeGlobals.hasCssModules)
|
||||
.tap(plugin, handler);
|
||||
compilation.hooks.runtimeRequirementInTree
|
||||
.for(RuntimeGlobals.ensureChunkHandlers)
|
||||
.tap(plugin, handler);
|
||||
compilation.hooks.runtimeRequirementInTree
|
||||
.for(RuntimeGlobals.hmrDownloadUpdateHandlers)
|
||||
.tap(plugin, handler);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
getModulesInOrder(chunk, modules, compilation) {
|
||||
if (!modules) return [];
|
||||
|
||||
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 => {
|
||||
return {
|
||||
module,
|
||||
index: chunkGroup.getModulePostOrderIndex(module)
|
||||
};
|
||||
})
|
||||
.filter(item => item.index !== undefined)
|
||||
.sort((a, b) => b.index - a.index)
|
||||
.map(item => item.module);
|
||||
|
||||
return { list: sortedModules, set: new Set(sortedModules) };
|
||||
});
|
||||
|
||||
if (modulesByChunkGroup.length === 1)
|
||||
return modulesByChunkGroup[0].list.reverse();
|
||||
|
||||
const compareModuleLists = ({ list: a }, { list: b }) => {
|
||||
if (a.length === 0) {
|
||||
return b.length === 0 ? 0 : 1;
|
||||
} else {
|
||||
if (b.length === 0) return -1;
|
||||
return compareModulesByIdentifier(a[a.length - 1], b[b.length - 1]);
|
||||
}
|
||||
};
|
||||
|
||||
modulesByChunkGroup.sort(compareModuleLists);
|
||||
|
||||
const finalModules = [];
|
||||
|
||||
for (;;) {
|
||||
const failedModules = new Set();
|
||||
const list = modulesByChunkGroup[0].list;
|
||||
if (list.length === 0) {
|
||||
// done, everything empty
|
||||
break;
|
||||
}
|
||||
let selectedModule = list[list.length - 1];
|
||||
let hasFailed = undefined;
|
||||
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
|
||||
if (compilation) {
|
||||
// TODO print better warning
|
||||
compilation.warnings.push(
|
||||
new Error(
|
||||
`chunk ${
|
||||
chunk.name || chunk.id
|
||||
}\nConflicting order between ${hasFailed.readableIdentifier(
|
||||
compilation.requestShortener
|
||||
)} and ${selectedModule.readableIdentifier(
|
||||
compilation.requestShortener
|
||||
)}`
|
||||
)
|
||||
);
|
||||
}
|
||||
selectedModule = 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;
|
||||
}
|
||||
|
||||
getOrderedChunkCssModules(chunk, chunkGraph, compilation) {
|
||||
return [
|
||||
...this.getModulesInOrder(
|
||||
chunk,
|
||||
chunkGraph.getOrderedChunkModulesIterableBySourceType(
|
||||
chunk,
|
||||
"css-import",
|
||||
compareModulesByIdentifier
|
||||
),
|
||||
compilation
|
||||
),
|
||||
...this.getModulesInOrder(
|
||||
chunk,
|
||||
chunkGraph.getOrderedChunkModulesIterableBySourceType(
|
||||
chunk,
|
||||
"css",
|
||||
compareModulesByIdentifier
|
||||
),
|
||||
compilation
|
||||
)
|
||||
];
|
||||
}
|
||||
|
||||
renderChunk({
|
||||
uniqueName,
|
||||
chunk,
|
||||
chunkGraph,
|
||||
codeGenerationResults,
|
||||
modules
|
||||
}) {
|
||||
const source = new ConcatSource();
|
||||
const metaData = [];
|
||||
for (const module of modules) {
|
||||
try {
|
||||
const codeGenResult = codeGenerationResults.get(module, chunk.runtime);
|
||||
|
||||
const s =
|
||||
codeGenResult.sources.get("css") ||
|
||||
codeGenResult.sources.get("css-import");
|
||||
if (s) {
|
||||
source.add(s);
|
||||
source.add("\n");
|
||||
}
|
||||
const exports =
|
||||
codeGenResult.data && codeGenResult.data.get("css-exports");
|
||||
const moduleId = chunkGraph.getModuleId(module) + "";
|
||||
metaData.push(
|
||||
`${
|
||||
exports
|
||||
? Array.from(exports, ([n, v]) => {
|
||||
const shortcutValue = `${
|
||||
uniqueName ? uniqueName + "-" : ""
|
||||
}${moduleId}-${n}`;
|
||||
return v === shortcutValue
|
||||
? `${escapeCss(n)}/`
|
||||
: v === "--" + shortcutValue
|
||||
? `${escapeCss(n)}%`
|
||||
: `${escapeCss(n)}(${escapeCss(v)})`;
|
||||
}).join("")
|
||||
: ""
|
||||
}${escapeCss(moduleId)}`
|
||||
);
|
||||
} catch (e) {
|
||||
e.message += `\nduring rendering of css ${module.identifier()}`;
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
source.add(
|
||||
`head{--webpack-${escapeCss(
|
||||
(uniqueName ? uniqueName + "-" : "") + chunk.id,
|
||||
true
|
||||
)}:${metaData.join(",")};}`
|
||||
);
|
||||
return source;
|
||||
}
|
||||
|
||||
static getChunkFilenameTemplate(chunk, outputOptions) {
|
||||
if (chunk.cssFilenameTemplate) {
|
||||
return chunk.cssFilenameTemplate;
|
||||
} else if (chunk.canBeInitial()) {
|
||||
return outputOptions.cssFilename;
|
||||
} else {
|
||||
return outputOptions.cssChunkFilename;
|
||||
}
|
||||
}
|
||||
|
||||
static chunkHasCss(chunk, chunkGraph) {
|
||||
return (
|
||||
!!chunkGraph.getChunkModulesIterableBySourceType(chunk, "css") ||
|
||||
!!chunkGraph.getChunkModulesIterableBySourceType(chunk, "css-import")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = CssModulesPlugin;
|
||||
618
uni-demo/node_modules/webpack/lib/css/CssParser.js
generated
vendored
Normal file
618
uni-demo/node_modules/webpack/lib/css/CssParser.js
generated
vendored
Normal file
@@ -0,0 +1,618 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const Parser = require("../Parser");
|
||||
const ConstDependency = require("../dependencies/ConstDependency");
|
||||
const CssExportDependency = require("../dependencies/CssExportDependency");
|
||||
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 walkCssTokens = require("./walkCssTokens");
|
||||
|
||||
/** @typedef {import("../Parser").ParserState} ParserState */
|
||||
/** @typedef {import("../Parser").PreparsedAst} PreparsedAst */
|
||||
|
||||
const CC_LEFT_CURLY = "{".charCodeAt(0);
|
||||
const CC_RIGHT_CURLY = "}".charCodeAt(0);
|
||||
const CC_COLON = ":".charCodeAt(0);
|
||||
const CC_SLASH = "/".charCodeAt(0);
|
||||
const CC_SEMICOLON = ";".charCodeAt(0);
|
||||
|
||||
const cssUnescape = str => {
|
||||
return str.replace(/\\([0-9a-fA-F]{1,6}[ \t\n\r\f]?|[\s\S])/g, match => {
|
||||
if (match.length > 2) {
|
||||
return String.fromCharCode(parseInt(match.slice(1).trim(), 16));
|
||||
} else {
|
||||
return match[1];
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
class LocConverter {
|
||||
constructor(input) {
|
||||
this._input = input;
|
||||
this.line = 1;
|
||||
this.column = 0;
|
||||
this.pos = 0;
|
||||
}
|
||||
|
||||
get(pos) {
|
||||
if (this.pos !== pos) {
|
||||
if (this.pos < pos) {
|
||||
const str = this._input.slice(this.pos, pos);
|
||||
let i = str.lastIndexOf("\n");
|
||||
if (i === -1) {
|
||||
this.column += str.length;
|
||||
} else {
|
||||
this.column = str.length - i - 1;
|
||||
this.line++;
|
||||
while (i > 0 && (i = str.lastIndexOf("\n", i - 1)) !== -1)
|
||||
this.line++;
|
||||
}
|
||||
} else {
|
||||
let i = this._input.lastIndexOf("\n", this.pos);
|
||||
while (i >= pos) {
|
||||
this.line--;
|
||||
i = i > 0 ? this._input.lastIndexOf("\n", i - 1) : -1;
|
||||
}
|
||||
this.column = pos - i;
|
||||
}
|
||||
this.pos = pos;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
}
|
||||
|
||||
const CSS_MODE_TOP_LEVEL = 0;
|
||||
const CSS_MODE_IN_RULE = 1;
|
||||
const CSS_MODE_IN_LOCAL_RULE = 2;
|
||||
const CSS_MODE_AT_IMPORT_EXPECT_URL = 3;
|
||||
// TODO implement layer and supports for @import
|
||||
const CSS_MODE_AT_IMPORT_EXPECT_SUPPORTS = 4;
|
||||
const CSS_MODE_AT_IMPORT_EXPECT_MEDIA = 5;
|
||||
const CSS_MODE_AT_OTHER = 6;
|
||||
|
||||
const explainMode = mode => {
|
||||
switch (mode) {
|
||||
case CSS_MODE_TOP_LEVEL:
|
||||
return "parsing top level css";
|
||||
case CSS_MODE_IN_RULE:
|
||||
return "parsing css rule content (global)";
|
||||
case CSS_MODE_IN_LOCAL_RULE:
|
||||
return "parsing css rule content (local)";
|
||||
case CSS_MODE_AT_IMPORT_EXPECT_URL:
|
||||
return "parsing @import (expecting url)";
|
||||
case CSS_MODE_AT_IMPORT_EXPECT_SUPPORTS:
|
||||
return "parsing @import (expecting optionally supports or media query)";
|
||||
case CSS_MODE_AT_IMPORT_EXPECT_MEDIA:
|
||||
return "parsing @import (expecting optionally media query)";
|
||||
case CSS_MODE_AT_OTHER:
|
||||
return "parsing at-rule";
|
||||
default:
|
||||
return mode;
|
||||
}
|
||||
};
|
||||
|
||||
class CssParser extends Parser {
|
||||
constructor({
|
||||
allowPseudoBlocks = true,
|
||||
allowModeSwitch = true,
|
||||
defaultMode = "global"
|
||||
} = {}) {
|
||||
super();
|
||||
this.allowPseudoBlocks = allowPseudoBlocks;
|
||||
this.allowModeSwitch = allowModeSwitch;
|
||||
this.defaultMode = defaultMode;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string | Buffer | PreparsedAst} source the source to parse
|
||||
* @param {ParserState} state the parser state
|
||||
* @returns {ParserState} the parser state
|
||||
*/
|
||||
parse(source, state) {
|
||||
if (Buffer.isBuffer(source)) {
|
||||
source = source.toString("utf-8");
|
||||
} else if (typeof source === "object") {
|
||||
throw new Error("webpackAst is unexpected for the CssParser");
|
||||
}
|
||||
if (source[0] === "\ufeff") {
|
||||
source = source.slice(1);
|
||||
}
|
||||
|
||||
const module = state.module;
|
||||
|
||||
const declaredCssVariables = new Set();
|
||||
|
||||
const locConverter = new LocConverter(source);
|
||||
let mode = CSS_MODE_TOP_LEVEL;
|
||||
let modePos = 0;
|
||||
let modeNestingLevel = 0;
|
||||
let modeData = undefined;
|
||||
let singleClassSelector = undefined;
|
||||
let lastIdentifier = undefined;
|
||||
const modeStack = [];
|
||||
const isTopLevelLocal = () =>
|
||||
modeData === "local" ||
|
||||
(this.defaultMode === "local" && modeData === undefined);
|
||||
const eatWhiteLine = (input, pos) => {
|
||||
for (;;) {
|
||||
const cc = input.charCodeAt(pos);
|
||||
if (cc === 32 || cc === 9) {
|
||||
pos++;
|
||||
continue;
|
||||
}
|
||||
if (cc === 10) pos++;
|
||||
break;
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
const eatUntil = chars => {
|
||||
const charCodes = Array.from({ length: chars.length }, (_, i) =>
|
||||
chars.charCodeAt(i)
|
||||
);
|
||||
const arr = Array.from(
|
||||
{ length: charCodes.reduce((a, b) => Math.max(a, b), 0) + 1 },
|
||||
() => false
|
||||
);
|
||||
charCodes.forEach(cc => (arr[cc] = true));
|
||||
return (input, pos) => {
|
||||
for (;;) {
|
||||
const cc = input.charCodeAt(pos);
|
||||
if (cc < arr.length && arr[cc]) {
|
||||
return pos;
|
||||
}
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
}
|
||||
};
|
||||
};
|
||||
const eatText = (input, pos, eater) => {
|
||||
let text = "";
|
||||
for (;;) {
|
||||
if (input.charCodeAt(pos) === CC_SLASH) {
|
||||
const newPos = walkCssTokens.eatComments(input, pos);
|
||||
if (pos !== newPos) {
|
||||
pos = newPos;
|
||||
if (pos === input.length) break;
|
||||
} else {
|
||||
text += "/";
|
||||
pos++;
|
||||
if (pos === input.length) break;
|
||||
}
|
||||
}
|
||||
const newPos = eater(input, pos);
|
||||
if (pos !== newPos) {
|
||||
text += input.slice(pos, newPos);
|
||||
pos = newPos;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
if (pos === input.length) break;
|
||||
}
|
||||
return [pos, text.trimRight()];
|
||||
};
|
||||
const eatExportName = eatUntil(":};/");
|
||||
const eatExportValue = eatUntil("};/");
|
||||
const parseExports = (input, pos) => {
|
||||
pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
|
||||
const cc = input.charCodeAt(pos);
|
||||
if (cc !== CC_LEFT_CURLY)
|
||||
throw new Error(
|
||||
`Unexpected ${input[pos]} at ${pos} during parsing of ':export' (expected '{')`
|
||||
);
|
||||
pos++;
|
||||
pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
|
||||
for (;;) {
|
||||
if (input.charCodeAt(pos) === CC_RIGHT_CURLY) break;
|
||||
pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
|
||||
if (pos === input.length) return pos;
|
||||
let start = pos;
|
||||
let name;
|
||||
[pos, name] = eatText(input, pos, eatExportName);
|
||||
if (pos === input.length) return pos;
|
||||
if (input.charCodeAt(pos) !== CC_COLON) {
|
||||
throw new Error(
|
||||
`Unexpected ${input[pos]} at ${pos} during parsing of export name in ':export' (expected ':')`
|
||||
);
|
||||
}
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
|
||||
if (pos === input.length) return pos;
|
||||
let value;
|
||||
[pos, value] = eatText(input, pos, eatExportValue);
|
||||
if (pos === input.length) return pos;
|
||||
const cc = input.charCodeAt(pos);
|
||||
if (cc === CC_SEMICOLON) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
|
||||
if (pos === input.length) return pos;
|
||||
} else if (cc !== CC_RIGHT_CURLY) {
|
||||
throw new Error(
|
||||
`Unexpected ${input[pos]} at ${pos} during parsing of export value in ':export' (expected ';' or '}')`
|
||||
);
|
||||
}
|
||||
const dep = new CssExportDependency(name, value);
|
||||
const { line: sl, column: sc } = locConverter.get(start);
|
||||
const { line: el, column: ec } = locConverter.get(pos);
|
||||
dep.setLoc(sl, sc, el, ec);
|
||||
module.addDependency(dep);
|
||||
}
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
pos = eatWhiteLine(input, pos);
|
||||
return pos;
|
||||
};
|
||||
const eatPropertyName = eatUntil(":{};");
|
||||
const processLocalDeclaration = (input, pos) => {
|
||||
modeData = undefined;
|
||||
const start = pos;
|
||||
pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
|
||||
const propertyNameStart = pos;
|
||||
const [propertyNameEnd, propertyName] = eatText(
|
||||
input,
|
||||
pos,
|
||||
eatPropertyName
|
||||
);
|
||||
if (input.charCodeAt(propertyNameEnd) !== CC_COLON) return start;
|
||||
pos = propertyNameEnd + 1;
|
||||
if (propertyName.startsWith("--")) {
|
||||
// CSS Variable
|
||||
const { line: sl, column: sc } = locConverter.get(propertyNameStart);
|
||||
const { line: el, column: ec } = locConverter.get(propertyNameEnd);
|
||||
const name = propertyName.slice(2);
|
||||
const dep = new CssLocalIdentifierDependency(
|
||||
name,
|
||||
[propertyNameStart, propertyNameEnd],
|
||||
"--"
|
||||
);
|
||||
dep.setLoc(sl, sc, el, ec);
|
||||
module.addDependency(dep);
|
||||
declaredCssVariables.add(name);
|
||||
} else if (
|
||||
propertyName === "animation-name" ||
|
||||
propertyName === "animation"
|
||||
) {
|
||||
modeData = "animation";
|
||||
lastIdentifier = undefined;
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
const processDeclarationValueDone = (input, pos) => {
|
||||
if (modeData === "animation" && lastIdentifier) {
|
||||
const { line: sl, column: sc } = locConverter.get(lastIdentifier[0]);
|
||||
const { line: el, column: ec } = locConverter.get(lastIdentifier[1]);
|
||||
const name = input.slice(lastIdentifier[0], lastIdentifier[1]);
|
||||
const dep = new CssSelfLocalIdentifierDependency(name, lastIdentifier);
|
||||
dep.setLoc(sl, sc, el, ec);
|
||||
module.addDependency(dep);
|
||||
}
|
||||
};
|
||||
const eatKeyframes = eatUntil("{};/");
|
||||
const eatNameInVar = eatUntil(",)};/");
|
||||
walkCssTokens(source, {
|
||||
isSelector: () => {
|
||||
return mode !== CSS_MODE_IN_RULE && mode !== CSS_MODE_IN_LOCAL_RULE;
|
||||
},
|
||||
url: (input, start, end, contentStart, contentEnd) => {
|
||||
const value = cssUnescape(input.slice(contentStart, contentEnd));
|
||||
switch (mode) {
|
||||
case CSS_MODE_AT_IMPORT_EXPECT_URL: {
|
||||
modeData.url = value;
|
||||
mode = CSS_MODE_AT_IMPORT_EXPECT_SUPPORTS;
|
||||
break;
|
||||
}
|
||||
case CSS_MODE_AT_IMPORT_EXPECT_SUPPORTS:
|
||||
case CSS_MODE_AT_IMPORT_EXPECT_MEDIA:
|
||||
throw new Error(
|
||||
`Unexpected ${input.slice(
|
||||
start,
|
||||
end
|
||||
)} at ${start} during ${explainMode(mode)}`
|
||||
);
|
||||
default: {
|
||||
const dep = new CssUrlDependency(value, [start, end], "url");
|
||||
const { line: sl, column: sc } = locConverter.get(start);
|
||||
const { line: el, column: ec } = locConverter.get(end);
|
||||
dep.setLoc(sl, sc, el, ec);
|
||||
module.addDependency(dep);
|
||||
module.addCodeGenerationDependency(dep);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return end;
|
||||
},
|
||||
string: (input, start, end) => {
|
||||
switch (mode) {
|
||||
case CSS_MODE_AT_IMPORT_EXPECT_URL: {
|
||||
modeData.url = cssUnescape(input.slice(start + 1, end - 1));
|
||||
mode = CSS_MODE_AT_IMPORT_EXPECT_SUPPORTS;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return end;
|
||||
},
|
||||
atKeyword: (input, start, end) => {
|
||||
const name = input.slice(start, end);
|
||||
if (name === "@namespace") {
|
||||
throw new Error("@namespace is not supported in bundled CSS");
|
||||
}
|
||||
if (name === "@import") {
|
||||
if (mode !== CSS_MODE_TOP_LEVEL) {
|
||||
throw new Error(
|
||||
`Unexpected @import at ${start} during ${explainMode(mode)}`
|
||||
);
|
||||
}
|
||||
mode = CSS_MODE_AT_IMPORT_EXPECT_URL;
|
||||
modePos = end;
|
||||
modeData = {
|
||||
start: start,
|
||||
url: undefined,
|
||||
supports: undefined
|
||||
};
|
||||
}
|
||||
if (name === "@keyframes") {
|
||||
let pos = end;
|
||||
pos = walkCssTokens.eatWhitespaceAndComments(input, pos);
|
||||
if (pos === input.length) return pos;
|
||||
const [newPos, name] = eatText(input, pos, eatKeyframes);
|
||||
const { line: sl, column: sc } = locConverter.get(pos);
|
||||
const { line: el, column: ec } = locConverter.get(newPos);
|
||||
const dep = new CssLocalIdentifierDependency(name, [pos, newPos]);
|
||||
dep.setLoc(sl, sc, el, ec);
|
||||
module.addDependency(dep);
|
||||
pos = newPos;
|
||||
if (pos === input.length) return pos;
|
||||
if (input.charCodeAt(pos) !== CC_LEFT_CURLY) {
|
||||
throw new Error(
|
||||
`Unexpected ${input[pos]} at ${pos} during parsing of @keyframes (expected '{')`
|
||||
);
|
||||
}
|
||||
mode = CSS_MODE_IN_LOCAL_RULE;
|
||||
modeNestingLevel = 1;
|
||||
return pos + 1;
|
||||
}
|
||||
return end;
|
||||
},
|
||||
semicolon: (input, start, end) => {
|
||||
switch (mode) {
|
||||
case CSS_MODE_AT_IMPORT_EXPECT_URL:
|
||||
throw new Error(`Expected URL for @import at ${start}`);
|
||||
case CSS_MODE_AT_IMPORT_EXPECT_MEDIA:
|
||||
case CSS_MODE_AT_IMPORT_EXPECT_SUPPORTS: {
|
||||
const { line: sl, column: sc } = locConverter.get(modeData.start);
|
||||
const { line: el, column: ec } = locConverter.get(end);
|
||||
end = eatWhiteLine(input, end);
|
||||
const media = input.slice(modePos, start).trim();
|
||||
const dep = new CssImportDependency(
|
||||
modeData.url,
|
||||
[modeData.start, end],
|
||||
modeData.supports,
|
||||
media
|
||||
);
|
||||
dep.setLoc(sl, sc, el, ec);
|
||||
module.addDependency(dep);
|
||||
break;
|
||||
}
|
||||
case CSS_MODE_IN_LOCAL_RULE: {
|
||||
processDeclarationValueDone(input, start);
|
||||
return processLocalDeclaration(input, end);
|
||||
}
|
||||
case CSS_MODE_IN_RULE: {
|
||||
return end;
|
||||
}
|
||||
}
|
||||
mode = CSS_MODE_TOP_LEVEL;
|
||||
modeData = undefined;
|
||||
singleClassSelector = undefined;
|
||||
return end;
|
||||
},
|
||||
leftCurlyBracket: (input, start, end) => {
|
||||
switch (mode) {
|
||||
case CSS_MODE_TOP_LEVEL:
|
||||
mode = isTopLevelLocal()
|
||||
? CSS_MODE_IN_LOCAL_RULE
|
||||
: CSS_MODE_IN_RULE;
|
||||
modeNestingLevel = 1;
|
||||
if (mode === CSS_MODE_IN_LOCAL_RULE)
|
||||
return processLocalDeclaration(input, end);
|
||||
break;
|
||||
case CSS_MODE_IN_RULE:
|
||||
case CSS_MODE_IN_LOCAL_RULE:
|
||||
modeNestingLevel++;
|
||||
break;
|
||||
}
|
||||
return end;
|
||||
},
|
||||
rightCurlyBracket: (input, start, end) => {
|
||||
switch (mode) {
|
||||
case CSS_MODE_IN_LOCAL_RULE:
|
||||
processDeclarationValueDone(input, start);
|
||||
/* falls through */
|
||||
case CSS_MODE_IN_RULE:
|
||||
if (--modeNestingLevel === 0) {
|
||||
mode = CSS_MODE_TOP_LEVEL;
|
||||
modeData = undefined;
|
||||
singleClassSelector = undefined;
|
||||
}
|
||||
break;
|
||||
}
|
||||
return end;
|
||||
},
|
||||
id: (input, start, end) => {
|
||||
singleClassSelector = false;
|
||||
switch (mode) {
|
||||
case CSS_MODE_TOP_LEVEL:
|
||||
if (isTopLevelLocal()) {
|
||||
const name = input.slice(start + 1, end);
|
||||
const dep = new CssLocalIdentifierDependency(name, [
|
||||
start + 1,
|
||||
end
|
||||
]);
|
||||
const { line: sl, column: sc } = locConverter.get(start);
|
||||
const { line: el, column: ec } = locConverter.get(end);
|
||||
dep.setLoc(sl, sc, el, ec);
|
||||
module.addDependency(dep);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return end;
|
||||
},
|
||||
identifier: (input, start, end) => {
|
||||
singleClassSelector = false;
|
||||
switch (mode) {
|
||||
case CSS_MODE_IN_LOCAL_RULE:
|
||||
if (modeData === "animation") {
|
||||
lastIdentifier = [start, end];
|
||||
}
|
||||
break;
|
||||
}
|
||||
return end;
|
||||
},
|
||||
class: (input, start, end) => {
|
||||
switch (mode) {
|
||||
case CSS_MODE_TOP_LEVEL: {
|
||||
if (isTopLevelLocal()) {
|
||||
const name = input.slice(start + 1, end);
|
||||
const dep = new CssLocalIdentifierDependency(name, [
|
||||
start + 1,
|
||||
end
|
||||
]);
|
||||
const { line: sl, column: sc } = locConverter.get(start);
|
||||
const { line: el, column: ec } = locConverter.get(end);
|
||||
dep.setLoc(sl, sc, el, ec);
|
||||
module.addDependency(dep);
|
||||
if (singleClassSelector === undefined) singleClassSelector = name;
|
||||
} else {
|
||||
singleClassSelector = false;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return end;
|
||||
},
|
||||
leftParenthesis: (input, start, end) => {
|
||||
switch (mode) {
|
||||
case CSS_MODE_TOP_LEVEL: {
|
||||
modeStack.push(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
return end;
|
||||
},
|
||||
rightParenthesis: (input, start, end) => {
|
||||
switch (mode) {
|
||||
case CSS_MODE_TOP_LEVEL: {
|
||||
const newModeData = modeStack.pop();
|
||||
if (newModeData !== false) {
|
||||
modeData = newModeData;
|
||||
const dep = new ConstDependency("", [start, end]);
|
||||
module.addPresentationalDependency(dep);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return end;
|
||||
},
|
||||
pseudoClass: (input, start, end) => {
|
||||
singleClassSelector = false;
|
||||
switch (mode) {
|
||||
case CSS_MODE_TOP_LEVEL: {
|
||||
const name = input.slice(start, end);
|
||||
if (this.allowModeSwitch && name === ":global") {
|
||||
modeData = "global";
|
||||
const dep = new ConstDependency("", [start, end]);
|
||||
module.addPresentationalDependency(dep);
|
||||
} else if (this.allowModeSwitch && name === ":local") {
|
||||
modeData = "local";
|
||||
const dep = new ConstDependency("", [start, end]);
|
||||
module.addPresentationalDependency(dep);
|
||||
} else if (this.allowPseudoBlocks && name === ":export") {
|
||||
const pos = parseExports(input, end);
|
||||
const dep = new ConstDependency("", [start, pos]);
|
||||
module.addPresentationalDependency(dep);
|
||||
return pos;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return end;
|
||||
},
|
||||
pseudoFunction: (input, start, end) => {
|
||||
switch (mode) {
|
||||
case CSS_MODE_TOP_LEVEL: {
|
||||
const name = input.slice(start, end - 1);
|
||||
if (this.allowModeSwitch && name === ":global") {
|
||||
modeStack.push(modeData);
|
||||
modeData = "global";
|
||||
const dep = new ConstDependency("", [start, end]);
|
||||
module.addPresentationalDependency(dep);
|
||||
} else if (this.allowModeSwitch && name === ":local") {
|
||||
modeStack.push(modeData);
|
||||
modeData = "local";
|
||||
const dep = new ConstDependency("", [start, end]);
|
||||
module.addPresentationalDependency(dep);
|
||||
} else {
|
||||
modeStack.push(false);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return end;
|
||||
},
|
||||
function: (input, start, end) => {
|
||||
switch (mode) {
|
||||
case CSS_MODE_IN_LOCAL_RULE: {
|
||||
const name = input.slice(start, end - 1);
|
||||
if (name === "var") {
|
||||
let pos = walkCssTokens.eatWhitespaceAndComments(input, end);
|
||||
if (pos === input.length) return pos;
|
||||
const [newPos, name] = eatText(input, pos, eatNameInVar);
|
||||
if (!name.startsWith("--")) return end;
|
||||
const { line: sl, column: sc } = locConverter.get(pos);
|
||||
const { line: el, column: ec } = locConverter.get(newPos);
|
||||
const dep = new CssSelfLocalIdentifierDependency(
|
||||
name.slice(2),
|
||||
[pos, newPos],
|
||||
"--",
|
||||
declaredCssVariables
|
||||
);
|
||||
dep.setLoc(sl, sc, el, ec);
|
||||
module.addDependency(dep);
|
||||
return newPos;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return end;
|
||||
},
|
||||
comma: (input, start, end) => {
|
||||
switch (mode) {
|
||||
case CSS_MODE_TOP_LEVEL:
|
||||
modeData = undefined;
|
||||
modeStack.length = 0;
|
||||
break;
|
||||
case CSS_MODE_IN_LOCAL_RULE:
|
||||
processDeclarationValueDone(input, start);
|
||||
break;
|
||||
}
|
||||
return end;
|
||||
}
|
||||
});
|
||||
|
||||
module.buildInfo.strict = true;
|
||||
module.buildMeta.exportsType = "namespace";
|
||||
module.addDependency(new StaticExportsDependency([], true));
|
||||
return state;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = CssParser;
|
||||
659
uni-demo/node_modules/webpack/lib/css/walkCssTokens.js
generated
vendored
Normal file
659
uni-demo/node_modules/webpack/lib/css/walkCssTokens.js
generated
vendored
Normal file
@@ -0,0 +1,659 @@
|
||||
/*
|
||||
MIT License http://www.opensource.org/licenses/mit-license.php
|
||||
Author Tobias Koppers @sokra
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
/**
|
||||
* @typedef {Object} CssTokenCallbacks
|
||||
* @property {function(string, number): boolean} isSelector
|
||||
* @property {function(string, number, number, number, number): number=} url
|
||||
* @property {function(string, number, number): number=} string
|
||||
* @property {function(string, number, number): number=} leftParenthesis
|
||||
* @property {function(string, number, number): number=} rightParenthesis
|
||||
* @property {function(string, number, number): number=} pseudoFunction
|
||||
* @property {function(string, number, number): number=} function
|
||||
* @property {function(string, number, number): number=} pseudoClass
|
||||
* @property {function(string, number, number): number=} atKeyword
|
||||
* @property {function(string, number, number): number=} class
|
||||
* @property {function(string, number, number): number=} identifier
|
||||
* @property {function(string, number, number): number=} id
|
||||
* @property {function(string, number, number): number=} leftCurlyBracket
|
||||
* @property {function(string, number, number): number=} rightCurlyBracket
|
||||
* @property {function(string, number, number): number=} semicolon
|
||||
* @property {function(string, number, number): number=} comma
|
||||
*/
|
||||
|
||||
/** @typedef {function(string, number, CssTokenCallbacks): number} CharHandler */
|
||||
|
||||
// spec: https://drafts.csswg.org/css-syntax/
|
||||
|
||||
const CC_LINE_FEED = "\n".charCodeAt(0);
|
||||
const CC_CARRIAGE_RETURN = "\r".charCodeAt(0);
|
||||
const CC_FORM_FEED = "\f".charCodeAt(0);
|
||||
|
||||
const CC_TAB = "\t".charCodeAt(0);
|
||||
const CC_SPACE = " ".charCodeAt(0);
|
||||
|
||||
const CC_SLASH = "/".charCodeAt(0);
|
||||
const CC_BACK_SLASH = "\\".charCodeAt(0);
|
||||
const CC_ASTERISK = "*".charCodeAt(0);
|
||||
|
||||
const CC_LEFT_PARENTHESIS = "(".charCodeAt(0);
|
||||
const CC_RIGHT_PARENTHESIS = ")".charCodeAt(0);
|
||||
const CC_LEFT_CURLY = "{".charCodeAt(0);
|
||||
const CC_RIGHT_CURLY = "}".charCodeAt(0);
|
||||
|
||||
const CC_QUOTATION_MARK = '"'.charCodeAt(0);
|
||||
const CC_APOSTROPHE = "'".charCodeAt(0);
|
||||
|
||||
const CC_FULL_STOP = ".".charCodeAt(0);
|
||||
const CC_COLON = ":".charCodeAt(0);
|
||||
const CC_SEMICOLON = ";".charCodeAt(0);
|
||||
const CC_COMMA = ",".charCodeAt(0);
|
||||
const CC_PERCENTAGE = "%".charCodeAt(0);
|
||||
const CC_AT_SIGN = "@".charCodeAt(0);
|
||||
|
||||
const CC_LOW_LINE = "_".charCodeAt(0);
|
||||
const CC_LOWER_A = "a".charCodeAt(0);
|
||||
const CC_LOWER_U = "u".charCodeAt(0);
|
||||
const CC_LOWER_E = "e".charCodeAt(0);
|
||||
const CC_LOWER_Z = "z".charCodeAt(0);
|
||||
const CC_UPPER_A = "A".charCodeAt(0);
|
||||
const CC_UPPER_E = "E".charCodeAt(0);
|
||||
const CC_UPPER_Z = "Z".charCodeAt(0);
|
||||
const CC_0 = "0".charCodeAt(0);
|
||||
const CC_9 = "9".charCodeAt(0);
|
||||
|
||||
const CC_NUMBER_SIGN = "#".charCodeAt(0);
|
||||
const CC_PLUS_SIGN = "+".charCodeAt(0);
|
||||
const CC_HYPHEN_MINUS = "-".charCodeAt(0);
|
||||
|
||||
const CC_LESS_THAN_SIGN = "<".charCodeAt(0);
|
||||
const CC_GREATER_THAN_SIGN = ">".charCodeAt(0);
|
||||
|
||||
const _isNewLine = cc => {
|
||||
return (
|
||||
cc === CC_LINE_FEED || cc === CC_CARRIAGE_RETURN || cc === CC_FORM_FEED
|
||||
);
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeSpace = (input, pos, callbacks) => {
|
||||
let cc;
|
||||
do {
|
||||
pos++;
|
||||
cc = input.charCodeAt(pos);
|
||||
} while (_isWhiteSpace(cc));
|
||||
return pos;
|
||||
};
|
||||
|
||||
const _isWhiteSpace = cc => {
|
||||
return (
|
||||
cc === CC_LINE_FEED ||
|
||||
cc === CC_CARRIAGE_RETURN ||
|
||||
cc === CC_FORM_FEED ||
|
||||
cc === CC_TAB ||
|
||||
cc === CC_SPACE
|
||||
);
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeSingleCharToken = (input, pos, callbacks) => {
|
||||
return pos + 1;
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumePotentialComment = (input, pos, callbacks) => {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
let cc = input.charCodeAt(pos);
|
||||
if (cc !== CC_ASTERISK) return pos;
|
||||
for (;;) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
cc = input.charCodeAt(pos);
|
||||
while (cc === CC_ASTERISK) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
cc = input.charCodeAt(pos);
|
||||
if (cc === CC_SLASH) return pos + 1;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/** @type {function(number): CharHandler} */
|
||||
const consumeString = end => (input, pos, callbacks) => {
|
||||
const start = pos;
|
||||
pos = _consumeString(input, pos, end);
|
||||
if (callbacks.string !== undefined) {
|
||||
pos = callbacks.string(input, start, pos);
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
|
||||
const _consumeString = (input, pos, end) => {
|
||||
pos++;
|
||||
for (;;) {
|
||||
if (pos === input.length) return pos;
|
||||
const cc = input.charCodeAt(pos);
|
||||
if (cc === end) return pos + 1;
|
||||
if (_isNewLine(cc)) {
|
||||
// bad string
|
||||
return pos;
|
||||
}
|
||||
if (cc === CC_BACK_SLASH) {
|
||||
// we don't need to fully parse the escaped code point
|
||||
// just skip over a potential new line
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
pos++;
|
||||
} else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const _isIdentifierStartCode = cc => {
|
||||
return (
|
||||
cc === CC_LOW_LINE ||
|
||||
(cc >= CC_LOWER_A && cc <= CC_LOWER_Z) ||
|
||||
(cc >= CC_UPPER_A && cc <= CC_UPPER_Z) ||
|
||||
cc > 0x80
|
||||
);
|
||||
};
|
||||
|
||||
const _isDigit = cc => {
|
||||
return cc >= CC_0 && cc <= CC_9;
|
||||
};
|
||||
|
||||
const _startsIdentifier = (input, pos) => {
|
||||
const cc = input.charCodeAt(pos);
|
||||
if (cc === CC_HYPHEN_MINUS) {
|
||||
if (pos === input.length) return false;
|
||||
const cc = input.charCodeAt(pos + 1);
|
||||
if (cc === CC_HYPHEN_MINUS) return true;
|
||||
if (cc === CC_BACK_SLASH) {
|
||||
const cc = input.charCodeAt(pos + 2);
|
||||
return !_isNewLine(cc);
|
||||
}
|
||||
return _isIdentifierStartCode(cc);
|
||||
}
|
||||
if (cc === CC_BACK_SLASH) {
|
||||
const cc = input.charCodeAt(pos + 1);
|
||||
return !_isNewLine(cc);
|
||||
}
|
||||
return _isIdentifierStartCode(cc);
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeNumberSign = (input, pos, callbacks) => {
|
||||
const start = pos;
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
if (callbacks.isSelector(input, pos) && _startsIdentifier(input, pos)) {
|
||||
pos = _consumeIdentifier(input, pos);
|
||||
if (callbacks.id !== undefined) {
|
||||
return callbacks.id(input, start, pos);
|
||||
}
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeMinus = (input, pos, callbacks) => {
|
||||
const start = pos;
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
const cc = input.charCodeAt(pos);
|
||||
if (cc === CC_FULL_STOP || _isDigit(cc)) {
|
||||
return consumeNumericToken(input, pos, callbacks);
|
||||
} else if (cc === CC_HYPHEN_MINUS) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
const cc = input.charCodeAt(pos);
|
||||
if (cc === CC_GREATER_THAN_SIGN) {
|
||||
return pos + 1;
|
||||
} else {
|
||||
pos = _consumeIdentifier(input, pos);
|
||||
if (callbacks.identifier !== undefined) {
|
||||
return callbacks.identifier(input, start, pos);
|
||||
}
|
||||
}
|
||||
} else if (cc === CC_BACK_SLASH) {
|
||||
if (pos + 1 === input.length) return pos;
|
||||
const cc = input.charCodeAt(pos + 1);
|
||||
if (_isNewLine(cc)) return pos;
|
||||
pos = _consumeIdentifier(input, pos);
|
||||
if (callbacks.identifier !== undefined) {
|
||||
return callbacks.identifier(input, start, pos);
|
||||
}
|
||||
} else if (_isIdentifierStartCode(cc)) {
|
||||
pos++;
|
||||
pos = _consumeIdentifier(input, pos);
|
||||
if (callbacks.identifier !== undefined) {
|
||||
return callbacks.identifier(input, start, pos);
|
||||
}
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeDot = (input, pos, callbacks) => {
|
||||
const start = pos;
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
const cc = input.charCodeAt(pos);
|
||||
if (_isDigit(cc)) return consumeNumericToken(input, pos - 2, callbacks);
|
||||
if (!callbacks.isSelector(input, pos) || !_startsIdentifier(input, pos))
|
||||
return pos;
|
||||
pos = _consumeIdentifier(input, pos);
|
||||
if (callbacks.class !== undefined) return callbacks.class(input, start, pos);
|
||||
return pos;
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeNumericToken = (input, pos, callbacks) => {
|
||||
pos = _consumeNumber(input, pos);
|
||||
if (pos === input.length) return pos;
|
||||
if (_startsIdentifier(input, pos)) return _consumeIdentifier(input, pos);
|
||||
const cc = input.charCodeAt(pos);
|
||||
if (cc === CC_PERCENTAGE) return pos + 1;
|
||||
return pos;
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeOtherIdentifier = (input, pos, callbacks) => {
|
||||
const start = pos;
|
||||
pos = _consumeIdentifier(input, pos);
|
||||
if (
|
||||
pos !== input.length &&
|
||||
!callbacks.isSelector(input, pos) &&
|
||||
input.charCodeAt(pos) === CC_LEFT_PARENTHESIS
|
||||
) {
|
||||
pos++;
|
||||
if (callbacks.function !== undefined) {
|
||||
return callbacks.function(input, start, pos);
|
||||
}
|
||||
} else {
|
||||
if (callbacks.identifier !== undefined) {
|
||||
return callbacks.identifier(input, start, pos);
|
||||
}
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumePotentialUrl = (input, pos, callbacks) => {
|
||||
const start = pos;
|
||||
pos = _consumeIdentifier(input, pos);
|
||||
if (pos === start + 3 && input.slice(start, pos + 1) === "url(") {
|
||||
pos++;
|
||||
let cc = input.charCodeAt(pos);
|
||||
while (_isWhiteSpace(cc)) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
cc = input.charCodeAt(pos);
|
||||
}
|
||||
if (cc === CC_QUOTATION_MARK || cc === CC_APOSTROPHE) {
|
||||
pos++;
|
||||
const contentStart = pos;
|
||||
pos = _consumeString(input, pos, cc);
|
||||
const contentEnd = pos - 1;
|
||||
cc = input.charCodeAt(pos);
|
||||
while (_isWhiteSpace(cc)) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
cc = input.charCodeAt(pos);
|
||||
}
|
||||
if (cc !== CC_RIGHT_PARENTHESIS) return pos;
|
||||
pos++;
|
||||
if (callbacks.url !== undefined)
|
||||
return callbacks.url(input, start, pos, contentStart, contentEnd);
|
||||
return pos;
|
||||
} else {
|
||||
const contentStart = pos;
|
||||
let contentEnd;
|
||||
for (;;) {
|
||||
if (cc === CC_BACK_SLASH) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
pos++;
|
||||
} else if (_isWhiteSpace(cc)) {
|
||||
contentEnd = pos;
|
||||
do {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
cc = input.charCodeAt(pos);
|
||||
} while (_isWhiteSpace(cc));
|
||||
if (cc !== CC_RIGHT_PARENTHESIS) return pos;
|
||||
pos++;
|
||||
if (callbacks.url !== undefined) {
|
||||
return callbacks.url(input, start, pos, contentStart, contentEnd);
|
||||
}
|
||||
return pos;
|
||||
} else if (cc === CC_RIGHT_PARENTHESIS) {
|
||||
contentEnd = pos;
|
||||
pos++;
|
||||
if (callbacks.url !== undefined) {
|
||||
return callbacks.url(input, start, pos, contentStart, contentEnd);
|
||||
}
|
||||
return pos;
|
||||
} else if (cc === CC_LEFT_PARENTHESIS) {
|
||||
return pos;
|
||||
} else {
|
||||
pos++;
|
||||
}
|
||||
if (pos === input.length) return pos;
|
||||
cc = input.charCodeAt(pos);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (callbacks.identifier !== undefined) {
|
||||
return callbacks.identifier(input, start, pos);
|
||||
}
|
||||
return pos;
|
||||
}
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumePotentialPseudo = (input, pos, callbacks) => {
|
||||
const start = pos;
|
||||
pos++;
|
||||
if (!callbacks.isSelector(input, pos) || !_startsIdentifier(input, pos))
|
||||
return pos;
|
||||
pos = _consumeIdentifier(input, pos);
|
||||
let cc = input.charCodeAt(pos);
|
||||
if (cc === CC_LEFT_PARENTHESIS) {
|
||||
pos++;
|
||||
if (callbacks.pseudoFunction !== undefined) {
|
||||
return callbacks.pseudoFunction(input, start, pos);
|
||||
}
|
||||
return pos;
|
||||
}
|
||||
if (callbacks.pseudoClass !== undefined) {
|
||||
return callbacks.pseudoClass(input, start, pos);
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeLeftParenthesis = (input, pos, callbacks) => {
|
||||
pos++;
|
||||
if (callbacks.leftParenthesis !== undefined) {
|
||||
return callbacks.leftParenthesis(input, pos - 1, pos);
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeRightParenthesis = (input, pos, callbacks) => {
|
||||
pos++;
|
||||
if (callbacks.rightParenthesis !== undefined) {
|
||||
return callbacks.rightParenthesis(input, pos - 1, pos);
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeLeftCurlyBracket = (input, pos, callbacks) => {
|
||||
pos++;
|
||||
if (callbacks.leftCurlyBracket !== undefined) {
|
||||
return callbacks.leftCurlyBracket(input, pos - 1, pos);
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeRightCurlyBracket = (input, pos, callbacks) => {
|
||||
pos++;
|
||||
if (callbacks.rightCurlyBracket !== undefined) {
|
||||
return callbacks.rightCurlyBracket(input, pos - 1, pos);
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeSemicolon = (input, pos, callbacks) => {
|
||||
pos++;
|
||||
if (callbacks.semicolon !== undefined) {
|
||||
return callbacks.semicolon(input, pos - 1, pos);
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeComma = (input, pos, callbacks) => {
|
||||
pos++;
|
||||
if (callbacks.comma !== undefined) {
|
||||
return callbacks.comma(input, pos - 1, pos);
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
|
||||
const _consumeIdentifier = (input, pos) => {
|
||||
for (;;) {
|
||||
const cc = input.charCodeAt(pos);
|
||||
if (cc === CC_BACK_SLASH) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
pos++;
|
||||
} else if (
|
||||
_isIdentifierStartCode(cc) ||
|
||||
_isDigit(cc) ||
|
||||
cc === CC_HYPHEN_MINUS
|
||||
) {
|
||||
pos++;
|
||||
} else {
|
||||
return pos;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const _consumeNumber = (input, pos) => {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
let cc = input.charCodeAt(pos);
|
||||
while (_isDigit(cc)) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
cc = input.charCodeAt(pos);
|
||||
}
|
||||
if (cc === CC_FULL_STOP && pos + 1 !== input.length) {
|
||||
const next = input.charCodeAt(pos + 1);
|
||||
if (_isDigit(next)) {
|
||||
pos += 2;
|
||||
cc = input.charCodeAt(pos);
|
||||
while (_isDigit(cc)) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
cc = input.charCodeAt(pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cc === CC_LOWER_E || cc === CC_UPPER_E) {
|
||||
if (pos + 1 !== input.length) {
|
||||
const next = input.charCodeAt(pos + 2);
|
||||
if (_isDigit(next)) {
|
||||
pos += 2;
|
||||
} else if (
|
||||
(next === CC_HYPHEN_MINUS || next === CC_PLUS_SIGN) &&
|
||||
pos + 2 !== input.length
|
||||
) {
|
||||
const next = input.charCodeAt(pos + 2);
|
||||
if (_isDigit(next)) {
|
||||
pos += 3;
|
||||
} else {
|
||||
return pos;
|
||||
}
|
||||
} else {
|
||||
return pos;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
return pos;
|
||||
}
|
||||
cc = input.charCodeAt(pos);
|
||||
while (_isDigit(cc)) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
cc = input.charCodeAt(pos);
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeLessThan = (input, pos, callbacks) => {
|
||||
if (input.slice(pos + 1, pos + 4) === "!--") return pos + 4;
|
||||
return pos + 1;
|
||||
};
|
||||
|
||||
/** @type {CharHandler} */
|
||||
const consumeAt = (input, pos, callbacks) => {
|
||||
const start = pos;
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
if (_startsIdentifier(input, pos)) {
|
||||
pos = _consumeIdentifier(input, pos);
|
||||
if (callbacks.atKeyword !== undefined) {
|
||||
pos = callbacks.atKeyword(input, start, pos);
|
||||
}
|
||||
}
|
||||
return pos;
|
||||
};
|
||||
|
||||
const CHAR_MAP = Array.from({ length: 0x80 }, (_, cc) => {
|
||||
// https://drafts.csswg.org/css-syntax/#consume-token
|
||||
switch (cc) {
|
||||
case CC_LINE_FEED:
|
||||
case CC_CARRIAGE_RETURN:
|
||||
case CC_FORM_FEED:
|
||||
case CC_TAB:
|
||||
case CC_SPACE:
|
||||
return consumeSpace;
|
||||
case CC_QUOTATION_MARK:
|
||||
case CC_APOSTROPHE:
|
||||
return consumeString(cc);
|
||||
case CC_NUMBER_SIGN:
|
||||
return consumeNumberSign;
|
||||
case CC_SLASH:
|
||||
return consumePotentialComment;
|
||||
// case CC_LEFT_SQUARE:
|
||||
// case CC_RIGHT_SQUARE:
|
||||
// case CC_COMMA:
|
||||
// case CC_COLON:
|
||||
// return consumeSingleCharToken;
|
||||
case CC_COMMA:
|
||||
return consumeComma;
|
||||
case CC_SEMICOLON:
|
||||
return consumeSemicolon;
|
||||
case CC_LEFT_PARENTHESIS:
|
||||
return consumeLeftParenthesis;
|
||||
case CC_RIGHT_PARENTHESIS:
|
||||
return consumeRightParenthesis;
|
||||
case CC_LEFT_CURLY:
|
||||
return consumeLeftCurlyBracket;
|
||||
case CC_RIGHT_CURLY:
|
||||
return consumeRightCurlyBracket;
|
||||
case CC_COLON:
|
||||
return consumePotentialPseudo;
|
||||
case CC_PLUS_SIGN:
|
||||
return consumeNumericToken;
|
||||
case CC_FULL_STOP:
|
||||
return consumeDot;
|
||||
case CC_HYPHEN_MINUS:
|
||||
return consumeMinus;
|
||||
case CC_LESS_THAN_SIGN:
|
||||
return consumeLessThan;
|
||||
case CC_AT_SIGN:
|
||||
return consumeAt;
|
||||
case CC_LOWER_U:
|
||||
return consumePotentialUrl;
|
||||
case CC_LOW_LINE:
|
||||
return consumeOtherIdentifier;
|
||||
default:
|
||||
if (_isDigit(cc)) return consumeNumericToken;
|
||||
if (
|
||||
(cc >= CC_LOWER_A && cc <= CC_LOWER_Z) ||
|
||||
(cc >= CC_UPPER_A && cc <= CC_UPPER_Z)
|
||||
) {
|
||||
return consumeOtherIdentifier;
|
||||
}
|
||||
return consumeSingleCharToken;
|
||||
}
|
||||
});
|
||||
|
||||
/**
|
||||
* @param {string} input input css
|
||||
* @param {CssTokenCallbacks} callbacks callbacks
|
||||
* @returns {void}
|
||||
*/
|
||||
module.exports = (input, callbacks) => {
|
||||
let pos = 0;
|
||||
while (pos < input.length) {
|
||||
const cc = input.charCodeAt(pos);
|
||||
if (cc < 0x80) {
|
||||
pos = CHAR_MAP[cc](input, pos, callbacks);
|
||||
} else {
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
module.exports.eatComments = (input, pos) => {
|
||||
loop: for (;;) {
|
||||
const cc = input.charCodeAt(pos);
|
||||
if (cc === CC_SLASH) {
|
||||
if (pos === input.length) return pos;
|
||||
let cc = input.charCodeAt(pos + 1);
|
||||
if (cc !== CC_ASTERISK) return pos;
|
||||
pos++;
|
||||
for (;;) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
cc = input.charCodeAt(pos);
|
||||
while (cc === CC_ASTERISK) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
cc = input.charCodeAt(pos);
|
||||
if (cc === CC_SLASH) {
|
||||
pos++;
|
||||
continue loop;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return pos;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports.eatWhitespaceAndComments = (input, pos) => {
|
||||
loop: for (;;) {
|
||||
const cc = input.charCodeAt(pos);
|
||||
if (cc === CC_SLASH) {
|
||||
if (pos === input.length) return pos;
|
||||
let cc = input.charCodeAt(pos + 1);
|
||||
if (cc !== CC_ASTERISK) return pos;
|
||||
pos++;
|
||||
for (;;) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
cc = input.charCodeAt(pos);
|
||||
while (cc === CC_ASTERISK) {
|
||||
pos++;
|
||||
if (pos === input.length) return pos;
|
||||
cc = input.charCodeAt(pos);
|
||||
if (cc === CC_SLASH) {
|
||||
pos++;
|
||||
continue loop;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (_isWhiteSpace(cc)) {
|
||||
pos++;
|
||||
continue;
|
||||
}
|
||||
return pos;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user