UNPKG

23.8 kBJavaScriptView Raw
1/*
2 MIT License http://www.opensource.org/licenses/mit-license.php
3 Author Tobias Koppers @sokra
4*/
5"use strict";
6const util = require("util");
7const { OriginalSource, RawSource } = require("webpack-sources");
8const Module = require("./Module");
9const AsyncDependenciesBlock = require("./AsyncDependenciesBlock");
10const Template = require("./Template");
11const contextify = require("./util/identifier").contextify;
12
13/** @typedef {"sync" | "eager" | "weak" | "async-weak" | "lazy" | "lazy-once"} ContextMode Context mode */
14/** @typedef {import("./dependencies/ContextElementDependency")} ContextElementDependency */
15
16/**
17 * @callback ResolveDependenciesCallback
18 * @param {Error=} err
19 * @param {ContextElementDependency[]} dependencies
20 */
21
22/**
23 * @callback ResolveDependencies
24 * @param {TODO} fs
25 * @param {TODO} options
26 * @param {ResolveDependenciesCallback} callback
27 */
28
29class ContextModule extends Module {
30 // type ContextMode = "sync" | "eager" | "weak" | "async-weak" | "lazy" | "lazy-once"
31 // type ContextOptions = { resource: string, recursive: boolean, regExp: RegExp, addon?: string, mode?: ContextMode, chunkName?: string, include?: RegExp, exclude?: RegExp, groupOptions?: Object }
32 // resolveDependencies: (fs: FS, options: ContextOptions, (err: Error?, dependencies: Dependency[]) => void) => void
33 // options: ContextOptions
34 /**
35 * @param {ResolveDependencies} resolveDependencies function to get dependencies in this context
36 * @param {TODO} options options object
37 */
38 constructor(resolveDependencies, options) {
39 let resource;
40 let resourceQuery;
41 const queryIdx = options.resource.indexOf("?");
42 if (queryIdx >= 0) {
43 resource = options.resource.substr(0, queryIdx);
44 resourceQuery = options.resource.substr(queryIdx);
45 } else {
46 resource = options.resource;
47 resourceQuery = "";
48 }
49
50 super("javascript/dynamic", resource);
51
52 // Info from Factory
53 this.resolveDependencies = resolveDependencies;
54 this.options = Object.assign({}, options, {
55 resource: resource,
56 resourceQuery: resourceQuery
57 });
58 if (options.resolveOptions !== undefined) {
59 this.resolveOptions = options.resolveOptions;
60 }
61
62 // Info from Build
63 this._contextDependencies = new Set([this.context]);
64
65 if (typeof options.mode !== "string") {
66 throw new Error("options.mode is a required option");
67 }
68
69 this._identifier = this._createIdentifier();
70 }
71
72 updateCacheModule(module) {
73 this.resolveDependencies = module.resolveDependencies;
74 this.options = module.options;
75 this.resolveOptions = module.resolveOptions;
76 }
77
78 prettyRegExp(regexString) {
79 // remove the "/" at the front and the beginning
80 // "/foo/" -> "foo"
81 return regexString.substring(1, regexString.length - 1);
82 }
83
84 _createIdentifier() {
85 let identifier = this.context;
86 if (this.options.resourceQuery) {
87 identifier += ` ${this.options.resourceQuery}`;
88 }
89 if (this.options.mode) {
90 identifier += ` ${this.options.mode}`;
91 }
92 if (!this.options.recursive) {
93 identifier += " nonrecursive";
94 }
95 if (this.options.addon) {
96 identifier += ` ${this.options.addon}`;
97 }
98 if (this.options.regExp) {
99 identifier += ` ${this.options.regExp}`;
100 }
101 if (this.options.include) {
102 identifier += ` include: ${this.options.include}`;
103 }
104 if (this.options.exclude) {
105 identifier += ` exclude: ${this.options.exclude}`;
106 }
107 if (this.options.groupOptions) {
108 identifier += ` groupOptions: ${JSON.stringify(
109 this.options.groupOptions
110 )}`;
111 }
112 if (this.options.namespaceObject === "strict") {
113 identifier += " strict namespace object";
114 } else if (this.options.namespaceObject) {
115 identifier += " namespace object";
116 }
117
118 return identifier;
119 }
120
121 identifier() {
122 return this._identifier;
123 }
124
125 readableIdentifier(requestShortener) {
126 let identifier = requestShortener.shorten(this.context);
127 if (this.options.resourceQuery) {
128 identifier += ` ${this.options.resourceQuery}`;
129 }
130 if (this.options.mode) {
131 identifier += ` ${this.options.mode}`;
132 }
133 if (!this.options.recursive) {
134 identifier += " nonrecursive";
135 }
136 if (this.options.addon) {
137 identifier += ` ${requestShortener.shorten(this.options.addon)}`;
138 }
139 if (this.options.regExp) {
140 identifier += ` ${this.prettyRegExp(this.options.regExp + "")}`;
141 }
142 if (this.options.include) {
143 identifier += ` include: ${this.prettyRegExp(this.options.include + "")}`;
144 }
145 if (this.options.exclude) {
146 identifier += ` exclude: ${this.prettyRegExp(this.options.exclude + "")}`;
147 }
148 if (this.options.groupOptions) {
149 const groupOptions = this.options.groupOptions;
150 for (const key of Object.keys(groupOptions)) {
151 identifier += ` ${key}: ${groupOptions[key]}`;
152 }
153 }
154 if (this.options.namespaceObject === "strict") {
155 identifier += " strict namespace object";
156 } else if (this.options.namespaceObject) {
157 identifier += " namespace object";
158 }
159
160 return identifier;
161 }
162
163 libIdent(options) {
164 let identifier = contextify(options.context, this.context);
165 if (this.options.mode) {
166 identifier += ` ${this.options.mode}`;
167 }
168 if (this.options.recursive) {
169 identifier += " recursive";
170 }
171 if (this.options.addon) {
172 identifier += ` ${contextify(options.context, this.options.addon)}`;
173 }
174 if (this.options.regExp) {
175 identifier += ` ${this.prettyRegExp(this.options.regExp + "")}`;
176 }
177 if (this.options.include) {
178 identifier += ` include: ${this.prettyRegExp(this.options.include + "")}`;
179 }
180 if (this.options.exclude) {
181 identifier += ` exclude: ${this.prettyRegExp(this.options.exclude + "")}`;
182 }
183
184 return identifier;
185 }
186
187 needRebuild(fileTimestamps, contextTimestamps) {
188 const ts = contextTimestamps.get(this.context);
189 if (!ts) {
190 return true;
191 }
192
193 return ts >= this.buildInfo.builtTime;
194 }
195
196 build(options, compilation, resolver, fs, callback) {
197 this.built = true;
198 this.buildMeta = {};
199 this.buildInfo = {
200 builtTime: Date.now(),
201 contextDependencies: this._contextDependencies
202 };
203 this.resolveDependencies(fs, this.options, (err, dependencies) => {
204 if (err) return callback(err);
205
206 // abort if something failed
207 // this will create an empty context
208 if (!dependencies) {
209 callback();
210 return;
211 }
212
213 // enhance dependencies with meta info
214 for (const dep of dependencies) {
215 dep.loc = {
216 name: dep.userRequest
217 };
218 dep.request = this.options.addon + dep.request;
219 }
220
221 if (this.options.mode === "sync" || this.options.mode === "eager") {
222 // if we have an sync or eager context
223 // just add all dependencies and continue
224 this.dependencies = dependencies;
225 } else if (this.options.mode === "lazy-once") {
226 // for the lazy-once mode create a new async dependency block
227 // and add that block to this context
228 if (dependencies.length > 0) {
229 const block = new AsyncDependenciesBlock(
230 Object.assign({}, this.options.groupOptions, {
231 name: this.options.chunkName
232 }),
233 this
234 );
235 for (const dep of dependencies) {
236 block.addDependency(dep);
237 }
238 this.addBlock(block);
239 }
240 } else if (
241 this.options.mode === "weak" ||
242 this.options.mode === "async-weak"
243 ) {
244 // we mark all dependencies as weak
245 for (const dep of dependencies) {
246 dep.weak = true;
247 }
248 this.dependencies = dependencies;
249 } else if (this.options.mode === "lazy") {
250 // if we are lazy create a new async dependency block per dependency
251 // and add all blocks to this context
252 let index = 0;
253 for (const dep of dependencies) {
254 let chunkName = this.options.chunkName;
255 if (chunkName) {
256 if (!/\[(index|request)\]/.test(chunkName)) {
257 chunkName += "[index]";
258 }
259 chunkName = chunkName.replace(/\[index\]/g, index++);
260 chunkName = chunkName.replace(
261 /\[request\]/g,
262 Template.toPath(dep.userRequest)
263 );
264 }
265 const block = new AsyncDependenciesBlock(
266 Object.assign({}, this.options.groupOptions, {
267 name: chunkName
268 }),
269 dep.module,
270 dep.loc,
271 dep.userRequest
272 );
273 block.addDependency(dep);
274 this.addBlock(block);
275 }
276 } else {
277 callback(
278 new Error(`Unsupported mode "${this.options.mode}" in context`)
279 );
280 return;
281 }
282 callback();
283 });
284 }
285
286 getUserRequestMap(dependencies) {
287 // if we filter first we get a new array
288 // therefor we dont need to create a clone of dependencies explicitly
289 // therefore the order of this is !important!
290 return dependencies
291 .filter(dependency => dependency.module)
292 .sort((a, b) => {
293 if (a.userRequest === b.userRequest) {
294 return 0;
295 }
296 return a.userRequest < b.userRequest ? -1 : 1;
297 })
298 .reduce((map, dep) => {
299 map[dep.userRequest] = dep.module.id;
300 return map;
301 }, Object.create(null));
302 }
303
304 getFakeMap(dependencies) {
305 if (!this.options.namespaceObject) {
306 return 9;
307 }
308 // if we filter first we get a new array
309 // therefor we dont need to create a clone of dependencies explicitly
310 // therefore the order of this is !important!
311 let hasNonHarmony = false;
312 let hasNamespace = false;
313 let hasNamed = false;
314 const fakeMap = dependencies
315 .filter(dependency => dependency.module)
316 .sort((a, b) => {
317 return b.module.id - a.module.id;
318 })
319 .reduce((map, dep) => {
320 const exportsType =
321 dep.module.buildMeta && dep.module.buildMeta.exportsType;
322 const id = dep.module.id;
323 if (!exportsType) {
324 map[id] = this.options.namespaceObject === "strict" ? 1 : 7;
325 hasNonHarmony = true;
326 } else if (exportsType === "namespace") {
327 map[id] = 9;
328 hasNamespace = true;
329 } else if (exportsType === "named") {
330 map[id] = 3;
331 hasNamed = true;
332 }
333 return map;
334 }, Object.create(null));
335 if (!hasNamespace && hasNonHarmony && !hasNamed) {
336 return this.options.namespaceObject === "strict" ? 1 : 7;
337 }
338 if (hasNamespace && !hasNonHarmony && !hasNamed) {
339 return 9;
340 }
341 if (!hasNamespace && !hasNonHarmony && hasNamed) {
342 return 3;
343 }
344 if (!hasNamespace && !hasNonHarmony && !hasNamed) {
345 return 9;
346 }
347 return fakeMap;
348 }
349
350 getFakeMapInitStatement(fakeMap) {
351 return typeof fakeMap === "object"
352 ? `var fakeMap = ${JSON.stringify(fakeMap, null, "\t")};`
353 : "";
354 }
355
356 getReturn(type) {
357 if (type === 9) {
358 return "__webpack_require__(id)";
359 }
360 return `__webpack_require__.t(id, ${type})`;
361 }
362
363 getReturnModuleObjectSource(fakeMap, fakeMapDataExpression = "fakeMap[id]") {
364 if (typeof fakeMap === "number") {
365 return `return ${this.getReturn(fakeMap)};`;
366 }
367 return `return __webpack_require__.t(id, ${fakeMapDataExpression})`;
368 }
369
370 getSyncSource(dependencies, id) {
371 const map = this.getUserRequestMap(dependencies);
372 const fakeMap = this.getFakeMap(dependencies);
373 const returnModuleObject = this.getReturnModuleObjectSource(fakeMap);
374
375 return `var map = ${JSON.stringify(map, null, "\t")};
376${this.getFakeMapInitStatement(fakeMap)}
377
378function webpackContext(req) {
379 var id = webpackContextResolve(req);
380 ${returnModuleObject}
381}
382function webpackContextResolve(req) {
383 var id = map[req];
384 if(!(id + 1)) { // check for number or string
385 var e = new Error("Cannot find module '" + req + "'");
386 e.code = 'MODULE_NOT_FOUND';
387 throw e;
388 }
389 return id;
390}
391webpackContext.keys = function webpackContextKeys() {
392 return Object.keys(map);
393};
394webpackContext.resolve = webpackContextResolve;
395module.exports = webpackContext;
396webpackContext.id = ${JSON.stringify(id)};`;
397 }
398
399 getWeakSyncSource(dependencies, id) {
400 const map = this.getUserRequestMap(dependencies);
401 const fakeMap = this.getFakeMap(dependencies);
402 const returnModuleObject = this.getReturnModuleObjectSource(fakeMap);
403
404 return `var map = ${JSON.stringify(map, null, "\t")};
405${this.getFakeMapInitStatement(fakeMap)}
406
407function webpackContext(req) {
408 var id = webpackContextResolve(req);
409 if(!__webpack_require__.m[id]) {
410 var e = new Error("Module '" + req + "' ('" + id + "') is not available (weak dependency)");
411 e.code = 'MODULE_NOT_FOUND';
412 throw e;
413 }
414 ${returnModuleObject}
415}
416function webpackContextResolve(req) {
417 var id = map[req];
418 if(!(id + 1)) { // check for number or string
419 var e = new Error("Cannot find module '" + req + "'");
420 e.code = 'MODULE_NOT_FOUND';
421 throw e;
422 }
423 return id;
424}
425webpackContext.keys = function webpackContextKeys() {
426 return Object.keys(map);
427};
428webpackContext.resolve = webpackContextResolve;
429webpackContext.id = ${JSON.stringify(id)};
430module.exports = webpackContext;`;
431 }
432
433 getAsyncWeakSource(dependencies, id) {
434 const map = this.getUserRequestMap(dependencies);
435 const fakeMap = this.getFakeMap(dependencies);
436 const returnModuleObject = this.getReturnModuleObjectSource(fakeMap);
437
438 return `var map = ${JSON.stringify(map, null, "\t")};
439${this.getFakeMapInitStatement(fakeMap)}
440
441function webpackAsyncContext(req) {
442 return webpackAsyncContextResolve(req).then(function(id) {
443 if(!__webpack_require__.m[id]) {
444 var e = new Error("Module '" + req + "' ('" + id + "') is not available (weak dependency)");
445 e.code = 'MODULE_NOT_FOUND';
446 throw e;
447 }
448 ${returnModuleObject}
449 });
450}
451function webpackAsyncContextResolve(req) {
452 // Here Promise.resolve().then() is used instead of new Promise() to prevent
453 // uncaught exception popping up in devtools
454 return Promise.resolve().then(function() {
455 var id = map[req];
456 if(!(id + 1)) { // check for number or string
457 var e = new Error("Cannot find module '" + req + "'");
458 e.code = 'MODULE_NOT_FOUND';
459 throw e;
460 }
461 return id;
462 });
463}
464webpackAsyncContext.keys = function webpackAsyncContextKeys() {
465 return Object.keys(map);
466};
467webpackAsyncContext.resolve = webpackAsyncContextResolve;
468webpackAsyncContext.id = ${JSON.stringify(id)};
469module.exports = webpackAsyncContext;`;
470 }
471
472 getEagerSource(dependencies, id) {
473 const map = this.getUserRequestMap(dependencies);
474 const fakeMap = this.getFakeMap(dependencies);
475 const thenFunction =
476 fakeMap !== 9
477 ? `function(id) {
478 ${this.getReturnModuleObjectSource(fakeMap)}
479 }`
480 : "__webpack_require__";
481 return `var map = ${JSON.stringify(map, null, "\t")};
482${this.getFakeMapInitStatement(fakeMap)}
483
484function webpackAsyncContext(req) {
485 return webpackAsyncContextResolve(req).then(${thenFunction});
486}
487function webpackAsyncContextResolve(req) {
488 // Here Promise.resolve().then() is used instead of new Promise() to prevent
489 // uncaught exception popping up in devtools
490 return Promise.resolve().then(function() {
491 var id = map[req];
492 if(!(id + 1)) { // check for number or string
493 var e = new Error("Cannot find module '" + req + "'");
494 e.code = 'MODULE_NOT_FOUND';
495 throw e;
496 }
497 return id;
498 });
499}
500webpackAsyncContext.keys = function webpackAsyncContextKeys() {
501 return Object.keys(map);
502};
503webpackAsyncContext.resolve = webpackAsyncContextResolve;
504webpackAsyncContext.id = ${JSON.stringify(id)};
505module.exports = webpackAsyncContext;`;
506 }
507
508 getLazyOnceSource(block, dependencies, id, runtimeTemplate) {
509 const promise = runtimeTemplate.blockPromise({
510 block,
511 message: "lazy-once context"
512 });
513 const map = this.getUserRequestMap(dependencies);
514 const fakeMap = this.getFakeMap(dependencies);
515 const thenFunction =
516 fakeMap !== 9
517 ? `function(id) {
518 ${this.getReturnModuleObjectSource(fakeMap)};
519 }`
520 : "__webpack_require__";
521
522 return `var map = ${JSON.stringify(map, null, "\t")};
523${this.getFakeMapInitStatement(fakeMap)}
524
525function webpackAsyncContext(req) {
526 return webpackAsyncContextResolve(req).then(${thenFunction});
527}
528function webpackAsyncContextResolve(req) {
529 return ${promise}.then(function() {
530 var id = map[req];
531 if(!(id + 1)) { // check for number or string
532 var e = new Error("Cannot find module '" + req + "'");
533 e.code = 'MODULE_NOT_FOUND';
534 throw e;
535 }
536 return id;
537 });
538}
539webpackAsyncContext.keys = function webpackAsyncContextKeys() {
540 return Object.keys(map);
541};
542webpackAsyncContext.resolve = webpackAsyncContextResolve;
543webpackAsyncContext.id = ${JSON.stringify(id)};
544module.exports = webpackAsyncContext;`;
545 }
546
547 getLazySource(blocks, id) {
548 let hasMultipleOrNoChunks = false;
549 const fakeMap = this.getFakeMap(blocks.map(b => b.dependencies[0]));
550 const map = blocks
551 .filter(block => block.dependencies[0].module)
552 .map(block => ({
553 dependency: block.dependencies[0],
554 block: block,
555 userRequest: block.dependencies[0].userRequest
556 }))
557 .sort((a, b) => {
558 if (a.userRequest === b.userRequest) return 0;
559 return a.userRequest < b.userRequest ? -1 : 1;
560 })
561 .reduce((map, item) => {
562 const chunks =
563 (item.block.chunkGroup && item.block.chunkGroup.chunks) || [];
564 if (chunks.length !== 1) {
565 hasMultipleOrNoChunks = true;
566 }
567 const arrayStart = [item.dependency.module.id];
568 if (typeof fakeMap === "object") {
569 arrayStart.push(fakeMap[item.dependency.module.id]);
570 }
571 map[item.userRequest] = arrayStart.concat(
572 chunks.map(chunk => chunk.id)
573 );
574
575 return map;
576 }, Object.create(null));
577
578 const chunksStartPosition = typeof fakeMap === "object" ? 2 : 1;
579 const requestPrefix = hasMultipleOrNoChunks
580 ? `Promise.all(ids.slice(${chunksStartPosition}).map(__webpack_require__.e))`
581 : `__webpack_require__.e(ids[${chunksStartPosition}])`;
582 const returnModuleObject = this.getReturnModuleObjectSource(
583 fakeMap,
584 "ids[1]"
585 );
586
587 return `var map = ${JSON.stringify(map, null, "\t")};
588function webpackAsyncContext(req) {
589 var ids = map[req];
590 if(!ids) {
591 return Promise.resolve().then(function() {
592 var e = new Error("Cannot find module '" + req + "'");
593 e.code = 'MODULE_NOT_FOUND';
594 throw e;
595 });
596 }
597 return ${requestPrefix}.then(function() {
598 var id = ids[0];
599 ${returnModuleObject}
600 });
601}
602webpackAsyncContext.keys = function webpackAsyncContextKeys() {
603 return Object.keys(map);
604};
605webpackAsyncContext.id = ${JSON.stringify(id)};
606module.exports = webpackAsyncContext;`;
607 }
608
609 getSourceForEmptyContext(id) {
610 return `function webpackEmptyContext(req) {
611 var e = new Error("Cannot find module '" + req + "'");
612 e.code = 'MODULE_NOT_FOUND';
613 throw e;
614}
615webpackEmptyContext.keys = function() { return []; };
616webpackEmptyContext.resolve = webpackEmptyContext;
617module.exports = webpackEmptyContext;
618webpackEmptyContext.id = ${JSON.stringify(id)};`;
619 }
620
621 getSourceForEmptyAsyncContext(id) {
622 return `function webpackEmptyAsyncContext(req) {
623 // Here Promise.resolve().then() is used instead of new Promise() to prevent
624 // uncaught exception popping up in devtools
625 return Promise.resolve().then(function() {
626 var e = new Error("Cannot find module '" + req + "'");
627 e.code = 'MODULE_NOT_FOUND';
628 throw e;
629 });
630}
631webpackEmptyAsyncContext.keys = function() { return []; };
632webpackEmptyAsyncContext.resolve = webpackEmptyAsyncContext;
633module.exports = webpackEmptyAsyncContext;
634webpackEmptyAsyncContext.id = ${JSON.stringify(id)};`;
635 }
636
637 getSourceString(asyncMode, runtimeTemplate) {
638 if (asyncMode === "lazy") {
639 if (this.blocks && this.blocks.length > 0) {
640 return this.getLazySource(this.blocks, this.id);
641 }
642 return this.getSourceForEmptyAsyncContext(this.id);
643 }
644 if (asyncMode === "eager") {
645 if (this.dependencies && this.dependencies.length > 0) {
646 return this.getEagerSource(this.dependencies, this.id);
647 }
648 return this.getSourceForEmptyAsyncContext(this.id);
649 }
650 if (asyncMode === "lazy-once") {
651 const block = this.blocks[0];
652 if (block) {
653 return this.getLazyOnceSource(
654 block,
655 block.dependencies,
656 this.id,
657 runtimeTemplate
658 );
659 }
660 return this.getSourceForEmptyAsyncContext(this.id);
661 }
662 if (asyncMode === "async-weak") {
663 if (this.dependencies && this.dependencies.length > 0) {
664 return this.getAsyncWeakSource(this.dependencies, this.id);
665 }
666 return this.getSourceForEmptyAsyncContext(this.id);
667 }
668 if (asyncMode === "weak") {
669 if (this.dependencies && this.dependencies.length > 0) {
670 return this.getWeakSyncSource(this.dependencies, this.id);
671 }
672 }
673 if (this.dependencies && this.dependencies.length > 0) {
674 return this.getSyncSource(this.dependencies, this.id);
675 }
676 return this.getSourceForEmptyContext(this.id);
677 }
678
679 getSource(sourceString) {
680 if (this.useSourceMap) {
681 return new OriginalSource(sourceString, this.identifier());
682 }
683 return new RawSource(sourceString);
684 }
685
686 source(dependencyTemplates, runtimeTemplate) {
687 return this.getSource(
688 this.getSourceString(this.options.mode, runtimeTemplate)
689 );
690 }
691
692 size() {
693 // base penalty
694 const initialSize = 160;
695
696 // if we dont have dependencies we stop here.
697 return this.dependencies.reduce((size, dependency) => {
698 const element = /** @type {ContextElementDependency} */ (dependency);
699 return size + 5 + element.userRequest.length;
700 }, initialSize);
701 }
702}
703
704// TODO remove in webpack 5
705Object.defineProperty(ContextModule.prototype, "recursive", {
706 configurable: false,
707 get: util.deprecate(
708 /**
709 * @deprecated
710 * @this {ContextModule}
711 * @returns {boolean} is recursive
712 */
713 function() {
714 return this.options.recursive;
715 },
716 "ContextModule.recursive has been moved to ContextModule.options.recursive"
717 ),
718 set: util.deprecate(
719 /**
720 * @deprecated
721 * @this {ContextModule}
722 * @param {boolean} value is recursive
723 * @returns {void}
724 */
725 function(value) {
726 this.options.recursive = value;
727 },
728 "ContextModule.recursive has been moved to ContextModule.options.recursive"
729 )
730});
731
732// TODO remove in webpack 5
733Object.defineProperty(ContextModule.prototype, "regExp", {
734 configurable: false,
735 get: util.deprecate(
736 /**
737 * @deprecated
738 * @this {ContextModule}
739 * @returns {RegExp} regular expression
740 */
741 function() {
742 return this.options.regExp;
743 },
744 "ContextModule.regExp has been moved to ContextModule.options.regExp"
745 ),
746 set: util.deprecate(
747 /**
748 * @deprecated
749 * @this {ContextModule}
750 * @param {RegExp} value Regular expression
751 * @returns {void}
752 */
753 function(value) {
754 this.options.regExp = value;
755 },
756 "ContextModule.regExp has been moved to ContextModule.options.regExp"
757 )
758});
759
760// TODO remove in webpack 5
761Object.defineProperty(ContextModule.prototype, "addon", {
762 configurable: false,
763 get: util.deprecate(
764 /**
765 * @deprecated
766 * @this {ContextModule}
767 * @returns {string} addon
768 */
769 function() {
770 return this.options.addon;
771 },
772 "ContextModule.addon has been moved to ContextModule.options.addon"
773 ),
774 set: util.deprecate(
775 /**
776 * @deprecated
777 * @this {ContextModule}
778 * @param {string} value addon
779 * @returns {void}
780 */
781 function(value) {
782 this.options.addon = value;
783 },
784 "ContextModule.addon has been moved to ContextModule.options.addon"
785 )
786});
787
788// TODO remove in webpack 5
789Object.defineProperty(ContextModule.prototype, "async", {
790 configurable: false,
791 get: util.deprecate(
792 /**
793 * @deprecated
794 * @this {ContextModule}
795 * @returns {boolean} is async
796 */
797 function() {
798 return this.options.mode;
799 },
800 "ContextModule.async has been moved to ContextModule.options.mode"
801 ),
802 set: util.deprecate(
803 /**
804 * @deprecated
805 * @this {ContextModule}
806 * @param {ContextMode} value Context mode
807 * @returns {void}
808 */
809 function(value) {
810 this.options.mode = value;
811 },
812 "ContextModule.async has been moved to ContextModule.options.mode"
813 )
814});
815
816// TODO remove in webpack 5
817Object.defineProperty(ContextModule.prototype, "chunkName", {
818 configurable: false,
819 get: util.deprecate(
820 /**
821 * @deprecated
822 * @this {ContextModule}
823 * @returns {string} chunk name
824 */
825 function() {
826 return this.options.chunkName;
827 },
828 "ContextModule.chunkName has been moved to ContextModule.options.chunkName"
829 ),
830 set: util.deprecate(
831 /**
832 * @deprecated
833 * @this {ContextModule}
834 * @param {string} value chunk name
835 * @returns {void}
836 */
837 function(value) {
838 this.options.chunkName = value;
839 },
840 "ContextModule.chunkName has been moved to ContextModule.options.chunkName"
841 )
842});
843
844module.exports = ContextModule;