| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const util = require("util"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | /** @type {Map<string, Function>} */ | 
					
						
							|  |  |  | const deprecationCache = new Map(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-14 18:02:32 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @typedef {Object} FakeHookMarker | 
					
						
							|  |  |  |  * @property {true} _fakeHook it's a fake hook | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @template T @typedef {T & FakeHookMarker} FakeHook<T> */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {string} message deprecation message | 
					
						
							| 
									
										
										
										
											2019-11-14 22:01:25 +08:00
										 |  |  |  * @param {string} code deprecation code | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  |  * @returns {Function} function to trigger deprecation | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-11-14 22:01:25 +08:00
										 |  |  | const createDeprecation = (message, code) => { | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | 	const cached = deprecationCache.get(message); | 
					
						
							|  |  |  | 	if (cached !== undefined) return cached; | 
					
						
							| 
									
										
										
										
											2019-11-14 22:01:25 +08:00
										 |  |  | 	const fn = util.deprecate( | 
					
						
							|  |  |  | 		() => {}, | 
					
						
							|  |  |  | 		message, | 
					
						
							|  |  |  | 		"DEP_WEBPACK_DEPRECATION_" + code | 
					
						
							|  |  |  | 	); | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | 	deprecationCache.set(message, fn); | 
					
						
							|  |  |  | 	return fn; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  | 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; | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | 		const d = createDeprecation( | 
					
						
							| 
									
										
										
										
											2019-11-14 22:01:25 +08:00
										 |  |  | 			`${name} was changed from Array to Set (using Array method '${method}' is deprecated)`, | 
					
						
							|  |  |  | 			"ARRAY_TO_SET" | 
					
						
							| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  | 		); | 
					
						
							|  |  |  | 		/** | 
					
						
							|  |  |  | 		 * @deprecated | 
					
						
							|  |  |  | 		 * @this {Set} | 
					
						
							|  |  |  | 		 * @returns {number} count | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 		set[method] = function () { | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | 			d(); | 
					
						
							|  |  |  | 			const array = Array.from(this); | 
					
						
							|  |  |  | 			return Array.prototype[method].apply(array, arguments); | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	const dPush = createDeprecation( | 
					
						
							| 
									
										
										
										
											2019-11-14 22:01:25 +08:00
										 |  |  | 		`${name} was changed from Array to Set (using Array method 'push' is deprecated)`, | 
					
						
							|  |  |  | 		"ARRAY_TO_SET_PUSH" | 
					
						
							| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  | 	); | 
					
						
							| 
									
										
										
										
											2019-06-14 16:45:56 +08:00
										 |  |  | 	const dLength = createDeprecation( | 
					
						
							| 
									
										
										
										
											2019-11-14 22:01:25 +08:00
										 |  |  | 		`${name} was changed from Array to Set (using Array property 'length' is deprecated)`, | 
					
						
							|  |  |  | 		"ARRAY_TO_SET_LENGTH" | 
					
						
							| 
									
										
										
										
											2019-06-14 16:45:56 +08:00
										 |  |  | 	); | 
					
						
							|  |  |  | 	const dIndexer = createDeprecation( | 
					
						
							| 
									
										
										
										
											2019-11-14 22:01:25 +08:00
										 |  |  | 		`${name} was changed from Array to Set (indexing Array is deprecated)`, | 
					
						
							|  |  |  | 		"ARRAY_TO_SET_INDEXER" | 
					
						
							| 
									
										
										
										
											2019-06-14 16:45:56 +08:00
										 |  |  | 	); | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @deprecated | 
					
						
							|  |  |  | 	 * @this {Set} | 
					
						
							|  |  |  | 	 * @returns {number} count | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 	set.push = function () { | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | 		dPush(); | 
					
						
							|  |  |  | 		for (const item of Array.from(arguments)) { | 
					
						
							|  |  |  | 			this.add(item); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return this.size; | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  | 	for (const method of DISABLED_METHODS) { | 
					
						
							|  |  |  | 		if (set[method]) continue; | 
					
						
							|  |  |  | 		set[method] = () => { | 
					
						
							|  |  |  | 			throw new Error( | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | 				`${name} was changed from Array to Set (using Array method '${method}' is not possible)` | 
					
						
							| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  | 			); | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-07-25 21:41:00 +08:00
										 |  |  | 	const createIndexGetter = index => { | 
					
						
							|  |  |  | 		/** | 
					
						
							|  |  |  | 		 * @this {Set} a Set | 
					
						
							|  |  |  | 		 * @returns {any} the value at this location | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 		const fn = function () { | 
					
						
							| 
									
										
										
										
											2019-07-25 21:41:00 +08:00
										 |  |  | 			dIndexer(); | 
					
						
							|  |  |  | 			let i = 0; | 
					
						
							|  |  |  | 			for (const item of this) { | 
					
						
							|  |  |  | 				if (i++ === index) return item; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			return undefined; | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 		return fn; | 
					
						
							| 
									
										
										
										
											2019-06-14 16:45:56 +08:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2020-09-22 22:46:01 +08:00
										 |  |  | 	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; | 
					
						
							| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  | 	Object.defineProperty(set, "length", { | 
					
						
							|  |  |  | 		get() { | 
					
						
							| 
									
										
										
										
											2019-06-14 16:45:56 +08:00
										 |  |  | 			dLength(); | 
					
						
							| 
									
										
										
										
											2019-07-25 21:41:00 +08:00
										 |  |  | 			const length = this.size; | 
					
						
							| 
									
										
										
										
											2020-09-22 22:46:01 +08:00
										 |  |  | 			for (indexerDefined; indexerDefined < length + 1; indexerDefined++) { | 
					
						
							|  |  |  | 				defineIndexGetter(indexerDefined); | 
					
						
							| 
									
										
										
										
											2019-06-14 16:45:56 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 			return length; | 
					
						
							| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  | 		}, | 
					
						
							|  |  |  | 		set(value) { | 
					
						
							|  |  |  | 			throw new Error( | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | 				`${name} was changed from Array to Set (writing to Array property 'length' is not possible)` | 
					
						
							| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  | 			); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2019-06-14 16:45:56 +08:00
										 |  |  | 	set[Symbol.isConcatSpreadable] = true; | 
					
						
							| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2019-07-25 21:41:00 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | exports.createArrayToSetDeprecationSet = name => { | 
					
						
							|  |  |  | 	class SetDeprecatedArray extends Set {} | 
					
						
							|  |  |  | 	exports.arrayToSetDeprecation(SetDeprecatedArray.prototype, name); | 
					
						
							|  |  |  | 	return SetDeprecatedArray; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2020-05-12 18:16:51 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-07-14 18:02:32 +08:00
										 |  |  | const deprecateAllProperties = (obj, message, code) => { | 
					
						
							| 
									
										
										
										
											2020-05-12 18:16:51 +08:00
										 |  |  | 	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); | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2020-07-14 18:02:32 +08:00
										 |  |  | 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) }) | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | }; |