You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
119 lines
3.0 KiB
119 lines
3.0 KiB
/* |
|
MIT License http://www.opensource.org/licenses/mit-license.php |
|
Author Ivan Kopeykin @vankop |
|
*/ |
|
|
|
"use strict"; |
|
|
|
const makeSerializable = require("../util/makeSerializable"); |
|
const NullDependency = require("./NullDependency"); |
|
|
|
/** @typedef {import("webpack-sources").ReplaceSource} ReplaceSource */ |
|
/** @typedef {import("../Dependency")} Dependency */ |
|
/** @typedef {import("../Dependency").ExportsSpec} ExportsSpec */ |
|
/** @typedef {import("../DependencyTemplate").CssDependencyTemplateContext} DependencyTemplateContext */ |
|
/** @typedef {import("../ModuleGraph")} ModuleGraph */ |
|
|
|
class CssLocalIdentifierDependency extends NullDependency { |
|
/** |
|
* @param {string} name name |
|
* @param {[number, number]} range range |
|
* @param {string=} prefix prefix |
|
*/ |
|
constructor(name, range, prefix = "") { |
|
super(); |
|
this.name = name; |
|
this.range = range; |
|
this.prefix = prefix; |
|
} |
|
|
|
get type() { |
|
return "css local identifier"; |
|
} |
|
|
|
/** |
|
* Returns the exported names |
|
* @param {ModuleGraph} moduleGraph module graph |
|
* @returns {ExportsSpec | undefined} export names |
|
*/ |
|
getExports(moduleGraph) { |
|
const name = this.name; |
|
return { |
|
exports: [ |
|
{ |
|
name, |
|
canMangle: true |
|
} |
|
], |
|
dependencies: undefined |
|
}; |
|
} |
|
|
|
serialize(context) { |
|
const { write } = context; |
|
write(this.name); |
|
write(this.range); |
|
write(this.prefix); |
|
super.serialize(context); |
|
} |
|
|
|
deserialize(context) { |
|
const { read } = context; |
|
this.name = read(); |
|
this.range = read(); |
|
this.prefix = read(); |
|
super.deserialize(context); |
|
} |
|
} |
|
|
|
const escapeCssIdentifier = (str, omitUnderscore) => { |
|
const escaped = `${str}`.replace( |
|
// cspell:word uffff |
|
/[^a-zA-Z0-9_\u0081-\uffff-]/g, |
|
s => `\\${s}` |
|
); |
|
return !omitUnderscore && /^(?!--)[0-9-]/.test(escaped) |
|
? `_${escaped}` |
|
: escaped; |
|
}; |
|
|
|
CssLocalIdentifierDependency.Template = class CssLocalIdentifierDependencyTemplate extends ( |
|
NullDependency.Template |
|
) { |
|
/** |
|
* @param {Dependency} dependency the dependency for which the template should be applied |
|
* @param {ReplaceSource} source the current replace source which can be modified |
|
* @param {DependencyTemplateContext} templateContext the context object |
|
* @returns {void} |
|
*/ |
|
apply( |
|
dependency, |
|
source, |
|
{ module, moduleGraph, chunkGraph, runtime, runtimeTemplate, cssExports } |
|
) { |
|
const dep = /** @type {CssLocalIdentifierDependency} */ (dependency); |
|
const used = moduleGraph |
|
.getExportInfo(module, dep.name) |
|
.getUsedName(dep.name, runtime); |
|
const moduleId = chunkGraph.getModuleId(module); |
|
const identifier = |
|
dep.prefix + |
|
(runtimeTemplate.outputOptions.uniqueName |
|
? runtimeTemplate.outputOptions.uniqueName + "-" |
|
: "") + |
|
(used ? moduleId + "-" + used : "-"); |
|
source.replace( |
|
dep.range[0], |
|
dep.range[1] - 1, |
|
escapeCssIdentifier(identifier, dep.prefix) |
|
); |
|
if (used) cssExports.set(used, identifier); |
|
} |
|
}; |
|
|
|
makeSerializable( |
|
CssLocalIdentifierDependency, |
|
"webpack/lib/dependencies/CssLocalIdentifierDependency" |
|
); |
|
|
|
module.exports = CssLocalIdentifierDependency;
|
|
|