|
1 |
| -import { DeprecationOptions, formatStringFromArgs, noop, version, Version } from "./_namespaces/ts"; |
2 |
| -import * as Debug from "../compiler/debug"; |
3 |
| - |
4 |
| -export let enableDeprecationWarnings = true; |
5 |
| - |
6 |
| -export function setEnableDeprecationWarnings(value: boolean) { |
7 |
| - enableDeprecationWarnings = value; |
8 |
| -} |
9 |
| - |
10 |
| -let typeScriptVersion: Version | undefined; |
11 |
| - |
12 |
| -export function getTypeScriptVersion() { |
13 |
| - return typeScriptVersion ?? (typeScriptVersion = new Version(version)); |
14 |
| -} |
15 |
| - |
16 |
| -function formatDeprecationMessage(name: string, error: boolean | undefined, errorAfter: Version | undefined, since: Version | undefined, message: string | undefined) { |
17 |
| - let deprecationMessage = error ? "DeprecationError: " : "DeprecationWarning: "; |
18 |
| - deprecationMessage += `'${name}' `; |
19 |
| - deprecationMessage += since ? `has been deprecated since v${since}` : "is deprecated"; |
20 |
| - deprecationMessage += error ? " and can no longer be used." : errorAfter ? ` and will no longer be usable after v${errorAfter}.` : "."; |
21 |
| - deprecationMessage += message ? ` ${formatStringFromArgs(message, [name], 0)}` : ""; |
22 |
| - return deprecationMessage; |
23 |
| -} |
24 |
| - |
25 |
| -function createErrorDeprecation(name: string, errorAfter: Version | undefined, since: Version | undefined, message: string | undefined) { |
26 |
| - const deprecationMessage = formatDeprecationMessage(name, /*error*/ true, errorAfter, since, message); |
27 |
| - return () => { |
28 |
| - throw new TypeError(deprecationMessage); |
29 |
| - }; |
30 |
| -} |
31 |
| - |
32 |
| -function createWarningDeprecation(name: string, errorAfter: Version | undefined, since: Version | undefined, message: string | undefined) { |
33 |
| - let hasWrittenDeprecation = false; |
34 |
| - return () => { |
35 |
| - if (enableDeprecationWarnings && !hasWrittenDeprecation) { |
36 |
| - Debug.log.warn(formatDeprecationMessage(name, /*error*/ false, errorAfter, since, message)); |
37 |
| - hasWrittenDeprecation = true; |
38 |
| - } |
39 |
| - }; |
40 |
| -} |
41 |
| - |
42 |
| -export function createDeprecation(name: string, options: DeprecationOptions & { error: true }): () => never; |
43 |
| -export function createDeprecation(name: string, options?: DeprecationOptions): () => void; |
44 |
| -export function createDeprecation(name: string, options: DeprecationOptions = {}) { |
45 |
| - const version = typeof options.typeScriptVersion === "string" ? new Version(options.typeScriptVersion) : options.typeScriptVersion ?? getTypeScriptVersion(); |
46 |
| - const errorAfter = typeof options.errorAfter === "string" ? new Version(options.errorAfter) : options.errorAfter; |
47 |
| - const warnAfter = typeof options.warnAfter === "string" ? new Version(options.warnAfter) : options.warnAfter; |
48 |
| - const since = typeof options.since === "string" ? new Version(options.since) : options.since ?? warnAfter; |
49 |
| - const error = options.error || errorAfter && version.compareTo(errorAfter) <= 0; |
50 |
| - const warn = !warnAfter || version.compareTo(warnAfter) >= 0; |
51 |
| - return error ? createErrorDeprecation(name, errorAfter, since, options.message) : |
52 |
| - warn ? createWarningDeprecation(name, errorAfter, since, options.message) : |
53 |
| - noop; |
54 |
| -} |
55 |
| - |
56 |
| -function wrapFunction<F extends (...args: any[]) => any>(deprecation: () => void, func: F): F { |
57 |
| - return function (this: unknown) { |
58 |
| - deprecation(); |
59 |
| - return func.apply(this, arguments); |
60 |
| - } as F; |
61 |
| -} |
62 |
| - |
63 |
| -export function deprecate<F extends (...args: any[]) => any>(func: F, options?: DeprecationOptions): F { |
64 |
| - const deprecation = createDeprecation(options?.name ?? Debug.getFunctionName(func), options); |
65 |
| - return wrapFunction(deprecation, func); |
66 |
| -} |
| 1 | +import { DeprecationOptions, formatStringFromArgs, noop, version, Version } from "./_namespaces/ts"; |
| 2 | +import * as Debug from "../compiler/debug"; |
| 3 | + |
| 4 | +export let enableDeprecationWarnings = true; |
| 5 | + |
| 6 | +export function setEnableDeprecationWarnings(value: boolean) { |
| 7 | + enableDeprecationWarnings = value; |
| 8 | +} |
| 9 | + |
| 10 | +let typeScriptVersion: Version | undefined; |
| 11 | + |
| 12 | +export function getTypeScriptVersion() { |
| 13 | + return typeScriptVersion ?? (typeScriptVersion = new Version(version)); |
| 14 | +} |
| 15 | + |
| 16 | +function formatDeprecationMessage(name: string, error: boolean | undefined, errorAfter: Version | undefined, since: Version | undefined, message: string | undefined) { |
| 17 | + let deprecationMessage = error ? "DeprecationError: " : "DeprecationWarning: "; |
| 18 | + deprecationMessage += `'${name}' `; |
| 19 | + deprecationMessage += since ? `has been deprecated since v${since}` : "is deprecated"; |
| 20 | + deprecationMessage += error ? " and can no longer be used." : errorAfter ? ` and will no longer be usable after v${errorAfter}.` : "."; |
| 21 | + deprecationMessage += message ? ` ${formatStringFromArgs(message, [name], 0)}` : ""; |
| 22 | + return deprecationMessage; |
| 23 | +} |
| 24 | + |
| 25 | +function createErrorDeprecation(name: string, errorAfter: Version | undefined, since: Version | undefined, message: string | undefined) { |
| 26 | + const deprecationMessage = formatDeprecationMessage(name, /*error*/ true, errorAfter, since, message); |
| 27 | + return () => { |
| 28 | + throw new TypeError(deprecationMessage); |
| 29 | + }; |
| 30 | +} |
| 31 | + |
| 32 | +function createWarningDeprecation(name: string, errorAfter: Version | undefined, since: Version | undefined, message: string | undefined) { |
| 33 | + let hasWrittenDeprecation = false; |
| 34 | + return () => { |
| 35 | + if (enableDeprecationWarnings && !hasWrittenDeprecation) { |
| 36 | + Debug.log.warn(formatDeprecationMessage(name, /*error*/ false, errorAfter, since, message)); |
| 37 | + hasWrittenDeprecation = true; |
| 38 | + } |
| 39 | + }; |
| 40 | +} |
| 41 | + |
| 42 | +export function createDeprecation(name: string, options: DeprecationOptions & { error: true }): () => never; |
| 43 | +export function createDeprecation(name: string, options?: DeprecationOptions): () => void; |
| 44 | +export function createDeprecation(name: string, options: DeprecationOptions = {}) { |
| 45 | + const version = typeof options.typeScriptVersion === "string" ? new Version(options.typeScriptVersion) : options.typeScriptVersion ?? getTypeScriptVersion(); |
| 46 | + const errorAfter = typeof options.errorAfter === "string" ? new Version(options.errorAfter) : options.errorAfter; |
| 47 | + const warnAfter = typeof options.warnAfter === "string" ? new Version(options.warnAfter) : options.warnAfter; |
| 48 | + const since = typeof options.since === "string" ? new Version(options.since) : options.since ?? warnAfter; |
| 49 | + const error = options.error || errorAfter && version.compareTo(errorAfter) <= 0; |
| 50 | + const warn = !warnAfter || version.compareTo(warnAfter) >= 0; |
| 51 | + return error ? createErrorDeprecation(name, errorAfter, since, options.message) : |
| 52 | + warn ? createWarningDeprecation(name, errorAfter, since, options.message) : |
| 53 | + noop; |
| 54 | +} |
| 55 | + |
| 56 | +function wrapFunction<F extends (...args: any[]) => any>(deprecation: () => void, func: F): F { |
| 57 | + return function (this: unknown) { |
| 58 | + deprecation(); |
| 59 | + return func.apply(this, arguments); |
| 60 | + } as F; |
| 61 | +} |
| 62 | + |
| 63 | +export function deprecate<F extends (...args: any[]) => any>(func: F, options?: DeprecationOptions): F { |
| 64 | + const deprecation = createDeprecation(options?.name ?? Debug.getFunctionName(func), options); |
| 65 | + return wrapFunction(deprecation, func); |
| 66 | +} |
0 commit comments