123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- const Dependency = require("../Dependency");
- const DependencyTemplate = require("../DependencyTemplate");
- const makeSerializable = require("../util/makeSerializable");
- const memoize = require("../util/memoize");
- /** @typedef {import("../ContextModule").ContextOptions} ContextOptions */
- /** @typedef {import("../Dependency").TRANSITIVE} TRANSITIVE */
- /** @typedef {import("../ModuleGraph")} ModuleGraph */
- /** @typedef {import("../WebpackError")} WebpackError */
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext} ObjectDeserializerContext */
- /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext} ObjectSerializerContext */
- const getCriticalDependencyWarning = memoize(() =>
- require("./CriticalDependencyWarning")
- );
- /** @typedef {ContextOptions & { request: string }} ContextDependencyOptions */
- /**
- * @param {RegExp | null | undefined} r regexp
- * @returns {string} stringified regexp
- */
- const regExpToString = r => (r ? r + "" : "");
- class ContextDependency extends Dependency {
- /**
- * @param {ContextDependencyOptions} options options for the context module
- * @param {string=} context request context
- */
- constructor(options, context) {
- super();
- this.options = options;
- this.userRequest = this.options && this.options.request;
- /** @type {false | undefined | string} */
- this.critical = false;
- this.hadGlobalOrStickyRegExp = false;
- if (
- this.options &&
- (this.options.regExp.global || this.options.regExp.sticky)
- ) {
- this.options = { ...this.options, regExp: null };
- this.hadGlobalOrStickyRegExp = true;
- }
- this.request = undefined;
- this.range = undefined;
- this.valueRange = undefined;
- /** @type {boolean | string | undefined} */
- this.inShorthand = undefined;
- // TODO refactor this
- this.replaces = undefined;
- this._requestContext = context;
- }
- /**
- * @returns {string | undefined} a request context
- */
- getContext() {
- return this._requestContext;
- }
- get category() {
- return "commonjs";
- }
- /**
- * @returns {boolean | TRANSITIVE} true, when changes to the referenced module could affect the referencing module; TRANSITIVE, when changes to the referenced module could affect referencing modules of the referencing module
- */
- couldAffectReferencingModule() {
- return true;
- }
- /**
- * @returns {string | null} an identifier to merge equal requests
- */
- getResourceIdentifier() {
- return (
- `context${this._requestContext || ""}|ctx request${
- this.options.request
- } ${this.options.recursive} ` +
- `${regExpToString(this.options.regExp)} ${regExpToString(
- this.options.include
- )} ${regExpToString(this.options.exclude)} ` +
- `${this.options.mode} ${this.options.chunkName} ` +
- `${JSON.stringify(this.options.groupOptions)}`
- );
- }
- /**
- * Returns warnings
- * @param {ModuleGraph} moduleGraph module graph
- * @returns {WebpackError[] | null | undefined} warnings
- */
- getWarnings(moduleGraph) {
- let warnings = super.getWarnings(moduleGraph);
- if (this.critical) {
- if (!warnings) warnings = [];
- const CriticalDependencyWarning = getCriticalDependencyWarning();
- warnings.push(new CriticalDependencyWarning(this.critical));
- }
- if (this.hadGlobalOrStickyRegExp) {
- if (!warnings) warnings = [];
- const CriticalDependencyWarning = getCriticalDependencyWarning();
- warnings.push(
- new CriticalDependencyWarning(
- "Contexts can't use RegExps with the 'g' or 'y' flags."
- )
- );
- }
- return warnings;
- }
- /**
- * @param {ObjectSerializerContext} context context
- */
- serialize(context) {
- const { write } = context;
- write(this.options);
- write(this.userRequest);
- write(this.critical);
- write(this.hadGlobalOrStickyRegExp);
- write(this.request);
- write(this._requestContext);
- write(this.range);
- write(this.valueRange);
- write(this.prepend);
- write(this.replaces);
- super.serialize(context);
- }
- /**
- * @param {ObjectDeserializerContext} context context
- */
- deserialize(context) {
- const { read } = context;
- this.options = read();
- this.userRequest = read();
- this.critical = read();
- this.hadGlobalOrStickyRegExp = read();
- this.request = read();
- this._requestContext = read();
- this.range = read();
- this.valueRange = read();
- this.prepend = read();
- this.replaces = read();
- super.deserialize(context);
- }
- }
- makeSerializable(
- ContextDependency,
- "webpack/lib/dependencies/ContextDependency"
- );
- ContextDependency.Template = DependencyTemplate;
- module.exports = ContextDependency;
|