| 
									
										
										
										
											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"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-14 00:34:04 +08:00
										 |  |  | /** @type {Map<string, () => void>} */ | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | const deprecationCache = new Map(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-07-14 18:02:32 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2024-06-11 21:09:50 +08:00
										 |  |  |  * @typedef {object} FakeHookMarker | 
					
						
							| 
									
										
										
										
											2020-07-14 18:02:32 +08:00
										 |  |  |  * @property {true} _fakeHook it's a fake hook | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-07 23:22:25 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							|  |  |  |  * @typedef {T & FakeHookMarker} FakeHook<T> | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2020-07-14 18:02:32 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2025-03-14 00:34:04 +08:00
										 |  |  |  * @returns {() => void} function to trigger deprecation | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											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, | 
					
						
							| 
									
										
										
										
											2024-07-31 10:39:30 +08:00
										 |  |  | 		`DEP_WEBPACK_DEPRECATION_${code}` | 
					
						
							| 
									
										
										
										
											2019-11-14 22:01:25 +08:00
										 |  |  | 	); | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | 	deprecationCache.set(message, fn); | 
					
						
							|  |  |  | 	return fn; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | /** @typedef {"concat" | "entry" | "filter" | "find" | "findIndex" | "includes" | "indexOf" | "join" | "lastIndexOf" | "map" | "reduce" | "reduceRight" | "slice" | "some"} COPY_METHODS_NAMES */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @type {COPY_METHODS_NAMES[]} */ | 
					
						
							| 
									
										
										
										
											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" | 
					
						
							|  |  |  | ]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | /** @typedef {"copyWithin" | "entries" | "fill" | "keys" | "pop" | "reverse" | "shift" | "splice" | "sort" | "unshift"} DISABLED_METHODS_NAMES */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** @type {DISABLED_METHODS_NAMES[]} */ | 
					
						
							| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  | const DISABLED_METHODS = [ | 
					
						
							|  |  |  | 	"copyWithin", | 
					
						
							|  |  |  | 	"entries", | 
					
						
							|  |  |  | 	"fill", | 
					
						
							|  |  |  | 	"keys", | 
					
						
							|  |  |  | 	"pop", | 
					
						
							|  |  |  | 	"reverse", | 
					
						
							|  |  |  | 	"shift", | 
					
						
							|  |  |  | 	"splice", | 
					
						
							|  |  |  | 	"sort", | 
					
						
							|  |  |  | 	"unshift" | 
					
						
							|  |  |  | ]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  |  * @template T | 
					
						
							|  |  |  |  * @typedef {Set<T> & {[Symbol.isConcatSpreadable]?: boolean} & { push?: (...items: T[]) => void } & { [P in DISABLED_METHODS_NAMES]?: () => void } & { [P in COPY_METHODS_NAMES]?: () => TODO }} SetWithDeprecatedArrayMethods | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							|  |  |  |  * @param {SetWithDeprecatedArrayMethods<T>} set new set | 
					
						
							| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  |  * @param {string} name property name | 
					
						
							|  |  |  |  * @returns {void} | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2024-07-31 04:54:55 +08:00
										 |  |  | module.exports.arrayToSetDeprecation = (set, name) => { | 
					
						
							| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  | 	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 | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 		 * @this {Set<T>} | 
					
						
							| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  | 		 * @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); | 
					
						
							| 
									
										
										
										
											2024-08-07 23:22:25 +08:00
										 |  |  | 			return Array.prototype[/** @type {keyof COPY_METHODS} */ (method)].apply( | 
					
						
							|  |  |  | 				array, | 
					
						
							|  |  |  | 				// eslint-disable-next-line prefer-rest-params
 | 
					
						
							|  |  |  | 				arguments | 
					
						
							|  |  |  | 			); | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | 		}; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	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 | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 	 * @this {Set<T>} | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | 	 * @returns {number} count | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2020-03-29 06:10:15 +08:00
										 |  |  | 	set.push = function () { | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | 		dPush(); | 
					
						
							| 
									
										
										
										
											2024-07-31 09:37:24 +08:00
										 |  |  | 		// eslint-disable-next-line prefer-rest-params
 | 
					
						
							| 
									
										
										
										
											2018-09-12 19:07:36 +08:00
										 |  |  | 		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; | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-09-06 22:57:32 +08:00
										 |  |  | 		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
										 |  |  | 			); | 
					
						
							|  |  |  | 		}; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-06-12 22:21:21 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {number} index index | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 	 * @returns {() => T | undefined} value | 
					
						
							| 
									
										
										
										
											2023-06-12 22:21:21 +08:00
										 |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2019-07-25 21:41:00 +08:00
										 |  |  | 	const createIndexGetter = index => { | 
					
						
							|  |  |  | 		/** | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 		 * @this {Set<T>} a Set | 
					
						
							|  |  |  | 		 * @returns {T | undefined} the value at this location | 
					
						
							| 
									
										
										
										
											2019-07-25 21:41:00 +08:00
										 |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2024-07-31 11:50:02 +08:00
										 |  |  | 		// eslint-disable-next-line func-style
 | 
					
						
							| 
									
										
										
										
											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 fn; | 
					
						
							| 
									
										
										
										
											2019-06-14 16:45:56 +08:00
										 |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2023-06-12 22:21:21 +08:00
										 |  |  | 	/** | 
					
						
							|  |  |  | 	 * @param {number} index index | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @template T | 
					
						
							|  |  |  |  * @param {string} name name | 
					
						
							|  |  |  |  * @returns {{ new <T = any>(values?: readonly T[] | null): SetDeprecatedArray<T> }} SetDeprecatedArray | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2024-07-31 04:54:55 +08:00
										 |  |  | module.exports.createArrayToSetDeprecationSet = name => { | 
					
						
							| 
									
										
										
										
											2021-11-05 16:53:32 +08:00
										 |  |  | 	let initialized = false; | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/** | 
					
						
							|  |  |  | 	 * @template T | 
					
						
							|  |  |  | 	 */ | 
					
						
							| 
									
										
										
										
											2021-11-05 16:53:32 +08:00
										 |  |  | 	class SetDeprecatedArray extends Set { | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  | 		/** | 
					
						
							|  |  |  | 		 * @param {readonly T[] | null=} items items | 
					
						
							|  |  |  | 		 */ | 
					
						
							| 
									
										
										
										
											2021-11-05 16:53:32 +08:00
										 |  |  | 		constructor(items) { | 
					
						
							|  |  |  | 			super(items); | 
					
						
							|  |  |  | 			if (!initialized) { | 
					
						
							|  |  |  | 				initialized = true; | 
					
						
							| 
									
										
										
										
											2024-07-31 04:54:55 +08:00
										 |  |  | 				module.exports.arrayToSetDeprecation( | 
					
						
							|  |  |  | 					SetDeprecatedArray.prototype, | 
					
						
							|  |  |  | 					name | 
					
						
							|  |  |  | 				); | 
					
						
							| 
									
										
										
										
											2021-11-05 16:53:32 +08:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2019-07-25 21:41:00 +08:00
										 |  |  | 	return SetDeprecatedArray; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2020-05-12 18:16:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-01 04:51:59 +08:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  |  * @template {object} T | 
					
						
							|  |  |  |  * @param {T} obj object | 
					
						
							| 
									
										
										
										
											2023-05-01 04:51:59 +08:00
										 |  |  |  * @param {string} name property name | 
					
						
							|  |  |  |  * @param {string} code deprecation code | 
					
						
							|  |  |  |  * @param {string} note additional note | 
					
						
							| 
									
										
										
										
											2025-04-03 00:02:22 +08:00
										 |  |  |  * @returns {T} frozen object with deprecation when modifying | 
					
						
							| 
									
										
										
										
											2023-05-01 04:51:59 +08:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2024-07-31 04:54:55 +08:00
										 |  |  | module.exports.soonFrozenObjectDeprecation = (obj, name, code, note = "") => { | 
					
						
							| 
									
										
										
										
											2020-05-12 18:16:51 +08:00
										 |  |  | 	const message = `${name} will be frozen in future, all modifications are deprecated.${ | 
					
						
							|  |  |  | 		note && `\n${note}` | 
					
						
							|  |  |  | 	}`;
 | 
					
						
							| 
									
										
										
										
											2025-04-03 00:02:22 +08:00
										 |  |  | 	return /** @type {T} */ ( | 
					
						
							|  |  |  | 		new Proxy(obj, { | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  | 			set: util.deprecate( | 
					
						
							|  |  |  | 				/** | 
					
						
							| 
									
										
										
										
											2025-04-03 00:02:22 +08:00
										 |  |  | 				 * @param {object} target target | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  | 				 * @param {string | symbol} property property | 
					
						
							| 
									
										
										
										
											2025-03-07 21:12:22 +08:00
										 |  |  | 				 * @param {EXPECTED_ANY} value value | 
					
						
							|  |  |  | 				 * @param {EXPECTED_ANY} receiver receiver | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  | 				 * @returns {boolean} result | 
					
						
							|  |  |  | 				 */ | 
					
						
							|  |  |  | 				(target, property, value, receiver) => | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 					Reflect.set(target, property, value, receiver), | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  | 				message, | 
					
						
							|  |  |  | 				code | 
					
						
							|  |  |  | 			), | 
					
						
							|  |  |  | 			defineProperty: util.deprecate( | 
					
						
							|  |  |  | 				/** | 
					
						
							| 
									
										
										
										
											2025-04-03 00:02:22 +08:00
										 |  |  | 				 * @param {object} target target | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  | 				 * @param {string | symbol} property property | 
					
						
							|  |  |  | 				 * @param {PropertyDescriptor} descriptor descriptor | 
					
						
							|  |  |  | 				 * @returns {boolean} result | 
					
						
							|  |  |  | 				 */ | 
					
						
							|  |  |  | 				(target, property, descriptor) => | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 					Reflect.defineProperty(target, property, descriptor), | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  | 				message, | 
					
						
							|  |  |  | 				code | 
					
						
							|  |  |  | 			), | 
					
						
							|  |  |  | 			deleteProperty: util.deprecate( | 
					
						
							|  |  |  | 				/** | 
					
						
							| 
									
										
										
										
											2025-04-03 00:02:22 +08:00
										 |  |  | 				 * @param {object} target target | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  | 				 * @param {string | symbol} property property | 
					
						
							|  |  |  | 				 * @returns {boolean} result | 
					
						
							|  |  |  | 				 */ | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 				(target, property) => Reflect.deleteProperty(target, property), | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  | 				message, | 
					
						
							|  |  |  | 				code | 
					
						
							|  |  |  | 			), | 
					
						
							|  |  |  | 			setPrototypeOf: util.deprecate( | 
					
						
							|  |  |  | 				/** | 
					
						
							| 
									
										
										
										
											2025-04-03 00:02:22 +08:00
										 |  |  | 				 * @param {object} target target | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 				 * @param {EXPECTED_OBJECT | null} proto proto | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  | 				 * @returns {boolean} result | 
					
						
							|  |  |  | 				 */ | 
					
						
							| 
									
										
										
										
											2025-03-27 08:07:25 +08:00
										 |  |  | 				(target, proto) => Reflect.setPrototypeOf(target, proto), | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  | 				message, | 
					
						
							|  |  |  | 				code | 
					
						
							|  |  |  | 			) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	); | 
					
						
							| 
									
										
										
										
											2020-05-12 18:16:51 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @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 | 
					
						
							| 
									
										
										
										
											2024-10-24 05:41:15 +08:00
										 |  |  | 					? util.deprecate( | 
					
						
							|  |  |  | 							/** | 
					
						
							|  |  |  | 							 * @template T | 
					
						
							|  |  |  | 							 * @param {T} v value | 
					
						
							|  |  |  | 							 * @returns {T} result | 
					
						
							|  |  |  | 							 */ | 
					
						
							|  |  |  | 							v => (value = v), | 
					
						
							|  |  |  | 							message, | 
					
						
							|  |  |  | 							code | 
					
						
							|  |  |  | 						) | 
					
						
							| 
									
										
										
										
											2020-05-12 18:16:51 +08:00
										 |  |  | 					: undefined | 
					
						
							|  |  |  | 			}); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return /** @type {T} */ (newObj); | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2024-07-31 04:54:55 +08:00
										 |  |  | module.exports.deprecateAllProperties = deprecateAllProperties; | 
					
						
							| 
									
										
										
										
											2020-07-14 18:02:32 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2024-10-01 03:05:27 +08:00
										 |  |  |  * @template {object} T | 
					
						
							| 
									
										
										
										
											2020-07-14 18:02:32 +08:00
										 |  |  |  * @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 | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2024-07-31 04:54:55 +08:00
										 |  |  | module.exports.createFakeHook = (fakeHook, message, code) => { | 
					
						
							| 
									
										
										
										
											2020-07-14 18:02:32 +08:00
										 |  |  | 	if (message && code) { | 
					
						
							|  |  |  | 		fakeHook = deprecateAllProperties(fakeHook, message, code); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return Object.freeze( | 
					
						
							|  |  |  | 		Object.assign(fakeHook, { _fakeHook: /** @type {true} */ (true) }) | 
					
						
							|  |  |  | 	); | 
					
						
							|  |  |  | }; |