123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279 |
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
- const util = require("util");
- /** @type {Map<string, Function>} */
- const deprecationCache = new Map();
- /**
- * @typedef {object} FakeHookMarker
- * @property {true} _fakeHook it's a fake hook
- */
- /** @template T @typedef {T & FakeHookMarker} FakeHook<T> */
- /**
- * @param {string} message deprecation message
- * @param {string} code deprecation code
- * @returns {Function} function to trigger deprecation
- */
- const createDeprecation = (message, code) => {
- const cached = deprecationCache.get(message);
- if (cached !== undefined) return cached;
- const fn = util.deprecate(
- () => {},
- message,
- "DEP_WEBPACK_DEPRECATION_" + code
- );
- deprecationCache.set(message, fn);
- return fn;
- };
- const COPY_METHODS = [
- "concat",
- "entry",
- "filter",
- "find",
- "findIndex",
- "includes",
- "indexOf",
- "join",
- "lastIndexOf",
- "map",
- "reduce",
- "reduceRight",
- "slice",
- "some"
- ];
- const DISABLED_METHODS = [
- "copyWithin",
- "entries",
- "fill",
- "keys",
- "pop",
- "reverse",
- "shift",
- "splice",
- "sort",
- "unshift"
- ];
- /**
- * @param {any} set new set
- * @param {string} name property name
- * @returns {void}
- */
- exports.arrayToSetDeprecation = (set, name) => {
- for (const method of COPY_METHODS) {
- if (set[method]) continue;
- const d = createDeprecation(
- `${name} was changed from Array to Set (using Array method '${method}' is deprecated)`,
- "ARRAY_TO_SET"
- );
- /**
- * @deprecated
- * @this {Set<any>}
- * @returns {number} count
- */
- set[method] = function () {
- d();
- const array = Array.from(this);
- return Array.prototype[method].apply(array, arguments);
- };
- }
- const dPush = createDeprecation(
- `${name} was changed from Array to Set (using Array method 'push' is deprecated)`,
- "ARRAY_TO_SET_PUSH"
- );
- const dLength = createDeprecation(
- `${name} was changed from Array to Set (using Array property 'length' is deprecated)`,
- "ARRAY_TO_SET_LENGTH"
- );
- const dIndexer = createDeprecation(
- `${name} was changed from Array to Set (indexing Array is deprecated)`,
- "ARRAY_TO_SET_INDEXER"
- );
- /**
- * @deprecated
- * @this {Set<any>}
- * @returns {number} count
- */
- set.push = function () {
- dPush();
- for (const item of Array.from(arguments)) {
- this.add(item);
- }
- return this.size;
- };
- for (const method of DISABLED_METHODS) {
- if (set[method]) continue;
- set[method] = () => {
- throw new Error(
- `${name} was changed from Array to Set (using Array method '${method}' is not possible)`
- );
- };
- }
- /**
- * @param {number} index index
- * @returns {any} value
- */
- const createIndexGetter = index => {
- /**
- * @this {Set<any>} a Set
- * @returns {any} the value at this location
- */
- const fn = function () {
- dIndexer();
- let i = 0;
- for (const item of this) {
- if (i++ === index) return item;
- }
- return undefined;
- };
- return fn;
- };
- /**
- * @param {number} index index
- */
- const defineIndexGetter = index => {
- Object.defineProperty(set, index, {
- get: createIndexGetter(index),
- set(value) {
- throw new Error(
- `${name} was changed from Array to Set (indexing Array with write is not possible)`
- );
- }
- });
- };
- defineIndexGetter(0);
- let indexerDefined = 1;
- Object.defineProperty(set, "length", {
- get() {
- dLength();
- const length = this.size;
- for (indexerDefined; indexerDefined < length + 1; indexerDefined++) {
- defineIndexGetter(indexerDefined);
- }
- return length;
- },
- set(value) {
- throw new Error(
- `${name} was changed from Array to Set (writing to Array property 'length' is not possible)`
- );
- }
- });
- set[Symbol.isConcatSpreadable] = true;
- };
- exports.createArrayToSetDeprecationSet = name => {
- let initialized = false;
- class SetDeprecatedArray extends Set {
- constructor(items) {
- super(items);
- if (!initialized) {
- initialized = true;
- exports.arrayToSetDeprecation(SetDeprecatedArray.prototype, name);
- }
- }
- }
- return SetDeprecatedArray;
- };
- /**
- * @template T
- * @param {object} obj object
- * @param {string} name property name
- * @param {string} code deprecation code
- * @param {string} note additional note
- * @returns {object} frozen object with deprecation when modifying
- */
- exports.soonFrozenObjectDeprecation = (obj, name, code, note = "") => {
- const message = `${name} will be frozen in future, all modifications are deprecated.${
- note && `\n${note}`
- }`;
- return new Proxy(obj, {
- set: util.deprecate(
- (target, property, value, receiver) =>
- Reflect.set(target, property, value, receiver),
- message,
- code
- ),
- defineProperty: util.deprecate(
- (target, property, descriptor) =>
- Reflect.defineProperty(target, property, descriptor),
- message,
- code
- ),
- deleteProperty: util.deprecate(
- (target, property) => Reflect.deleteProperty(target, property),
- message,
- code
- ),
- setPrototypeOf: util.deprecate(
- (target, proto) => Reflect.setPrototypeOf(target, proto),
- message,
- code
- )
- });
- };
- /**
- * @template T
- * @param {T} obj object
- * @param {string} message deprecation message
- * @param {string} code deprecation code
- * @returns {T} object with property access deprecated
- */
- const deprecateAllProperties = (obj, message, code) => {
- const newObj = {};
- const descriptors = Object.getOwnPropertyDescriptors(obj);
- for (const name of Object.keys(descriptors)) {
- const descriptor = descriptors[name];
- if (typeof descriptor.value === "function") {
- Object.defineProperty(newObj, name, {
- ...descriptor,
- value: util.deprecate(descriptor.value, message, code)
- });
- } else if (descriptor.get || descriptor.set) {
- Object.defineProperty(newObj, name, {
- ...descriptor,
- get: descriptor.get && util.deprecate(descriptor.get, message, code),
- set: descriptor.set && util.deprecate(descriptor.set, message, code)
- });
- } else {
- let value = descriptor.value;
- Object.defineProperty(newObj, name, {
- configurable: descriptor.configurable,
- enumerable: descriptor.enumerable,
- get: util.deprecate(() => value, message, code),
- set: descriptor.writable
- ? util.deprecate(v => (value = v), message, code)
- : undefined
- });
- }
- }
- return /** @type {T} */ (newObj);
- };
- exports.deprecateAllProperties = deprecateAllProperties;
- /**
- * @template T
- * @param {T} fakeHook fake hook implementation
- * @param {string=} message deprecation message (not deprecated when unset)
- * @param {string=} code deprecation code (not deprecated when unset)
- * @returns {FakeHook<T>} fake hook which redirects
- */
- exports.createFakeHook = (fakeHook, message, code) => {
- if (message && code) {
- fakeHook = deprecateAllProperties(fakeHook, message, code);
- }
- return Object.freeze(
- Object.assign(fakeHook, { _fakeHook: /** @type {true} */ (true) })
- );
- };
|