From 453ac54a89f98171231a748373a7e2052c71ee15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 12 Jan 2022 22:11:13 +0100 Subject: [PATCH 01/64] feat(eslint-plugin): [prefer-readonly-parameter-types] Added an optional type whitelist --- .../rules/prefer-readonly-parameter-types.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index ed3e4ba284b1..54b6dd22520d 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -8,6 +8,7 @@ type Options = [ { checkParameterProperties?: boolean; ignoreInferredTypes?: boolean; + whitelist?: Array; } & util.ReadonlynessOptions, ]; type MessageIds = 'shouldBeReadonly'; @@ -33,6 +34,9 @@ export default util.createRule({ ignoreInferredTypes: { type: 'boolean', }, + whitelist: { + type: 'array', + }, ...util.readonlynessOptionsSchema.properties, }, }, @@ -45,12 +49,20 @@ export default util.createRule({ { checkParameterProperties: true, ignoreInferredTypes: false, + whitelist: ['HTMLElement'], ...util.readonlynessOptionsDefaults, }, ], create( context, - [{ checkParameterProperties, ignoreInferredTypes, treatMethodsAsReadonly }], + [ + { + checkParameterProperties, + ignoreInferredTypes, + whitelist, + treatMethodsAsReadonly, + }, + ], ) { const { esTreeNodeToTSNodeMap, program } = util.getParserServices(context); const checker = program.getTypeChecker(); @@ -100,6 +112,9 @@ export default util.createRule({ const isReadOnly = util.isTypeReadonly(checker, type, { treatMethodsAsReadonly: treatMethodsAsReadonly!, }); + if (whitelist?.includes(type.getSymbol()?.escapedName!)) { + return; + } if (!isReadOnly) { context.report({ From e0a04d75700aff431b10a4424bdf2c44dbcdbf4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Thu, 13 Jan 2022 18:30:11 +0100 Subject: [PATCH 02/64] chore(eslint-plugin): [prefer-readonly-parameter-types] whitelist -> allowlist --- .../src/rules/prefer-readonly-parameter-types.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index 54b6dd22520d..2e24d45bb4f9 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -8,7 +8,7 @@ type Options = [ { checkParameterProperties?: boolean; ignoreInferredTypes?: boolean; - whitelist?: Array; + allowlist?: Array; } & util.ReadonlynessOptions, ]; type MessageIds = 'shouldBeReadonly'; @@ -34,7 +34,7 @@ export default util.createRule({ ignoreInferredTypes: { type: 'boolean', }, - whitelist: { + allowlist: { type: 'array', }, ...util.readonlynessOptionsSchema.properties, @@ -49,7 +49,7 @@ export default util.createRule({ { checkParameterProperties: true, ignoreInferredTypes: false, - whitelist: ['HTMLElement'], + allowlist: ['HTMLElement'], ...util.readonlynessOptionsDefaults, }, ], @@ -59,7 +59,7 @@ export default util.createRule({ { checkParameterProperties, ignoreInferredTypes, - whitelist, + allowlist, treatMethodsAsReadonly, }, ], @@ -112,7 +112,7 @@ export default util.createRule({ const isReadOnly = util.isTypeReadonly(checker, type, { treatMethodsAsReadonly: treatMethodsAsReadonly!, }); - if (whitelist?.includes(type.getSymbol()?.escapedName!)) { + if (allowlist?.includes(type.getSymbol()?.escapedName!)) { return; } From 618fbd12b84c20cd4aa5633c9f83a6262742ff9f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Thu, 13 Jan 2022 22:49:36 +0100 Subject: [PATCH 03/64] feat(eslint-plugin): [prefer-readonly-parameter-types] Split the allowlist between internal and configurable --- .../src/rules/prefer-readonly-parameter-types.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index 650afd1ceb63..783d1b1edcee 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -46,7 +46,7 @@ export default util.createRule({ { checkParameterProperties: true, ignoreInferredTypes: false, - allowlist: ['HTMLElement'], + allowlist: [], ...util.readonlynessOptionsDefaults, }, ], @@ -112,6 +112,17 @@ export default util.createRule({ if (allowlist?.includes(type.getSymbol()?.escapedName!)) { return; } + const internalAllowlist = ['HTMLElement']; + if (internalAllowlist?.includes(type.getSymbol()?.escapedName!)) { + const declarations = type.getSymbol()?.getDeclarations() ?? []; + for (const declaration of declarations) { + if ( + program.isSourceFileDefaultLibrary(declaration.getSourceFile()) + ) { + return; + } + } + } if (!isReadOnly) { context.report({ From 17d013e7f203ea1a76670f3780c7f08f4703b5bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Thu, 13 Jan 2022 22:54:27 +0100 Subject: [PATCH 04/64] fix(eslint-plugin): [prefer-readonly-parameter-types] Fixed lint issue with non-null assertion --- .../rules/prefer-readonly-parameter-types.ts | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index 783d1b1edcee..43da243ccf74 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -109,17 +109,22 @@ export default util.createRule({ const isReadOnly = util.isTypeReadonly(checker, type, { treatMethodsAsReadonly: treatMethodsAsReadonly!, }); - if (allowlist?.includes(type.getSymbol()?.escapedName!)) { - return; - } - const internalAllowlist = ['HTMLElement']; - if (internalAllowlist?.includes(type.getSymbol()?.escapedName!)) { - const declarations = type.getSymbol()?.getDeclarations() ?? []; - for (const declaration of declarations) { - if ( - program.isSourceFileDefaultLibrary(declaration.getSourceFile()) - ) { - return; + const typeName = type.getSymbol()?.escapedName; + if (typeName !== undefined) { + if (allowlist?.includes(typeName)) { + return; + } + const internalAllowlist = ['HTMLElement']; + if (internalAllowlist?.includes(typeName)) { + const declarations = type.getSymbol()?.getDeclarations() ?? []; + for (const declaration of declarations) { + if ( + program.isSourceFileDefaultLibrary( + declaration.getSourceFile(), + ) + ) { + return; + } } } } From 6fd713d0fdfda075987066ad4cfe757e3218f94f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sat, 15 Jan 2022 23:03:18 +0100 Subject: [PATCH 05/64] fix(eslint-plugin): [prefer-readonly-parameter-types] Using allowlist everywhere in deep readonlyness checks --- .../rules/prefer-readonly-parameter-types.ts | 22 +------- packages/type-utils/src/isTypeReadonly.ts | 52 +++++++++++++++---- 2 files changed, 44 insertions(+), 30 deletions(-) diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index 43da243ccf74..eff22be9341f 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -106,28 +106,10 @@ export default util.createRule({ const tsNode = esTreeNodeToTSNodeMap.get(actualParam); const type = checker.getTypeAtLocation(tsNode); - const isReadOnly = util.isTypeReadonly(checker, type, { + const isReadOnly = util.isTypeReadonly(program, type, { treatMethodsAsReadonly: treatMethodsAsReadonly!, + exceptions: allowlist, }); - const typeName = type.getSymbol()?.escapedName; - if (typeName !== undefined) { - if (allowlist?.includes(typeName)) { - return; - } - const internalAllowlist = ['HTMLElement']; - if (internalAllowlist?.includes(typeName)) { - const declarations = type.getSymbol()?.getDeclarations() ?? []; - for (const declaration of declarations) { - if ( - program.isSourceFileDefaultLibrary( - declaration.getSourceFile(), - ) - ) { - return; - } - } - } - } if (!isReadOnly) { context.report({ diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index d5d05e94a0e8..6bb95a49a9ee 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -21,6 +21,7 @@ const enum Readonlyness { export interface ReadonlynessOptions { readonly treatMethodsAsReadonly?: boolean; + readonly exceptions?: Array; } export const readonlynessOptionsSchema = { @@ -35,18 +36,44 @@ export const readonlynessOptionsSchema = { export const readonlynessOptionsDefaults: ReadonlynessOptions = { treatMethodsAsReadonly: false, + exceptions: [], }; function hasSymbol(node: ts.Node): node is ts.Node & { symbol: ts.Symbol } { return Object.prototype.hasOwnProperty.call(node, 'symbol'); } +function isTypeExcepted( + type: ts.Type, + program: ts.Program, + exceptions: Array, +): boolean { + const typeName = type.getSymbol()?.escapedName; + if (typeName === undefined) { + return false; + } + if (exceptions.includes(typeName)) { + return true; + } + const internalAllowlist = ['HTMLElement']; // TODO + if (internalAllowlist?.includes(typeName)) { + const declarations = type.getSymbol()?.getDeclarations() ?? []; + for (const declaration of declarations) { + if (program.isSourceFileDefaultLibrary(declaration.getSourceFile())) { + return true; + } + } + } + return false; +} + function isTypeReadonlyArrayOrTuple( - checker: ts.TypeChecker, + program: ts.Program, type: ts.Type, options: ReadonlynessOptions, seenTypes: Set, ): Readonlyness { + const checker = program.getTypeChecker(); function checkTypeArguments(arrayType: ts.TypeReference): Readonlyness { const typeArguments = // getTypeArguments was only added in TS3.7 @@ -65,7 +92,7 @@ function isTypeReadonlyArrayOrTuple( if ( typeArguments.some( typeArg => - isTypeReadonlyRecurser(checker, typeArg, options, seenTypes) === + isTypeReadonlyRecurser(program, typeArg, options, seenTypes) === Readonlyness.Mutable, ) ) { @@ -99,11 +126,12 @@ function isTypeReadonlyArrayOrTuple( } function isTypeReadonlyObject( - checker: ts.TypeChecker, + program: ts.Program, type: ts.Type, options: ReadonlynessOptions, seenTypes: Set, ): Readonlyness { + const checker = program.getTypeChecker(); function checkIndexSignature(kind: ts.IndexKind): Readonlyness { const indexInfo = checker.getIndexInfoOfType(type, kind); if (indexInfo) { @@ -157,7 +185,7 @@ function isTypeReadonlyObject( } if ( - isTypeReadonlyRecurser(checker, propertyType, options, seenTypes) === + isTypeReadonlyRecurser(program, propertyType, options, seenTypes) === Readonlyness.Mutable ) { return Readonlyness.Mutable; @@ -180,19 +208,23 @@ function isTypeReadonlyObject( // a helper function to ensure the seenTypes map is always passed down, except by the external caller function isTypeReadonlyRecurser( - checker: ts.TypeChecker, + program: ts.Program, type: ts.Type, options: ReadonlynessOptions, seenTypes: Set, ): Readonlyness.Readonly | Readonlyness.Mutable { seenTypes.add(type); + if (isTypeExcepted(type, program, options.exceptions!)) { + return Readonlyness.Readonly; + } + if (isUnionType(type)) { // all types in the union must be readonly const result = unionTypeParts(type).every( t => seenTypes.has(t) || - isTypeReadonlyRecurser(checker, t, options, seenTypes), + isTypeReadonlyRecurser(program, t, options, seenTypes), ); const readonlyness = result ? Readonlyness.Readonly : Readonlyness.Mutable; return readonlyness; @@ -213,7 +245,7 @@ function isTypeReadonlyRecurser( } const isReadonlyArray = isTypeReadonlyArrayOrTuple( - checker, + program, type, options, seenTypes, @@ -223,7 +255,7 @@ function isTypeReadonlyRecurser( } const isReadonlyObject = isTypeReadonlyObject( - checker, + program, type, options, seenTypes, @@ -241,12 +273,12 @@ function isTypeReadonlyRecurser( * Checks if the given type is readonly */ function isTypeReadonly( - checker: ts.TypeChecker, + program: ts.Program, type: ts.Type, options: ReadonlynessOptions = readonlynessOptionsDefaults, ): boolean { return ( - isTypeReadonlyRecurser(checker, type, options, new Set()) === + isTypeReadonlyRecurser(program, type, options, new Set()) === Readonlyness.Readonly ); } From b8cdd5cdfac86d6ca080b6640db7cbeb4eabaa3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sat, 15 Jan 2022 23:07:27 +0100 Subject: [PATCH 06/64] fix(eslint-plugin): [prefer-readonly-parameter-types] Passing internal allowlist from rule --- .../src/rules/prefer-readonly-parameter-types.ts | 1 + packages/type-utils/src/isTypeReadonly.ts | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index eff22be9341f..074f96830c51 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -109,6 +109,7 @@ export default util.createRule({ const isReadOnly = util.isTypeReadonly(program, type, { treatMethodsAsReadonly: treatMethodsAsReadonly!, exceptions: allowlist, + internalExceptions: ['HTMLElement'], }); if (!isReadOnly) { diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index 6bb95a49a9ee..34c51f65322e 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -22,6 +22,7 @@ const enum Readonlyness { export interface ReadonlynessOptions { readonly treatMethodsAsReadonly?: boolean; readonly exceptions?: Array; + readonly internalExceptions?: Array; } export const readonlynessOptionsSchema = { @@ -46,17 +47,16 @@ function hasSymbol(node: ts.Node): node is ts.Node & { symbol: ts.Symbol } { function isTypeExcepted( type: ts.Type, program: ts.Program, - exceptions: Array, + options: ReadonlynessOptions, ): boolean { const typeName = type.getSymbol()?.escapedName; if (typeName === undefined) { return false; } - if (exceptions.includes(typeName)) { + if (options.exceptions?.includes(typeName)) { return true; } - const internalAllowlist = ['HTMLElement']; // TODO - if (internalAllowlist?.includes(typeName)) { + if (options.internalExceptions?.includes(typeName)) { const declarations = type.getSymbol()?.getDeclarations() ?? []; for (const declaration of declarations) { if (program.isSourceFileDefaultLibrary(declaration.getSourceFile())) { @@ -215,7 +215,7 @@ function isTypeReadonlyRecurser( ): Readonlyness.Readonly | Readonlyness.Mutable { seenTypes.add(type); - if (isTypeExcepted(type, program, options.exceptions!)) { + if (isTypeExcepted(type, program, options)) { return Readonlyness.Readonly; } From 4ab1f5feef00e9a822c1c2fb887c56bcab2e32c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sat, 15 Jan 2022 23:20:05 +0100 Subject: [PATCH 07/64] fix(eslint-plugin): [prefer-readonly-parameter-types] Decoupled options and schema of rule and util --- .../rules/prefer-readonly-parameter-types.ts | 19 +++++++++++-------- packages/type-utils/src/isTypeReadonly.ts | 15 +++------------ 2 files changed, 14 insertions(+), 20 deletions(-) diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index 074f96830c51..eec0a4bab82c 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -3,10 +3,11 @@ import * as util from '../util'; type Options = [ { + allowlist?: Array; checkParameterProperties?: boolean; ignoreInferredTypes?: boolean; - allowlist?: Array; - } & util.ReadonlynessOptions, + treatMethodsAsReadonly?: boolean; + }, ]; type MessageIds = 'shouldBeReadonly'; @@ -25,16 +26,18 @@ export default util.createRule({ type: 'object', additionalProperties: false, properties: { + allowlist: { + type: 'array', + }, checkParameterProperties: { type: 'boolean', }, ignoreInferredTypes: { type: 'boolean', }, - allowlist: { - type: 'array', + treatMethodsAsReadonly: { + type: 'boolean', }, - ...util.readonlynessOptionsSchema.properties, }, }, ], @@ -44,19 +47,19 @@ export default util.createRule({ }, defaultOptions: [ { + allowlist: [], checkParameterProperties: true, ignoreInferredTypes: false, - allowlist: [], - ...util.readonlynessOptionsDefaults, + treatMethodsAsReadonly: false, }, ], create( context, [ { + allowlist, checkParameterProperties, ignoreInferredTypes, - allowlist, treatMethodsAsReadonly, }, ], diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index 34c51f65322e..0edd1e5e5ecf 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -19,25 +19,16 @@ const enum Readonlyness { Readonly = 3, } -export interface ReadonlynessOptions { +interface ReadonlynessOptions { readonly treatMethodsAsReadonly?: boolean; readonly exceptions?: Array; readonly internalExceptions?: Array; } -export const readonlynessOptionsSchema = { - type: 'object', - additionalProperties: false, - properties: { - treatMethodsAsReadonly: { - type: 'boolean', - }, - }, -}; - -export const readonlynessOptionsDefaults: ReadonlynessOptions = { +const readonlynessOptionsDefaults: ReadonlynessOptions = { treatMethodsAsReadonly: false, exceptions: [], + internalExceptions: [], }; function hasSymbol(node: ts.Node): node is ts.Node & { symbol: ts.Symbol } { From 49713c8be09f6a28fcb4f27ee39118f8500f46a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sun, 16 Jan 2022 12:42:34 +0100 Subject: [PATCH 08/64] feat(eslint-plugin): [prefer-readonly-parameter-types] Added tests --- .../tests/fixtures/tsconfig.json | 2 +- .../prefer-readonly-parameter-types.test.ts | 108 ++++++++++++++++++ 2 files changed, 109 insertions(+), 1 deletion(-) diff --git a/packages/eslint-plugin/tests/fixtures/tsconfig.json b/packages/eslint-plugin/tests/fixtures/tsconfig.json index 7ff53268e423..26b92a121541 100644 --- a/packages/eslint-plugin/tests/fixtures/tsconfig.json +++ b/packages/eslint-plugin/tests/fixtures/tsconfig.json @@ -5,7 +5,7 @@ "module": "commonjs", "strict": true, "esModuleInterop": true, - "lib": ["es2015", "es2017", "esnext"], + "lib": ["es2015", "es2017", "esnext", "dom"], "experimentalDecorators": true }, "include": [ diff --git a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts index f17a19f1f6d6..c2fa259da88b 100644 --- a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts @@ -343,6 +343,74 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { }, ], }, + ` + function foo(arg: HTMLElement) {} + `, + ` + interface Foo { + readonly prop: HTMLElement; + } + + function foo(arg: Foo) {} + `, + { + code: ` + function foo(arg: RegExp) {} + `, + options: [ + { + allowlist: ['RegExp'], + }, + ], + }, + { + code: ` + interface Foo { + prop: string; + } + + function foo(arg: Foo) {} + `, + options: [ + { + allowlist: ['Foo'], + }, + ], + }, + { + code: ` + interface Bar { + prop: string; + } + interface Foo { + readonly prop: Bar; + } + + function foo(arg: Foo) {} + `, + options: [ + { + allowlist: ['Foo'], + }, + ], + }, + { + code: ` + interface Bar { + prop: string; + } + interface Foo { + readonly prop: Bar; + } + + function foo(arg: Foo) {} + `, + options: [ + { + allowlist: ['Bar'], + }, + ], + }, ], invalid: [ // arrays @@ -811,5 +879,45 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { }, ], }, + { + code: ` + function foo(arg: RegExp) {} + `, + options: [ + { + allowlist: ['Foo'], + }, + ], + errors: [ + { + messageId: 'shouldBeReadonly', + line: 2, + column: 22, + endColumn: 33, + }, + ], + }, + { + code: ` + interface Foo { + readonly prop: RegExp; + } + + function foo(arg: Foo) {} + `, + options: [ + { + allowlist: ['Bar'], + }, + ], + errors: [ + { + messageId: 'shouldBeReadonly', + line: 6, + column: 22, + endColumn: 30, + }, + ], + }, ], }); From 6d842ecc50b53c017cc320320943cbaf83b83ddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sun, 16 Jan 2022 12:45:33 +0100 Subject: [PATCH 09/64] fix(eslint-plugin): [prefer-readonly-parameter-types] Added missing docs for option treatMethodsAsReadonly --- .../eslint-plugin/docs/rules/prefer-readonly-parameter-types.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index 6790b55113e8..d96d2f546a48 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -129,6 +129,7 @@ interface Foo { interface Options { checkParameterProperties?: boolean; ignoreInferredTypes?: boolean; + treatMethodsAsReadonly?: boolean; } const defaultOptions: Options = { From 2734b7a59605d4c0dd99c07f1db4962f28450710 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sun, 16 Jan 2022 13:59:46 +0100 Subject: [PATCH 10/64] docs(eslint-plugin): [prefer-readonly-parameter-types] Added docs for allowlist --- .../rules/prefer-readonly-parameter-types.md | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index d96d2f546a48..d325437d33bc 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -127,18 +127,64 @@ interface Foo { ```ts interface Options { + allowlist: Array; checkParameterProperties?: boolean; ignoreInferredTypes?: boolean; treatMethodsAsReadonly?: boolean; } const defaultOptions: Options = { + allowlist: []; checkParameterProperties: true, ignoreInferredTypes: false, treatMethodsAsReadonly: false, }; ``` +### `allowlist` + +Some complex types cannot easily be made readonly, for example the `JQueryStatic` type from `@types/jquery`. This option allows you to globally disable reporting of such types. + +Examples of code for this rule with `{allowlist: ["Foo"]}`: + + + +#### ❌ Incorrect + +```ts +interface Foo { + prop: string; +} + +interface Bar { + sub: Foo; +} + +interface Baz { + readonly sub: Foo; + otherProp: string; +} + +function fn1(arg: Bar) {} // Incorrect because Bar.sub is not readonly +function fn2(arg: Baz) {} // Incorrect because Baz.otherProp is not readonly and not in the allowlist +``` + +#### ✅ Correct + +```ts +interface Foo { + prop: string; +} + +interface Bar { + readonly sub: Foo; + readonly otherProp: string; +} + +function fn1(arg: Foo) {} // Works because Foo is allowlisted +function fn2(arg: Bar) {} // Works even when Foo is nested somewhere in the type, with other properties still being checked +``` + ### `checkParameterProperties` This option allows you to enable or disable the checking of parameter properties. From 3df00ed32d14e201fb6edf209dde28038d2c76ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Mon, 17 Jan 2022 22:05:54 +0100 Subject: [PATCH 11/64] fix(eslint-plugin): [prefer-readonly-parameter-types] Fixed regressions from merging main --- packages/type-utils/src/isTypeReadonly.ts | 11 ++++++----- packages/type-utils/tests/isTypeReadonly.test.ts | 16 ++++++++-------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index 55289177930d..d4ab895f6859 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -20,7 +20,7 @@ const enum Readonlyness { Readonly = 3, } -interface ReadonlynessOptions { +export interface ReadonlynessOptions { readonly treatMethodsAsReadonly?: boolean; readonly exceptions?: Array; readonly internalExceptions?: Array; @@ -132,7 +132,7 @@ function isTypeReadonlyObject( } return isTypeReadonlyRecurser( - checker, + program, indexInfo.type, options, seenTypes, @@ -229,6 +229,7 @@ function isTypeReadonlyRecurser( options: ReadonlynessOptions, seenTypes: Set, ): Readonlyness.Readonly | Readonlyness.Mutable { + const checker = program.getTypeChecker(); seenTypes.add(type); if (isTypeExcepted(type, program, options)) { @@ -255,7 +256,7 @@ function isTypeReadonlyRecurser( const allReadonlyParts = type.types.every( t => seenTypes.has(t) || - isTypeReadonlyRecurser(checker, t, options, seenTypes) === + isTypeReadonlyRecurser(program, t, options, seenTypes) === Readonlyness.Readonly, ); return allReadonlyParts ? Readonlyness.Readonly : Readonlyness.Mutable; @@ -263,7 +264,7 @@ function isTypeReadonlyRecurser( // Normal case. const isReadonlyObject = isTypeReadonlyObject( - checker, + program, type, options, seenTypes, @@ -279,7 +280,7 @@ function isTypeReadonlyRecurser( .every( t => seenTypes.has(t) || - isTypeReadonlyRecurser(checker, t, options, seenTypes) === + isTypeReadonlyRecurser(program, t, options, seenTypes) === Readonlyness.Readonly, ); diff --git a/packages/type-utils/tests/isTypeReadonly.test.ts b/packages/type-utils/tests/isTypeReadonly.test.ts index f6f2cebd12bc..fa7ee893780f 100644 --- a/packages/type-utils/tests/isTypeReadonly.test.ts +++ b/packages/type-utils/tests/isTypeReadonly.test.ts @@ -13,22 +13,22 @@ describe('isTypeReadonly', () => { describe('TSTypeAliasDeclaration ', () => { function getType(code: string): { type: ts.Type; - checker: ts.TypeChecker; + program: ts.Program; } { const { ast, services } = parseForESLint(code, { project: './tsconfig.json', filePath: path.join(rootDir, 'file.ts'), tsconfigRootDir: rootDir, }); - const checker = services.program.getTypeChecker(); + const program = services.program; const esTreeNodeToTSNodeMap = services.esTreeNodeToTSNodeMap; const declaration = ast.body[0] as TSESTree.TSTypeAliasDeclaration; return { - type: checker.getTypeAtLocation( - esTreeNodeToTSNodeMap.get(declaration.id), - ), - checker, + type: program + .getTypeChecker() + .getTypeAtLocation(esTreeNodeToTSNodeMap.get(declaration.id)), + program, }; } @@ -37,9 +37,9 @@ describe('isTypeReadonly', () => { options: ReadonlynessOptions | undefined, expected: boolean, ): void { - const { type, checker } = getType(code); + const { type, program } = getType(code); - const result = isTypeReadonly(checker, type, options); + const result = isTypeReadonly(program, type, options); expect(result).toBe(expected); } From 53aac7839176c465b5307f65f781b6f400cee9ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Mon, 24 Jan 2022 19:01:05 +0100 Subject: [PATCH 12/64] feat(eslint-plugin): [prefer-readonly-parameter-types] Merged exceptions and internalExceptions together to create a universal allowlist API --- .../rules/prefer-readonly-parameter-types.ts | 7 ++- .../prefer-readonly-parameter-types.test.ts | 12 ++--- packages/type-utils/src/isTypeReadonly.ts | 45 +++++++++++++------ 3 files changed, 40 insertions(+), 24 deletions(-) diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index eec0a4bab82c..9b51181622db 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -3,7 +3,7 @@ import * as util from '../util'; type Options = [ { - allowlist?: Array; + allowlist?: Array; checkParameterProperties?: boolean; ignoreInferredTypes?: boolean; treatMethodsAsReadonly?: boolean; @@ -47,7 +47,7 @@ export default util.createRule({ }, defaultOptions: [ { - allowlist: [], + allowlist: [{ typeName: 'HTMLElement', defaultLib: true }], checkParameterProperties: true, ignoreInferredTypes: false, treatMethodsAsReadonly: false, @@ -111,8 +111,7 @@ export default util.createRule({ const type = checker.getTypeAtLocation(tsNode); const isReadOnly = util.isTypeReadonly(program, type, { treatMethodsAsReadonly: treatMethodsAsReadonly!, - exceptions: allowlist, - internalExceptions: ['HTMLElement'], + allowlist: allowlist, }); if (!isReadOnly) { diff --git a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts index c2fa259da88b..d69523158171 100644 --- a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts @@ -359,7 +359,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: ['RegExp'], + allowlist: [{ typeName: 'RegExp', defaultLib: true }], }, ], }, @@ -373,7 +373,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: ['Foo'], + allowlist: [{ typeName: 'Foo', local: true }], }, ], }, @@ -390,7 +390,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: ['Foo'], + allowlist: [{ typeName: 'Foo', local: true }], }, ], }, @@ -407,7 +407,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: ['Bar'], + allowlist: [{ typeName: 'Bar', local: true }], }, ], }, @@ -885,7 +885,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: ['Foo'], + allowlist: [{ typeName: 'Foo', local: true }], }, ], errors: [ @@ -907,7 +907,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: ['Bar'], + allowlist: [{ typeName: 'Bar', local: true }], }, ], errors: [ diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index d4ab895f6859..da861c8cced2 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -11,6 +11,10 @@ import { import * as ts from 'typescript'; import { getTypeOfPropertyOfType } from './propertyTypes'; +export type TypeAllowlistItem = { + typeName: string; +} & ({ local: true } | { defaultLib: true } | { package: string }); + const enum Readonlyness { /** the type cannot be handled by the function */ UnknownType = 1, @@ -22,14 +26,12 @@ const enum Readonlyness { export interface ReadonlynessOptions { readonly treatMethodsAsReadonly?: boolean; - readonly exceptions?: Array; - readonly internalExceptions?: Array; + readonly allowlist?: Array; } const readonlynessOptionsDefaults: ReadonlynessOptions = { treatMethodsAsReadonly: false, - exceptions: [], - internalExceptions: [], + allowlist: [{ typeName: 'HTMLElement', defaultLib: true }], }; function hasSymbol(node: ts.Node): node is ts.Node & { symbol: ts.Symbol } { @@ -42,16 +44,31 @@ function isTypeExcepted( options: ReadonlynessOptions, ): boolean { const typeName = type.getSymbol()?.escapedName; - if (typeName === undefined) { - return false; - } - if (options.exceptions?.includes(typeName)) { - return true; - } - if (options.internalExceptions?.includes(typeName)) { - const declarations = type.getSymbol()?.getDeclarations() ?? []; - for (const declaration of declarations) { - if (program.isSourceFileDefaultLibrary(declaration.getSourceFile())) { + const matchingItems = + options.allowlist?.filter(item => item.typeName === typeName) ?? []; + for (const item of matchingItems) { + const declarationFiles = + type + .getSymbol() + ?.getDeclarations() + ?.map(declaration => declaration.getSourceFile()) ?? []; + for (const declaration of declarationFiles) { + if ( + // A local type defined in the current package + ('local' in item && + item.local === true && + declaration.fileName.startsWith(program.getCurrentDirectory())) || + // A type from the default library + ('defaultLib' in item && + item.defaultLib === true && + program.isSourceFileDefaultLibrary(declaration)) || + // A type from a specified third-party package + ('package' in item && + (declaration.fileName.includes('node_modules/' + item.package) || + declaration.fileName.includes( + 'node_modules/@types/' + item.package, + ))) + ) { return true; } } From efd4140e357ee068a68e6f31e71e7255861191c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Mon, 24 Jan 2022 22:56:47 +0100 Subject: [PATCH 13/64] feat(eslint-plugin): [prefer-readonly-parameter-types] Added a schema for type allowlist --- .../rules/prefer-readonly-parameter-types.ts | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index 9b51181622db..0cd2c109a4c7 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -28,6 +28,47 @@ export default util.createRule({ properties: { allowlist: { type: 'array', + items: { + type: 'object', + oneOf: [ + { + additionalProperties: false, + properties: { + typeName: { + type: 'string', + }, + local: { + type: 'boolean', + }, + }, + required: ['typeName', 'local'], + }, + { + additionalProperties: false, + properties: { + typeName: { + type: 'string', + }, + defaultLib: { + type: 'boolean', + }, + }, + required: ['typeName', 'defaultLib'], + }, + { + additionalProperties: false, + properties: { + typeName: { + type: 'string', + }, + package: { + type: 'string', + }, + }, + required: ['typeName', 'package'], + }, + ], + }, }, checkParameterProperties: { type: 'boolean', From 05046087e4eac9577887aec228115cde6812435f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Mon, 24 Jan 2022 23:01:49 +0100 Subject: [PATCH 14/64] chore(eslint-plugin): [prefer-readonly-parameter-types] Split TypeAllowlistItem out into own file --- .../rules/prefer-readonly-parameter-types.ts | 42 +---------------- packages/type-utils/src/TypeAllowListItem.ts | 45 +++++++++++++++++++ packages/type-utils/src/index.ts | 1 + packages/type-utils/src/isTypeReadonly.ts | 5 +-- 4 files changed, 48 insertions(+), 45 deletions(-) create mode 100644 packages/type-utils/src/TypeAllowListItem.ts diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index 0cd2c109a4c7..bf90a5a0c85d 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -28,47 +28,7 @@ export default util.createRule({ properties: { allowlist: { type: 'array', - items: { - type: 'object', - oneOf: [ - { - additionalProperties: false, - properties: { - typeName: { - type: 'string', - }, - local: { - type: 'boolean', - }, - }, - required: ['typeName', 'local'], - }, - { - additionalProperties: false, - properties: { - typeName: { - type: 'string', - }, - defaultLib: { - type: 'boolean', - }, - }, - required: ['typeName', 'defaultLib'], - }, - { - additionalProperties: false, - properties: { - typeName: { - type: 'string', - }, - package: { - type: 'string', - }, - }, - required: ['typeName', 'package'], - }, - ], - }, + items: util.typeAllowListItemSchema, }, checkParameterProperties: { type: 'boolean', diff --git a/packages/type-utils/src/TypeAllowListItem.ts b/packages/type-utils/src/TypeAllowListItem.ts new file mode 100644 index 000000000000..be3039d1c19c --- /dev/null +++ b/packages/type-utils/src/TypeAllowListItem.ts @@ -0,0 +1,45 @@ +export type TypeAllowlistItem = { + typeName: string; +} & ({ local: true } | { defaultLib: true } | { package: string }); + +export const typeAllowListItemSchema = { + type: 'object', + oneOf: [ + { + additionalProperties: false, + properties: { + typeName: { + type: 'string', + }, + local: { + type: 'boolean', + }, + }, + required: ['typeName', 'local'], + }, + { + additionalProperties: false, + properties: { + typeName: { + type: 'string', + }, + defaultLib: { + type: 'boolean', + }, + }, + required: ['typeName', 'defaultLib'], + }, + { + additionalProperties: false, + properties: { + typeName: { + type: 'string', + }, + package: { + type: 'string', + }, + }, + required: ['typeName', 'package'], + }, + ], +}; diff --git a/packages/type-utils/src/index.ts b/packages/type-utils/src/index.ts index 44eb35ec945b..5726594554b7 100644 --- a/packages/type-utils/src/index.ts +++ b/packages/type-utils/src/index.ts @@ -11,4 +11,5 @@ export * from './isUnsafeAssignment'; export * from './predicates'; export * from './propertyTypes'; export * from './requiresQuoting'; +export * from './TypeAllowListItem'; export * from './typeFlagUtils'; diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index da861c8cced2..29a44ad90bf6 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -10,10 +10,7 @@ import { } from 'tsutils'; import * as ts from 'typescript'; import { getTypeOfPropertyOfType } from './propertyTypes'; - -export type TypeAllowlistItem = { - typeName: string; -} & ({ local: true } | { defaultLib: true } | { package: string }); +import { TypeAllowlistItem } from './TypeAllowListItem'; const enum Readonlyness { /** the type cannot be handled by the function */ From 7a6c9434159e85b4c8e6976bd6f88c11b94abba7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Mon, 24 Jan 2022 23:42:12 +0100 Subject: [PATCH 15/64] docs(eslint-plugin): [prefer-readonly-parameter-types] Updated docs for the more sophisticated allowlist --- .../rules/prefer-readonly-parameter-types.md | 54 +++++++++++++++---- 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index d325437d33bc..3eac5eafb2d2 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -143,30 +143,46 @@ const defaultOptions: Options = { ### `allowlist` -Some complex types cannot easily be made readonly, for example the `JQueryStatic` type from `@types/jquery`. This option allows you to globally disable reporting of such types. +Some complex types cannot easily be made readonly, for example the `HTMLElement` type or the `JQueryStatic` type from `@types/jquery`. This option allows you to globally disable reporting of such types. -Examples of code for this rule with `{allowlist: ["Foo"]}`: +Each item has to be either a local type (`{typeName: "Foo", local: true}`), a type from the default library (`{typeName: "Foo", defaultLib: true}`), or a file from a specific package (`{typeName: "Foo", package: "foo-lib"}`, this also works for types defined in a typings package). + +Examples of code for this rule with `{allowlist: [{typeName: "Foo", local: true}, {typeName: "HTMLElement", defaultLib: true}, {typeName: "Bar", package: "bar-lib"}]}`: #### ❌ Incorrect ```ts -interface Foo { +interface ThisIsMutable { prop: string; } -interface Bar { - sub: Foo; +interface Wrapper { + sub: ThisIsMutable; } -interface Baz { +interface WrapperWithOther { readonly sub: Foo; otherProp: string; } -function fn1(arg: Bar) {} // Incorrect because Bar.sub is not readonly -function fn2(arg: Baz) {} // Incorrect because Baz.otherProp is not readonly and not in the allowlist +function fn1(arg: ThisIsMutable) {} // Incorrect because ThisIsMutable is not readonly +function fn2(arg: Wrapper) {} // Incorrect because Wrapper.sub is not readonly +function fn3(arg: WrapperWithOther) {} // Incorrect because WrapperWithOther.otherProp is not readonly and not in the allowlist +``` + +```ts +import { Foo } from 'some-lib'; +import { Bar } from 'incorrect-lib'; + +interface HTMLElement { + prop: string; +} + +function fn1(arg: Foo) {} // Incorrect because Foo is not a local type +function fn2(arg: HTMLElement) {} // Incorrect because HTMLElement is not from the default library +function fn3(arg: Bar) {} // Incorrect because Bar is not from "bar-lib" ``` #### ✅ Correct @@ -176,13 +192,31 @@ interface Foo { prop: string; } -interface Bar { +interface Wrapper { readonly sub: Foo; readonly otherProp: string; } function fn1(arg: Foo) {} // Works because Foo is allowlisted -function fn2(arg: Bar) {} // Works even when Foo is nested somewhere in the type, with other properties still being checked +function fn2(arg: Wrapper) {} // Works even when Foo is nested somewhere in the type, with other properties still being checked +``` + +```ts +import { Bar } from 'bar-lib'; + +interface Foo { + prop: string; +} + +function fn1(arg: Foo) {} // Works because Foo is a local type +function fn2(arg: HTMLElement) {} // Works because HTMLElement is from the default library +function fn3(arg: Bar) {} // Works because Bar is from "bar-lib" +``` + +```ts +import { Foo } from './foo'; + +function fn(arg: Foo) {} // Works because Foo is still a local type - it has to be in the same package ``` ### `checkParameterProperties` From f2acfaac805cb597ea9285c20c6aeca8739176b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Mon, 24 Jan 2022 23:49:00 +0100 Subject: [PATCH 16/64] docs(eslint-plugin): [prefer-readonly-parameter-types] Fixed allowlist option type --- .../docs/rules/prefer-readonly-parameter-types.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index 3eac5eafb2d2..e078f70eb95b 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -126,15 +126,19 @@ interface Foo { ## Options ```ts +type TypeAllowlistItem = { + typeName: string; +} & ({ local: true } | { defaultLib: true } | { package: string }); + interface Options { - allowlist: Array; + allowlist: Array; checkParameterProperties?: boolean; ignoreInferredTypes?: boolean; treatMethodsAsReadonly?: boolean; } const defaultOptions: Options = { - allowlist: []; + allowlist: [{typeName: "HTMLElement", defaultLib: true}]; checkParameterProperties: true, ignoreInferredTypes: false, treatMethodsAsReadonly: false, From b178a21eca5d20e4370a4464a30965f933cd6ee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Tue, 25 Jan 2022 00:02:33 +0100 Subject: [PATCH 17/64] test(eslint-plugin): [prefer-readonly-parameter-types] Added tests for type allowlist with wrong kinds of types --- .../prefer-readonly-parameter-types.test.ts | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts index d69523158171..cd8660174acd 100644 --- a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts @@ -353,6 +353,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { function foo(arg: Foo) {} `, + // Allowlist { code: ` function foo(arg: RegExp) {} @@ -879,6 +880,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { }, ], }, + // Allowlist { code: ` function foo(arg: RegExp) {} @@ -919,5 +921,85 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { }, ], }, + { + code: ` + interface Foo { + readonly prop: RegExp; + } + + function foo(arg: Foo) {} + `, + options: [ + { + allowlist: [{ typeName: 'Foo', defaultLib: true }], + }, + ], + errors: [ + { + messageId: 'shouldBeReadonly', + line: 6, + column: 22, + endColumn: 30, + }, + ], + }, + { + code: ` + interface Foo { + readonly prop: RegExp; + } + + function foo(arg: Foo) {} + `, + options: [ + { + allowlist: [{ typeName: 'Foo', package: 'foo-lib' }], + }, + ], + errors: [ + { + messageId: 'shouldBeReadonly', + line: 6, + column: 22, + endColumn: 30, + }, + ], + }, + { + code: ` + function foo(arg: RegExp) {} + `, + options: [ + { + allowlist: [{ typeName: 'RegExp', local: true }], + }, + ], + errors: [ + { + messageId: 'shouldBeReadonly', + line: 2, + column: 22, + endColumn: 33, + }, + ], + }, + { + code: ` + function foo(arg: RegExp) {} + `, + options: [ + { + allowlist: [{ typeName: 'RegExp', package: 'regexp-lib' }], + }, + ], + errors: [ + { + messageId: 'shouldBeReadonly', + line: 2, + column: 22, + endColumn: 33, + }, + ], + }, ], }); From e8af7cb202005e1b9f6dcb330cf343f212feb21e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Tue, 25 Jan 2022 17:09:21 +0100 Subject: [PATCH 18/64] chore(eslint-plugin): [prefer-readonly-parameter-types] Deduplicated default configuration --- .../src/rules/prefer-readonly-parameter-types.ts | 5 +++-- packages/type-utils/src/isTypeReadonly.ts | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index bf90a5a0c85d..fd9abba60a36 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -48,10 +48,11 @@ export default util.createRule({ }, defaultOptions: [ { - allowlist: [{ typeName: 'HTMLElement', defaultLib: true }], + allowlist: util.readonlynessOptionsDefaults.allowlist, checkParameterProperties: true, ignoreInferredTypes: false, - treatMethodsAsReadonly: false, + treatMethodsAsReadonly: + util.readonlynessOptionsDefaults.treatMethodsAsReadonly, }, ], create( diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index 29a44ad90bf6..fa76d2f052e3 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -26,7 +26,7 @@ export interface ReadonlynessOptions { readonly allowlist?: Array; } -const readonlynessOptionsDefaults: ReadonlynessOptions = { +export const readonlynessOptionsDefaults: ReadonlynessOptions = { treatMethodsAsReadonly: false, allowlist: [{ typeName: 'HTMLElement', defaultLib: true }], }; From 5e18240a32e7a241ff6d0ebd9b5dbfe7d3ea2b8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Tue, 25 Jan 2022 18:10:08 +0100 Subject: [PATCH 19/64] fix(eslint-plugin): [prefer-readonly-parameter-types] Added back readonlynessOptionsSchema --- .../rules/prefer-readonly-parameter-types.ts | 10 +++------- packages/type-utils/src/isTypeReadonly.ts | 19 ++++++++++++++++++- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index fd9abba60a36..1a2f452c60d0 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -26,19 +26,15 @@ export default util.createRule({ type: 'object', additionalProperties: false, properties: { - allowlist: { - type: 'array', - items: util.typeAllowListItemSchema, - }, + allowlist: util.readonlynessOptionsSchema.properties.allowlist, checkParameterProperties: { type: 'boolean', }, ignoreInferredTypes: { type: 'boolean', }, - treatMethodsAsReadonly: { - type: 'boolean', - }, + treatMethodsAsReadonly: + util.readonlynessOptionsSchema.properties.treatMethodsAsReadonly, }, }, ], diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index fa76d2f052e3..0907a3c6e92e 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -10,7 +10,10 @@ import { } from 'tsutils'; import * as ts from 'typescript'; import { getTypeOfPropertyOfType } from './propertyTypes'; -import { TypeAllowlistItem } from './TypeAllowListItem'; +import { + TypeAllowlistItem, + typeAllowListItemSchema, +} from './TypeAllowListItem'; const enum Readonlyness { /** the type cannot be handled by the function */ @@ -26,6 +29,20 @@ export interface ReadonlynessOptions { readonly allowlist?: Array; } +export const readonlynessOptionsSchema = { + type: 'object', + additionalProperties: false, + properties: { + treatMethodsAsReadonly: { + type: 'boolean', + }, + allowlist: { + type: 'array', + items: typeAllowListItemSchema, + }, + }, +}; + export const readonlynessOptionsDefaults: ReadonlynessOptions = { treatMethodsAsReadonly: false, allowlist: [{ typeName: 'HTMLElement', defaultLib: true }], From 59371e72c1c3fab0073e62fc27c3ef14aadd8634 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 26 Jan 2022 23:09:50 +0100 Subject: [PATCH 20/64] chore(eslint-plugin): [prefer-readonly-parameter-types] Removed default allowlist --- packages/type-utils/src/isTypeReadonly.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index 0907a3c6e92e..770c9c0b94c0 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -45,7 +45,7 @@ export const readonlynessOptionsSchema = { export const readonlynessOptionsDefaults: ReadonlynessOptions = { treatMethodsAsReadonly: false, - allowlist: [{ typeName: 'HTMLElement', defaultLib: true }], + allowlist: [], }; function hasSymbol(node: ts.Node): node is ts.Node & { symbol: ts.Symbol } { From 3eb89b6913cd494767d8ff81382967151838dede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Thu, 27 Jan 2022 10:33:39 +0100 Subject: [PATCH 21/64] docs(eslint-plugin): [prefer-readonly-parameter-types] Fixed default allowlist in docs --- .../eslint-plugin/docs/rules/prefer-readonly-parameter-types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index e078f70eb95b..dfde552ad299 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -138,7 +138,7 @@ interface Options { } const defaultOptions: Options = { - allowlist: [{typeName: "HTMLElement", defaultLib: true}]; + allowlist: []; checkParameterProperties: true, ignoreInferredTypes: false, treatMethodsAsReadonly: false, From 766a2e7a6058fc73543dbdd3ddce2c53a4185d8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Thu, 27 Jan 2022 17:36:43 +0100 Subject: [PATCH 22/64] test(eslint-plugin): [prefer-readonly-parameter-types] Not using DOM in tests --- .../tests/fixtures/tsconfig.json | 2 +- .../prefer-readonly-parameter-types.test.ts | 30 ++++++++++++------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/packages/eslint-plugin/tests/fixtures/tsconfig.json b/packages/eslint-plugin/tests/fixtures/tsconfig.json index 26b92a121541..7ff53268e423 100644 --- a/packages/eslint-plugin/tests/fixtures/tsconfig.json +++ b/packages/eslint-plugin/tests/fixtures/tsconfig.json @@ -5,7 +5,7 @@ "module": "commonjs", "strict": true, "esModuleInterop": true, - "lib": ["es2015", "es2017", "esnext", "dom"], + "lib": ["es2015", "es2017", "esnext"], "experimentalDecorators": true }, "include": [ diff --git a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts index cd8660174acd..c50f46178e0b 100644 --- a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts @@ -343,20 +343,28 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { }, ], }, - ` - function foo(arg: HTMLElement) {} - `, - ` - interface Foo { - readonly prop: HTMLElement; - } - - function foo(arg: Foo) {} - `, // Allowlist { code: ` - function foo(arg: RegExp) {} + interface Foo { + readonly prop: RegExp; + } + + function foo(arg: Foo) {} + `, + options: [ + { + allowlist: [{ typeName: 'RegExp', defaultLib: true }], + }, + ], + }, + { + code: ` + interface Foo { + prop: RegExp; + } + + function foo(arg: Readonly) {} `, options: [ { From 854dcac924535ffb34b32a7525fb4fbd81ff730b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sat, 29 Jan 2022 18:14:57 +0100 Subject: [PATCH 23/64] chore(eslint-plugin): [prefer-readonly-parameter-types] Using property shorthand --- .../eslint-plugin/src/rules/prefer-readonly-parameter-types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index 1a2f452c60d0..4fb4c99d6bab 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -109,7 +109,7 @@ export default util.createRule({ const type = checker.getTypeAtLocation(tsNode); const isReadOnly = util.isTypeReadonly(program, type, { treatMethodsAsReadonly: treatMethodsAsReadonly!, - allowlist: allowlist, + allowlist, }); if (!isReadOnly) { From 0e489cb78255734877d0136230c9ea801a84e75c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Fri, 4 Feb 2022 23:35:59 +0100 Subject: [PATCH 24/64] feat(eslint-plugin): [prefer-readonly-parameter-types] TypeAllowlistItem is now a discriminated union --- .../prefer-readonly-parameter-types.test.ts | 26 +++++++++++-------- packages/type-utils/src/TypeAllowListItem.ts | 26 ++++++++----------- packages/type-utils/src/isTypeReadonly.ts | 8 +++--- 3 files changed, 29 insertions(+), 31 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts index c50f46178e0b..1fad339ad6eb 100644 --- a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts @@ -354,7 +354,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'RegExp', defaultLib: true }], + allowlist: [{ typeName: 'RegExp', source: 'default-lib' }], }, ], }, @@ -368,7 +368,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'RegExp', defaultLib: true }], + allowlist: [{ typeName: 'RegExp', source: 'default-lib' }], }, ], }, @@ -382,7 +382,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'Foo', local: true }], + allowlist: [{ typeName: 'Foo', source: 'local' }], }, ], }, @@ -399,7 +399,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'Foo', local: true }], + allowlist: [{ typeName: 'Foo', source: 'local' }], }, ], }, @@ -416,7 +416,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'Bar', local: true }], + allowlist: [{ typeName: 'Bar', source: 'local' }], }, ], }, @@ -895,7 +895,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'Foo', local: true }], + allowlist: [{ typeName: 'Foo', source: 'local' }], }, ], errors: [ @@ -917,7 +917,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'Bar', local: true }], + allowlist: [{ typeName: 'Bar', source: 'local' }], }, ], errors: [ @@ -939,7 +939,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'Foo', defaultLib: true }], + allowlist: [{ typeName: 'Foo', source: 'default-lib' }], }, ], errors: [ @@ -961,7 +961,9 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'Foo', package: 'foo-lib' }], + allowlist: [ + { typeName: 'Foo', source: 'package', package: 'foo-lib' }, + ], }, ], errors: [ @@ -979,7 +981,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'RegExp', local: true }], + allowlist: [{ typeName: 'RegExp', source: 'local' }], }, ], errors: [ @@ -997,7 +999,9 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'RegExp', package: 'regexp-lib' }], + allowlist: [ + { typeName: 'RegExp', source: 'package', package: 'regexp-lib' }, + ], }, ], errors: [ diff --git a/packages/type-utils/src/TypeAllowListItem.ts b/packages/type-utils/src/TypeAllowListItem.ts index be3039d1c19c..77ee0a40ece1 100644 --- a/packages/type-utils/src/TypeAllowListItem.ts +++ b/packages/type-utils/src/TypeAllowListItem.ts @@ -1,6 +1,9 @@ export type TypeAllowlistItem = { typeName: string; -} & ({ local: true } | { defaultLib: true } | { package: string }); +} & ( + | { source: 'local' | 'default-lib' } + | { source: 'package'; package: string } +); export const typeAllowListItemSchema = { type: 'object', @@ -11,11 +14,12 @@ export const typeAllowListItemSchema = { typeName: { type: 'string', }, - local: { - type: 'boolean', + source: { + type: 'string', + pattern: '^local|default-lib$', }, }, - required: ['typeName', 'local'], + required: ['typeName', 'source'], }, { additionalProperties: false, @@ -23,23 +27,15 @@ export const typeAllowListItemSchema = { typeName: { type: 'string', }, - defaultLib: { - type: 'boolean', - }, - }, - required: ['typeName', 'defaultLib'], - }, - { - additionalProperties: false, - properties: { - typeName: { + source: { type: 'string', + pattern: '^package$', }, package: { type: 'string', }, }, - required: ['typeName', 'package'], + required: ['typeName', 'source', 'package'], }, ], }; diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index 770c9c0b94c0..ee6ef48a6236 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -69,15 +69,13 @@ function isTypeExcepted( for (const declaration of declarationFiles) { if ( // A local type defined in the current package - ('local' in item && - item.local === true && + (item.source === 'local' && declaration.fileName.startsWith(program.getCurrentDirectory())) || // A type from the default library - ('defaultLib' in item && - item.defaultLib === true && + (item.source === 'default-lib' && program.isSourceFileDefaultLibrary(declaration)) || // A type from a specified third-party package - ('package' in item && + (item.source === 'package' && (declaration.fileName.includes('node_modules/' + item.package) || declaration.fileName.includes( 'node_modules/@types/' + item.package, From 6534ef335c18f295685f605bd29b95834d8102cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Fri, 4 Feb 2022 23:39:36 +0100 Subject: [PATCH 25/64] docs(eslint-plugin): [prefer-readonly-parameter-types] TypeAllowlistItem is now a discriminated union - docs update --- .../docs/rules/prefer-readonly-parameter-types.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index dfde552ad299..c9e07897c60e 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -128,7 +128,10 @@ interface Foo { ```ts type TypeAllowlistItem = { typeName: string; -} & ({ local: true } | { defaultLib: true } | { package: string }); +} & ( + | { source: 'local' | 'default-lib' } + | { source: 'package'; package: string } +); interface Options { allowlist: Array; @@ -149,9 +152,9 @@ const defaultOptions: Options = { Some complex types cannot easily be made readonly, for example the `HTMLElement` type or the `JQueryStatic` type from `@types/jquery`. This option allows you to globally disable reporting of such types. -Each item has to be either a local type (`{typeName: "Foo", local: true}`), a type from the default library (`{typeName: "Foo", defaultLib: true}`), or a file from a specific package (`{typeName: "Foo", package: "foo-lib"}`, this also works for types defined in a typings package). +Each item has to be either a local type (`{typeName: "Foo", source: "local"}`), a type from the default library (`{typeName: "Foo", source: "default-lib"}`), or a file from a specific package (`{typeName: "Foo", source: "package", package: "foo-lib"}`, this also works for types defined in a typings package). -Examples of code for this rule with `{allowlist: [{typeName: "Foo", local: true}, {typeName: "HTMLElement", defaultLib: true}, {typeName: "Bar", package: "bar-lib"}]}`: +Examples of code for this rule with `{allowlist: [{typeName: "Foo", source: "local"}, {typeName: "HTMLElement", source: "default-lib"}, {typeName: "Bar", source: "package", package: "bar-lib"}]}`: From 81b18e3331b10835495ad890c158dc270cfd0b6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Mon, 28 Mar 2022 19:05:16 +0200 Subject: [PATCH 26/64] test(type-utils): [prefer-readonly-parameter-types] Added rudimentary test for allowlist --- .../type-utils/tests/isTypeReadonly.test.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/packages/type-utils/tests/isTypeReadonly.test.ts b/packages/type-utils/tests/isTypeReadonly.test.ts index 759b63796e1f..106d04fc6c90 100644 --- a/packages/type-utils/tests/isTypeReadonly.test.ts +++ b/packages/type-utils/tests/isTypeReadonly.test.ts @@ -273,5 +273,30 @@ describe('isTypeReadonly', () => { ])('handles non fully readonly sets and maps', runTests); }); }); + + describe('allowlist', () => { + const options: ReadonlynessOptions = { + allowlist: [ + { + typeName: 'RegExp', + source: 'default-lib', + }, + ], + }; + + function runTestIsReadonly(code: string): void { + runTestForAliasDeclaration(code, options, true); + } + + describe('is readonly', () => { + const runTests = runTestIsReadonly; + + it.each([ + [ + 'interface Bar {readonly prop: RegExp}; type test = (arg: Bar) => void;', + ], + ])('correctly marks allowlisted types as readonly', runTests); + }); + }); }); }); From 164ae2b854e87794624878f1fd34445b3540cf2c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Mon, 28 Mar 2022 19:53:52 +0200 Subject: [PATCH 27/64] test(type-utils): [prefer-readonly-parameter-types] Added test for allowlist containing local definition --- packages/type-utils/tests/isTypeReadonly.test.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/type-utils/tests/isTypeReadonly.test.ts b/packages/type-utils/tests/isTypeReadonly.test.ts index 106d04fc6c90..054b261f3444 100644 --- a/packages/type-utils/tests/isTypeReadonly.test.ts +++ b/packages/type-utils/tests/isTypeReadonly.test.ts @@ -281,6 +281,10 @@ describe('isTypeReadonly', () => { typeName: 'RegExp', source: 'default-lib', }, + { + typeName: 'Foo', + source: 'local', + }, ], }; @@ -293,8 +297,9 @@ describe('isTypeReadonly', () => { it.each([ [ - 'interface Bar {readonly prop: RegExp}; type test = (arg: Bar) => void;', + 'interface Bar {readonly prop: RegExp}; type Test = (arg: Bar) => void;', ], + ['interface Foo {prop: string}; type Test = (arg: Foo) => void;'], ])('correctly marks allowlisted types as readonly', runTests); }); }); From 6bda8a30765731ed87a2233766de75cd9cc83bf0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Mon, 11 Apr 2022 00:00:22 +0200 Subject: [PATCH 28/64] Update packages/type-utils/src/TypeAllowListItem.ts to use enum in JSON schema Co-authored-by: Brad Zacher --- packages/type-utils/src/TypeAllowListItem.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/type-utils/src/TypeAllowListItem.ts b/packages/type-utils/src/TypeAllowListItem.ts index 77ee0a40ece1..ebba5751210b 100644 --- a/packages/type-utils/src/TypeAllowListItem.ts +++ b/packages/type-utils/src/TypeAllowListItem.ts @@ -16,7 +16,7 @@ export const typeAllowListItemSchema = { }, source: { type: 'string', - pattern: '^local|default-lib$', + enum: ['local', 'default-lib'], }, }, required: ['typeName', 'source'], @@ -29,7 +29,7 @@ export const typeAllowListItemSchema = { }, source: { type: 'string', - pattern: '^package$', + enum: ['package'], }, package: { type: 'string', From abfc236b9478e7697e4b71ce9b2b2d1cf25af205 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Mon, 11 Apr 2022 00:04:04 +0200 Subject: [PATCH 29/64] fix(eslint-plugin): [prefer-readonly-parameter-types] Added trainling slash to package path check --- packages/type-utils/src/isTypeReadonly.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index 79c9a5280e2b..fbf46cc7f4fe 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -76,9 +76,9 @@ function isTypeExcepted( program.isSourceFileDefaultLibrary(declaration)) || // A type from a specified third-party package (item.source === 'package' && - (declaration.fileName.includes('node_modules/' + item.package) || + (declaration.fileName.includes(`node_modules/${item.package}/`) || declaration.fileName.includes( - 'node_modules/@types/' + item.package, + `node_modules/@types/${item.package}/`, ))) ) { return true; From bbca206e9858924b097b1247fcc79a44a6d1d0ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Thu, 27 Oct 2022 10:35:08 +0200 Subject: [PATCH 30/64] fix(eslint-plugin) Fixed type imports not being separated --- packages/type-utils/src/isTypeReadonly.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index 62a5034067b0..824697e1eead 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -11,10 +11,8 @@ import { import * as ts from 'typescript'; import { getTypeOfPropertyOfType } from './propertyTypes'; -import { - TypeAllowlistItem, - typeAllowListItemSchema, -} from './TypeAllowListItem'; +import type { TypeAllowlistItem } from './TypeAllowListItem'; +import { typeAllowListItemSchema } from './TypeAllowListItem'; const enum Readonlyness { /** the type cannot be handled by the function */ From ffd2aae4426500848ce57e275f8fdb28b8593666 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Tue, 10 Jan 2023 17:14:47 +0100 Subject: [PATCH 31/64] feat(type-utils): Added TypeOrValueSpecifier, its schema and test for the schema --- packages/type-utils/package.json | 1 + .../type-utils/src/TypeOrValueSpecifier.ts | 139 ++++ .../tests/TypeOrValueSpecifier.test.ts | 136 ++++ yarn.lock | 717 +++++++++++++++++- 4 files changed, 969 insertions(+), 24 deletions(-) create mode 100644 packages/type-utils/src/TypeOrValueSpecifier.ts create mode 100644 packages/type-utils/tests/TypeOrValueSpecifier.test.ts diff --git a/packages/type-utils/package.json b/packages/type-utils/package.json index ce0d7e61be71..f007b5224026 100644 --- a/packages/type-utils/package.json +++ b/packages/type-utils/package.json @@ -46,6 +46,7 @@ }, "devDependencies": { "@typescript-eslint/parser": "5.48.0", + "ajv": "^8.12.0", "typescript": "*" }, "peerDependencies": { diff --git a/packages/type-utils/src/TypeOrValueSpecifier.ts b/packages/type-utils/src/TypeOrValueSpecifier.ts new file mode 100644 index 000000000000..4856e3cb22b5 --- /dev/null +++ b/packages/type-utils/src/TypeOrValueSpecifier.ts @@ -0,0 +1,139 @@ +interface FileSpecifier { + from: 'file'; + name: string | string[]; + source?: string; +} + +interface LibSpecifier { + from: 'lib'; + name: string | string[]; +} + +interface PackageSpecifier { + from: 'package'; + name: string | string[]; + source: string; +} + +interface MultiSourceSpecifier { + from: Array<'file' | 'lib' | 'package'>; + name: string; +} + +export type TypeOrValueSpecifier = + | string + | FileSpecifier + | LibSpecifier + | PackageSpecifier + | MultiSourceSpecifier; + +export const typeOrValueSpecifierSchema = { + oneOf: [ + { + type: 'string', + }, + { + type: 'object', + additionalProperties: false, + properties: { + from: { + type: 'string', + const: 'file', + }, + name: { + oneOf: [ + { + type: 'string', + }, + { + type: 'array', + minItems: 1, + uniqueItems: true, + items: { + type: 'string', + }, + }, + ], + }, + source: { + type: 'string', + }, + }, + required: ['from', 'name'], + }, + { + type: 'object', + additionalProperties: false, + properties: { + from: { + type: 'string', + const: 'lib', + }, + name: { + oneOf: [ + { + type: 'string', + }, + { + type: 'array', + minItems: 1, + uniqueItems: true, + items: { + type: 'string', + }, + }, + ], + }, + }, + required: ['from', 'name'], + }, + { + type: 'object', + additionalProperties: false, + properties: { + from: { + type: 'string', + const: 'package', + }, + name: { + oneOf: [ + { + type: 'string', + }, + { + type: 'array', + minItems: 1, + uniqueItems: true, + items: { + type: 'string', + }, + }, + ], + }, + source: { + type: 'string', + }, + }, + required: ['from', 'name', 'source'], + }, + { + type: 'object', + additionalProperties: false, + properties: { + from: { + type: 'array', + minItems: 1, + uniqueItems: true, + items: { + type: 'string', + enum: ['file', 'lib', 'package'], + }, + }, + name: { + type: 'string', + }, + }, + required: ['from', 'name'], + }, + ], +}; diff --git a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts new file mode 100644 index 000000000000..c7b6e9a578c4 --- /dev/null +++ b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts @@ -0,0 +1,136 @@ +import Ajv from 'ajv'; + +import { typeOrValueSpecifierSchema } from '../src/TypeOrValueSpecifier'; + +describe('TypeOrValueSpecifier', () => { + describe('Schema', () => { + const ajv = new Ajv(); + const validate = ajv.compile(typeOrValueSpecifierSchema); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + function runTestPositive(data: any): void { + expect(validate(data)).toBe(true); + } + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + function runTestNegative(data: any): void { + expect(validate(data)).toBe(false); + } + + it.each([['MyType'], ['myValue'], ['any'], ['void'], ['never']])( + 'matches a simple string specifier', + runTestPositive, + ); + + it.each([ + [42], + [false], + [null], + [undefined], + [['MyType']], + [(): void => {}], + ])("doesn't match any non-string basic type", runTestNegative); + + it.each([ + [{ from: 'file', name: 'MyType' }], + [{ from: 'file', name: ['MyType', 'myValue'] }], + [{ from: 'file', name: 'MyType', source: './filename.js' }], + [{ from: 'file', name: ['MyType', 'myValue'], source: './filename.js' }], + ])('matches a file specifier', runTestPositive); + + it.each([ + [{ from: 'file', name: 42 }], + [{ from: 'file', name: ['MyType', 42] }], + [{ from: 'file', name: ['MyType', 'MyType'] }], + [{ from: 'file', name: [] }], + [{ from: 'file', source: './filename.js' }], + [{ from: 'file', name: 'MyType', source: 42 }], + [{ from: 'file', name: ['MyType', 'MyType'], source: './filename.js' }], + [{ from: 'file', name: [], source: './filename.js' }], + [ + { + from: 'file', + name: ['MyType', 'myValue'], + source: ['./filename.js', './another-file.js'], + }, + ], + [{ from: 'file', name: 'MyType', unrelatedProperty: '' }], + ])("doesn't match a malformed file specifier", runTestNegative); + + it.each([ + [{ from: 'lib', name: 'MyType' }], + [{ from: 'lib', name: ['MyType', 'myValue'] }], + ])('matches a lib specifier', runTestPositive); + + it.each([ + [{ from: 'lib', name: 42 }], + [{ from: 'lib', name: ['MyType', 42] }], + [{ from: 'lib', name: ['MyType', 'MyType'] }], + [{ from: 'lib', name: [] }], + [{ from: 'lib' }], + [{ from: 'lib', name: 'MyType', unrelatedProperty: '' }], + ])("doesn't match a malformed lib specifier", runTestNegative); + + it.each([ + [{ from: 'package', name: 'MyType', source: './filename.js' }], + [ + { + from: 'package', + name: ['MyType', 'myValue'], + source: './filename.js', + }, + ], + ])('matches a package specifier', runTestPositive); + + it.each([ + [{ from: 'package', name: 42, source: './filename.js' }], + [{ from: 'package', name: ['MyType', 42], source: './filename.js' }], + [ + { + from: 'package', + name: ['MyType', 'MyType'], + source: './filename.js', + }, + ], + [{ from: 'package', name: [], source: './filename.js' }], + [{ from: 'package', name: 'MyType' }], + [{ from: 'package', source: './filename.js' }], + [{ from: 'package', name: 'MyType', source: 42 }], + [ + { + from: 'package', + name: ['MyType', 'myValue'], + source: ['./filename.js', './another-file.js'], + }, + ], + [ + { + from: 'package', + name: 'MyType', + source: './filename.js', + unrelatedProperty: '', + }, + ], + ])("doesn't match a malformed package specifier", runTestNegative); + + it.each([ + [{ from: ['file'], name: 'MyType' }], + [{ from: ['lib'], name: 'MyType' }], + [{ from: ['package'], name: 'MyType' }], + [{ from: ['file', 'lib'], name: 'MyType' }], + [{ from: ['file', 'package'], name: 'MyType' }], + [{ from: ['lib', 'package'], name: 'MyType' }], + [{ from: ['file', 'lib', 'package'], name: 'MyType' }], + ])('matches a multi-source specifier', runTestPositive); + + it.each([ + [{ from: [], name: 'MyType' }], + [{ from: ['invalid'], name: 'MyType' }], + [{ from: ['file', 'invalid'], name: 'MyType' }], + [{ from: ['file', 'file'], name: 'MyType' }], + [{ from: ['file'], name: 42 }], + [{ from: ['file'] }], + [{ from: ['file'], name: 'MyType', unrelatedProperty: '' }], + ])("doesn't match a malformed multi-source specifier", runTestNegative); + }); +}); diff --git a/yarn.lock b/yarn.lock index 2d237c3ce2cd..23d078192004 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2038,6 +2038,18 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== +"@jest/console@^28.1.1", "@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + "@jest/console@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.1.2.tgz#0ae975a70004696f8320490fcaa1a4152f7b62e4" @@ -2084,12 +2096,22 @@ slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/create-cache-key-function@^27.4.2", "@jest/create-cache-key-function@^29": - version "29.1.2" - resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.1.2.tgz#ba72143479abccc5ce7705e00fcbe89e4d6e1873" - integrity sha512-s7yfOwnDZhqTzLWOwWjv/Lbg9CkJ7bItz5OVrMa0d+g2bP+rFwDs7FpsKuYpym5tpdbDaXHnF3cbl/e01ZeUcw== +"@jest/create-cache-key-function@^27.4.2": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" + integrity sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ== dependencies: - "@jest/types" "^29.1.2" + "@jest/types" "^27.5.1" + +"@jest/environment@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" + integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== + dependencies: + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + jest-mock "^28.1.3" "@jest/environment@^29.1.2": version "29.1.2" @@ -2101,6 +2123,13 @@ "@types/node" "*" jest-mock "^29.1.2" +"@jest/expect-utils@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" + integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== + dependencies: + jest-get-type "^28.0.2" + "@jest/expect-utils@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.1.2.tgz#66dbb514d38f7d21456bc774419c9ae5cca3f88d" @@ -2108,6 +2137,14 @@ dependencies: jest-get-type "^29.0.0" +"@jest/expect@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" + integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== + dependencies: + expect "^28.1.3" + jest-snapshot "^28.1.3" + "@jest/expect@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.1.2.tgz#334a86395f621f1ab63ad95b06a588b9114d7b7a" @@ -2116,6 +2153,18 @@ expect "^29.1.2" jest-snapshot "^29.1.2" +"@jest/fake-timers@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" + integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== + dependencies: + "@jest/types" "^28.1.3" + "@sinonjs/fake-timers" "^9.1.2" + "@types/node" "*" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-util "^28.1.3" + "@jest/fake-timers@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.1.2.tgz#f157cdf23b4da48ce46cb00fea28ed1b57fc271a" @@ -2128,6 +2177,15 @@ jest-mock "^29.1.2" jest-util "^29.1.2" +"@jest/globals@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" + integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/types" "^28.1.3" + "@jest/globals@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.1.2.tgz#826ede84bc280ae7f789cb72d325c48cd048b9d3" @@ -2138,7 +2196,38 @@ "@jest/types" "^29.1.2" jest-mock "^29.1.2" -"@jest/reporters@28.1.1", "@jest/reporters@^29", "@jest/reporters@^29.1.2": +"@jest/reporters@28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.1.tgz#9389f4bb3cce4d9b586f6195f83c79cd2a1c8662" + integrity sha512-597Zj4D4d88sZrzM4atEGLuO7SdA/YrOv9SRXHXRNC+/FwPCWxZhBAEzhXoiJzfRwn8zes/EjS8Lo6DouGN5Gg== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^28.1.1" + "@jest/test-result" "^28.1.1" + "@jest/transform" "^28.1.1" + "@jest/types" "^28.1.1" + "@jridgewell/trace-mapping" "^0.3.7" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-message-util "^28.1.1" + jest-util "^28.1.1" + jest-worker "^28.1.1" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + terminal-link "^2.0.0" + v8-to-istanbul "^9.0.0" + +"@jest/reporters@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.1.2.tgz#5520898ed0a4ecf69d8b671e1dc8465d0acdfa6e" integrity sha512-X4fiwwyxy9mnfpxL0g9DD0KcTmEIqP0jUdnc2cfa9riHy+I6Gwwp5vOZiwyg0vZxfSDxrOlK9S4+340W4d+DAA== @@ -2169,6 +2258,13 @@ terminal-link "^2.0.0" v8-to-istanbul "^9.0.1" +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" + "@jest/schemas@^29.0.0": version "29.0.0" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" @@ -2176,6 +2272,15 @@ dependencies: "@sinclair/typebox" "^0.24.1" +"@jest/source-map@^28.1.2": + version "28.1.2" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" + integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== + dependencies: + "@jridgewell/trace-mapping" "^0.3.13" + callsites "^3.0.0" + graceful-fs "^4.2.9" + "@jest/source-map@^29.0.0": version "29.0.0" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.0.0.tgz#f8d1518298089f8ae624e442bbb6eb870ee7783c" @@ -2185,7 +2290,27 @@ callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@28.1.1", "@jest/test-result@^29", "@jest/test-result@^29.1.2": +"@jest/test-result@28.1.1": + version "28.1.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.1.tgz#c6f18d1bbb01aa88925dd687872a75f8414b317a" + integrity sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ== + dependencies: + "@jest/console" "^28.1.1" + "@jest/types" "^28.1.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^28.1.1", "@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + dependencies: + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.1.2.tgz#6a8d006eb2b31ce0287d1fc10d12b8ff8504f3c8" integrity sha512-jjYYjjumCJjH9hHCoMhA8PCl1OxNeGgAoZ7yuGYILRJX9NjgzTN0pCT5qAoYR4jfOP8htIByvAlz9vfNSSBoVg== @@ -2195,6 +2320,16 @@ "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" +"@jest/test-sequencer@^28.1.1": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" + integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== + dependencies: + "@jest/test-result" "^28.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + slash "^3.0.0" + "@jest/test-sequencer@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.1.2.tgz#10bfd89c08bfdba382eb05cc79c1d23a01238a93" @@ -2205,6 +2340,27 @@ jest-haste-map "^29.1.2" slash "^3.0.0" +"@jest/transform@^28.1.1", "@jest/transform@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" + integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/types" "^28.1.3" + "@jridgewell/trace-mapping" "^0.3.13" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.1" + "@jest/transform@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.1.2.tgz#20f814696e04f090421f6d505c14bbfe0157062a" @@ -2226,6 +2382,29 @@ slash "^3.0.0" write-file-atomic "^4.0.1" +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jest/types@^28.1.1", "@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== + dependencies: + "@jest/schemas" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + "@jest/types@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.1.2.tgz#7442d32b16bcd7592d9614173078b8c334ec730a" @@ -2247,7 +2426,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== @@ -2265,7 +2444,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== @@ -2278,6 +2457,14 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@jridgewell/trace-mapping@^0.3.13": + version "0.3.17" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" + integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + "@jsdevtools/ono@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" @@ -3749,10 +3936,19 @@ "@svgr/plugin-jsx" "^6.2.1" "@svgr/plugin-svgo" "^6.2.0" -"@swc/core-android-arm-eabi@1.3.4", "@swc/core-android-arm-eabi@npm:dummypkg-a@1.0.0", "@swc/core-android-arm64@1.3.4", "@swc/core-android-arm64@npm:dummypkg-a@1.0.0", "@swc/core-freebsd-x64@1.3.4", "@swc/core-freebsd-x64@npm:dummypkg-a@1.0.0", "@swc/core-linux-arm-gnueabihf@1.3.4", "@swc/core-linux-arm-gnueabihf@npm:dummypkg-a@1.0.0", "@swc/core-linux-arm64-gnu@1.3.4", "@swc/core-linux-arm64-gnu@npm:dummypkg-a@1.0.0", "@swc/core-linux-arm64-musl@1.3.4", "@swc/core-linux-arm64-musl@npm:dummypkg-a@1.0.0", "@swc/core-win32-arm64-msvc@1.3.4", "@swc/core-win32-arm64-msvc@npm:dummypkg-a@1.0.0", "@swc/core-win32-ia32-msvc@1.3.4", "@swc/core-win32-ia32-msvc@npm:dummypkg-a@1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/dummypkg-a/-/dummypkg-a-1.0.0.tgz#02868251461af84d70603446ef5908b72c5c8435" - integrity sha512-V9qLfUzVlmSW/ayzlchss1XjAqWXqHmJtzGwnfg/jsnloIUyLKR5a0Djfdgj/Jv3yoNAljIUaelTVjptxtTyGA== +"@swc/core-android-arm-eabi@1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.3.4.tgz#ce1a32c0107f599aebd55923473e0f7217918686" + integrity sha512-aq+CAebSQMtdrIR4+v/JBfykK/daD+so2gPHm4wgLaTR+xwziQAsBBI5iq5sinhIg4FGnmljtO75QolcNLmpvw== + dependencies: + "@swc/wasm" "1.2.122" + +"@swc/core-android-arm64@1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@swc/core-android-arm64/-/core-android-arm64-1.3.4.tgz#998697ef810e10848e4cc64834f37ee60dd738c0" + integrity sha512-E5z6ribiEzDqrq5Kv5xOLdWcTzHWlzGuqDSxTQNz9GCC94qSVzXp5Df+egVEKE/4t7u2P6nO46BUKweYMb9TJg== + dependencies: + "@swc/wasm" "1.2.130" "@swc/core-darwin-arm64@1.3.4": version "1.3.4" @@ -3764,6 +3960,30 @@ resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.4.tgz#4742a7f83de9f6ba50801e9f6500b538856853ea" integrity sha512-A6KMZsUJ3j5TVxAizbv+UEjCNvMgWBm9jw4R3biaw8kbgu3XUWHdkiheXO+c2kjjjgwr1jhkHcLgRjffwpLYFA== +"@swc/core-freebsd-x64@1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@swc/core-freebsd-x64/-/core-freebsd-x64-1.3.4.tgz#b007e547470c709ec66c0187e01478736c7e3c4a" + integrity sha512-C5FCXHebcHwPJtEhgRShumXvcdPO5Cqiwd7GDNBav1IZribs3+ZqrTkCaz2hY7gb5NvyFIxkJ5HhpS4Pxafhuw== + dependencies: + "@swc/wasm" "1.2.130" + +"@swc/core-linux-arm-gnueabihf@1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.4.tgz#f1224392d6a67e6e16865f762af1c18d0123f2ff" + integrity sha512-vawHUhUcS//xNvGzL0zZ3vZ1YnsjgyvWQXB5PF4bhM5Y0/rmcrEdpkSId1qTfaMpcL7l2QSy9/DM7ucjlSpK6w== + dependencies: + "@swc/wasm" "1.2.130" + +"@swc/core-linux-arm64-gnu@1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.4.tgz#fa4326d7c42d5e5c34461cf0ae3b6c5e97aea3c1" + integrity sha512-p60RoYaDS8zrqp/cGkcJryk9HobJvrL+Ox/iz8ivDrV4IS0LXvqW5/5YTSzLo93/+blvG/M0hdaokoMhWhDnwA== + +"@swc/core-linux-arm64-musl@1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.4.tgz#0b03ddf3d2e562dfea6faa6917cd87496a910925" + integrity sha512-F9hW6g5l4YesJJH/JMznaLGdLeCV4FKq5MN5DaZfuB8qrCZGLmAasGgvSNbXh1oZnDu1PD2ZxMYivkf2n8/4OA== + "@swc/core-linux-x64-gnu@1.3.4": version "1.3.4" resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.4.tgz#1cc63f9a86074cac7454796ccbe3836ac7f6451b" @@ -3774,6 +3994,20 @@ resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.4.tgz#f65abb7e149ad3f20ca98c933331aa98c190cd9f" integrity sha512-stVnU7KXQxSbh67UiIVxZsgjkRSXApPTEU3CYnwsdH7G+ynfO1WocSatzjIKpJfhcY2Nss8/33yDaOKZXVhbIA== +"@swc/core-win32-arm64-msvc@1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.4.tgz#4bfca2e1c73bf8c6109ed734eb15eca6406b1ebd" + integrity sha512-qc3UIdAQfLTA1mJsFkX3ISqJDU02qtcjUbnLI8sl6oedCAOFF66TcecJvwl4iO+BTO04+KoZc5rJovSTOb3eQA== + dependencies: + "@swc/wasm" "1.2.130" + +"@swc/core-win32-ia32-msvc@1.3.4": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.4.tgz#df9c06ad65e80b19d26710a0d5951f29848a76ae" + integrity sha512-FxuDGn60VrnYBcpH0CeR9+pCnPUaVvZ20CO6o/oNYHSfIhqPc76o3zFYYEFswYodExjCCYwsuPYgi+stvKZroA== + dependencies: + "@swc/wasm" "1.2.130" + "@swc/core-win32-x64-msvc@1.3.4": version "1.3.4" resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.4.tgz#7bf6cd6f5c3197d7d807b273d12dd666e23b238e" @@ -3806,6 +4040,16 @@ "@jest/create-cache-key-function" "^27.4.2" jsonc-parser "^3.2.0" +"@swc/wasm@1.2.122": + version "1.2.122" + resolved "https://registry.yarnpkg.com/@swc/wasm/-/wasm-1.2.122.tgz#87a5e654b26a71b2e84b801f41e45f823b856639" + integrity sha512-sM1VCWQxmNhFtdxME+8UXNyPNhxNu7zdb6ikWpz0YKAQQFRGT5ThZgJrubEpah335SUToNg8pkdDF7ibVCjxbQ== + +"@swc/wasm@1.2.130": + version "1.2.130" + resolved "https://registry.yarnpkg.com/@swc/wasm/-/wasm-1.2.130.tgz#88ac26433335d1f957162a9a92f1450b73c176a0" + integrity sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q== + "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -4123,11 +4367,21 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@12.20.24", "@types/node@^17.0.5", "@types/node@^18.11.9": +"@types/node@*", "@types/node@^18.11.9": version "18.11.9" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== +"@types/node@12.20.24": + version "12.20.24" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.24.tgz#c37ac69cb2948afb4cef95f424fa0037971a9a5c" + integrity sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ== + +"@types/node@^17.0.5": + version "17.0.45" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" + integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== + "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" @@ -4301,6 +4555,13 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== +"@types/yargs@^16.0.0": + version "16.0.5" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" + integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== + dependencies: + "@types/yargs-parser" "*" + "@types/yargs@^17.0.8": version "17.0.10" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" @@ -4573,6 +4834,16 @@ ajv@^8.0.0, ajv@^8.6.0, ajv@^8.8.0: require-from-string "^2.0.2" uri-js "^4.2.2" +ajv@^8.12.0: + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + algoliasearch-helper@^3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.10.0.tgz#59a0f645dd3c7e55cf01faa568d1af50c49d36f6" @@ -4859,6 +5130,19 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== +babel-jest@^28.1.1: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" + integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== + dependencies: + "@jest/transform" "^28.1.3" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^28.1.3" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + babel-jest@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.1.2.tgz#540d3241925c55240fb0c742e3ffc5f33a501978" @@ -4915,6 +5199,16 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" +babel-plugin-jest-hoist@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe" + integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + babel-plugin-jest-hoist@^29.0.2: version "29.0.2" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.0.2.tgz#ae61483a829a021b146c016c6ad39b8bcc37c2c8" @@ -4982,6 +5276,14 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" +babel-preset-jest@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" + integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== + dependencies: + babel-plugin-jest-hoist "^28.1.3" + babel-preset-current-node-syntax "^1.0.0" + babel-preset-jest@^29.0.2: version "29.0.2" resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.0.2.tgz#e14a7124e22b161551818d89e5bdcfb3b2b0eac7" @@ -6471,6 +6773,11 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" +diff-sequences@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" + integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== + diff-sequences@^29.0.0: version "29.0.0" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.0.0.tgz#bae49972ef3933556bcb0800b72e8579d19d9e4f" @@ -7175,6 +7482,17 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= +expect@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" + integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== + dependencies: + "@jest/expect-utils" "^28.1.3" + jest-get-type "^28.0.2" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + expect@^29.0.0, expect@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/expect/-/expect-29.1.2.tgz#82f8f28d7d408c7c68da3a386a490ee683e1eced" @@ -8921,6 +9239,31 @@ jest-changed-files@^29.0.0: execa "^5.0.0" p-limit "^3.1.0" +jest-circus@^28.1.1: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" + integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/expect" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + is-generator-fn "^2.0.0" + jest-each "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-runtime "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + p-limit "^3.1.0" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-circus@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.1.2.tgz#4551068e432f169a53167fe1aef420cf51c8a735" @@ -8964,7 +9307,35 @@ jest-cli@^29.1.2: prompts "^2.0.1" yargs "^17.3.1" -jest-config@28.1.1, jest-config@^29, jest-config@^29.1.2: +jest-config@28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.1.tgz#e90b97b984f14a6c24a221859e81b258990fce2f" + integrity sha512-tASynMhS+jVV85zKvjfbJ8nUyJS/jUSYZ5KQxLUN2ZCvcQc/OmhQl2j6VEL3ezQkNofxn5pQ3SPYWPHb0unTZA== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^28.1.1" + "@jest/types" "^28.1.1" + babel-jest "^28.1.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-circus "^28.1.1" + jest-environment-node "^28.1.1" + jest-get-type "^28.0.2" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.1" + jest-runner "^28.1.1" + jest-util "^28.1.1" + jest-validate "^28.1.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^28.1.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-config@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.1.2.tgz#7d004345ca4c09f5d8f802355f54494e90842f4d" integrity sha512-EC3Zi86HJUOz+2YWQcJYQXlf0zuBhJoeyxLM6vb6qJsVmpP7KcCP1JnyF0iaqTaXdBP8Rlwsvs7hnKWQWWLwwA== @@ -8992,7 +9363,7 @@ jest-config@28.1.1, jest-config@^29, jest-config@^29.1.2: slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@*, jest-diff@^29, jest-diff@^29.0.3, jest-diff@^29.1.2: +jest-diff@*, jest-diff@^29.0.3, jest-diff@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.1.2.tgz#bb7aaf5353227d6f4f96c5e7e8713ce576a607dc" integrity sha512-4GQts0aUopVvecIT4IwD/7xsBaMhKTYoM4/njE/aVw9wpw+pIUVp8Vab/KnSzSilr84GnLBkaP3JLDnQYCKqVQ== @@ -9002,6 +9373,23 @@ jest-diff@*, jest-diff@^29, jest-diff@^29.0.3, jest-diff@^29.1.2: jest-get-type "^29.0.0" pretty-format "^29.1.2" +jest-diff@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" + integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== + dependencies: + chalk "^4.0.0" + diff-sequences "^28.1.1" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-docblock@^28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" + integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== + dependencies: + detect-newline "^3.0.0" + jest-docblock@^29.0.0: version "29.0.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.0.0.tgz#3151bcc45ed7f5a8af4884dcc049aee699b4ceae" @@ -9009,6 +9397,17 @@ jest-docblock@^29.0.0: dependencies: detect-newline "^3.0.0" +jest-each@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" + integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== + dependencies: + "@jest/types" "^28.1.3" + chalk "^4.0.0" + jest-get-type "^28.0.2" + jest-util "^28.1.3" + pretty-format "^28.1.3" + jest-each@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.1.2.tgz#d4c8532c07a846e79f194f7007ce7cb1987d1cd0" @@ -9020,6 +9419,18 @@ jest-each@^29.1.2: jest-util "^29.1.2" pretty-format "^29.1.2" +jest-environment-node@^28.1.1, jest-environment-node@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" + integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + jest-mock "^28.1.3" + jest-util "^28.1.3" + jest-environment-node@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.1.2.tgz#005e05cc6ea4b9b5ba55906ab1ce53c82f6907a7" @@ -9032,11 +9443,35 @@ jest-environment-node@^29.1.2: jest-mock "^29.1.2" jest-util "^29.1.2" -jest-get-type@^29, jest-get-type@^29.0.0: +jest-get-type@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" + integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== + +jest-get-type@^29.0.0: version "29.0.0" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.0.0.tgz#843f6c50a1b778f7325df1129a0fd7aa713aef80" integrity sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw== +jest-haste-map@^28.1.1, jest-haste-map@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" + integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== + dependencies: + "@jest/types" "^28.1.3" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^28.0.2" + jest-util "^28.1.3" + jest-worker "^28.1.3" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + jest-haste-map@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.1.2.tgz#93f3634aa921b6b654e7c94137b24e02e7ca6ac9" @@ -9056,6 +9491,14 @@ jest-haste-map@^29.1.2: optionalDependencies: fsevents "^2.3.2" +jest-leak-detector@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" + integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== + dependencies: + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + jest-leak-detector@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.1.2.tgz#4c846db14c58219430ccbc4f01a1ec52ebee4fc2" @@ -9064,7 +9507,17 @@ jest-leak-detector@^29.1.2: jest-get-type "^29.0.0" pretty-format "^29.1.2" -jest-matcher-utils@^29, jest-matcher-utils@^29.1.2: +jest-matcher-utils@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" + integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== + dependencies: + chalk "^4.0.0" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + pretty-format "^28.1.3" + +jest-matcher-utils@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.1.2.tgz#e68c4bcc0266e70aa1a5c13fb7b8cd4695e318a1" integrity sha512-MV5XrD3qYSW2zZSHRRceFzqJ39B2z11Qv0KPyZYxnzDHFeYZGJlgGi0SW+IXSJfOewgJp/Km/7lpcFT+cgZypw== @@ -9074,6 +9527,21 @@ jest-matcher-utils@^29, jest-matcher-utils@^29.1.2: jest-get-type "^29.0.0" pretty-format "^29.1.2" +jest-message-util@^28.1.1, jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + jest-message-util@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.1.2.tgz#c21a33c25f9dc1ebfcd0f921d89438847a09a501" @@ -9089,6 +9557,14 @@ jest-message-util@^29.1.2: slash "^3.0.0" stack-utils "^2.0.3" +jest-mock@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" + integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + jest-mock@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.1.2.tgz#de47807edbb9d4abf8423f1d8d308d670105678c" @@ -9103,6 +9579,11 @@ jest-pnp-resolver@^1.2.2: resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== +jest-regex-util@^28.0.2: + version "28.0.2" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + jest-regex-util@^29.0.0: version "29.0.0" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.0.0.tgz#b442987f688289df8eb6c16fa8df488b4cd007de" @@ -9116,7 +9597,37 @@ jest-resolve-dependencies@^29.1.2: jest-regex-util "^29.0.0" jest-snapshot "^29.1.2" -jest-resolve@28.1.1, jest-resolve@^29, jest-resolve@^29.1.2: +jest-resolve@28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.1.tgz#bc2eaf384abdcc1aaf3ba7c50d1adf01e59095e5" + integrity sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.1" + jest-pnp-resolver "^1.2.2" + jest-util "^28.1.1" + jest-validate "^28.1.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-resolve@^28.1.1, jest-resolve@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" + integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-pnp-resolver "^1.2.2" + jest-util "^28.1.3" + jest-validate "^28.1.3" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-resolve@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.1.2.tgz#9dd8c2fc83e59ee7d676b14bd45a5f89e877741d" integrity sha512-7fcOr+k7UYSVRJYhSmJHIid3AnDBcLQX3VmT9OSbPWsWz1MfT7bcoerMhADKGvKCoMpOHUQaDHtQoNp/P9JMGg== @@ -9131,6 +9642,33 @@ jest-resolve@28.1.1, jest-resolve@^29, jest-resolve@^29.1.2: resolve.exports "^1.1.0" slash "^3.0.0" +jest-runner@^28.1.1: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" + integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== + dependencies: + "@jest/console" "^28.1.3" + "@jest/environment" "^28.1.3" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.10.2" + graceful-fs "^4.2.9" + jest-docblock "^28.1.1" + jest-environment-node "^28.1.3" + jest-haste-map "^28.1.3" + jest-leak-detector "^28.1.3" + jest-message-util "^28.1.3" + jest-resolve "^28.1.3" + jest-runtime "^28.1.3" + jest-util "^28.1.3" + jest-watcher "^28.1.3" + jest-worker "^28.1.3" + p-limit "^3.1.0" + source-map-support "0.5.13" + jest-runner@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.1.2.tgz#f18b2b86101341e047de8c2f51a5fdc4e97d053a" @@ -9158,6 +9696,34 @@ jest-runner@^29.1.2: p-limit "^3.1.0" source-map-support "0.5.13" +jest-runtime@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" + integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== + dependencies: + "@jest/environment" "^28.1.3" + "@jest/fake-timers" "^28.1.3" + "@jest/globals" "^28.1.3" + "@jest/source-map" "^28.1.2" + "@jest/test-result" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^28.1.3" + jest-message-util "^28.1.3" + jest-mock "^28.1.3" + jest-regex-util "^28.0.2" + jest-resolve "^28.1.3" + jest-snapshot "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + strip-bom "^4.0.0" + jest-runtime@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.1.2.tgz#dbcd57103d61115479108d5864bdcd661d9c6783" @@ -9186,7 +9752,7 @@ jest-runtime@^29.1.2: slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@*, jest-snapshot@^29, jest-snapshot@^29.0.0, jest-snapshot@^29.0.3, jest-snapshot@^29.1.2: +jest-snapshot@*, jest-snapshot@^29.0.0, jest-snapshot@^29.0.3, jest-snapshot@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.1.2.tgz#7dd277e88c45f2d2ff5888de1612e63c7ceb575b" integrity sha512-rYFomGpVMdBlfwTYxkUp3sjD6usptvZcONFYNqVlaz4EpHPnDvlWjvmOQ9OCSNKqYZqLM2aS3wq01tWujLg7gg== @@ -9216,6 +9782,35 @@ jest-snapshot@*, jest-snapshot@^29, jest-snapshot@^29.0.0, jest-snapshot@^29.0.3 pretty-format "^29.1.2" semver "^7.3.5" +jest-snapshot@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" + integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== + dependencies: + "@babel/core" "^7.11.6" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.3.3" + "@jest/expect-utils" "^28.1.3" + "@jest/transform" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/babel__traverse" "^7.0.6" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^28.1.3" + graceful-fs "^4.2.9" + jest-diff "^28.1.3" + jest-get-type "^28.0.2" + jest-haste-map "^28.1.3" + jest-matcher-utils "^28.1.3" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + natural-compare "^1.4.0" + pretty-format "^28.1.3" + semver "^7.3.5" + jest-specific-snapshot@*, jest-specific-snapshot@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/jest-specific-snapshot/-/jest-specific-snapshot-7.0.0.tgz#c8851bc263b780c0fa750462f61bd98fe956fc64" @@ -9223,7 +9818,31 @@ jest-specific-snapshot@*, jest-specific-snapshot@^7.0.0: dependencies: jest-snapshot "^29.0.0" -jest-util@28.1.1, jest-util@^29, jest-util@^29.1.2: +jest-util@28.1.1: + version "28.1.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.1.tgz#ff39e436a1aca397c0ab998db5a51ae2b7080d05" + integrity sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw== + dependencies: + "@jest/types" "^28.1.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^28.1.1, jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.1.2.tgz#ac5798e93cb6a6703084e194cfa0898d66126df1" integrity sha512-vPCk9F353i0Ymx3WQq3+a4lZ07NXu9Ca8wya6o4Fe4/aO1e1awMMprZ3woPFpKwghEOW+UXgd15vVotuNN9ONQ== @@ -9235,6 +9854,18 @@ jest-util@28.1.1, jest-util@^29, jest-util@^29.1.2: graceful-fs "^4.2.9" picomatch "^2.2.3" +jest-validate@^28.1.1, jest-validate@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" + integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== + dependencies: + "@jest/types" "^28.1.3" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^28.0.2" + leven "^3.1.0" + pretty-format "^28.1.3" + jest-validate@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.1.2.tgz#83a728b8f6354da2e52346878c8bc7383516ca51" @@ -9247,6 +9878,20 @@ jest-validate@^29.1.2: leven "^3.1.0" pretty-format "^29.1.2" +jest-watcher@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== + dependencies: + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" + jest-watcher@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.1.2.tgz#de21439b7d889e2fcf62cc2a4779ef1a3f1f3c62" @@ -9279,6 +9924,15 @@ jest-worker@^27.4.5, jest-worker@^27.5.1: merge-stream "^2.0.0" supports-color "^8.0.0" +jest-worker@^28.1.1, jest-worker@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jest-worker@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.1.2.tgz#a68302af61bce82b42a9a57285ca7499d29b2afc" @@ -11588,7 +12242,7 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" -pretty-format@*, pretty-format@^29, pretty-format@^29.0.0, pretty-format@^29.0.3, pretty-format@^29.1.2: +pretty-format@*, pretty-format@^29.0.0, pretty-format@^29.0.3, pretty-format@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.1.2.tgz#b1f6b75be7d699be1a051f5da36e8ae9e76a8e6a" integrity sha512-CGJ6VVGXVRP2o2Dorl4mAwwvDWT25luIsYhkyVQW32E4nL+TgW939J7LlKT/npq5Cpq6j3s+sy+13yk7xYpBmg== @@ -11597,6 +12251,16 @@ pretty-format@*, pretty-format@^29, pretty-format@^29.0.0, pretty-format@^29.0.3 ansi-styles "^5.0.0" react-is "^18.0.0" +pretty-format@^28.1.1, pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + pretty-time@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" @@ -13646,11 +14310,16 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@*, "typescript@>=3.3.1 <5.0.0", "typescript@^3 || ^4", typescript@next, typescript@~4.8.4, typescript@~4.9.3: +typescript@*, "typescript@>=3.3.1 <5.0.0", "typescript@^3 || ^4", typescript@next: version "4.9.3" resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== +typescript@~4.8.4: + version "4.8.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" + integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== + ua-parser-js@^0.7.30: version "0.7.31" resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.31.tgz#649a656b191dffab4f21d5e053e27ca17cbff5c6" @@ -13945,7 +14614,7 @@ v8-compile-cache@2.3.0, v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^9.0.1: +v8-to-istanbul@^9.0.0, v8-to-istanbul@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== From c4d0a3f3dec3760703169da68443de5a62542c5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 11 Jan 2023 11:10:12 +0100 Subject: [PATCH 32/64] feat(type-utils): Added typeMatchesSpecifier() and switched isTypeReadonly over to TypeOrValueSpecifier --- .../rules/prefer-readonly-parameter-types.ts | 2 +- packages/type-utils/src/TypeAllowListItem.ts | 41 - .../type-utils/src/TypeOrValueSpecifier.ts | 136 +- packages/type-utils/src/index.ts | 2 +- packages/type-utils/src/isTypeReadonly.ts | 45 +- .../type-utils/tests/isTypeReadonly.test.ts | 8 +- yarn.lock | 1181 ++++++----------- 7 files changed, 550 insertions(+), 865 deletions(-) delete mode 100644 packages/type-utils/src/TypeAllowListItem.ts diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index 54147ae58d58..388086cbef2b 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -5,7 +5,7 @@ import * as util from '../util'; type Options = [ { - allowlist?: Array; + allowlist?: Array; checkParameterProperties?: boolean; ignoreInferredTypes?: boolean; treatMethodsAsReadonly?: boolean; diff --git a/packages/type-utils/src/TypeAllowListItem.ts b/packages/type-utils/src/TypeAllowListItem.ts deleted file mode 100644 index ebba5751210b..000000000000 --- a/packages/type-utils/src/TypeAllowListItem.ts +++ /dev/null @@ -1,41 +0,0 @@ -export type TypeAllowlistItem = { - typeName: string; -} & ( - | { source: 'local' | 'default-lib' } - | { source: 'package'; package: string } -); - -export const typeAllowListItemSchema = { - type: 'object', - oneOf: [ - { - additionalProperties: false, - properties: { - typeName: { - type: 'string', - }, - source: { - type: 'string', - enum: ['local', 'default-lib'], - }, - }, - required: ['typeName', 'source'], - }, - { - additionalProperties: false, - properties: { - typeName: { - type: 'string', - }, - source: { - type: 'string', - enum: ['package'], - }, - package: { - type: 'string', - }, - }, - required: ['typeName', 'source', 'package'], - }, - ], -}; diff --git a/packages/type-utils/src/TypeOrValueSpecifier.ts b/packages/type-utils/src/TypeOrValueSpecifier.ts index 4856e3cb22b5..3206b6036f23 100644 --- a/packages/type-utils/src/TypeOrValueSpecifier.ts +++ b/packages/type-utils/src/TypeOrValueSpecifier.ts @@ -1,17 +1,19 @@ +import type * as ts from 'typescript'; + interface FileSpecifier { from: 'file'; - name: string | string[]; + name: string | Array; source?: string; } interface LibSpecifier { from: 'lib'; - name: string | string[]; + name: string | Array; } interface PackageSpecifier { from: 'package'; - name: string | string[]; + name: string | Array; source: string; } @@ -137,3 +139,131 @@ export const typeOrValueSpecifierSchema = { }, ], }; + +function isMultiSourceSpecifier( + specifier: TypeOrValueSpecifier, +): specifier is MultiSourceSpecifier { + return typeof specifier === 'object' && Array.isArray(specifier.from); +} + +function specifierNameMatches( + type: ts.Type, + name: string | Array, +): boolean { + if (typeof name === 'string') { + name = [name]; + } + return name.some(item => item === type.getSymbol()?.escapedName); +} + +function typeMatchesFileSpecifier( + type: ts.Type, + specifier: FileSpecifier, + declarationFiles: Array, + program: ts.Program, +): boolean { + if ( + !declarationFiles.some(declaration => + declaration.fileName.startsWith(program.getCurrentDirectory()), + ) + ) { + return false; + } + // TODO: Check filename against source. + return true; +} + +function typeIsFromLib( + declarationFiles: Array, + program: ts.Program, +): boolean { + return declarationFiles.some(declaration => + program.isSourceFileDefaultLibrary(declaration), + ); +} + +function typeMatchesPackageSpecifier( + specifier: PackageSpecifier, + declarationFiles: Array, +): boolean { + return declarationFiles.some( + declaration => + declaration.fileName.includes(`node_modules/${specifier.source}/`) || + declaration.fileName.includes(`node_modules/@types/${specifier.source}/`), + ); +} + +function typeMatchesMultiSourceSpecifier( + type: ts.Type, + specifier: MultiSourceSpecifier, + declarationFiles: Array, + program: ts.Program, +): boolean { + if ( + specifier.from.includes('file') && + typeMatchesFileSpecifier( + type, + { from: 'file', name: specifier.name }, + declarationFiles, + program, + ) + ) { + return true; + } + if ( + specifier.from.includes('lib') && + typeIsFromLib(declarationFiles, program) + ) { + return true; + } + if ( + specifier.from.includes('package') && + typeMatchesPackageSpecifier( + // TODO: Solve what to do with the source. + { from: 'package', name: specifier.name, source: '' }, + declarationFiles, + ) + ) { + return true; + } + return false; +} + +export function typeMatchesSpecifier( + type: ts.Type, + specifier: TypeOrValueSpecifier, + program: ts.Program, +): boolean { + if (typeof specifier === 'string') { + return specifierNameMatches(type, specifier); + } + if (!specifierNameMatches(type, specifier.name)) { + return false; + } + const declarationFiles = + type + .getSymbol() + ?.getDeclarations() + ?.map(declaration => declaration.getSourceFile()) ?? []; + if (isMultiSourceSpecifier(specifier)) { + return typeMatchesMultiSourceSpecifier( + type, + specifier, + declarationFiles, + program, + ); + } + switch (specifier.from) { + case 'file': + return typeMatchesFileSpecifier( + type, + specifier, + declarationFiles, + program, + ); + case 'lib': + return typeIsFromLib(declarationFiles, program); + case 'package': + return typeMatchesPackageSpecifier(specifier, declarationFiles); + } +} diff --git a/packages/type-utils/src/index.ts b/packages/type-utils/src/index.ts index 832f36dcb001..9fc499aa8f31 100644 --- a/packages/type-utils/src/index.ts +++ b/packages/type-utils/src/index.ts @@ -11,7 +11,7 @@ export * from './isUnsafeAssignment'; export * from './predicates'; export * from './propertyTypes'; export * from './requiresQuoting'; -export * from './TypeAllowListItem'; +export * from './TypeOrValueSpecifier'; export * from './typeFlagUtils'; export { getDecorators, diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index 047ef6c1e397..efcf5b1cbd5a 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -11,8 +11,11 @@ import { import * as ts from 'typescript'; import { getTypeOfPropertyOfType } from './propertyTypes'; -import type { TypeAllowlistItem } from './TypeAllowListItem'; -import { typeAllowListItemSchema } from './TypeAllowListItem'; +import type { TypeOrValueSpecifier } from './TypeOrValueSpecifier'; +import { + typeMatchesSpecifier, + typeOrValueSpecifierSchema, +} from './TypeOrValueSpecifier'; const enum Readonlyness { /** the type cannot be handled by the function */ @@ -25,7 +28,7 @@ const enum Readonlyness { export interface ReadonlynessOptions { readonly treatMethodsAsReadonly?: boolean; - readonly allowlist?: Array; + readonly allowlist?: Array; } export const readonlynessOptionsSchema = { @@ -37,7 +40,7 @@ export const readonlynessOptionsSchema = { }, allowlist: { type: 'array', - items: typeAllowListItemSchema, + items: typeOrValueSpecifierSchema, }, }, }; @@ -56,35 +59,11 @@ function isTypeExcepted( program: ts.Program, options: ReadonlynessOptions, ): boolean { - const typeName = type.getSymbol()?.escapedName; - const matchingItems = - options.allowlist?.filter(item => item.typeName === typeName) ?? []; - for (const item of matchingItems) { - const declarationFiles = - type - .getSymbol() - ?.getDeclarations() - ?.map(declaration => declaration.getSourceFile()) ?? []; - for (const declaration of declarationFiles) { - if ( - // A local type defined in the current package - (item.source === 'local' && - declaration.fileName.startsWith(program.getCurrentDirectory())) || - // A type from the default library - (item.source === 'default-lib' && - program.isSourceFileDefaultLibrary(declaration)) || - // A type from a specified third-party package - (item.source === 'package' && - (declaration.fileName.includes(`node_modules/${item.package}/`) || - declaration.fileName.includes( - `node_modules/@types/${item.package}/`, - ))) - ) { - return true; - } - } - } - return false; + return ( + options.allowlist?.some(specifier => + typeMatchesSpecifier(type, specifier, program), + ) ?? false + ); } function isTypeReadonlyArrayOrTuple( diff --git a/packages/type-utils/tests/isTypeReadonly.test.ts b/packages/type-utils/tests/isTypeReadonly.test.ts index e0d7b34f1234..28c5e03d5482 100644 --- a/packages/type-utils/tests/isTypeReadonly.test.ts +++ b/packages/type-utils/tests/isTypeReadonly.test.ts @@ -313,12 +313,12 @@ describe('isTypeReadonly', () => { const options: ReadonlynessOptions = { allowlist: [ { - typeName: 'RegExp', - source: 'default-lib', + from: 'lib', + name: 'RegExp', }, { - typeName: 'Foo', - source: 'local', + from: 'file', + name: 'Foo', }, ], }; diff --git a/yarn.lock b/yarn.lock index 23d078192004..358a2db98932 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2038,18 +2038,6 @@ resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== -"@jest/console@^28.1.1", "@jest/console@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-28.1.3.tgz#2030606ec03a18c31803b8a36382762e447655df" - integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - slash "^3.0.0" - "@jest/console@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.1.2.tgz#0ae975a70004696f8320490fcaa1a4152f7b62e4" @@ -2062,6 +2050,18 @@ jest-util "^29.1.2" slash "^3.0.0" +"@jest/console@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.3.1.tgz#3e3f876e4e47616ea3b1464b9fbda981872e9583" + integrity sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg== + dependencies: + "@jest/types" "^29.3.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.3.1" + jest-util "^29.3.1" + slash "^3.0.0" + "@jest/core@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.1.2.tgz#e5ce7a71e7da45156a96fb5eeed11d18b67bd112" @@ -2096,22 +2096,12 @@ slash "^3.0.0" strip-ansi "^6.0.0" -"@jest/create-cache-key-function@^27.4.2": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-27.5.1.tgz#7448fae15602ea95c828f5eceed35c202a820b31" - integrity sha512-dmH1yW+makpTSURTy8VzdUwFnfQh1G8R+DxO2Ho2FFmBbKFEVm+3jWdvFhE2VqB/LATCTokkP0dotjyQyw5/AQ== +"@jest/create-cache-key-function@^27.4.2", "@jest/create-cache-key-function@^29": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.3.1.tgz#3a0970ea595ab3d9507244edbcef14d6b016cdc9" + integrity sha512-4i+E+E40gK13K78ffD/8cy4lSSqeWwyXeTZoq16tndiCP12hC8uQsPJdIu5C6Kf22fD8UbBk71so7s/6VwpUOQ== dependencies: - "@jest/types" "^27.5.1" - -"@jest/environment@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-28.1.3.tgz#abed43a6b040a4c24fdcb69eab1f97589b2d663e" - integrity sha512-1bf40cMFTEkKyEf585R9Iz1WayDjHoHqvts0XFYEqyKM3cFWDpeMoqKKTAF9LSYQModPUlh8FKptoM2YcMWAXA== - dependencies: - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - jest-mock "^28.1.3" + "@jest/types" "^29.3.1" "@jest/environment@^29.1.2": version "29.1.2" @@ -2123,12 +2113,15 @@ "@types/node" "*" jest-mock "^29.1.2" -"@jest/expect-utils@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-28.1.3.tgz#58561ce5db7cd253a7edddbc051fb39dda50f525" - integrity sha512-wvbi9LUrHJLn3NlDW6wF2hvIMtd4JUl2QNVrjq+IBSHirgfrR3o9RnVtxzdEGO2n9JyIWwHnLfby5KzqBGg2YA== +"@jest/environment@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.3.1.tgz#eb039f726d5fcd14698acd072ac6576d41cfcaa6" + integrity sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag== dependencies: - jest-get-type "^28.0.2" + "@jest/fake-timers" "^29.3.1" + "@jest/types" "^29.3.1" + "@types/node" "*" + jest-mock "^29.3.1" "@jest/expect-utils@^29.1.2": version "29.1.2" @@ -2137,13 +2130,12 @@ dependencies: jest-get-type "^29.0.0" -"@jest/expect@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-28.1.3.tgz#9ac57e1d4491baca550f6bdbd232487177ad6a72" - integrity sha512-lzc8CpUbSoE4dqT0U+g1qODQjBRHPpCPXissXD4mS9+sWQdmmpeJ9zSH1rS1HEkrsMN0fb7nKrJ9giAR1d3wBw== +"@jest/expect-utils@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" + integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== dependencies: - expect "^28.1.3" - jest-snapshot "^28.1.3" + jest-get-type "^29.2.0" "@jest/expect@^29.1.2": version "29.1.2" @@ -2153,17 +2145,13 @@ expect "^29.1.2" jest-snapshot "^29.1.2" -"@jest/fake-timers@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-28.1.3.tgz#230255b3ad0a3d4978f1d06f70685baea91c640e" - integrity sha512-D/wOkL2POHv52h+ok5Oj/1gOG9HSywdoPtFsRCUmlCILXNn5eIWmcnd3DIiWlJnpGvQtmajqBP95Ei0EimxfLw== +"@jest/expect@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.3.1.tgz#456385b62894349c1d196f2d183e3716d4c6a6cd" + integrity sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg== dependencies: - "@jest/types" "^28.1.3" - "@sinonjs/fake-timers" "^9.1.2" - "@types/node" "*" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-util "^28.1.3" + expect "^29.3.1" + jest-snapshot "^29.3.1" "@jest/fake-timers@^29.1.2": version "29.1.2" @@ -2177,14 +2165,17 @@ jest-mock "^29.1.2" jest-util "^29.1.2" -"@jest/globals@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-28.1.3.tgz#a601d78ddc5fdef542728309894895b4a42dc333" - integrity sha512-XFU4P4phyryCXu1pbcqMO0GSQcYe1IsalYCDzRNyhetyeyxMcIxa11qPNDpVNLeretItNqEmYYQn1UYz/5x1NA== +"@jest/fake-timers@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.3.1.tgz#b140625095b60a44de820876d4c14da1aa963f67" + integrity sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A== dependencies: - "@jest/environment" "^28.1.3" - "@jest/expect" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/types" "^29.3.1" + "@sinonjs/fake-timers" "^9.1.2" + "@types/node" "*" + jest-message-util "^29.3.1" + jest-mock "^29.3.1" + jest-util "^29.3.1" "@jest/globals@^29.1.2": version "29.1.2" @@ -2196,47 +2187,26 @@ "@jest/types" "^29.1.2" jest-mock "^29.1.2" -"@jest/reporters@28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-28.1.1.tgz#9389f4bb3cce4d9b586f6195f83c79cd2a1c8662" - integrity sha512-597Zj4D4d88sZrzM4atEGLuO7SdA/YrOv9SRXHXRNC+/FwPCWxZhBAEzhXoiJzfRwn8zes/EjS8Lo6DouGN5Gg== +"@jest/globals@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.3.1.tgz#92be078228e82d629df40c3656d45328f134a0c6" + integrity sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q== dependencies: - "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^28.1.1" - "@jest/test-result" "^28.1.1" - "@jest/transform" "^28.1.1" - "@jest/types" "^28.1.1" - "@jridgewell/trace-mapping" "^0.3.7" - "@types/node" "*" - chalk "^4.0.0" - collect-v8-coverage "^1.0.0" - exit "^0.1.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - istanbul-lib-coverage "^3.0.0" - istanbul-lib-instrument "^5.1.0" - istanbul-lib-report "^3.0.0" - istanbul-lib-source-maps "^4.0.0" - istanbul-reports "^3.1.3" - jest-message-util "^28.1.1" - jest-util "^28.1.1" - jest-worker "^28.1.1" - slash "^3.0.0" - string-length "^4.0.1" - strip-ansi "^6.0.0" - terminal-link "^2.0.0" - v8-to-istanbul "^9.0.0" + "@jest/environment" "^29.3.1" + "@jest/expect" "^29.3.1" + "@jest/types" "^29.3.1" + jest-mock "^29.3.1" -"@jest/reporters@^29.1.2": - version "29.1.2" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.1.2.tgz#5520898ed0a4ecf69d8b671e1dc8465d0acdfa6e" - integrity sha512-X4fiwwyxy9mnfpxL0g9DD0KcTmEIqP0jUdnc2cfa9riHy+I6Gwwp5vOZiwyg0vZxfSDxrOlK9S4+340W4d+DAA== +"@jest/reporters@28.1.1", "@jest/reporters@^29", "@jest/reporters@^29.1.2": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.3.1.tgz#9a6d78c109608e677c25ddb34f907b90e07b4310" + integrity sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.1.2" - "@jest/test-result" "^29.1.2" - "@jest/transform" "^29.1.2" - "@jest/types" "^29.1.2" + "@jest/console" "^29.3.1" + "@jest/test-result" "^29.3.1" + "@jest/transform" "^29.3.1" + "@jest/types" "^29.3.1" "@jridgewell/trace-mapping" "^0.3.15" "@types/node" "*" chalk "^4.0.0" @@ -2249,22 +2219,14 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.1.2" - jest-util "^29.1.2" - jest-worker "^29.1.2" + jest-message-util "^29.3.1" + jest-util "^29.3.1" + jest-worker "^29.3.1" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" - terminal-link "^2.0.0" v8-to-istanbul "^9.0.1" -"@jest/schemas@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-28.1.3.tgz#ad8b86a66f11f33619e3d7e1dcddd7f2d40ff905" - integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== - dependencies: - "@sinclair/typebox" "^0.24.1" - "@jest/schemas@^29.0.0": version "29.0.0" resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.0.0.tgz#5f47f5994dd4ef067fb7b4188ceac45f77fe952a" @@ -2272,15 +2234,6 @@ dependencies: "@sinclair/typebox" "^0.24.1" -"@jest/source-map@^28.1.2": - version "28.1.2" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-28.1.2.tgz#7fe832b172b497d6663cdff6c13b0a920e139e24" - integrity sha512-cV8Lx3BeStJb8ipPHnqVw/IM2VCMWO3crWZzYodSIkxXnRcXJipCdx1JCK0K5MsJJouZQTH73mzf4vgxRaH9ww== - dependencies: - "@jridgewell/trace-mapping" "^0.3.13" - callsites "^3.0.0" - graceful-fs "^4.2.9" - "@jest/source-map@^29.0.0": version "29.0.0" resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.0.0.tgz#f8d1518298089f8ae624e442bbb6eb870ee7783c" @@ -2290,76 +2243,34 @@ callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/test-result@28.1.1": - version "28.1.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.1.tgz#c6f18d1bbb01aa88925dd687872a75f8414b317a" - integrity sha512-hPmkugBktqL6rRzwWAtp1JtYT4VHwv8OQ+9lE5Gymj6dHzubI/oJHMUpPOt8NrdVWSrz9S7bHjJUmv2ggFoUNQ== +"@jest/source-map@^29.2.0": + version "29.2.0" + resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.2.0.tgz#ab3420c46d42508dcc3dc1c6deee0b613c235744" + integrity sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ== dependencies: - "@jest/console" "^28.1.1" - "@jest/types" "^28.1.1" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" - -"@jest/test-result@^28.1.1", "@jest/test-result@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-28.1.3.tgz#5eae945fd9f4b8fcfce74d239e6f725b6bf076c5" - integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== - dependencies: - "@jest/console" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/istanbul-lib-coverage" "^2.0.0" - collect-v8-coverage "^1.0.0" + "@jridgewell/trace-mapping" "^0.3.15" + callsites "^3.0.0" + graceful-fs "^4.2.9" -"@jest/test-result@^29.1.2": - version "29.1.2" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.1.2.tgz#6a8d006eb2b31ce0287d1fc10d12b8ff8504f3c8" - integrity sha512-jjYYjjumCJjH9hHCoMhA8PCl1OxNeGgAoZ7yuGYILRJX9NjgzTN0pCT5qAoYR4jfOP8htIByvAlz9vfNSSBoVg== +"@jest/test-result@28.1.1", "@jest/test-result@^29", "@jest/test-result@^29.1.2", "@jest/test-result@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.3.1.tgz#92cd5099aa94be947560a24610aa76606de78f50" + integrity sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw== dependencies: - "@jest/console" "^29.1.2" - "@jest/types" "^29.1.2" + "@jest/console" "^29.3.1" + "@jest/types" "^29.3.1" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^28.1.1": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-28.1.3.tgz#9d0c283d906ac599c74bde464bc0d7e6a82886c3" - integrity sha512-NIMPEqqa59MWnDi1kvXXpYbqsfQmSJsIbnd85mdVGkiDfQ9WQQTXOLsvISUfonmnBT+w85WEgneCigEEdHDFxw== +"@jest/test-sequencer@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz#fa24b3b050f7a59d48f7ef9e0b782ab65123090d" + integrity sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA== dependencies: - "@jest/test-result" "^28.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - slash "^3.0.0" - -"@jest/test-sequencer@^29.1.2": - version "29.1.2" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.1.2.tgz#10bfd89c08bfdba382eb05cc79c1d23a01238a93" - integrity sha512-fU6dsUqqm8sA+cd85BmeF7Gu9DsXVWFdGn9taxM6xN1cKdcP/ivSgXh5QucFRFz1oZxKv3/9DYYbq0ULly3P/Q== - dependencies: - "@jest/test-result" "^29.1.2" - graceful-fs "^4.2.9" - jest-haste-map "^29.1.2" - slash "^3.0.0" - -"@jest/transform@^28.1.1", "@jest/transform@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-28.1.3.tgz#59d8098e50ab07950e0f2fc0fc7ec462371281b0" - integrity sha512-u5dT5di+oFI6hfcLOHGTAfmUxFRrjK+vnaP0kkVow9Md/M7V/MxqQMOz/VV25UZO8pzeA9PjfTpOu6BDuwSPQA== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^28.1.3" - "@jridgewell/trace-mapping" "^0.3.13" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^1.4.0" - fast-json-stable-stringify "^2.0.0" + "@jest/test-result" "^29.3.1" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-regex-util "^28.0.2" - jest-util "^28.1.3" - micromatch "^4.0.4" - pirates "^4.0.4" + jest-haste-map "^29.3.1" slash "^3.0.0" - write-file-atomic "^4.0.1" "@jest/transform@^29.1.2": version "29.1.2" @@ -2382,33 +2293,43 @@ slash "^3.0.0" write-file-atomic "^4.0.1" -"@jest/types@^27.5.1": - version "27.5.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-27.5.1.tgz#3c79ec4a8ba61c170bf937bcf9e98a9df175ec80" - integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== +"@jest/transform@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.3.1.tgz#1e6bd3da4af50b5c82a539b7b1f3770568d6e36d" + integrity sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug== dependencies: - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^16.0.0" + "@babel/core" "^7.11.6" + "@jest/types" "^29.3.1" + "@jridgewell/trace-mapping" "^0.3.15" + babel-plugin-istanbul "^6.1.1" chalk "^4.0.0" + convert-source-map "^2.0.0" + fast-json-stable-stringify "^2.1.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.3.1" + jest-regex-util "^29.2.0" + jest-util "^29.3.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.1" -"@jest/types@^28.1.1", "@jest/types@^28.1.3": - version "28.1.3" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-28.1.3.tgz#b05de80996ff12512bc5ceb1d208285a7d11748b" - integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== +"@jest/types@^29.1.2": + version "29.1.2" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.1.2.tgz#7442d32b16bcd7592d9614173078b8c334ec730a" + integrity sha512-DcXGtoTykQB5jiwCmVr8H4vdg2OJhQex3qPkG+ISyDO7xQXbt/4R6dowcRyPemRnkH7JoHvZuxPBdlq+9JxFCg== dependencies: - "@jest/schemas" "^28.1.3" + "@jest/schemas" "^29.0.0" "@types/istanbul-lib-coverage" "^2.0.0" "@types/istanbul-reports" "^3.0.0" "@types/node" "*" "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^29.1.2": - version "29.1.2" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.1.2.tgz#7442d32b16bcd7592d9614173078b8c334ec730a" - integrity sha512-DcXGtoTykQB5jiwCmVr8H4vdg2OJhQex3qPkG+ISyDO7xQXbt/4R6dowcRyPemRnkH7JoHvZuxPBdlq+9JxFCg== +"@jest/types@^29.3.1": + version "29.3.1" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" + integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== dependencies: "@jest/schemas" "^29.0.0" "@types/istanbul-lib-coverage" "^2.0.0" @@ -2426,7 +2347,7 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": +"@jridgewell/resolve-uri@^3.0.3": version "3.1.0" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== @@ -2444,7 +2365,7 @@ "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@^1.4.10": version "1.4.14" resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== @@ -2457,14 +2378,6 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.13": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== - dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" - "@jsdevtools/ono@^7.1.3": version "7.1.3" resolved "https://registry.yarnpkg.com/@jsdevtools/ono/-/ono-7.1.3.tgz#9df03bbd7c696a5c58885c34aa06da41c8543796" @@ -3936,19 +3849,10 @@ "@svgr/plugin-jsx" "^6.2.1" "@svgr/plugin-svgo" "^6.2.0" -"@swc/core-android-arm-eabi@1.3.4": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@swc/core-android-arm-eabi/-/core-android-arm-eabi-1.3.4.tgz#ce1a32c0107f599aebd55923473e0f7217918686" - integrity sha512-aq+CAebSQMtdrIR4+v/JBfykK/daD+so2gPHm4wgLaTR+xwziQAsBBI5iq5sinhIg4FGnmljtO75QolcNLmpvw== - dependencies: - "@swc/wasm" "1.2.122" - -"@swc/core-android-arm64@1.3.4": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@swc/core-android-arm64/-/core-android-arm64-1.3.4.tgz#998697ef810e10848e4cc64834f37ee60dd738c0" - integrity sha512-E5z6ribiEzDqrq5Kv5xOLdWcTzHWlzGuqDSxTQNz9GCC94qSVzXp5Df+egVEKE/4t7u2P6nO46BUKweYMb9TJg== - dependencies: - "@swc/wasm" "1.2.130" +"@swc/core-android-arm-eabi@1.3.4", "@swc/core-android-arm-eabi@npm:dummypkg-a@1.0.0", "@swc/core-android-arm64@1.3.4", "@swc/core-android-arm64@npm:dummypkg-a@1.0.0", "@swc/core-freebsd-x64@1.3.4", "@swc/core-freebsd-x64@npm:dummypkg-a@1.0.0", "@swc/core-linux-arm-gnueabihf@1.3.4", "@swc/core-linux-arm-gnueabihf@npm:dummypkg-a@1.0.0", "@swc/core-linux-arm64-gnu@1.3.4", "@swc/core-linux-arm64-gnu@npm:dummypkg-a@1.0.0", "@swc/core-linux-arm64-musl@1.3.4", "@swc/core-linux-arm64-musl@npm:dummypkg-a@1.0.0", "@swc/core-win32-arm64-msvc@1.3.4", "@swc/core-win32-arm64-msvc@npm:dummypkg-a@1.0.0", "@swc/core-win32-ia32-msvc@1.3.4", "@swc/core-win32-ia32-msvc@npm:dummypkg-a@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/dummypkg-a/-/dummypkg-a-1.0.0.tgz#02868251461af84d70603446ef5908b72c5c8435" + integrity sha512-V9qLfUzVlmSW/ayzlchss1XjAqWXqHmJtzGwnfg/jsnloIUyLKR5a0Djfdgj/Jv3yoNAljIUaelTVjptxtTyGA== "@swc/core-darwin-arm64@1.3.4": version "1.3.4" @@ -3960,30 +3864,6 @@ resolved "https://registry.yarnpkg.com/@swc/core-darwin-x64/-/core-darwin-x64-1.3.4.tgz#4742a7f83de9f6ba50801e9f6500b538856853ea" integrity sha512-A6KMZsUJ3j5TVxAizbv+UEjCNvMgWBm9jw4R3biaw8kbgu3XUWHdkiheXO+c2kjjjgwr1jhkHcLgRjffwpLYFA== -"@swc/core-freebsd-x64@1.3.4": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@swc/core-freebsd-x64/-/core-freebsd-x64-1.3.4.tgz#b007e547470c709ec66c0187e01478736c7e3c4a" - integrity sha512-C5FCXHebcHwPJtEhgRShumXvcdPO5Cqiwd7GDNBav1IZribs3+ZqrTkCaz2hY7gb5NvyFIxkJ5HhpS4Pxafhuw== - dependencies: - "@swc/wasm" "1.2.130" - -"@swc/core-linux-arm-gnueabihf@1.3.4": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.4.tgz#f1224392d6a67e6e16865f762af1c18d0123f2ff" - integrity sha512-vawHUhUcS//xNvGzL0zZ3vZ1YnsjgyvWQXB5PF4bhM5Y0/rmcrEdpkSId1qTfaMpcL7l2QSy9/DM7ucjlSpK6w== - dependencies: - "@swc/wasm" "1.2.130" - -"@swc/core-linux-arm64-gnu@1.3.4": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.4.tgz#fa4326d7c42d5e5c34461cf0ae3b6c5e97aea3c1" - integrity sha512-p60RoYaDS8zrqp/cGkcJryk9HobJvrL+Ox/iz8ivDrV4IS0LXvqW5/5YTSzLo93/+blvG/M0hdaokoMhWhDnwA== - -"@swc/core-linux-arm64-musl@1.3.4": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.4.tgz#0b03ddf3d2e562dfea6faa6917cd87496a910925" - integrity sha512-F9hW6g5l4YesJJH/JMznaLGdLeCV4FKq5MN5DaZfuB8qrCZGLmAasGgvSNbXh1oZnDu1PD2ZxMYivkf2n8/4OA== - "@swc/core-linux-x64-gnu@1.3.4": version "1.3.4" resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.4.tgz#1cc63f9a86074cac7454796ccbe3836ac7f6451b" @@ -3994,20 +3874,6 @@ resolved "https://registry.yarnpkg.com/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.4.tgz#f65abb7e149ad3f20ca98c933331aa98c190cd9f" integrity sha512-stVnU7KXQxSbh67UiIVxZsgjkRSXApPTEU3CYnwsdH7G+ynfO1WocSatzjIKpJfhcY2Nss8/33yDaOKZXVhbIA== -"@swc/core-win32-arm64-msvc@1.3.4": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.4.tgz#4bfca2e1c73bf8c6109ed734eb15eca6406b1ebd" - integrity sha512-qc3UIdAQfLTA1mJsFkX3ISqJDU02qtcjUbnLI8sl6oedCAOFF66TcecJvwl4iO+BTO04+KoZc5rJovSTOb3eQA== - dependencies: - "@swc/wasm" "1.2.130" - -"@swc/core-win32-ia32-msvc@1.3.4": - version "1.3.4" - resolved "https://registry.yarnpkg.com/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.4.tgz#df9c06ad65e80b19d26710a0d5951f29848a76ae" - integrity sha512-FxuDGn60VrnYBcpH0CeR9+pCnPUaVvZ20CO6o/oNYHSfIhqPc76o3zFYYEFswYodExjCCYwsuPYgi+stvKZroA== - dependencies: - "@swc/wasm" "1.2.130" - "@swc/core-win32-x64-msvc@1.3.4": version "1.3.4" resolved "https://registry.yarnpkg.com/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.4.tgz#7bf6cd6f5c3197d7d807b273d12dd666e23b238e" @@ -4040,16 +3906,6 @@ "@jest/create-cache-key-function" "^27.4.2" jsonc-parser "^3.2.0" -"@swc/wasm@1.2.122": - version "1.2.122" - resolved "https://registry.yarnpkg.com/@swc/wasm/-/wasm-1.2.122.tgz#87a5e654b26a71b2e84b801f41e45f823b856639" - integrity sha512-sM1VCWQxmNhFtdxME+8UXNyPNhxNu7zdb6ikWpz0YKAQQFRGT5ThZgJrubEpah335SUToNg8pkdDF7ibVCjxbQ== - -"@swc/wasm@1.2.130": - version "1.2.130" - resolved "https://registry.yarnpkg.com/@swc/wasm/-/wasm-1.2.130.tgz#88ac26433335d1f957162a9a92f1450b73c176a0" - integrity sha512-rNcJsBxS70+pv8YUWwf5fRlWX6JoY/HJc25HD/F8m6Kv7XhJdqPPMhyX6TKkUBPAG7TWlZYoxa+rHAjPy4Cj3Q== - "@szmarczak/http-timer@^1.1.2": version "1.1.2" resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" @@ -4367,21 +4223,11 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@^18.11.9": +"@types/node@*", "@types/node@12.20.24", "@types/node@^17.0.5", "@types/node@^18.11.9": version "18.11.9" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.9.tgz#02d013de7058cea16d36168ef2fc653464cfbad4" integrity sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg== -"@types/node@12.20.24": - version "12.20.24" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.24.tgz#c37ac69cb2948afb4cef95f424fa0037971a9a5c" - integrity sha512-yxDeaQIAJlMav7fH5AQqPH1u8YIuhYJXYBzxaQ4PifsU0GDO38MSdmEDeRlIxrKbC6NbEaaEHDanWb+y30U8SQ== - -"@types/node@^17.0.5": - version "17.0.45" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" - integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== - "@types/normalize-package-data@^2.4.0": version "2.4.1" resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" @@ -4555,13 +4401,6 @@ resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-20.2.1.tgz#3b9ce2489919d9e4fea439b76916abc34b2df129" integrity sha512-7tFImggNeNBVMsn0vLrpn1H1uPrUBdnARPTpZoitY37ZrdJREzf7I16tMrlK3hen349gr1NYh8CmZQa7CTG6Aw== -"@types/yargs@^16.0.0": - version "16.0.5" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.5.tgz#12cc86393985735a283e387936398c2f9e5f88e3" - integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== - dependencies: - "@types/yargs-parser" "*" - "@types/yargs@^17.0.8": version "17.0.10" resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.10.tgz#591522fce85d8739bca7b8bb90d048e4478d186a" @@ -5130,28 +4969,15 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -babel-jest@^28.1.1: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-28.1.3.tgz#c1187258197c099072156a0a121c11ee1e3917d5" - integrity sha512-epUaPOEWMk3cWX0M/sPvCHHCe9fMFAa/9hXEgKP8nFfNl/jlGkE9ucq9NqkZGXLDduCJYS0UvSlPUwC0S+rH6Q== +babel-jest@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.3.1.tgz#05c83e0d128cd48c453eea851482a38782249f44" + integrity sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA== dependencies: - "@jest/transform" "^28.1.3" + "@jest/transform" "^29.3.1" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^28.1.3" - chalk "^4.0.0" - graceful-fs "^4.2.9" - slash "^3.0.0" - -babel-jest@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.1.2.tgz#540d3241925c55240fb0c742e3ffc5f33a501978" - integrity sha512-IuG+F3HTHryJb7gacC7SQ59A9kO56BctUsT67uJHp1mMCHUOMXpDwOHWGifWqdWVknN2WNkCVQELPjXx0aLJ9Q== - dependencies: - "@jest/transform" "^29.1.2" - "@types/babel__core" "^7.1.14" - babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.0.2" + babel-preset-jest "^29.2.0" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -5199,20 +5025,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-28.1.3.tgz#1952c4d0ea50f2d6d794353762278d1d8cca3fbe" - integrity sha512-Ys3tUKAmfnkRUpPdpa98eYrAR0nV+sSFUZZEGuQ2EbFd1y4SOLtD5QDNHAq+bb9a+bbXvYQC4b+ID/THIMcU6Q== - dependencies: - "@babel/template" "^7.3.3" - "@babel/types" "^7.3.3" - "@types/babel__core" "^7.1.14" - "@types/babel__traverse" "^7.0.6" - -babel-plugin-jest-hoist@^29.0.2: - version "29.0.2" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.0.2.tgz#ae61483a829a021b146c016c6ad39b8bcc37c2c8" - integrity sha512-eBr2ynAEFjcebVvu8Ktx580BD1QKCrBG1XwEUTXJe285p9HA/4hOhfWCFRQhTKSyBV0VzjhG7H91Eifz9s29hg== +babel-plugin-jest-hoist@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz#23ee99c37390a98cfddf3ef4a78674180d823094" + integrity sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -5276,20 +5092,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-28.1.3.tgz#5dfc20b99abed5db994406c2b9ab94c73aaa419d" - integrity sha512-L+fupJvlWAHbQfn74coNX3zf60LXMJsezNvvx8eIh7iOR1luJ1poxYgQk1F8PYtNq/6QODDHCqsSnTFSWC491A== +babel-preset-jest@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz#3048bea3a1af222e3505e4a767a974c95a7620dc" + integrity sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA== dependencies: - babel-plugin-jest-hoist "^28.1.3" - babel-preset-current-node-syntax "^1.0.0" - -babel-preset-jest@^29.0.2: - version "29.0.2" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.0.2.tgz#e14a7124e22b161551818d89e5bdcfb3b2b0eac7" - integrity sha512-BeVXp7rH5TK96ofyEnHjznjLMQ2nAeDJ+QzxKnHAAMs0RgrQsCywjAN8m4mOm5Di0pxU//3AoEeJJrerMH5UeA== - dependencies: - babel-plugin-jest-hoist "^29.0.2" + babel-plugin-jest-hoist "^29.2.0" babel-preset-current-node-syntax "^1.0.0" bail@^1.0.0: @@ -6193,6 +6001,11 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -6773,16 +6586,16 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -diff-sequences@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-28.1.1.tgz#9989dc731266dc2903457a70e996f3a041913ac6" - integrity sha512-FU0iFaH/E23a+a718l8Qa/19bF9p06kgE0KipMOMadwa3SjnaElKzPaUC0vnibs6/B/9ni97s61mcejk8W1fQw== - diff-sequences@^29.0.0: version "29.0.0" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.0.0.tgz#bae49972ef3933556bcb0800b72e8579d19d9e4f" integrity sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA== +diff-sequences@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" + integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== + diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" @@ -6956,6 +6769,11 @@ emittery@^0.10.2: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -7482,17 +7300,6 @@ exit@^0.1.2: resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" integrity sha1-BjJjj42HfMghB9MKD/8aF8uhzQw= -expect@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" - integrity sha512-eEh0xn8HlsuOBxFgIss+2mX85VAS4Qy3OSkjV7rlBWljtA4oWH37glVGyOZSZvErDT/yBywZdPGwCXuTvSG85g== - dependencies: - "@jest/expect-utils" "^28.1.3" - jest-get-type "^28.0.2" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" - expect@^29.0.0, expect@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/expect/-/expect-29.1.2.tgz#82f8f28d7d408c7c68da3a386a490ee683e1eced" @@ -7504,6 +7311,17 @@ expect@^29.0.0, expect@^29.1.2: jest-message-util "^29.1.2" jest-util "^29.1.2" +expect@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" + integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== + dependencies: + "@jest/expect-utils" "^29.3.1" + jest-get-type "^29.2.0" + jest-matcher-utils "^29.3.1" + jest-message-util "^29.3.1" + jest-util "^29.3.1" + express@^4.17.3: version "4.18.1" resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" @@ -9239,53 +9057,28 @@ jest-changed-files@^29.0.0: execa "^5.0.0" p-limit "^3.1.0" -jest-circus@^28.1.1: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-28.1.3.tgz#d14bd11cf8ee1a03d69902dc47b6bd4634ee00e4" - integrity sha512-cZ+eS5zc79MBwt+IhQhiEp0OeBddpc1n8MBo1nMB8A7oPMKEO+Sre+wHaLJexQUj9Ya/8NOBY0RESUgYjB6fow== +jest-circus@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.3.1.tgz#177d07c5c0beae8ef2937a67de68f1e17bbf1b4a" + integrity sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg== dependencies: - "@jest/environment" "^28.1.3" - "@jest/expect" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/environment" "^29.3.1" + "@jest/expect" "^29.3.1" + "@jest/test-result" "^29.3.1" + "@jest/types" "^29.3.1" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-runtime "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" + jest-each "^29.3.1" + jest-matcher-utils "^29.3.1" + jest-message-util "^29.3.1" + jest-runtime "^29.3.1" + jest-snapshot "^29.3.1" + jest-util "^29.3.1" p-limit "^3.1.0" - pretty-format "^28.1.3" - slash "^3.0.0" - stack-utils "^2.0.3" - -jest-circus@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.1.2.tgz#4551068e432f169a53167fe1aef420cf51c8a735" - integrity sha512-ajQOdxY6mT9GtnfJRZBRYS7toNIJayiiyjDyoZcnvPRUPwJ58JX0ci0PKAKUo2C1RyzlHw0jabjLGKksO42JGA== - dependencies: - "@jest/environment" "^29.1.2" - "@jest/expect" "^29.1.2" - "@jest/test-result" "^29.1.2" - "@jest/types" "^29.1.2" - "@types/node" "*" - chalk "^4.0.0" - co "^4.6.0" - dedent "^0.7.0" - is-generator-fn "^2.0.0" - jest-each "^29.1.2" - jest-matcher-utils "^29.1.2" - jest-message-util "^29.1.2" - jest-runtime "^29.1.2" - jest-snapshot "^29.1.2" - jest-util "^29.1.2" - p-limit "^3.1.0" - pretty-format "^29.1.2" + pretty-format "^29.3.1" slash "^3.0.0" stack-utils "^2.0.3" @@ -9307,88 +9100,43 @@ jest-cli@^29.1.2: prompts "^2.0.1" yargs "^17.3.1" -jest-config@28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-28.1.1.tgz#e90b97b984f14a6c24a221859e81b258990fce2f" - integrity sha512-tASynMhS+jVV85zKvjfbJ8nUyJS/jUSYZ5KQxLUN2ZCvcQc/OmhQl2j6VEL3ezQkNofxn5pQ3SPYWPHb0unTZA== +jest-config@28.1.1, jest-config@^29, jest-config@^29.1.2: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.3.1.tgz#0bc3dcb0959ff8662957f1259947aedaefb7f3c6" + integrity sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^28.1.1" - "@jest/types" "^28.1.1" - babel-jest "^28.1.1" + "@jest/test-sequencer" "^29.3.1" + "@jest/types" "^29.3.1" + babel-jest "^29.3.1" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^28.1.1" - jest-environment-node "^28.1.1" - jest-get-type "^28.0.2" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.1" - jest-runner "^28.1.1" - jest-util "^28.1.1" - jest-validate "^28.1.1" + jest-circus "^29.3.1" + jest-environment-node "^29.3.1" + jest-get-type "^29.2.0" + jest-regex-util "^29.2.0" + jest-resolve "^29.3.1" + jest-runner "^29.3.1" + jest-util "^29.3.1" + jest-validate "^29.3.1" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^28.1.1" + pretty-format "^29.3.1" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-config@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.1.2.tgz#7d004345ca4c09f5d8f802355f54494e90842f4d" - integrity sha512-EC3Zi86HJUOz+2YWQcJYQXlf0zuBhJoeyxLM6vb6qJsVmpP7KcCP1JnyF0iaqTaXdBP8Rlwsvs7hnKWQWWLwwA== +jest-diff@*, jest-diff@^29, jest-diff@^29.0.3, jest-diff@^29.1.2, jest-diff@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" + integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== dependencies: - "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.1.2" - "@jest/types" "^29.1.2" - babel-jest "^29.1.2" chalk "^4.0.0" - ci-info "^3.2.0" - deepmerge "^4.2.2" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-circus "^29.1.2" - jest-environment-node "^29.1.2" - jest-get-type "^29.0.0" - jest-regex-util "^29.0.0" - jest-resolve "^29.1.2" - jest-runner "^29.1.2" - jest-util "^29.1.2" - jest-validate "^29.1.2" - micromatch "^4.0.4" - parse-json "^5.2.0" - pretty-format "^29.1.2" - slash "^3.0.0" - strip-json-comments "^3.1.1" - -jest-diff@*, jest-diff@^29.0.3, jest-diff@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.1.2.tgz#bb7aaf5353227d6f4f96c5e7e8713ce576a607dc" - integrity sha512-4GQts0aUopVvecIT4IwD/7xsBaMhKTYoM4/njE/aVw9wpw+pIUVp8Vab/KnSzSilr84GnLBkaP3JLDnQYCKqVQ== - dependencies: - chalk "^4.0.0" - diff-sequences "^29.0.0" - jest-get-type "^29.0.0" - pretty-format "^29.1.2" - -jest-diff@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-28.1.3.tgz#948a192d86f4e7a64c5264ad4da4877133d8792f" - integrity sha512-8RqP1B/OXzjjTWkqMX67iqgwBVJRgCyKD3L9nq+6ZqJMdvjE8RgHktqZ6jNrkdMT+dJuYNI3rhQpxaz7drJHfw== - dependencies: - chalk "^4.0.0" - diff-sequences "^28.1.1" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" - -jest-docblock@^28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-28.1.1.tgz#6f515c3bf841516d82ecd57a62eed9204c2f42a8" - integrity sha512-3wayBVNiOYx0cwAbl9rwm5kKFP8yHH3d/fkEaL02NPTkDojPtheGB7HZSFY4wzX+DxyrvhXz0KSCVksmCknCuA== - dependencies: - detect-newline "^3.0.0" + diff-sequences "^29.3.1" + jest-get-type "^29.2.0" + pretty-format "^29.3.1" jest-docblock@^29.0.0: version "29.0.0" @@ -9397,39 +9145,23 @@ jest-docblock@^29.0.0: dependencies: detect-newline "^3.0.0" -jest-each@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-28.1.3.tgz#bdd1516edbe2b1f3569cfdad9acd543040028f81" - integrity sha512-arT1z4sg2yABU5uogObVPvSlSMQlDA48owx07BDPAiasW0yYpYHYOo4HHLz9q0BVzDVU4hILFjzJw0So9aCL/g== +jest-docblock@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.2.0.tgz#307203e20b637d97cee04809efc1d43afc641e82" + integrity sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A== dependencies: - "@jest/types" "^28.1.3" - chalk "^4.0.0" - jest-get-type "^28.0.2" - jest-util "^28.1.3" - pretty-format "^28.1.3" + detect-newline "^3.0.0" -jest-each@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.1.2.tgz#d4c8532c07a846e79f194f7007ce7cb1987d1cd0" - integrity sha512-AmTQp9b2etNeEwMyr4jc0Ql/LIX/dhbgP21gHAizya2X6rUspHn2gysMXaj6iwWuOJ2sYRgP8c1P4cXswgvS1A== +jest-each@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.3.1.tgz#bc375c8734f1bb96625d83d1ca03ef508379e132" + integrity sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA== dependencies: - "@jest/types" "^29.1.2" + "@jest/types" "^29.3.1" chalk "^4.0.0" - jest-get-type "^29.0.0" - jest-util "^29.1.2" - pretty-format "^29.1.2" - -jest-environment-node@^28.1.1, jest-environment-node@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-28.1.3.tgz#7e74fe40eb645b9d56c0c4b70ca4357faa349be5" - integrity sha512-ugP6XOhEpjAEhGYvp5Xj989ns5cB1K6ZdjBYuS30umT4CQEETaxSiPcZ/E1kFktX4GkrcM4qu07IIlDYX1gp+A== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - jest-mock "^28.1.3" - jest-util "^28.1.3" + jest-get-type "^29.2.0" + jest-util "^29.3.1" + pretty-format "^29.3.1" jest-environment-node@^29.1.2: version "29.1.2" @@ -9443,34 +9175,22 @@ jest-environment-node@^29.1.2: jest-mock "^29.1.2" jest-util "^29.1.2" -jest-get-type@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-28.0.2.tgz#34622e628e4fdcd793d46db8a242227901fcf203" - integrity sha512-ioj2w9/DxSYHfOm5lJKCdcAmPJzQXmbM/Url3rhlghrPvT3tt+7a/+oXc9azkKmLvoiXjtV83bEWqi+vs5nlPA== - -jest-get-type@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.0.0.tgz#843f6c50a1b778f7325df1129a0fd7aa713aef80" - integrity sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw== - -jest-haste-map@^28.1.1, jest-haste-map@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-28.1.3.tgz#abd5451129a38d9841049644f34b034308944e2b" - integrity sha512-3S+RQWDXccXDKSWnkHa/dPwt+2qwA8CJzR61w3FoYCvoo3Pn8tvGcysmMF0Bj0EX5RYvAI2EIvC57OmotfdtKA== +jest-environment-node@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.3.1.tgz#5023b32472b3fba91db5c799a0d5624ad4803e74" + integrity sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag== dependencies: - "@jest/types" "^28.1.3" - "@types/graceful-fs" "^4.1.3" + "@jest/environment" "^29.3.1" + "@jest/fake-timers" "^29.3.1" + "@jest/types" "^29.3.1" "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^28.0.2" - jest-util "^28.1.3" - jest-worker "^28.1.3" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" + jest-mock "^29.3.1" + jest-util "^29.3.1" + +jest-get-type@^29, jest-get-type@^29.0.0, jest-get-type@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" + integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== jest-haste-map@^29.1.2: version "29.1.2" @@ -9491,13 +9211,24 @@ jest-haste-map@^29.1.2: optionalDependencies: fsevents "^2.3.2" -jest-leak-detector@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" - integrity sha512-WFVJhnQsiKtDEo5lG2mM0v40QWnBM+zMdHHyJs8AWZ7J0QZJS59MsyKeJHWhpBZBH32S48FOVvGyOFT1h0DlqA== +jest-haste-map@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.3.1.tgz#af83b4347f1dae5ee8c2fb57368dc0bb3e5af843" + integrity sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A== dependencies: - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + "@jest/types" "^29.3.1" + "@types/graceful-fs" "^4.1.3" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^29.2.0" + jest-util "^29.3.1" + jest-worker "^29.3.1" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" jest-leak-detector@^29.1.2: version "29.1.2" @@ -9507,64 +9238,54 @@ jest-leak-detector@^29.1.2: jest-get-type "^29.0.0" pretty-format "^29.1.2" -jest-matcher-utils@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-28.1.3.tgz#5a77f1c129dd5ba3b4d7fc20728806c78893146e" - integrity sha512-kQeJ7qHemKfbzKoGjHHrRKH6atgxMk8Enkk2iPQ3XwO6oE/KYD8lMYOziCkeSB9G4adPM4nR1DE8Tf5JeWH6Bw== +jest-leak-detector@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz#95336d020170671db0ee166b75cd8ef647265518" + integrity sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA== dependencies: - chalk "^4.0.0" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - pretty-format "^28.1.3" + jest-get-type "^29.2.0" + pretty-format "^29.3.1" -jest-matcher-utils@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.1.2.tgz#e68c4bcc0266e70aa1a5c13fb7b8cd4695e318a1" - integrity sha512-MV5XrD3qYSW2zZSHRRceFzqJ39B2z11Qv0KPyZYxnzDHFeYZGJlgGi0SW+IXSJfOewgJp/Km/7lpcFT+cgZypw== +jest-matcher-utils@^29, jest-matcher-utils@^29.1.2, jest-matcher-utils@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" + integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== dependencies: chalk "^4.0.0" - jest-diff "^29.1.2" - jest-get-type "^29.0.0" - pretty-format "^29.1.2" + jest-diff "^29.3.1" + jest-get-type "^29.2.0" + pretty-format "^29.3.1" -jest-message-util@^28.1.1, jest-message-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-28.1.3.tgz#232def7f2e333f1eecc90649b5b94b0055e7c43d" - integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== +jest-message-util@^29.1.2: + version "29.1.2" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.1.2.tgz#c21a33c25f9dc1ebfcd0f921d89438847a09a501" + integrity sha512-9oJ2Os+Qh6IlxLpmvshVbGUiSkZVc2FK+uGOm6tghafnB2RyjKAxMZhtxThRMxfX1J1SOMhTn9oK3/MutRWQJQ== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^28.1.3" + "@jest/types" "^29.1.2" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^28.1.3" + pretty-format "^29.1.2" slash "^3.0.0" stack-utils "^2.0.3" -jest-message-util@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.1.2.tgz#c21a33c25f9dc1ebfcd0f921d89438847a09a501" - integrity sha512-9oJ2Os+Qh6IlxLpmvshVbGUiSkZVc2FK+uGOm6tghafnB2RyjKAxMZhtxThRMxfX1J1SOMhTn9oK3/MutRWQJQ== +jest-message-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" + integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== dependencies: "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.1.2" + "@jest/types" "^29.3.1" "@types/stack-utils" "^2.0.0" chalk "^4.0.0" graceful-fs "^4.2.9" micromatch "^4.0.4" - pretty-format "^29.1.2" + pretty-format "^29.3.1" slash "^3.0.0" stack-utils "^2.0.3" -jest-mock@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-28.1.3.tgz#d4e9b1fc838bea595c77ab73672ebf513ab249da" - integrity sha512-o3J2jr6dMMWYVH4Lh/NKmDXdosrsJgi4AviS8oXLujcjpCMBb1FMsblDnOXKZKfSiHLxYub1eS0IHuRXsio9eA== - dependencies: - "@jest/types" "^28.1.3" - "@types/node" "*" - jest-mock@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.1.2.tgz#de47807edbb9d4abf8423f1d8d308d670105678c" @@ -9574,21 +9295,30 @@ jest-mock@^29.1.2: "@types/node" "*" jest-util "^29.1.2" +jest-mock@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.3.1.tgz#60287d92e5010979d01f218c6b215b688e0f313e" + integrity sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA== + dependencies: + "@jest/types" "^29.3.1" + "@types/node" "*" + jest-util "^29.3.1" + jest-pnp-resolver@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" integrity sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w== -jest-regex-util@^28.0.2: - version "28.0.2" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-28.0.2.tgz#afdc377a3b25fb6e80825adcf76c854e5bf47ead" - integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== - jest-regex-util@^29.0.0: version "29.0.0" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.0.0.tgz#b442987f688289df8eb6c16fa8df488b4cd007de" integrity sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug== +jest-regex-util@^29.2.0: + version "29.2.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz#82ef3b587e8c303357728d0322d48bbfd2971f7b" + integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== + jest-resolve-dependencies@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.1.2.tgz#a6919e58a0c7465582cb8ec2d745b4e64ae8647f" @@ -9597,78 +9327,21 @@ jest-resolve-dependencies@^29.1.2: jest-regex-util "^29.0.0" jest-snapshot "^29.1.2" -jest-resolve@28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.1.tgz#bc2eaf384abdcc1aaf3ba7c50d1adf01e59095e5" - integrity sha512-/d1UbyUkf9nvsgdBildLe6LAD4DalgkgZcKd0nZ8XUGPyA/7fsnaQIlKVnDiuUXv/IeZhPEDrRJubVSulxrShA== +jest-resolve@28.1.1, jest-resolve@^29, jest-resolve@^29.1.2, jest-resolve@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.3.1.tgz#9a4b6b65387a3141e4a40815535c7f196f1a68a7" + integrity sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^28.1.1" + jest-haste-map "^29.3.1" jest-pnp-resolver "^1.2.2" - jest-util "^28.1.1" - jest-validate "^28.1.1" + jest-util "^29.3.1" + jest-validate "^29.3.1" resolve "^1.20.0" resolve.exports "^1.1.0" slash "^3.0.0" -jest-resolve@^28.1.1, jest-resolve@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-28.1.3.tgz#cfb36100341ddbb061ec781426b3c31eb51aa0a8" - integrity sha512-Z1W3tTjE6QaNI90qo/BJpfnvpxtaFTFw5CDgwpyE/Kz8U/06N1Hjf4ia9quUhCh39qIGWF1ZuxFiBiJQwSEYKQ== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-pnp-resolver "^1.2.2" - jest-util "^28.1.3" - jest-validate "^28.1.3" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-resolve@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.1.2.tgz#9dd8c2fc83e59ee7d676b14bd45a5f89e877741d" - integrity sha512-7fcOr+k7UYSVRJYhSmJHIid3AnDBcLQX3VmT9OSbPWsWz1MfT7bcoerMhADKGvKCoMpOHUQaDHtQoNp/P9JMGg== - dependencies: - chalk "^4.0.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.1.2" - jest-pnp-resolver "^1.2.2" - jest-util "^29.1.2" - jest-validate "^29.1.2" - resolve "^1.20.0" - resolve.exports "^1.1.0" - slash "^3.0.0" - -jest-runner@^28.1.1: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-28.1.3.tgz#5eee25febd730b4713a2cdfd76bdd5557840f9a1" - integrity sha512-GkMw4D/0USd62OVO0oEgjn23TM+YJa2U2Wu5zz9xsQB1MxWKDOlrnykPxnMsN0tnJllfLPinHTka61u0QhaxBA== - dependencies: - "@jest/console" "^28.1.3" - "@jest/environment" "^28.1.3" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.10.2" - graceful-fs "^4.2.9" - jest-docblock "^28.1.1" - jest-environment-node "^28.1.3" - jest-haste-map "^28.1.3" - jest-leak-detector "^28.1.3" - jest-message-util "^28.1.3" - jest-resolve "^28.1.3" - jest-runtime "^28.1.3" - jest-util "^28.1.3" - jest-watcher "^28.1.3" - jest-worker "^28.1.3" - p-limit "^3.1.0" - source-map-support "0.5.13" - jest-runner@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.1.2.tgz#f18b2b86101341e047de8c2f51a5fdc4e97d053a" @@ -9696,33 +9369,32 @@ jest-runner@^29.1.2: p-limit "^3.1.0" source-map-support "0.5.13" -jest-runtime@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-28.1.3.tgz#a57643458235aa53e8ec7821949e728960d0605f" - integrity sha512-NU+881ScBQQLc1JHG5eJGU7Ui3kLKrmwCPPtYsJtBykixrM2OhVQlpMmFWJjMyDfdkGgBMNjXCGB/ebzsgNGQw== - dependencies: - "@jest/environment" "^28.1.3" - "@jest/fake-timers" "^28.1.3" - "@jest/globals" "^28.1.3" - "@jest/source-map" "^28.1.2" - "@jest/test-result" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" +jest-runner@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.3.1.tgz#a92a879a47dd096fea46bb1517b0a99418ee9e2d" + integrity sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA== + dependencies: + "@jest/console" "^29.3.1" + "@jest/environment" "^29.3.1" + "@jest/test-result" "^29.3.1" + "@jest/transform" "^29.3.1" + "@jest/types" "^29.3.1" + "@types/node" "*" chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - execa "^5.0.0" - glob "^7.1.3" + emittery "^0.13.1" graceful-fs "^4.2.9" - jest-haste-map "^28.1.3" - jest-message-util "^28.1.3" - jest-mock "^28.1.3" - jest-regex-util "^28.0.2" - jest-resolve "^28.1.3" - jest-snapshot "^28.1.3" - jest-util "^28.1.3" - slash "^3.0.0" - strip-bom "^4.0.0" + jest-docblock "^29.2.0" + jest-environment-node "^29.3.1" + jest-haste-map "^29.3.1" + jest-leak-detector "^29.3.1" + jest-message-util "^29.3.1" + jest-resolve "^29.3.1" + jest-runtime "^29.3.1" + jest-util "^29.3.1" + jest-watcher "^29.3.1" + jest-worker "^29.3.1" + p-limit "^3.1.0" + source-map-support "0.5.13" jest-runtime@^29.1.2: version "29.1.2" @@ -9752,63 +9424,62 @@ jest-runtime@^29.1.2: slash "^3.0.0" strip-bom "^4.0.0" -jest-snapshot@*, jest-snapshot@^29.0.0, jest-snapshot@^29.0.3, jest-snapshot@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.1.2.tgz#7dd277e88c45f2d2ff5888de1612e63c7ceb575b" - integrity sha512-rYFomGpVMdBlfwTYxkUp3sjD6usptvZcONFYNqVlaz4EpHPnDvlWjvmOQ9OCSNKqYZqLM2aS3wq01tWujLg7gg== - dependencies: - "@babel/core" "^7.11.6" - "@babel/generator" "^7.7.2" - "@babel/plugin-syntax-jsx" "^7.7.2" - "@babel/plugin-syntax-typescript" "^7.7.2" - "@babel/traverse" "^7.7.2" - "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.1.2" - "@jest/transform" "^29.1.2" - "@jest/types" "^29.1.2" - "@types/babel__traverse" "^7.0.6" - "@types/prettier" "^2.1.5" - babel-preset-current-node-syntax "^1.0.0" +jest-runtime@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.3.1.tgz#21efccb1a66911d6d8591276a6182f520b86737a" + integrity sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A== + dependencies: + "@jest/environment" "^29.3.1" + "@jest/fake-timers" "^29.3.1" + "@jest/globals" "^29.3.1" + "@jest/source-map" "^29.2.0" + "@jest/test-result" "^29.3.1" + "@jest/transform" "^29.3.1" + "@jest/types" "^29.3.1" + "@types/node" "*" chalk "^4.0.0" - expect "^29.1.2" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + glob "^7.1.3" graceful-fs "^4.2.9" - jest-diff "^29.1.2" - jest-get-type "^29.0.0" - jest-haste-map "^29.1.2" - jest-matcher-utils "^29.1.2" - jest-message-util "^29.1.2" - jest-util "^29.1.2" - natural-compare "^1.4.0" - pretty-format "^29.1.2" - semver "^7.3.5" + jest-haste-map "^29.3.1" + jest-message-util "^29.3.1" + jest-mock "^29.3.1" + jest-regex-util "^29.2.0" + jest-resolve "^29.3.1" + jest-snapshot "^29.3.1" + jest-util "^29.3.1" + slash "^3.0.0" + strip-bom "^4.0.0" -jest-snapshot@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-28.1.3.tgz#17467b3ab8ddb81e2f605db05583d69388fc0668" - integrity sha512-4lzMgtiNlc3DU/8lZfmqxN3AYD6GGLbl+72rdBpXvcV+whX7mDrREzkPdp2RnmfIiWBg1YbuFSkXduF2JcafJg== +jest-snapshot@*, jest-snapshot@^29, jest-snapshot@^29.0.0, jest-snapshot@^29.0.3, jest-snapshot@^29.1.2, jest-snapshot@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.3.1.tgz#17bcef71a453adc059a18a32ccbd594b8cc4e45e" + integrity sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-jsx" "^7.7.2" "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^28.1.3" - "@jest/transform" "^28.1.3" - "@jest/types" "^28.1.3" + "@jest/expect-utils" "^29.3.1" + "@jest/transform" "^29.3.1" + "@jest/types" "^29.3.1" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^28.1.3" + expect "^29.3.1" graceful-fs "^4.2.9" - jest-diff "^28.1.3" - jest-get-type "^28.0.2" - jest-haste-map "^28.1.3" - jest-matcher-utils "^28.1.3" - jest-message-util "^28.1.3" - jest-util "^28.1.3" + jest-diff "^29.3.1" + jest-get-type "^29.2.0" + jest-haste-map "^29.3.1" + jest-matcher-utils "^29.3.1" + jest-message-util "^29.3.1" + jest-util "^29.3.1" natural-compare "^1.4.0" - pretty-format "^28.1.3" + pretty-format "^29.3.1" semver "^7.3.5" jest-specific-snapshot@*, jest-specific-snapshot@^7.0.0: @@ -9818,54 +9489,18 @@ jest-specific-snapshot@*, jest-specific-snapshot@^7.0.0: dependencies: jest-snapshot "^29.0.0" -jest-util@28.1.1: - version "28.1.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.1.tgz#ff39e436a1aca397c0ab998db5a51ae2b7080d05" - integrity sha512-FktOu7ca1DZSyhPAxgxB6hfh2+9zMoJ7aEQA759Z6p45NuO8mWcqujH+UdHlCm/V6JTWwDztM2ITCzU1ijJAfw== - dependencies: - "@jest/types" "^28.1.1" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-util@^28.1.1, jest-util@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-28.1.3.tgz#f4f932aa0074f0679943220ff9cbba7e497028b0" - integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== +jest-util@28.1.1, jest-util@^29, jest-util@^29.1.2, jest-util@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" + integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== dependencies: - "@jest/types" "^28.1.3" + "@jest/types" "^29.3.1" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" graceful-fs "^4.2.9" picomatch "^2.2.3" -jest-util@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.1.2.tgz#ac5798e93cb6a6703084e194cfa0898d66126df1" - integrity sha512-vPCk9F353i0Ymx3WQq3+a4lZ07NXu9Ca8wya6o4Fe4/aO1e1awMMprZ3woPFpKwghEOW+UXgd15vVotuNN9ONQ== - dependencies: - "@jest/types" "^29.1.2" - "@types/node" "*" - chalk "^4.0.0" - ci-info "^3.2.0" - graceful-fs "^4.2.9" - picomatch "^2.2.3" - -jest-validate@^28.1.1, jest-validate@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-28.1.3.tgz#e322267fd5e7c64cea4629612c357bbda96229df" - integrity sha512-SZbOGBWEsaTxBGCOpsRWlXlvNkvTkY0XxRfh7zYmvd8uL5Qzyg0CHAXiXKROflh801quA6+/DsT4ODDthOC/OA== - dependencies: - "@jest/types" "^28.1.3" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^28.0.2" - leven "^3.1.0" - pretty-format "^28.1.3" - jest-validate@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.1.2.tgz#83a728b8f6354da2e52346878c8bc7383516ca51" @@ -9878,19 +9513,17 @@ jest-validate@^29.1.2: leven "^3.1.0" pretty-format "^29.1.2" -jest-watcher@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-28.1.3.tgz#c6023a59ba2255e3b4c57179fc94164b3e73abd4" - integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== +jest-validate@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.3.1.tgz#d56fefaa2e7d1fde3ecdc973c7f7f8f25eea704a" + integrity sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g== dependencies: - "@jest/test-result" "^28.1.3" - "@jest/types" "^28.1.3" - "@types/node" "*" - ansi-escapes "^4.2.1" + "@jest/types" "^29.3.1" + camelcase "^6.2.0" chalk "^4.0.0" - emittery "^0.10.2" - jest-util "^28.1.3" - string-length "^4.0.1" + jest-get-type "^29.2.0" + leven "^3.1.0" + pretty-format "^29.3.1" jest-watcher@^29.1.2: version "29.1.2" @@ -9906,6 +9539,20 @@ jest-watcher@^29.1.2: jest-util "^29.1.2" string-length "^4.0.1" +jest-watcher@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.3.1.tgz#3341547e14fe3c0f79f9c3a4c62dbc3fc977fd4a" + integrity sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg== + dependencies: + "@jest/test-result" "^29.3.1" + "@jest/types" "^29.3.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.3.1" + string-length "^4.0.1" + jest-worker@^26.2.1: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" @@ -9924,15 +9571,6 @@ jest-worker@^27.4.5, jest-worker@^27.5.1: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^28.1.1, jest-worker@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-28.1.3.tgz#7e3c4ce3fa23d1bb6accb169e7f396f98ed4bb98" - integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== - dependencies: - "@types/node" "*" - merge-stream "^2.0.0" - supports-color "^8.0.0" - jest-worker@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.1.2.tgz#a68302af61bce82b42a9a57285ca7499d29b2afc" @@ -9943,6 +9581,16 @@ jest-worker@^29.1.2: merge-stream "^2.0.0" supports-color "^8.0.0" +jest-worker@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.3.1.tgz#e9462161017a9bb176380d721cab022661da3d6b" + integrity sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw== + dependencies: + "@types/node" "*" + jest-util "^29.3.1" + merge-stream "^2.0.0" + supports-color "^8.0.0" + jest@^29.0.3: version "29.1.2" resolved "https://registry.yarnpkg.com/jest/-/jest-29.1.2.tgz#f821a1695ffd6cd0efc3b59d2dfcc70a98582499" @@ -12242,25 +11890,15 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" -pretty-format@*, pretty-format@^29.0.0, pretty-format@^29.0.3, pretty-format@^29.1.2: - version "29.1.2" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.1.2.tgz#b1f6b75be7d699be1a051f5da36e8ae9e76a8e6a" - integrity sha512-CGJ6VVGXVRP2o2Dorl4mAwwvDWT25luIsYhkyVQW32E4nL+TgW939J7LlKT/npq5Cpq6j3s+sy+13yk7xYpBmg== +pretty-format@*, pretty-format@^29, pretty-format@^29.0.0, pretty-format@^29.0.3, pretty-format@^29.1.2, pretty-format@^29.3.1: + version "29.3.1" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" + integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== dependencies: "@jest/schemas" "^29.0.0" ansi-styles "^5.0.0" react-is "^18.0.0" -pretty-format@^28.1.1, pretty-format@^28.1.3: - version "28.1.3" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-28.1.3.tgz#c9fba8cedf99ce50963a11b27d982a9ae90970d5" - integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== - dependencies: - "@jest/schemas" "^28.1.3" - ansi-regex "^5.0.1" - ansi-styles "^5.0.0" - react-is "^18.0.0" - pretty-time@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pretty-time/-/pretty-time-1.1.0.tgz#ffb7429afabb8535c346a34e41873adf3d74dd0e" @@ -13863,14 +13501,6 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" - integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -13947,14 +13577,6 @@ tempy@^0.6.0: type-fest "^0.16.0" unique-string "^2.0.0" -terminal-link@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" - integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== - dependencies: - ansi-escapes "^4.2.1" - supports-hyperlinks "^2.0.0" - terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.3: version "5.3.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" @@ -14310,15 +13932,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@*, "typescript@>=3.3.1 <5.0.0", "typescript@^3 || ^4", typescript@next: - version "4.9.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.3.tgz#3aea307c1746b8c384435d8ac36b8a2e580d85db" - integrity sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA== - -typescript@~4.8.4: - version "4.8.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.8.4.tgz#c464abca159669597be5f96b8943500b238e60e6" - integrity sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ== +typescript@*, "typescript@>=3.3.1 <5.0.0", "typescript@^3 || ^4", typescript@next, typescript@~4.8.4, typescript@~4.9.3: + version "4.9.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" + integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== ua-parser-js@^0.7.30: version "0.7.31" @@ -14614,7 +14231,7 @@ v8-compile-cache@2.3.0, v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8-to-istanbul@^9.0.0, v8-to-istanbul@^9.0.1: +v8-to-istanbul@^9.0.1: version "9.0.1" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.0.1.tgz#b6f994b0b5d4ef255e17a0d17dc444a9f5132fa4" integrity sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w== From 5d74151783ed95436e337ab86b24b8284b23002c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 11 Jan 2023 11:20:23 +0100 Subject: [PATCH 33/64] fix(eslint-plugin): [prefer-readonly-parameter-types] Fixed tests having old allowlist format --- .../prefer-readonly-parameter-types.test.ts | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts index 0fc1583b55f8..9da20bd8147c 100644 --- a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts @@ -412,7 +412,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'RegExp', source: 'default-lib' }], + allowlist: [{ from: 'lib', name: 'RegExp' }], }, ], }, @@ -426,7 +426,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'RegExp', source: 'default-lib' }], + allowlist: [{ from: 'lib', name: 'RegExp' }], }, ], }, @@ -440,7 +440,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'Foo', source: 'local' }], + allowlist: [{ from: 'file', name: 'Foo' }], }, ], }, @@ -457,7 +457,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'Foo', source: 'local' }], + allowlist: [{ from: 'file', name: 'Foo' }], }, ], }, @@ -474,7 +474,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'Bar', source: 'local' }], + allowlist: [{ from: 'file', name: 'Bar' }], }, ], }, @@ -953,7 +953,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'Foo', source: 'local' }], + allowlist: [{ from: 'file', name: 'Foo' }], }, ], errors: [ @@ -975,7 +975,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'Bar', source: 'local' }], + allowlist: [{ from: 'file', name: 'Bar' }], }, ], errors: [ @@ -997,7 +997,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'Foo', source: 'default-lib' }], + allowlist: [{ from: 'lib', name: 'Foo' }], }, ], errors: [ @@ -1019,9 +1019,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [ - { typeName: 'Foo', source: 'package', package: 'foo-lib' }, - ], + allowlist: [{ from: 'package', name: 'Foo', source: 'foo-lib' }], }, ], errors: [ @@ -1039,7 +1037,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ typeName: 'RegExp', source: 'local' }], + allowlist: [{ from: 'file', name: 'RegExp' }], }, ], errors: [ @@ -1058,7 +1056,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { options: [ { allowlist: [ - { typeName: 'RegExp', source: 'package', package: 'regexp-lib' }, + { from: 'package', name: 'RegExp', source: 'regexp-lib' }, ], }, ], From fb67f4d6bfabd31d6631d1b8e58c7538d00a47f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 11 Jan 2023 11:27:18 +0100 Subject: [PATCH 34/64] fix(type-utils): Removed unneeded function isTypeExcepted --- packages/type-utils/src/isTypeReadonly.ts | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index efcf5b1cbd5a..e633ad1243bc 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -54,18 +54,6 @@ function hasSymbol(node: ts.Node): node is ts.Node & { symbol: ts.Symbol } { return Object.prototype.hasOwnProperty.call(node, 'symbol'); } -function isTypeExcepted( - type: ts.Type, - program: ts.Program, - options: ReadonlynessOptions, -): boolean { - return ( - options.allowlist?.some(specifier => - typeMatchesSpecifier(type, specifier, program), - ) ?? false - ); -} - function isTypeReadonlyArrayOrTuple( program: ts.Program, type: ts.Type, @@ -248,7 +236,11 @@ function isTypeReadonlyRecurser( const checker = program.getTypeChecker(); seenTypes.add(type); - if (isTypeExcepted(type, program, options)) { + if ( + options.allowlist?.some(specifier => + typeMatchesSpecifier(type, specifier, program), + ) + ) { return Readonlyness.Readonly; } From c4334cc76b74b9286cbce07008b992ac8b831df1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 11 Jan 2023 13:30:23 +0100 Subject: [PATCH 35/64] feat(type-utils): Added source file checking to typeMatchesFileSpecifier() --- .../type-utils/src/TypeOrValueSpecifier.ts | 21 ++++++++----------- yarn.lock | 7 +------ 2 files changed, 10 insertions(+), 18 deletions(-) diff --git a/packages/type-utils/src/TypeOrValueSpecifier.ts b/packages/type-utils/src/TypeOrValueSpecifier.ts index 3206b6036f23..67aba1580a94 100644 --- a/packages/type-utils/src/TypeOrValueSpecifier.ts +++ b/packages/type-utils/src/TypeOrValueSpecifier.ts @@ -157,7 +157,6 @@ function specifierNameMatches( } function typeMatchesFileSpecifier( - type: ts.Type, specifier: FileSpecifier, declarationFiles: Array, program: ts.Program, @@ -169,8 +168,14 @@ function typeMatchesFileSpecifier( ) { return false; } - // TODO: Check filename against source. - return true; + const source = specifier.source; + if (source === undefined) { + return true; + } + return declarationFiles.some( + declaration => + declaration.fileName === program.getCurrentDirectory() + '/' + source, + ); } function typeIsFromLib( @@ -194,7 +199,6 @@ function typeMatchesPackageSpecifier( } function typeMatchesMultiSourceSpecifier( - type: ts.Type, specifier: MultiSourceSpecifier, declarationFiles: Array, program: ts.Program, @@ -202,7 +206,6 @@ function typeMatchesMultiSourceSpecifier( if ( specifier.from.includes('file') && typeMatchesFileSpecifier( - type, { from: 'file', name: specifier.name }, declarationFiles, program, @@ -247,7 +250,6 @@ export function typeMatchesSpecifier( ?.map(declaration => declaration.getSourceFile()) ?? []; if (isMultiSourceSpecifier(specifier)) { return typeMatchesMultiSourceSpecifier( - type, specifier, declarationFiles, program, @@ -255,12 +257,7 @@ export function typeMatchesSpecifier( } switch (specifier.from) { case 'file': - return typeMatchesFileSpecifier( - type, - specifier, - declarationFiles, - program, - ); + return typeMatchesFileSpecifier(specifier, declarationFiles, program); case 'lib': return typeIsFromLib(declarationFiles, program); case 'package': diff --git a/yarn.lock b/yarn.lock index 358a2db98932..c43e938c8dbc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6586,11 +6586,6 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -diff-sequences@^29.0.0: - version "29.0.0" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.0.0.tgz#bae49972ef3933556bcb0800b72e8579d19d9e4f" - integrity sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA== - diff-sequences@^29.3.1: version "29.3.1" resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" @@ -9128,7 +9123,7 @@ jest-config@28.1.1, jest-config@^29, jest-config@^29.1.2: slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@*, jest-diff@^29, jest-diff@^29.0.3, jest-diff@^29.1.2, jest-diff@^29.3.1: +jest-diff@*, jest-diff@^29, jest-diff@^29.0.3, jest-diff@^29.3.1: version "29.3.1" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== From bc3ce110331793c2186f570929eb73a17d9f889f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 11 Jan 2023 13:41:03 +0100 Subject: [PATCH 36/64] docs(eslint-plugin): [prefer-readonly-parameter-types] Updated docs to use TypeOrValueSpecifier allowlist style --- .../docs/rules/prefer-readonly-parameter-types.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index c3323e4edbb1..56d2488c3a97 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -133,9 +133,9 @@ interface Foo { Some complex types cannot easily be made readonly, for example the `HTMLElement` type or the `JQueryStatic` type from `@types/jquery`. This option allows you to globally disable reporting of such types. -Each item has to be either a local type (`{typeName: "Foo", source: "local"}`), a type from the default library (`{typeName: "Foo", source: "default-lib"}`), or a file from a specific package (`{typeName: "Foo", source: "package", package: "foo-lib"}`, this also works for types defined in a typings package). +Each item has to be either a type defined in a file (`{from: "file", name: "Foo", source: "src/foo-file.ts"}` with `source` being optional), a type from the default library (`{from: "lib", name: "Foo"}`), or a file from a specific package (`{from: "package", name: "Foo", source: "foo-lib"}`, this also works for types defined in a typings package). Additionaly, multiple sources may be combined (`{from: ["file", "package"], name: "Foo"}`) or a type may be defined just as a simple string, which then matches the type independtly of its origin. -Examples of code for this rule with `{allowlist: [{typeName: "Foo", source: "local"}, {typeName: "HTMLElement", source: "default-lib"}, {typeName: "Bar", source: "package", package: "bar-lib"}]}`: +Examples of code for this rule with `{allowlist: [{source: "file", name: "Foo"}, {source: "lib", name: "HTMLElement"}, {from: "package", name: "Bar", source: "bar-lib"}]}`: From 1e1bfc2080522f391845ba9575dc6d3f929280b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 11 Jan 2023 13:42:11 +0100 Subject: [PATCH 37/64] docs(eslint-plugin): [prefer-readonly-parameter-types] Typo fix --- .../eslint-plugin/docs/rules/prefer-readonly-parameter-types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index 56d2488c3a97..1660f274aa80 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -133,7 +133,7 @@ interface Foo { Some complex types cannot easily be made readonly, for example the `HTMLElement` type or the `JQueryStatic` type from `@types/jquery`. This option allows you to globally disable reporting of such types. -Each item has to be either a type defined in a file (`{from: "file", name: "Foo", source: "src/foo-file.ts"}` with `source` being optional), a type from the default library (`{from: "lib", name: "Foo"}`), or a file from a specific package (`{from: "package", name: "Foo", source: "foo-lib"}`, this also works for types defined in a typings package). Additionaly, multiple sources may be combined (`{from: ["file", "package"], name: "Foo"}`) or a type may be defined just as a simple string, which then matches the type independtly of its origin. +Each item has to be either a type defined in a file (`{from: "file", name: "Foo", source: "src/foo-file.ts"}` with `source` being optional), a type from the default library (`{from: "lib", name: "Foo"}`), or a file from a specific package (`{from: "package", name: "Foo", source: "foo-lib"}`, this also works for types defined in a typings package). Additionaly, multiple sources may be combined (`{from: ["file", "package"], name: "Foo"}`) or a type may be defined just as a simple string, which then matches the type independently of its origin. Examples of code for this rule with `{allowlist: [{source: "file", name: "Foo"}, {source: "lib", name: "HTMLElement"}, {from: "package", name: "Bar", source: "bar-lib"}]}`: From c5c1d700810b99b319d480cc162e8c68ef0c12eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 11 Jan 2023 13:50:16 +0100 Subject: [PATCH 38/64] docs(eslint-plugin): [prefer-readonly-parameter-types] Typo fix 2 --- .../eslint-plugin/docs/rules/prefer-readonly-parameter-types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index 1660f274aa80..54e443bc19f0 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -133,7 +133,7 @@ interface Foo { Some complex types cannot easily be made readonly, for example the `HTMLElement` type or the `JQueryStatic` type from `@types/jquery`. This option allows you to globally disable reporting of such types. -Each item has to be either a type defined in a file (`{from: "file", name: "Foo", source: "src/foo-file.ts"}` with `source` being optional), a type from the default library (`{from: "lib", name: "Foo"}`), or a file from a specific package (`{from: "package", name: "Foo", source: "foo-lib"}`, this also works for types defined in a typings package). Additionaly, multiple sources may be combined (`{from: ["file", "package"], name: "Foo"}`) or a type may be defined just as a simple string, which then matches the type independently of its origin. +Each item has to be either a type defined in a file (`{from: "file", name: "Foo", source: "src/foo-file.ts"}` with `source` being optional), a type from the default library (`{from: "lib", name: "Foo"}`), or a file from a specific package (`{from: "package", name: "Foo", source: "foo-lib"}`, this also works for types defined in a typings package). Additionally, multiple sources may be combined (`{from: ["file", "package"], name: "Foo"}`) or a type may be defined just as a simple string, which then matches the type independently of its origin. Examples of code for this rule with `{allowlist: [{source: "file", name: "Foo"}, {source: "lib", name: "HTMLElement"}, {from: "package", name: "Bar", source: "bar-lib"}]}`: From 22bb89107e849870b2cf5d656b129c27ccab0a13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 11 Jan 2023 15:03:59 +0100 Subject: [PATCH 39/64] feat(type-utils): Added tests for typeMatchesSpecifier() --- .../tests/TypeOrValueSpecifier.test.ts | 105 +++++++++++++++++- 1 file changed, 104 insertions(+), 1 deletion(-) diff --git a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts index c7b6e9a578c4..5f5646a20024 100644 --- a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts +++ b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts @@ -1,6 +1,14 @@ +import { parseForESLint } from '@typescript-eslint/parser'; +import type { TSESTree } from '@typescript-eslint/utils'; import Ajv from 'ajv'; +import path from 'path'; +import type * as ts from 'typescript'; -import { typeOrValueSpecifierSchema } from '../src/TypeOrValueSpecifier'; +import type { TypeOrValueSpecifier } from '../src/TypeOrValueSpecifier'; +import { + typeMatchesSpecifier, + typeOrValueSpecifierSchema, +} from '../src/TypeOrValueSpecifier'; describe('TypeOrValueSpecifier', () => { describe('Schema', () => { @@ -133,4 +141,99 @@ describe('TypeOrValueSpecifier', () => { [{ from: ['file'], name: 'MyType', unrelatedProperty: '' }], ])("doesn't match a malformed multi-source specifier", runTestNegative); }); + + describe('typeMatchesSpecifier', () => { + function runTests( + code: string, + specifier: TypeOrValueSpecifier, + expected: boolean, + ): void { + const rootDir = path.join(__dirname, 'fixtures'); + const { ast, services } = parseForESLint(code, { + project: './tsconfig.json', + filePath: path.join(rootDir, 'file.ts'), + tsconfigRootDir: rootDir, + }); + const type = services.program + .getTypeChecker() + .getTypeAtLocation( + services.esTreeNodeToTSNodeMap.get( + (ast.body[0] as TSESTree.TSTypeAliasDeclaration).id, + ), + ); + expect(typeMatchesSpecifier(type, specifier, services.program)).toBe( + expected, + ); + } + + function runTestPositive( + code: string, + specifier: TypeOrValueSpecifier, + ): void { + runTests(code, specifier, true); + } + + function runTestNegative( + code: string, + specifier: TypeOrValueSpecifier, + ): void { + runTests(code, specifier, false); + } + + it.each<[string, TypeOrValueSpecifier]>([ + [ + 'interface Foo {prop: string}; type Test = Foo;', + { from: 'file', name: 'Foo' }, + ], + [ + 'interface Foo {prop: string}; type Test = Foo;', + { from: 'file', name: ['Foo', 'Bar'] }, + ], + [ + 'interface Foo {prop: string}; type Test = Foo;', + { from: 'file', name: 'Foo', source: 'tests/fixtures/file.ts' }, + ], + [ + 'interface Foo {prop: string}; type Test = Foo;', + { + from: 'file', + name: ['Foo', 'Bar'], + source: 'tests/fixtures/file.ts', + }, + ], + ])('correctly matches a file type', runTestPositive); + + it.each<[string, TypeOrValueSpecifier]>([ + [ + 'interface Foo {prop: string}; type Test = Foo;', + { from: 'file', name: 'Bar' }, + ], + [ + 'interface Foo {prop: string}; type Test = Foo;', + { from: 'file', name: ['Bar', 'Baz'] }, + ], + [ + 'interface Foo {prop: string}; type Test = Foo;', + { from: 'file', name: 'Foo', source: 'tests/fixtures/wrong-file.ts' }, + ], + [ + 'interface Foo {prop: string}; type Test = Foo;', + { + from: 'file', + name: ['Foo', 'Bar'], + source: 'tests/fixtures/wrong-file.ts', + }, + ], + ])("correctly doesn't match an incorrect file type", runTestNegative); + + it.each<[string, TypeOrValueSpecifier]>([ + ['type Test = RegExp;', { from: 'lib', name: 'RegExp' }], + ['type Test = RegExp;', { from: 'lib', name: ['RegExp', 'BigInt'] }], + ])('correctly matches a lib type', runTestPositive); + + it.each<[string, TypeOrValueSpecifier]>([ + ['type Test = RegExp;', { from: 'lib', name: 'BigInt' }], + ['type Test = RegExp;', { from: 'lib', name: ['BigInt', 'Date'] }], + ])("correctly doesn't match an incorrect lib type", runTestNegative); + }); }); From af5cfc0ffd2f86f850558bbb1d20ba380a48057c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 11 Jan 2023 16:02:55 +0100 Subject: [PATCH 40/64] fix(type-utils): Using node path joining typeMatchesSpecifier() --- packages/type-utils/src/TypeOrValueSpecifier.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/type-utils/src/TypeOrValueSpecifier.ts b/packages/type-utils/src/TypeOrValueSpecifier.ts index 67aba1580a94..f6eb717452dc 100644 --- a/packages/type-utils/src/TypeOrValueSpecifier.ts +++ b/packages/type-utils/src/TypeOrValueSpecifier.ts @@ -1,3 +1,4 @@ +import path from 'path'; import type * as ts from 'typescript'; interface FileSpecifier { @@ -172,9 +173,9 @@ function typeMatchesFileSpecifier( if (source === undefined) { return true; } + const specifierPath = path.join(program.getCurrentDirectory(), source); return declarationFiles.some( - declaration => - declaration.fileName === program.getCurrentDirectory() + '/' + source, + declaration => declaration.fileName === specifierPath, ); } From 5c3f37f1232175f02feeab013cb3d9bb5a77d346 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 11 Jan 2023 16:07:19 +0100 Subject: [PATCH 41/64] feat(type-utils): Removed MultiSourceSpecifier --- .../type-utils/src/TypeOrValueSpecifier.ts | 55 +------------------ 1 file changed, 1 insertion(+), 54 deletions(-) diff --git a/packages/type-utils/src/TypeOrValueSpecifier.ts b/packages/type-utils/src/TypeOrValueSpecifier.ts index f6eb717452dc..a31ffe811914 100644 --- a/packages/type-utils/src/TypeOrValueSpecifier.ts +++ b/packages/type-utils/src/TypeOrValueSpecifier.ts @@ -18,17 +18,11 @@ interface PackageSpecifier { source: string; } -interface MultiSourceSpecifier { - from: Array<'file' | 'lib' | 'package'>; - name: string; -} - export type TypeOrValueSpecifier = | string | FileSpecifier | LibSpecifier - | PackageSpecifier - | MultiSourceSpecifier; + | PackageSpecifier; export const typeOrValueSpecifierSchema = { oneOf: [ @@ -141,12 +135,6 @@ export const typeOrValueSpecifierSchema = { ], }; -function isMultiSourceSpecifier( - specifier: TypeOrValueSpecifier, -): specifier is MultiSourceSpecifier { - return typeof specifier === 'object' && Array.isArray(specifier.from); -} - function specifierNameMatches( type: ts.Type, name: string | Array, @@ -199,40 +187,6 @@ function typeMatchesPackageSpecifier( ); } -function typeMatchesMultiSourceSpecifier( - specifier: MultiSourceSpecifier, - declarationFiles: Array, - program: ts.Program, -): boolean { - if ( - specifier.from.includes('file') && - typeMatchesFileSpecifier( - { from: 'file', name: specifier.name }, - declarationFiles, - program, - ) - ) { - return true; - } - if ( - specifier.from.includes('lib') && - typeIsFromLib(declarationFiles, program) - ) { - return true; - } - if ( - specifier.from.includes('package') && - typeMatchesPackageSpecifier( - // TODO: Solve what to do with the source. - { from: 'package', name: specifier.name, source: '' }, - declarationFiles, - ) - ) { - return true; - } - return false; -} - export function typeMatchesSpecifier( type: ts.Type, specifier: TypeOrValueSpecifier, @@ -249,13 +203,6 @@ export function typeMatchesSpecifier( .getSymbol() ?.getDeclarations() ?.map(declaration => declaration.getSourceFile()) ?? []; - if (isMultiSourceSpecifier(specifier)) { - return typeMatchesMultiSourceSpecifier( - specifier, - declarationFiles, - program, - ); - } switch (specifier.from) { case 'file': return typeMatchesFileSpecifier(specifier, declarationFiles, program); From 60dcf3612fd3e38bb5351d1b293cd01725feebe8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 11 Jan 2023 16:11:59 +0100 Subject: [PATCH 42/64] chore(type-utils): Simplified typeMatchesSpecifier() --- .../type-utils/src/TypeOrValueSpecifier.ts | 32 ++++++------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/packages/type-utils/src/TypeOrValueSpecifier.ts b/packages/type-utils/src/TypeOrValueSpecifier.ts index a31ffe811914..49ddd1394202 100644 --- a/packages/type-utils/src/TypeOrValueSpecifier.ts +++ b/packages/type-utils/src/TypeOrValueSpecifier.ts @@ -167,26 +167,6 @@ function typeMatchesFileSpecifier( ); } -function typeIsFromLib( - declarationFiles: Array, - program: ts.Program, -): boolean { - return declarationFiles.some(declaration => - program.isSourceFileDefaultLibrary(declaration), - ); -} - -function typeMatchesPackageSpecifier( - specifier: PackageSpecifier, - declarationFiles: Array, -): boolean { - return declarationFiles.some( - declaration => - declaration.fileName.includes(`node_modules/${specifier.source}/`) || - declaration.fileName.includes(`node_modules/@types/${specifier.source}/`), - ); -} - export function typeMatchesSpecifier( type: ts.Type, specifier: TypeOrValueSpecifier, @@ -207,8 +187,16 @@ export function typeMatchesSpecifier( case 'file': return typeMatchesFileSpecifier(specifier, declarationFiles, program); case 'lib': - return typeIsFromLib(declarationFiles, program); + return declarationFiles.some(declaration => + program.isSourceFileDefaultLibrary(declaration), + ); case 'package': - return typeMatchesPackageSpecifier(specifier, declarationFiles); + return declarationFiles.some( + declaration => + declaration.fileName.includes(`node_modules/${specifier.source}/`) || + declaration.fileName.includes( + `node_modules/@types/${specifier.source}/`, + ), + ); } } From e6d81a9204094a9bd8a4474a05ebccb3eea64a74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 11 Jan 2023 16:43:06 +0100 Subject: [PATCH 43/64] feat(type-utils): Added more tests for typeMatchesSpecifier() --- .../tests/TypeOrValueSpecifier.test.ts | 77 +++++++++++++++++-- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts index 5f5646a20024..4bcd2f632eb6 100644 --- a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts +++ b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts @@ -2,7 +2,6 @@ import { parseForESLint } from '@typescript-eslint/parser'; import type { TSESTree } from '@typescript-eslint/utils'; import Ajv from 'ajv'; import path from 'path'; -import type * as ts from 'typescript'; import type { TypeOrValueSpecifier } from '../src/TypeOrValueSpecifier'; import { @@ -180,6 +179,21 @@ describe('TypeOrValueSpecifier', () => { runTests(code, specifier, false); } + it.each<[string, TypeOrValueSpecifier]>([ + ['interface Foo {prop: string}; type Test = Foo;', 'Foo'], + ['type Test = RegExp;', 'RegExp'], + ])('correctly matches a universal string specifier', runTestPositive); + + it.each<[string, TypeOrValueSpecifier]>([ + ['interface Foo {prop: string}; type Test = Foo;', 'Bar'], + ['interface Foo {prop: string}; type Test = Foo;', 'RegExp'], + ['type Test = RegExp;', 'Foo'], + ['type Test = RegExp;', 'BigInt'], + ])( + "correctly doesn't match a mismatched universal string specifier", + runTestNegative, + ); + it.each<[string, TypeOrValueSpecifier]>([ [ 'interface Foo {prop: string}; type Test = Foo;', @@ -201,7 +215,7 @@ describe('TypeOrValueSpecifier', () => { source: 'tests/fixtures/file.ts', }, ], - ])('correctly matches a file type', runTestPositive); + ])('correctly matches a file specifier', runTestPositive); it.each<[string, TypeOrValueSpecifier]>([ [ @@ -224,16 +238,69 @@ describe('TypeOrValueSpecifier', () => { source: 'tests/fixtures/wrong-file.ts', }, ], - ])("correctly doesn't match an incorrect file type", runTestNegative); + ])("correctly doesn't match a mismatched file specifier", runTestNegative); it.each<[string, TypeOrValueSpecifier]>([ ['type Test = RegExp;', { from: 'lib', name: 'RegExp' }], ['type Test = RegExp;', { from: 'lib', name: ['RegExp', 'BigInt'] }], - ])('correctly matches a lib type', runTestPositive); + ])('correctly matches a lib specifier', runTestPositive); it.each<[string, TypeOrValueSpecifier]>([ ['type Test = RegExp;', { from: 'lib', name: 'BigInt' }], ['type Test = RegExp;', { from: 'lib', name: ['BigInt', 'Date'] }], - ])("correctly doesn't match an incorrect lib type", runTestNegative); + ])("correctly doesn't match a mismatched lib specifier", runTestNegative); + + it.each<[string, TypeOrValueSpecifier]>([ + [ + 'interface Foo {prop: string}; type Test = Foo;', + { from: 'lib', name: 'Foo' }, + ], + [ + 'interface Foo {prop: string}; type Test = Foo;', + { from: 'lib', name: ['Foo', 'Bar'] }, + ], + [ + 'interface Foo {prop: string}; type Test = Foo;', + { from: 'package', name: 'Foo', source: 'foo-package' }, + ], + [ + 'interface Foo {prop: string}; type Test = Foo;', + { from: 'package', name: ['Foo', 'Bar'], source: 'foo-package' }, + ], + [ + 'interface Foo {prop: string}; type Test = Foo;', + { from: 'package', name: 'Foo', source: 'foo-package' }, + ], + [ + 'interface Foo {prop: string}; type Test = Foo;', + { + from: 'package', + name: ['Foo', 'Bar'], + source: 'foo-package', + }, + ], + ['type Test = RegExp;', { from: 'file', name: 'RegExp' }], + ['type Test = RegExp;', { from: 'file', name: ['RegExp', 'BigInt'] }], + [ + 'type Test = RegExp;', + { from: 'file', name: 'RegExp', source: 'tests/fixtures/file.ts' }, + ], + [ + 'type Test = RegExp;', + { + from: 'file', + name: ['RegExp', 'BigInt'], + source: 'tests/fixtures/file.ts', + }, + ], + [ + 'type Test = RegExp;', + { from: 'package', name: 'RegExp', source: 'foo-package' }, + ], + [ + 'type Test = RegExp;', + { from: 'package', name: ['RegExp', 'BigInt'], source: 'foo-package' }, + ], + ])("correctly doesn't match a mismatched specifier type", runTestNegative); }); }); From 333d00810c5bfd07fb019b165237f8f43f26ecfa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sun, 5 Feb 2023 12:40:32 +0100 Subject: [PATCH 44/64] docs(prefer-readonly-parameter-types) more legible docs Co-authored-by: Josh Goldberg --- .../rules/prefer-readonly-parameter-types.md | 22 ++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index 54e443bc19f0..a9dc9c737d71 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -133,9 +133,25 @@ interface Foo { Some complex types cannot easily be made readonly, for example the `HTMLElement` type or the `JQueryStatic` type from `@types/jquery`. This option allows you to globally disable reporting of such types. -Each item has to be either a type defined in a file (`{from: "file", name: "Foo", source: "src/foo-file.ts"}` with `source` being optional), a type from the default library (`{from: "lib", name: "Foo"}`), or a file from a specific package (`{from: "package", name: "Foo", source: "foo-lib"}`, this also works for types defined in a typings package). Additionally, multiple sources may be combined (`{from: ["file", "package"], name: "Foo"}`) or a type may be defined just as a simple string, which then matches the type independently of its origin. - -Examples of code for this rule with `{allowlist: [{source: "file", name: "Foo"}, {source: "lib", name: "HTMLElement"}, {from: "package", name: "Bar", source: "bar-lib"}]}`: +Each item must be one of: +* A type defined in a file (`{from: "file", name: "Foo", source: "src/foo-file.ts"}` with `source` being optional) +* A type from the default library (`{from: "lib", name: "Foo"}`) +* A type from a package (`{from: "package", name: "Foo", source: "foo-lib"}`, this also works for types defined in a typings package). + +Two additional formats are supported: +* Multiple sources, as an array for `from` (`{from: ["file", "package"], name: "Foo"}`) +* A type may be defined just as a simple string, which then matches the type independently of its origin. + +Examples of code for this rule with: + +```json +{ + "allowlist": [ + { "source": "file", "name": "Foo" }, + { "source": "lib", "name": "HTMLElement" }, + { "from": "package", "name": "Bar", "source": "bar-lib" } + ] +} From 08eebc8f773c9275a8a2819221223e1a3cb4abb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sun, 5 Feb 2023 12:41:39 +0100 Subject: [PATCH 45/64] fix(eslint-plugin): [prefer-readonly-parameter-types] Fixed missing end of code listing in docs --- .../docs/rules/prefer-readonly-parameter-types.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index a9dc9c737d71..2cff7b3fca89 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -134,13 +134,15 @@ interface Foo { Some complex types cannot easily be made readonly, for example the `HTMLElement` type or the `JQueryStatic` type from `@types/jquery`. This option allows you to globally disable reporting of such types. Each item must be one of: -* A type defined in a file (`{from: "file", name: "Foo", source: "src/foo-file.ts"}` with `source` being optional) -* A type from the default library (`{from: "lib", name: "Foo"}`) -* A type from a package (`{from: "package", name: "Foo", source: "foo-lib"}`, this also works for types defined in a typings package). + +- A type defined in a file (`{from: "file", name: "Foo", source: "src/foo-file.ts"}` with `source` being optional) +- A type from the default library (`{from: "lib", name: "Foo"}`) +- A type from a package (`{from: "package", name: "Foo", source: "foo-lib"}`, this also works for types defined in a typings package). Two additional formats are supported: -* Multiple sources, as an array for `from` (`{from: ["file", "package"], name: "Foo"}`) -* A type may be defined just as a simple string, which then matches the type independently of its origin. + +- Multiple sources, as an array for `from` (`{from: ["file", "package"], name: "Foo"}`) +- A type may be defined just as a simple string, which then matches the type independently of its origin. Examples of code for this rule with: @@ -152,6 +154,7 @@ Examples of code for this rule with: { "from": "package", "name": "Bar", "source": "bar-lib" } ] } +``` From eb7aef68e85b744fa00e9743f38c42f940de90cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sun, 5 Feb 2023 13:09:56 +0100 Subject: [PATCH 46/64] chore(type-utils): Simplified typeDeclaredInFile() --- .../type-utils/src/TypeOrValueSpecifier.ts | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/packages/type-utils/src/TypeOrValueSpecifier.ts b/packages/type-utils/src/TypeOrValueSpecifier.ts index 49ddd1394202..e0dedac4c8f1 100644 --- a/packages/type-utils/src/TypeOrValueSpecifier.ts +++ b/packages/type-utils/src/TypeOrValueSpecifier.ts @@ -145,25 +145,19 @@ function specifierNameMatches( return name.some(item => item === type.getSymbol()?.escapedName); } -function typeMatchesFileSpecifier( - specifier: FileSpecifier, +function typeDeclaredInFile( + relativePath: string | undefined, declarationFiles: Array, program: ts.Program, ): boolean { - if ( - !declarationFiles.some(declaration => + if (relativePath === undefined) { + return declarationFiles.some(declaration => declaration.fileName.startsWith(program.getCurrentDirectory()), - ) - ) { - return false; - } - const source = specifier.source; - if (source === undefined) { - return true; + ); } - const specifierPath = path.join(program.getCurrentDirectory(), source); + const absolutePath = path.join(program.getCurrentDirectory(), relativePath); return declarationFiles.some( - declaration => declaration.fileName === specifierPath, + declaration => declaration.fileName === absolutePath, ); } @@ -185,7 +179,7 @@ export function typeMatchesSpecifier( ?.map(declaration => declaration.getSourceFile()) ?? []; switch (specifier.from) { case 'file': - return typeMatchesFileSpecifier(specifier, declarationFiles, program); + return typeDeclaredInFile(specifier.source, declarationFiles, program); case 'lib': return declarationFiles.some(declaration => program.isSourceFileDefaultLibrary(declaration), From b5b91cb23487044826058a34203ea69f47ab27cf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sun, 5 Feb 2023 13:30:27 +0100 Subject: [PATCH 47/64] chore(type-utils): Using unknown instead of any in tests --- packages/type-utils/tests/TypeOrValueSpecifier.test.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts index 4bcd2f632eb6..67a0ff468261 100644 --- a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts +++ b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts @@ -14,13 +14,11 @@ describe('TypeOrValueSpecifier', () => { const ajv = new Ajv(); const validate = ajv.compile(typeOrValueSpecifierSchema); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function runTestPositive(data: any): void { + function runTestPositive(data: unknown): void { expect(validate(data)).toBe(true); } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - function runTestNegative(data: any): void { + function runTestNegative(data: unknown): void { expect(validate(data)).toBe(false); } From e41d8be769e9c9589950cef1ef0e58d02c77955c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sun, 5 Feb 2023 13:34:56 +0100 Subject: [PATCH 48/64] test(type-utils): grammar fix in test specifications --- .../type-utils/tests/TypeOrValueSpecifier.test.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts index 67a0ff468261..2b384caa2ce7 100644 --- a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts +++ b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts @@ -180,7 +180,7 @@ describe('TypeOrValueSpecifier', () => { it.each<[string, TypeOrValueSpecifier]>([ ['interface Foo {prop: string}; type Test = Foo;', 'Foo'], ['type Test = RegExp;', 'RegExp'], - ])('correctly matches a universal string specifier', runTestPositive); + ])('matches a matching universal string specifier', runTestPositive); it.each<[string, TypeOrValueSpecifier]>([ ['interface Foo {prop: string}; type Test = Foo;', 'Bar'], @@ -188,7 +188,7 @@ describe('TypeOrValueSpecifier', () => { ['type Test = RegExp;', 'Foo'], ['type Test = RegExp;', 'BigInt'], ])( - "correctly doesn't match a mismatched universal string specifier", + "doesn't match a mismatched universal string specifier", runTestNegative, ); @@ -213,7 +213,7 @@ describe('TypeOrValueSpecifier', () => { source: 'tests/fixtures/file.ts', }, ], - ])('correctly matches a file specifier', runTestPositive); + ])('matches a matching file specifier', runTestPositive); it.each<[string, TypeOrValueSpecifier]>([ [ @@ -236,17 +236,17 @@ describe('TypeOrValueSpecifier', () => { source: 'tests/fixtures/wrong-file.ts', }, ], - ])("correctly doesn't match a mismatched file specifier", runTestNegative); + ])("doesn't match a mismatched file specifier", runTestNegative); it.each<[string, TypeOrValueSpecifier]>([ ['type Test = RegExp;', { from: 'lib', name: 'RegExp' }], ['type Test = RegExp;', { from: 'lib', name: ['RegExp', 'BigInt'] }], - ])('correctly matches a lib specifier', runTestPositive); + ])('matches a matching lib specifier', runTestPositive); it.each<[string, TypeOrValueSpecifier]>([ ['type Test = RegExp;', { from: 'lib', name: 'BigInt' }], ['type Test = RegExp;', { from: 'lib', name: ['BigInt', 'Date'] }], - ])("correctly doesn't match a mismatched lib specifier", runTestNegative); + ])("doesn't match a mismatched lib specifier", runTestNegative); it.each<[string, TypeOrValueSpecifier]>([ [ @@ -299,6 +299,6 @@ describe('TypeOrValueSpecifier', () => { 'type Test = RegExp;', { from: 'package', name: ['RegExp', 'BigInt'], source: 'foo-package' }, ], - ])("correctly doesn't match a mismatched specifier type", runTestNegative); + ])("doesn't match a mismatched specifier type", runTestNegative); }); }); From 852ca690f44c9e33984687f099d3c4625b0ff656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sun, 5 Feb 2023 15:01:50 +0100 Subject: [PATCH 49/64] chore: Reset yarn.lock --- yarn.lock | 569 ++++++++++++++---------------------------------------- 1 file changed, 149 insertions(+), 420 deletions(-) diff --git a/yarn.lock b/yarn.lock index 7d70b1598d9d..89ff0d9c07f1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2084,18 +2084,6 @@ jest-util "^29.1.2" slash "^3.0.0" -"@jest/console@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/console/-/console-29.3.1.tgz#3e3f876e4e47616ea3b1464b9fbda981872e9583" - integrity sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg== - dependencies: - "@jest/types" "^29.3.1" - "@types/node" "*" - chalk "^4.0.0" - jest-message-util "^29.3.1" - jest-util "^29.3.1" - slash "^3.0.0" - "@jest/core@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/core/-/core-29.1.2.tgz#e5ce7a71e7da45156a96fb5eeed11d18b67bd112" @@ -2131,11 +2119,11 @@ strip-ansi "^6.0.0" "@jest/create-cache-key-function@^27.4.2", "@jest/create-cache-key-function@^29": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.3.1.tgz#3a0970ea595ab3d9507244edbcef14d6b016cdc9" - integrity sha512-4i+E+E40gK13K78ffD/8cy4lSSqeWwyXeTZoq16tndiCP12hC8uQsPJdIu5C6Kf22fD8UbBk71so7s/6VwpUOQ== + version "29.1.2" + resolved "https://registry.yarnpkg.com/@jest/create-cache-key-function/-/create-cache-key-function-29.1.2.tgz#ba72143479abccc5ce7705e00fcbe89e4d6e1873" + integrity sha512-s7yfOwnDZhqTzLWOwWjv/Lbg9CkJ7bItz5OVrMa0d+g2bP+rFwDs7FpsKuYpym5tpdbDaXHnF3cbl/e01ZeUcw== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.1.2" "@jest/environment@^29.1.2": version "29.1.2" @@ -2147,16 +2135,6 @@ "@types/node" "*" jest-mock "^29.1.2" -"@jest/environment@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/environment/-/environment-29.3.1.tgz#eb039f726d5fcd14698acd072ac6576d41cfcaa6" - integrity sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag== - dependencies: - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/node" "*" - jest-mock "^29.3.1" - "@jest/expect-utils@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.1.2.tgz#66dbb514d38f7d21456bc774419c9ae5cca3f88d" @@ -2164,13 +2142,6 @@ dependencies: jest-get-type "^29.0.0" -"@jest/expect-utils@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect-utils/-/expect-utils-29.3.1.tgz#531f737039e9b9e27c42449798acb5bba01935b6" - integrity sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g== - dependencies: - jest-get-type "^29.2.0" - "@jest/expect@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.1.2.tgz#334a86395f621f1ab63ad95b06a588b9114d7b7a" @@ -2179,14 +2150,6 @@ expect "^29.1.2" jest-snapshot "^29.1.2" -"@jest/expect@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/expect/-/expect-29.3.1.tgz#456385b62894349c1d196f2d183e3716d4c6a6cd" - integrity sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg== - dependencies: - expect "^29.3.1" - jest-snapshot "^29.3.1" - "@jest/fake-timers@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.1.2.tgz#f157cdf23b4da48ce46cb00fea28ed1b57fc271a" @@ -2199,18 +2162,6 @@ jest-mock "^29.1.2" jest-util "^29.1.2" -"@jest/fake-timers@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/fake-timers/-/fake-timers-29.3.1.tgz#b140625095b60a44de820876d4c14da1aa963f67" - integrity sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A== - dependencies: - "@jest/types" "^29.3.1" - "@sinonjs/fake-timers" "^9.1.2" - "@types/node" "*" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-util "^29.3.1" - "@jest/globals@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.1.2.tgz#826ede84bc280ae7f789cb72d325c48cd048b9d3" @@ -2221,26 +2172,16 @@ "@jest/types" "^29.1.2" jest-mock "^29.1.2" -"@jest/globals@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/globals/-/globals-29.3.1.tgz#92be078228e82d629df40c3656d45328f134a0c6" - integrity sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q== - dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/types" "^29.3.1" - jest-mock "^29.3.1" - "@jest/reporters@28.1.1", "@jest/reporters@^29", "@jest/reporters@^29.1.2": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.3.1.tgz#9a6d78c109608e677c25ddb34f907b90e07b4310" - integrity sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA== + version "29.1.2" + resolved "https://registry.yarnpkg.com/@jest/reporters/-/reporters-29.1.2.tgz#5520898ed0a4ecf69d8b671e1dc8465d0acdfa6e" + integrity sha512-X4fiwwyxy9mnfpxL0g9DD0KcTmEIqP0jUdnc2cfa9riHy+I6Gwwp5vOZiwyg0vZxfSDxrOlK9S4+340W4d+DAA== dependencies: "@bcoe/v8-coverage" "^0.2.3" - "@jest/console" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.1.2" + "@jest/test-result" "^29.1.2" + "@jest/transform" "^29.1.2" + "@jest/types" "^29.1.2" "@jridgewell/trace-mapping" "^0.3.15" "@types/node" "*" chalk "^4.0.0" @@ -2253,12 +2194,13 @@ istanbul-lib-report "^3.0.0" istanbul-lib-source-maps "^4.0.0" istanbul-reports "^3.1.3" - jest-message-util "^29.3.1" - jest-util "^29.3.1" - jest-worker "^29.3.1" + jest-message-util "^29.1.2" + jest-util "^29.1.2" + jest-worker "^29.1.2" slash "^3.0.0" string-length "^4.0.1" strip-ansi "^6.0.0" + terminal-link "^2.0.0" v8-to-istanbul "^9.0.1" "@jest/schemas@^29.0.0": @@ -2277,33 +2219,24 @@ callsites "^3.0.0" graceful-fs "^4.2.9" -"@jest/source-map@^29.2.0": - version "29.2.0" - resolved "https://registry.yarnpkg.com/@jest/source-map/-/source-map-29.2.0.tgz#ab3420c46d42508dcc3dc1c6deee0b613c235744" - integrity sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ== - dependencies: - "@jridgewell/trace-mapping" "^0.3.15" - callsites "^3.0.0" - graceful-fs "^4.2.9" - -"@jest/test-result@28.1.1", "@jest/test-result@^29", "@jest/test-result@^29.1.2", "@jest/test-result@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.3.1.tgz#92cd5099aa94be947560a24610aa76606de78f50" - integrity sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw== +"@jest/test-result@28.1.1", "@jest/test-result@^29", "@jest/test-result@^29.1.2": + version "29.1.2" + resolved "https://registry.yarnpkg.com/@jest/test-result/-/test-result-29.1.2.tgz#6a8d006eb2b31ce0287d1fc10d12b8ff8504f3c8" + integrity sha512-jjYYjjumCJjH9hHCoMhA8PCl1OxNeGgAoZ7yuGYILRJX9NjgzTN0pCT5qAoYR4jfOP8htIByvAlz9vfNSSBoVg== dependencies: - "@jest/console" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/console" "^29.1.2" + "@jest/types" "^29.1.2" "@types/istanbul-lib-coverage" "^2.0.0" collect-v8-coverage "^1.0.0" -"@jest/test-sequencer@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.3.1.tgz#fa24b3b050f7a59d48f7ef9e0b782ab65123090d" - integrity sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA== +"@jest/test-sequencer@^29.1.2": + version "29.1.2" + resolved "https://registry.yarnpkg.com/@jest/test-sequencer/-/test-sequencer-29.1.2.tgz#10bfd89c08bfdba382eb05cc79c1d23a01238a93" + integrity sha512-fU6dsUqqm8sA+cd85BmeF7Gu9DsXVWFdGn9taxM6xN1cKdcP/ivSgXh5QucFRFz1oZxKv3/9DYYbq0ULly3P/Q== dependencies: - "@jest/test-result" "^29.3.1" + "@jest/test-result" "^29.1.2" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.1.2" slash "^3.0.0" "@jest/transform@^29.1.2": @@ -2327,27 +2260,6 @@ slash "^3.0.0" write-file-atomic "^4.0.1" -"@jest/transform@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/transform/-/transform-29.3.1.tgz#1e6bd3da4af50b5c82a539b7b1f3770568d6e36d" - integrity sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug== - dependencies: - "@babel/core" "^7.11.6" - "@jest/types" "^29.3.1" - "@jridgewell/trace-mapping" "^0.3.15" - babel-plugin-istanbul "^6.1.1" - chalk "^4.0.0" - convert-source-map "^2.0.0" - fast-json-stable-stringify "^2.1.0" - graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - jest-regex-util "^29.2.0" - jest-util "^29.3.1" - micromatch "^4.0.4" - pirates "^4.0.4" - slash "^3.0.0" - write-file-atomic "^4.0.1" - "@jest/types@^29.1.2": version "29.1.2" resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.1.2.tgz#7442d32b16bcd7592d9614173078b8c334ec730a" @@ -2360,18 +2272,6 @@ "@types/yargs" "^17.0.8" chalk "^4.0.0" -"@jest/types@^29.3.1": - version "29.3.1" - resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.3.1.tgz#7c5a80777cb13e703aeec6788d044150341147e3" - integrity sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA== - dependencies: - "@jest/schemas" "^29.0.0" - "@types/istanbul-lib-coverage" "^2.0.0" - "@types/istanbul-reports" "^3.0.0" - "@types/node" "*" - "@types/yargs" "^17.0.8" - chalk "^4.0.0" - "@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": version "0.3.2" resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" @@ -5004,15 +4904,15 @@ axobject-query@^2.2.0: resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be" integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA== -babel-jest@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.3.1.tgz#05c83e0d128cd48c453eea851482a38782249f44" - integrity sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA== +babel-jest@^29.1.2: + version "29.1.2" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-29.1.2.tgz#540d3241925c55240fb0c742e3ffc5f33a501978" + integrity sha512-IuG+F3HTHryJb7gacC7SQ59A9kO56BctUsT67uJHp1mMCHUOMXpDwOHWGifWqdWVknN2WNkCVQELPjXx0aLJ9Q== dependencies: - "@jest/transform" "^29.3.1" + "@jest/transform" "^29.1.2" "@types/babel__core" "^7.1.14" babel-plugin-istanbul "^6.1.1" - babel-preset-jest "^29.2.0" + babel-preset-jest "^29.0.2" chalk "^4.0.0" graceful-fs "^4.2.9" slash "^3.0.0" @@ -5060,10 +4960,10 @@ babel-plugin-istanbul@^6.1.1: istanbul-lib-instrument "^5.0.4" test-exclude "^6.0.0" -babel-plugin-jest-hoist@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.2.0.tgz#23ee99c37390a98cfddf3ef4a78674180d823094" - integrity sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA== +babel-plugin-jest-hoist@^29.0.2: + version "29.0.2" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.0.2.tgz#ae61483a829a021b146c016c6ad39b8bcc37c2c8" + integrity sha512-eBr2ynAEFjcebVvu8Ktx580BD1QKCrBG1XwEUTXJe285p9HA/4hOhfWCFRQhTKSyBV0VzjhG7H91Eifz9s29hg== dependencies: "@babel/template" "^7.3.3" "@babel/types" "^7.3.3" @@ -5127,12 +5027,12 @@ babel-preset-current-node-syntax@^1.0.0: "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-top-level-await" "^7.8.3" -babel-preset-jest@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.2.0.tgz#3048bea3a1af222e3505e4a767a974c95a7620dc" - integrity sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA== +babel-preset-jest@^29.0.2: + version "29.0.2" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-29.0.2.tgz#e14a7124e22b161551818d89e5bdcfb3b2b0eac7" + integrity sha512-BeVXp7rH5TK96ofyEnHjznjLMQ2nAeDJ+QzxKnHAAMs0RgrQsCywjAN8m4mOm5Di0pxU//3AoEeJJrerMH5UeA== dependencies: - babel-plugin-jest-hoist "^29.2.0" + babel-plugin-jest-hoist "^29.0.2" babel-preset-current-node-syntax "^1.0.0" bail@^1.0.0: @@ -6036,11 +5936,6 @@ convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: dependencies: safe-buffer "~5.1.1" -convert-source-map@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" - integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== - cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -6621,10 +6516,10 @@ dezalgo@^1.0.0: asap "^2.0.0" wrappy "1" -diff-sequences@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.3.1.tgz#104b5b95fe725932421a9c6e5b4bef84c3f2249e" - integrity sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ== +diff-sequences@^29.0.0: + version "29.0.0" + resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.0.0.tgz#bae49972ef3933556bcb0800b72e8579d19d9e4f" + integrity sha512-7Qe/zd1wxSDL4D/X/FPjOMB+ZMDt71W94KYaq05I2l0oQqgXgs7s4ftYYmV38gBSrPz2vcygxfs1xn0FT+rKNA== diff@^4.0.1: version "4.0.2" @@ -6799,11 +6694,6 @@ emittery@^0.10.2: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.10.2.tgz#902eec8aedb8c41938c46e9385e9db7e03182933" integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== -emittery@^0.13.1: - version "0.13.1" - resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" - integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -7469,17 +7359,6 @@ expect@^29.0.0, expect@^29.1.2: jest-message-util "^29.1.2" jest-util "^29.1.2" -expect@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/expect/-/expect-29.3.1.tgz#92877aad3f7deefc2e3f6430dd195b92295554a6" - integrity sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA== - dependencies: - "@jest/expect-utils" "^29.3.1" - jest-get-type "^29.2.0" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" - express@^4.17.3: version "4.18.1" resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" @@ -9234,28 +9113,28 @@ jest-changed-files@^29.0.0: execa "^5.0.0" p-limit "^3.1.0" -jest-circus@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.3.1.tgz#177d07c5c0beae8ef2937a67de68f1e17bbf1b4a" - integrity sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg== +jest-circus@^29.1.2: + version "29.1.2" + resolved "https://registry.yarnpkg.com/jest-circus/-/jest-circus-29.1.2.tgz#4551068e432f169a53167fe1aef420cf51c8a735" + integrity sha512-ajQOdxY6mT9GtnfJRZBRYS7toNIJayiiyjDyoZcnvPRUPwJ58JX0ci0PKAKUo2C1RyzlHw0jabjLGKksO42JGA== dependencies: - "@jest/environment" "^29.3.1" - "@jest/expect" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/environment" "^29.1.2" + "@jest/expect" "^29.1.2" + "@jest/test-result" "^29.1.2" + "@jest/types" "^29.1.2" "@types/node" "*" chalk "^4.0.0" co "^4.6.0" dedent "^0.7.0" is-generator-fn "^2.0.0" - jest-each "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-runtime "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" + jest-each "^29.1.2" + jest-matcher-utils "^29.1.2" + jest-message-util "^29.1.2" + jest-runtime "^29.1.2" + jest-snapshot "^29.1.2" + jest-util "^29.1.2" p-limit "^3.1.0" - pretty-format "^29.3.1" + pretty-format "^29.1.2" slash "^3.0.0" stack-utils "^2.0.3" @@ -9278,42 +9157,42 @@ jest-cli@^29.1.2: yargs "^17.3.1" jest-config@28.1.1, jest-config@^29, jest-config@^29.1.2: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.3.1.tgz#0bc3dcb0959ff8662957f1259947aedaefb7f3c6" - integrity sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg== + version "29.1.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-29.1.2.tgz#7d004345ca4c09f5d8f802355f54494e90842f4d" + integrity sha512-EC3Zi86HJUOz+2YWQcJYQXlf0zuBhJoeyxLM6vb6qJsVmpP7KcCP1JnyF0iaqTaXdBP8Rlwsvs7hnKWQWWLwwA== dependencies: "@babel/core" "^7.11.6" - "@jest/test-sequencer" "^29.3.1" - "@jest/types" "^29.3.1" - babel-jest "^29.3.1" + "@jest/test-sequencer" "^29.1.2" + "@jest/types" "^29.1.2" + babel-jest "^29.1.2" chalk "^4.0.0" ci-info "^3.2.0" deepmerge "^4.2.2" glob "^7.1.3" graceful-fs "^4.2.9" - jest-circus "^29.3.1" - jest-environment-node "^29.3.1" - jest-get-type "^29.2.0" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-runner "^29.3.1" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-circus "^29.1.2" + jest-environment-node "^29.1.2" + jest-get-type "^29.0.0" + jest-regex-util "^29.0.0" + jest-resolve "^29.1.2" + jest-runner "^29.1.2" + jest-util "^29.1.2" + jest-validate "^29.1.2" micromatch "^4.0.4" parse-json "^5.2.0" - pretty-format "^29.3.1" + pretty-format "^29.1.2" slash "^3.0.0" strip-json-comments "^3.1.1" -jest-diff@*, jest-diff@^29, jest-diff@^29.0.3, jest-diff@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.3.1.tgz#d8215b72fed8f1e647aed2cae6c752a89e757527" - integrity sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw== +jest-diff@*, jest-diff@^29, jest-diff@^29.0.3, jest-diff@^29.1.2: + version "29.1.2" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-29.1.2.tgz#bb7aaf5353227d6f4f96c5e7e8713ce576a607dc" + integrity sha512-4GQts0aUopVvecIT4IwD/7xsBaMhKTYoM4/njE/aVw9wpw+pIUVp8Vab/KnSzSilr84GnLBkaP3JLDnQYCKqVQ== dependencies: chalk "^4.0.0" - diff-sequences "^29.3.1" - jest-get-type "^29.2.0" - pretty-format "^29.3.1" + diff-sequences "^29.0.0" + jest-get-type "^29.0.0" + pretty-format "^29.1.2" jest-docblock@^29.0.0: version "29.0.0" @@ -9322,23 +9201,16 @@ jest-docblock@^29.0.0: dependencies: detect-newline "^3.0.0" -jest-docblock@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-29.2.0.tgz#307203e20b637d97cee04809efc1d43afc641e82" - integrity sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A== - dependencies: - detect-newline "^3.0.0" - -jest-each@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.3.1.tgz#bc375c8734f1bb96625d83d1ca03ef508379e132" - integrity sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA== +jest-each@^29.1.2: + version "29.1.2" + resolved "https://registry.yarnpkg.com/jest-each/-/jest-each-29.1.2.tgz#d4c8532c07a846e79f194f7007ce7cb1987d1cd0" + integrity sha512-AmTQp9b2etNeEwMyr4jc0Ql/LIX/dhbgP21gHAizya2X6rUspHn2gysMXaj6iwWuOJ2sYRgP8c1P4cXswgvS1A== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.1.2" chalk "^4.0.0" - jest-get-type "^29.2.0" - jest-util "^29.3.1" - pretty-format "^29.3.1" + jest-get-type "^29.0.0" + jest-util "^29.1.2" + pretty-format "^29.1.2" jest-environment-node@^29.1.2: version "29.1.2" @@ -9352,22 +9224,10 @@ jest-environment-node@^29.1.2: jest-mock "^29.1.2" jest-util "^29.1.2" -jest-environment-node@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-29.3.1.tgz#5023b32472b3fba91db5c799a0d5624ad4803e74" - integrity sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag== - dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/node" "*" - jest-mock "^29.3.1" - jest-util "^29.3.1" - -jest-get-type@^29, jest-get-type@^29.0.0, jest-get-type@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.2.0.tgz#726646f927ef61d583a3b3adb1ab13f3a5036408" - integrity sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA== +jest-get-type@^29, jest-get-type@^29.0.0: + version "29.0.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-29.0.0.tgz#843f6c50a1b778f7325df1129a0fd7aa713aef80" + integrity sha512-83X19z/HuLKYXYHskZlBAShO7UfLFXu/vWajw9ZNJASN32li8yHMaVGAQqxFW1RCFOkB7cubaL6FaJVQqqJLSw== jest-haste-map@^29.1.2: version "29.1.2" @@ -9388,25 +9248,6 @@ jest-haste-map@^29.1.2: optionalDependencies: fsevents "^2.3.2" -jest-haste-map@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-29.3.1.tgz#af83b4347f1dae5ee8c2fb57368dc0bb3e5af843" - integrity sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A== - dependencies: - "@jest/types" "^29.3.1" - "@types/graceful-fs" "^4.1.3" - "@types/node" "*" - anymatch "^3.0.3" - fb-watchman "^2.0.0" - graceful-fs "^4.2.9" - jest-regex-util "^29.2.0" - jest-util "^29.3.1" - jest-worker "^29.3.1" - micromatch "^4.0.4" - walker "^1.0.8" - optionalDependencies: - fsevents "^2.3.2" - jest-leak-detector@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.1.2.tgz#4c846db14c58219430ccbc4f01a1ec52ebee4fc2" @@ -9415,23 +9256,15 @@ jest-leak-detector@^29.1.2: jest-get-type "^29.0.0" pretty-format "^29.1.2" -jest-leak-detector@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-29.3.1.tgz#95336d020170671db0ee166b75cd8ef647265518" - integrity sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA== - dependencies: - jest-get-type "^29.2.0" - pretty-format "^29.3.1" - -jest-matcher-utils@^29, jest-matcher-utils@^29.1.2, jest-matcher-utils@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz#6e7f53512f80e817dfa148672bd2d5d04914a572" - integrity sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ== +jest-matcher-utils@^29, jest-matcher-utils@^29.1.2: + version "29.1.2" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-29.1.2.tgz#e68c4bcc0266e70aa1a5c13fb7b8cd4695e318a1" + integrity sha512-MV5XrD3qYSW2zZSHRRceFzqJ39B2z11Qv0KPyZYxnzDHFeYZGJlgGi0SW+IXSJfOewgJp/Km/7lpcFT+cgZypw== dependencies: chalk "^4.0.0" - jest-diff "^29.3.1" - jest-get-type "^29.2.0" - pretty-format "^29.3.1" + jest-diff "^29.1.2" + jest-get-type "^29.0.0" + pretty-format "^29.1.2" jest-message-util@^29.1.2: version "29.1.2" @@ -9448,21 +9281,6 @@ jest-message-util@^29.1.2: slash "^3.0.0" stack-utils "^2.0.3" -jest-message-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-29.3.1.tgz#37bc5c468dfe5120712053dd03faf0f053bd6adb" - integrity sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA== - dependencies: - "@babel/code-frame" "^7.12.13" - "@jest/types" "^29.3.1" - "@types/stack-utils" "^2.0.0" - chalk "^4.0.0" - graceful-fs "^4.2.9" - micromatch "^4.0.4" - pretty-format "^29.3.1" - slash "^3.0.0" - stack-utils "^2.0.3" - jest-mock@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.1.2.tgz#de47807edbb9d4abf8423f1d8d308d670105678c" @@ -9472,15 +9290,6 @@ jest-mock@^29.1.2: "@types/node" "*" jest-util "^29.1.2" -jest-mock@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-29.3.1.tgz#60287d92e5010979d01f218c6b215b688e0f313e" - integrity sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA== - dependencies: - "@jest/types" "^29.3.1" - "@types/node" "*" - jest-util "^29.3.1" - jest-pnp-resolver@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz#b704ac0ae028a89108a4d040b3f919dfddc8e33c" @@ -9491,11 +9300,6 @@ jest-regex-util@^29.0.0: resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.0.0.tgz#b442987f688289df8eb6c16fa8df488b4cd007de" integrity sha512-BV7VW7Sy0fInHWN93MMPtlClweYv2qrSCwfeFWmpribGZtQPWNvRSq9XOVgOEjU1iBGRKXUZil0o2AH7Iy9Lug== -jest-regex-util@^29.2.0: - version "29.2.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-29.2.0.tgz#82ef3b587e8c303357728d0322d48bbfd2971f7b" - integrity sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA== - jest-resolve-dependencies@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-29.1.2.tgz#a6919e58a0c7465582cb8ec2d745b4e64ae8647f" @@ -9504,17 +9308,17 @@ jest-resolve-dependencies@^29.1.2: jest-regex-util "^29.0.0" jest-snapshot "^29.1.2" -jest-resolve@28.1.1, jest-resolve@^29, jest-resolve@^29.1.2, jest-resolve@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.3.1.tgz#9a4b6b65387a3141e4a40815535c7f196f1a68a7" - integrity sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw== +jest-resolve@28.1.1, jest-resolve@^29, jest-resolve@^29.1.2: + version "29.1.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-29.1.2.tgz#9dd8c2fc83e59ee7d676b14bd45a5f89e877741d" + integrity sha512-7fcOr+k7UYSVRJYhSmJHIid3AnDBcLQX3VmT9OSbPWsWz1MfT7bcoerMhADKGvKCoMpOHUQaDHtQoNp/P9JMGg== dependencies: chalk "^4.0.0" graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" + jest-haste-map "^29.1.2" jest-pnp-resolver "^1.2.2" - jest-util "^29.3.1" - jest-validate "^29.3.1" + jest-util "^29.1.2" + jest-validate "^29.1.2" resolve "^1.20.0" resolve.exports "^1.1.0" slash "^3.0.0" @@ -9546,33 +9350,6 @@ jest-runner@^29.1.2: p-limit "^3.1.0" source-map-support "0.5.13" -jest-runner@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-29.3.1.tgz#a92a879a47dd096fea46bb1517b0a99418ee9e2d" - integrity sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA== - dependencies: - "@jest/console" "^29.3.1" - "@jest/environment" "^29.3.1" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/node" "*" - chalk "^4.0.0" - emittery "^0.13.1" - graceful-fs "^4.2.9" - jest-docblock "^29.2.0" - jest-environment-node "^29.3.1" - jest-haste-map "^29.3.1" - jest-leak-detector "^29.3.1" - jest-message-util "^29.3.1" - jest-resolve "^29.3.1" - jest-runtime "^29.3.1" - jest-util "^29.3.1" - jest-watcher "^29.3.1" - jest-worker "^29.3.1" - p-limit "^3.1.0" - source-map-support "0.5.13" - jest-runtime@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.1.2.tgz#dbcd57103d61115479108d5864bdcd661d9c6783" @@ -9601,38 +9378,10 @@ jest-runtime@^29.1.2: slash "^3.0.0" strip-bom "^4.0.0" -jest-runtime@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-29.3.1.tgz#21efccb1a66911d6d8591276a6182f520b86737a" - integrity sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A== - dependencies: - "@jest/environment" "^29.3.1" - "@jest/fake-timers" "^29.3.1" - "@jest/globals" "^29.3.1" - "@jest/source-map" "^29.2.0" - "@jest/test-result" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/node" "*" - chalk "^4.0.0" - cjs-module-lexer "^1.0.0" - collect-v8-coverage "^1.0.0" - glob "^7.1.3" - graceful-fs "^4.2.9" - jest-haste-map "^29.3.1" - jest-message-util "^29.3.1" - jest-mock "^29.3.1" - jest-regex-util "^29.2.0" - jest-resolve "^29.3.1" - jest-snapshot "^29.3.1" - jest-util "^29.3.1" - slash "^3.0.0" - strip-bom "^4.0.0" - -jest-snapshot@*, jest-snapshot@^29, jest-snapshot@^29.0.0, jest-snapshot@^29.0.3, jest-snapshot@^29.1.2, jest-snapshot@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.3.1.tgz#17bcef71a453adc059a18a32ccbd594b8cc4e45e" - integrity sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA== +jest-snapshot@*, jest-snapshot@^29, jest-snapshot@^29.0.0, jest-snapshot@^29.0.3, jest-snapshot@^29.1.2: + version "29.1.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-29.1.2.tgz#7dd277e88c45f2d2ff5888de1612e63c7ceb575b" + integrity sha512-rYFomGpVMdBlfwTYxkUp3sjD6usptvZcONFYNqVlaz4EpHPnDvlWjvmOQ9OCSNKqYZqLM2aS3wq01tWujLg7gg== dependencies: "@babel/core" "^7.11.6" "@babel/generator" "^7.7.2" @@ -9640,23 +9389,23 @@ jest-snapshot@*, jest-snapshot@^29, jest-snapshot@^29.0.0, jest-snapshot@^29.0.3 "@babel/plugin-syntax-typescript" "^7.7.2" "@babel/traverse" "^7.7.2" "@babel/types" "^7.3.3" - "@jest/expect-utils" "^29.3.1" - "@jest/transform" "^29.3.1" - "@jest/types" "^29.3.1" + "@jest/expect-utils" "^29.1.2" + "@jest/transform" "^29.1.2" + "@jest/types" "^29.1.2" "@types/babel__traverse" "^7.0.6" "@types/prettier" "^2.1.5" babel-preset-current-node-syntax "^1.0.0" chalk "^4.0.0" - expect "^29.3.1" + expect "^29.1.2" graceful-fs "^4.2.9" - jest-diff "^29.3.1" - jest-get-type "^29.2.0" - jest-haste-map "^29.3.1" - jest-matcher-utils "^29.3.1" - jest-message-util "^29.3.1" - jest-util "^29.3.1" + jest-diff "^29.1.2" + jest-get-type "^29.0.0" + jest-haste-map "^29.1.2" + jest-matcher-utils "^29.1.2" + jest-message-util "^29.1.2" + jest-util "^29.1.2" natural-compare "^1.4.0" - pretty-format "^29.3.1" + pretty-format "^29.1.2" semver "^7.3.5" jest-specific-snapshot@*, jest-specific-snapshot@^7.0.0: @@ -9666,12 +9415,12 @@ jest-specific-snapshot@*, jest-specific-snapshot@^7.0.0: dependencies: jest-snapshot "^29.0.0" -jest-util@28.1.1, jest-util@^29, jest-util@^29.1.2, jest-util@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.3.1.tgz#1dda51e378bbcb7e3bc9d8ab651445591ed373e1" - integrity sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ== +jest-util@28.1.1, jest-util@^29, jest-util@^29.1.2: + version "29.1.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.1.2.tgz#ac5798e93cb6a6703084e194cfa0898d66126df1" + integrity sha512-vPCk9F353i0Ymx3WQq3+a4lZ07NXu9Ca8wya6o4Fe4/aO1e1awMMprZ3woPFpKwghEOW+UXgd15vVotuNN9ONQ== dependencies: - "@jest/types" "^29.3.1" + "@jest/types" "^29.1.2" "@types/node" "*" chalk "^4.0.0" ci-info "^3.2.0" @@ -9690,18 +9439,6 @@ jest-validate@^29.1.2: leven "^3.1.0" pretty-format "^29.1.2" -jest-validate@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-29.3.1.tgz#d56fefaa2e7d1fde3ecdc973c7f7f8f25eea704a" - integrity sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g== - dependencies: - "@jest/types" "^29.3.1" - camelcase "^6.2.0" - chalk "^4.0.0" - jest-get-type "^29.2.0" - leven "^3.1.0" - pretty-format "^29.3.1" - jest-watcher@^29.1.2: version "29.1.2" resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.1.2.tgz#de21439b7d889e2fcf62cc2a4779ef1a3f1f3c62" @@ -9716,20 +9453,6 @@ jest-watcher@^29.1.2: jest-util "^29.1.2" string-length "^4.0.1" -jest-watcher@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-watcher/-/jest-watcher-29.3.1.tgz#3341547e14fe3c0f79f9c3a4c62dbc3fc977fd4a" - integrity sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg== - dependencies: - "@jest/test-result" "^29.3.1" - "@jest/types" "^29.3.1" - "@types/node" "*" - ansi-escapes "^4.2.1" - chalk "^4.0.0" - emittery "^0.13.1" - jest-util "^29.3.1" - string-length "^4.0.1" - jest-worker@^26.2.1: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed" @@ -9758,16 +9481,6 @@ jest-worker@^29.1.2: merge-stream "^2.0.0" supports-color "^8.0.0" -jest-worker@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.3.1.tgz#e9462161017a9bb176380d721cab022661da3d6b" - integrity sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw== - dependencies: - "@types/node" "*" - jest-util "^29.3.1" - merge-stream "^2.0.0" - supports-color "^8.0.0" - jest@^29.0.3: version "29.1.2" resolved "https://registry.yarnpkg.com/jest/-/jest-29.1.2.tgz#f821a1695ffd6cd0efc3b59d2dfcc70a98582499" @@ -12061,10 +11774,10 @@ pretty-error@^4.0.0: lodash "^4.17.20" renderkid "^3.0.0" -pretty-format@*, pretty-format@^29, pretty-format@^29.0.0, pretty-format@^29.0.3, pretty-format@^29.1.2, pretty-format@^29.3.1: - version "29.3.1" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.3.1.tgz#1841cac822b02b4da8971dacb03e8a871b4722da" - integrity sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg== +pretty-format@*, pretty-format@^29, pretty-format@^29.0.0, pretty-format@^29.0.3, pretty-format@^29.1.2: + version "29.1.2" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-29.1.2.tgz#b1f6b75be7d699be1a051f5da36e8ae9e76a8e6a" + integrity sha512-CGJ6VVGXVRP2o2Dorl4mAwwvDWT25luIsYhkyVQW32E4nL+TgW939J7LlKT/npq5Cpq6j3s+sy+13yk7xYpBmg== dependencies: "@jest/schemas" "^29.0.0" ansi-styles "^5.0.0" @@ -13677,6 +13390,14 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" +supports-hyperlinks@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/supports-hyperlinks/-/supports-hyperlinks-2.2.0.tgz#4f77b42488765891774b70c79babd87f9bd594bb" + integrity sha512-6sXEzV5+I5j8Bmq9/vUphGRM/RJNT9SCURJLjwfOg51heRtguGWDzcaBlgAzKhQa0EVNpPEKzQuBwZ8S8WaCeQ== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" @@ -13753,6 +13474,14 @@ tempy@^0.6.0: type-fest "^0.16.0" unique-string "^2.0.0" +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/terminal-link/-/terminal-link-2.1.1.tgz#14a64a27ab3c0df933ea546fba55f2d078edc994" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.3.3: version "5.3.3" resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz#8033db876dd5875487213e87c627bca323e5ed90" From 5407105ba2f475cc6b83aa53ab77f753171a169d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sun, 5 Feb 2023 15:38:39 +0100 Subject: [PATCH 50/64] chore: renamed readonlyness allowlist to just allow --- .../rules/prefer-readonly-parameter-types.md | 6 ++--- .../rules/prefer-readonly-parameter-types.ts | 10 ++++---- .../prefer-readonly-parameter-types.test.ts | 24 +++++++++---------- packages/type-utils/src/isTypeReadonly.ts | 8 +++---- .../type-utils/tests/isTypeReadonly.test.ts | 2 +- 5 files changed, 24 insertions(+), 26 deletions(-) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index 2cff7b3fca89..1d8dd1628397 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -129,7 +129,7 @@ interface Foo { ## Options -### `allowlist` +### `allow` Some complex types cannot easily be made readonly, for example the `HTMLElement` type or the `JQueryStatic` type from `@types/jquery`. This option allows you to globally disable reporting of such types. @@ -148,7 +148,7 @@ Examples of code for this rule with: ```json { - "allowlist": [ + "allow": [ { "source": "file", "name": "Foo" }, { "source": "lib", "name": "HTMLElement" }, { "from": "package", "name": "Bar", "source": "bar-lib" } @@ -204,7 +204,7 @@ interface Wrapper { readonly otherProp: string; } -function fn1(arg: Foo) {} // Works because Foo is allowlisted +function fn1(arg: Foo) {} // Works because Foo is allowed function fn2(arg: Wrapper) {} // Works even when Foo is nested somewhere in the type, with other properties still being checked ``` diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index 57557cca5ba6..2b4abe4f4a8a 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -5,7 +5,7 @@ import * as util from '../util'; type Options = [ { - allowlist?: Array; + allow?: Array; checkParameterProperties?: boolean; ignoreInferredTypes?: boolean; treatMethodsAsReadonly?: boolean; @@ -28,7 +28,7 @@ export default util.createRule({ type: 'object', additionalProperties: false, properties: { - allowlist: util.readonlynessOptionsSchema.properties.allowlist, + allow: util.readonlynessOptionsSchema.properties.allow, checkParameterProperties: { type: 'boolean', }, @@ -46,7 +46,7 @@ export default util.createRule({ }, defaultOptions: [ { - allowlist: util.readonlynessOptionsDefaults.allowlist, + allow: util.readonlynessOptionsDefaults.allow, checkParameterProperties: true, ignoreInferredTypes: false, treatMethodsAsReadonly: @@ -57,7 +57,7 @@ export default util.createRule({ context, [ { - allowlist, + allow, checkParameterProperties, ignoreInferredTypes, treatMethodsAsReadonly, @@ -109,7 +109,7 @@ export default util.createRule({ const type = services.getTypeAtLocation(actualParam); const isReadOnly = util.isTypeReadonly(services.program, type, { treatMethodsAsReadonly: treatMethodsAsReadonly!, - allowlist, + allow, }); if (!isReadOnly) { diff --git a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts index 9da20bd8147c..df2e6c95355c 100644 --- a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts @@ -412,7 +412,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ from: 'lib', name: 'RegExp' }], + allow: [{ from: 'lib', name: 'RegExp' }], }, ], }, @@ -426,7 +426,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ from: 'lib', name: 'RegExp' }], + allow: [{ from: 'lib', name: 'RegExp' }], }, ], }, @@ -440,7 +440,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ from: 'file', name: 'Foo' }], + allow: [{ from: 'file', name: 'Foo' }], }, ], }, @@ -457,7 +457,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ from: 'file', name: 'Foo' }], + allow: [{ from: 'file', name: 'Foo' }], }, ], }, @@ -474,7 +474,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ from: 'file', name: 'Bar' }], + allow: [{ from: 'file', name: 'Bar' }], }, ], }, @@ -953,7 +953,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ from: 'file', name: 'Foo' }], + allow: [{ from: 'file', name: 'Foo' }], }, ], errors: [ @@ -975,7 +975,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ from: 'file', name: 'Bar' }], + allow: [{ from: 'file', name: 'Bar' }], }, ], errors: [ @@ -997,7 +997,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ from: 'lib', name: 'Foo' }], + allow: [{ from: 'lib', name: 'Foo' }], }, ], errors: [ @@ -1019,7 +1019,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ from: 'package', name: 'Foo', source: 'foo-lib' }], + allow: [{ from: 'package', name: 'Foo', source: 'foo-lib' }], }, ], errors: [ @@ -1037,7 +1037,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [{ from: 'file', name: 'RegExp' }], + allow: [{ from: 'file', name: 'RegExp' }], }, ], errors: [ @@ -1055,9 +1055,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allowlist: [ - { from: 'package', name: 'RegExp', source: 'regexp-lib' }, - ], + allow: [{ from: 'package', name: 'RegExp', source: 'regexp-lib' }], }, ], errors: [ diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index e633ad1243bc..5adc11ab7ad8 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -28,7 +28,7 @@ const enum Readonlyness { export interface ReadonlynessOptions { readonly treatMethodsAsReadonly?: boolean; - readonly allowlist?: Array; + readonly allow?: Array; } export const readonlynessOptionsSchema = { @@ -38,7 +38,7 @@ export const readonlynessOptionsSchema = { treatMethodsAsReadonly: { type: 'boolean', }, - allowlist: { + allow: { type: 'array', items: typeOrValueSpecifierSchema, }, @@ -47,7 +47,7 @@ export const readonlynessOptionsSchema = { export const readonlynessOptionsDefaults: ReadonlynessOptions = { treatMethodsAsReadonly: false, - allowlist: [], + allow: [], }; function hasSymbol(node: ts.Node): node is ts.Node & { symbol: ts.Symbol } { @@ -237,7 +237,7 @@ function isTypeReadonlyRecurser( seenTypes.add(type); if ( - options.allowlist?.some(specifier => + options.allow?.some(specifier => typeMatchesSpecifier(type, specifier, program), ) ) { diff --git a/packages/type-utils/tests/isTypeReadonly.test.ts b/packages/type-utils/tests/isTypeReadonly.test.ts index c556a9760767..4b204a809866 100644 --- a/packages/type-utils/tests/isTypeReadonly.test.ts +++ b/packages/type-utils/tests/isTypeReadonly.test.ts @@ -313,7 +313,7 @@ describe('isTypeReadonly', () => { describe('allowlist', () => { const options: ReadonlynessOptions = { - allowlist: [ + allow: [ { from: 'lib', name: 'RegExp', From b9f785c70e0df0bf096fe25c612da8651b214ae3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sun, 5 Feb 2023 15:55:40 +0100 Subject: [PATCH 51/64] fix(type-utils): fixed services.program now being optional and not checked in tests --- packages/type-utils/tests/TypeOrValueSpecifier.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts index 2b384caa2ce7..2fbb24aa2f77 100644 --- a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts +++ b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts @@ -151,14 +151,14 @@ describe('TypeOrValueSpecifier', () => { filePath: path.join(rootDir, 'file.ts'), tsconfigRootDir: rootDir, }); - const type = services.program - .getTypeChecker() + const type = services + .program!.getTypeChecker() .getTypeAtLocation( services.esTreeNodeToTSNodeMap.get( (ast.body[0] as TSESTree.TSTypeAliasDeclaration).id, ), ); - expect(typeMatchesSpecifier(type, specifier, services.program)).toBe( + expect(typeMatchesSpecifier(type, specifier, services.program!)).toBe( expected, ); } From 8626d16e11541d2d62561dbfe233abdabe94e806 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Sun, 5 Feb 2023 17:13:43 +0100 Subject: [PATCH 52/64] test(type-utils): negative tests for isTypeReadonly --- .../type-utils/tests/isTypeReadonly.test.ts | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/type-utils/tests/isTypeReadonly.test.ts b/packages/type-utils/tests/isTypeReadonly.test.ts index 4b204a809866..2adfaaec7aa8 100644 --- a/packages/type-utils/tests/isTypeReadonly.test.ts +++ b/packages/type-utils/tests/isTypeReadonly.test.ts @@ -329,15 +329,32 @@ describe('isTypeReadonly', () => { runTestForAliasDeclaration(code, options, true); } - describe('is readonly', () => { - const runTests = runTestIsReadonly; + function runTestIsNotReadonly(code: string): void { + runTestForAliasDeclaration(code, options, false); + } + describe('is readonly', () => { it.each([ [ - 'interface Bar {readonly prop: RegExp}; type Test = (arg: Bar) => void;', + 'interface Foo {readonly prop: RegExp}; type Test = (arg: Foo) => void;', + ], + [ + 'interface Foo {prop: RegExp}; type Test = (arg: Readonly) => void;', ], ['interface Foo {prop: string}; type Test = (arg: Foo) => void;'], - ])('correctly marks allowlisted types as readonly', runTests); + ])('correctly marks allowlisted types as readonly', runTestIsReadonly); + }); + + describe('is not readonly', () => { + it.each([ + [ + 'interface Bar {prop: RegExp}; type Test = (arg: Readonly) => void;', + ], + ['interface Bar {prop: string}; type Test = (arg: Bar) => void;'], + ])( + 'correctly marks allowlisted types as readonly', + runTestIsNotReadonly, + ); }); }); }); From 235acd32a5f9747975619129d5945dabae04984c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Mon, 20 Feb 2023 10:40:25 +0100 Subject: [PATCH 53/64] fix(eslint-plugin): bracket style array notation Co-authored-by: Josh Goldberg --- .../eslint-plugin/src/rules/prefer-readonly-parameter-types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts index 2b4abe4f4a8a..a0219130a816 100644 --- a/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts +++ b/packages/eslint-plugin/src/rules/prefer-readonly-parameter-types.ts @@ -5,7 +5,7 @@ import * as util from '../util'; type Options = [ { - allow?: Array; + allow?: util.TypeOrValueSpecifier[]; checkParameterProperties?: boolean; ignoreInferredTypes?: boolean; treatMethodsAsReadonly?: boolean; From 0bd760190105601ea6be6a78115fb87dbadbeb47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Mon, 6 Mar 2023 14:53:06 +0100 Subject: [PATCH 54/64] fix(type-utils): Fixed array style --- packages/type-utils/src/TypeOrValueSpecifier.ts | 13 +++++-------- packages/type-utils/src/isTypeReadonly.ts | 2 +- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/packages/type-utils/src/TypeOrValueSpecifier.ts b/packages/type-utils/src/TypeOrValueSpecifier.ts index e0dedac4c8f1..c01d6a00980a 100644 --- a/packages/type-utils/src/TypeOrValueSpecifier.ts +++ b/packages/type-utils/src/TypeOrValueSpecifier.ts @@ -3,18 +3,18 @@ import type * as ts from 'typescript'; interface FileSpecifier { from: 'file'; - name: string | Array; + name: string | string[]; source?: string; } interface LibSpecifier { from: 'lib'; - name: string | Array; + name: string | string[]; } interface PackageSpecifier { from: 'package'; - name: string | Array; + name: string | string[]; source: string; } @@ -135,10 +135,7 @@ export const typeOrValueSpecifierSchema = { ], }; -function specifierNameMatches( - type: ts.Type, - name: string | Array, -): boolean { +function specifierNameMatches(type: ts.Type, name: string | string[]): boolean { if (typeof name === 'string') { name = [name]; } @@ -147,7 +144,7 @@ function specifierNameMatches( function typeDeclaredInFile( relativePath: string | undefined, - declarationFiles: Array, + declarationFiles: ts.SourceFile[], program: ts.Program, ): boolean { if (relativePath === undefined) { diff --git a/packages/type-utils/src/isTypeReadonly.ts b/packages/type-utils/src/isTypeReadonly.ts index cc876b344a50..16eeb73449c8 100644 --- a/packages/type-utils/src/isTypeReadonly.ts +++ b/packages/type-utils/src/isTypeReadonly.ts @@ -20,7 +20,7 @@ const enum Readonlyness { export interface ReadonlynessOptions { readonly treatMethodsAsReadonly?: boolean; - readonly allow?: Array; + readonly allow?: TypeOrValueSpecifier[]; } export const readonlynessOptionsSchema = { From 0136e5b6d9e3082f1fec5d8763f0565fc96a32b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Mon, 6 Mar 2023 15:06:30 +0100 Subject: [PATCH 55/64] fix(type-utils): Not fetching symbol repeatedly --- packages/type-utils/src/TypeOrValueSpecifier.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/type-utils/src/TypeOrValueSpecifier.ts b/packages/type-utils/src/TypeOrValueSpecifier.ts index c01d6a00980a..3ce9edb354d4 100644 --- a/packages/type-utils/src/TypeOrValueSpecifier.ts +++ b/packages/type-utils/src/TypeOrValueSpecifier.ts @@ -139,7 +139,11 @@ function specifierNameMatches(type: ts.Type, name: string | string[]): boolean { if (typeof name === 'string') { name = [name]; } - return name.some(item => item === type.getSymbol()?.escapedName); + const symbol = type.getSymbol(); + if (symbol === undefined) { + return false; + } + return name.some(item => item === symbol.escapedName); } function typeDeclaredInFile( From 386fd03e86508fe0a2debb0412fabbbc2c784cee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Tue, 7 Mar 2023 10:06:15 +0100 Subject: [PATCH 56/64] fix(type-utils): Remove ManySpecifiers format from TypeOrValueSpecifier schema --- .../type-utils/src/TypeOrValueSpecifier.ts | 19 --------------- .../tests/TypeOrValueSpecifier.test.ts | 24 ++++--------------- 2 files changed, 4 insertions(+), 39 deletions(-) diff --git a/packages/type-utils/src/TypeOrValueSpecifier.ts b/packages/type-utils/src/TypeOrValueSpecifier.ts index 3ce9edb354d4..9f8b7c9abd7a 100644 --- a/packages/type-utils/src/TypeOrValueSpecifier.ts +++ b/packages/type-utils/src/TypeOrValueSpecifier.ts @@ -113,25 +113,6 @@ export const typeOrValueSpecifierSchema = { }, required: ['from', 'name', 'source'], }, - { - type: 'object', - additionalProperties: false, - properties: { - from: { - type: 'array', - minItems: 1, - uniqueItems: true, - items: { - type: 'string', - enum: ['file', 'lib', 'package'], - }, - }, - name: { - type: 'string', - }, - }, - required: ['from', 'name'], - }, ], }; diff --git a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts index 2fbb24aa2f77..8f8d9800ad7c 100644 --- a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts +++ b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts @@ -101,6 +101,10 @@ describe('TypeOrValueSpecifier', () => { [{ from: 'package', name: 'MyType' }], [{ from: 'package', source: './filename.js' }], [{ from: 'package', name: 'MyType', source: 42 }], + [{ from: [], name: 'MyType' }], + [{ from: ['file'], name: 'MyType' }], + [{ from: ['lib'], name: 'MyType' }], + [{ from: ['package'], name: 'MyType' }], [ { from: 'package', @@ -117,26 +121,6 @@ describe('TypeOrValueSpecifier', () => { }, ], ])("doesn't match a malformed package specifier", runTestNegative); - - it.each([ - [{ from: ['file'], name: 'MyType' }], - [{ from: ['lib'], name: 'MyType' }], - [{ from: ['package'], name: 'MyType' }], - [{ from: ['file', 'lib'], name: 'MyType' }], - [{ from: ['file', 'package'], name: 'MyType' }], - [{ from: ['lib', 'package'], name: 'MyType' }], - [{ from: ['file', 'lib', 'package'], name: 'MyType' }], - ])('matches a multi-source specifier', runTestPositive); - - it.each([ - [{ from: [], name: 'MyType' }], - [{ from: ['invalid'], name: 'MyType' }], - [{ from: ['file', 'invalid'], name: 'MyType' }], - [{ from: ['file', 'file'], name: 'MyType' }], - [{ from: ['file'], name: 42 }], - [{ from: ['file'] }], - [{ from: ['file'], name: 'MyType', unrelatedProperty: '' }], - ])("doesn't match a malformed multi-source specifier", runTestNegative); }); describe('typeMatchesSpecifier', () => { From ed1e07a69da7a3cb3a1cd462160667d023c7d224 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Tue, 7 Mar 2023 10:13:49 +0100 Subject: [PATCH 57/64] docs(eslint-plugin): [prefer-readonly-parameter-types] described file specifier path as being relative --- .../eslint-plugin/docs/rules/prefer-readonly-parameter-types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index 1d8dd1628397..acfab64b6674 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -135,7 +135,7 @@ Some complex types cannot easily be made readonly, for example the `HTMLElement` Each item must be one of: -- A type defined in a file (`{from: "file", name: "Foo", source: "src/foo-file.ts"}` with `source` being optional) +- A type defined in a file (`{from: "file", name: "Foo", source: "src/foo-file.ts"}` with `source` being an optional path relative to the project root directory) - A type from the default library (`{from: "lib", name: "Foo"}`) - A type from a package (`{from: "package", name: "Foo", source: "foo-lib"}`, this also works for types defined in a typings package). From 346fdbc1c2cfe63a6cd006c22b652d536332cefc Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Mon, 13 Mar 2023 16:14:53 -0400 Subject: [PATCH 58/64] path and package --- packages/type-utils/src/TypeOrValueSpecifier.ts | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/type-utils/src/TypeOrValueSpecifier.ts b/packages/type-utils/src/TypeOrValueSpecifier.ts index 9f8b7c9abd7a..4fac69ea1065 100644 --- a/packages/type-utils/src/TypeOrValueSpecifier.ts +++ b/packages/type-utils/src/TypeOrValueSpecifier.ts @@ -4,7 +4,7 @@ import type * as ts from 'typescript'; interface FileSpecifier { from: 'file'; name: string | string[]; - source?: string; + path?: string; } interface LibSpecifier { @@ -15,7 +15,7 @@ interface LibSpecifier { interface PackageSpecifier { from: 'package'; name: string | string[]; - source: string; + package: string; } export type TypeOrValueSpecifier = @@ -52,7 +52,7 @@ export const typeOrValueSpecifierSchema = { }, ], }, - source: { + path: { type: 'string', }, }, @@ -107,11 +107,11 @@ export const typeOrValueSpecifierSchema = { }, ], }, - source: { + package: { type: 'string', }, }, - required: ['from', 'name', 'source'], + required: ['from', 'name', 'package'], }, ], }; @@ -161,7 +161,7 @@ export function typeMatchesSpecifier( ?.map(declaration => declaration.getSourceFile()) ?? []; switch (specifier.from) { case 'file': - return typeDeclaredInFile(specifier.source, declarationFiles, program); + return typeDeclaredInFile(specifier.path, declarationFiles, program); case 'lib': return declarationFiles.some(declaration => program.isSourceFileDefaultLibrary(declaration), @@ -169,9 +169,9 @@ export function typeMatchesSpecifier( case 'package': return declarationFiles.some( declaration => - declaration.fileName.includes(`node_modules/${specifier.source}/`) || + declaration.fileName.includes(`node_modules/${specifier.package}/`) || declaration.fileName.includes( - `node_modules/@types/${specifier.source}/`, + `node_modules/@types/${specifier.package}/`, ), ); } From 609351ede16a4dd6a1eac67a48c38e6f59943299 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Mon, 13 Mar 2023 16:15:40 -0400 Subject: [PATCH 59/64] Update docs too --- .../docs/rules/prefer-readonly-parameter-types.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index acfab64b6674..d043c9d72ebd 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -135,20 +135,18 @@ Some complex types cannot easily be made readonly, for example the `HTMLElement` Each item must be one of: -- A type defined in a file (`{from: "file", name: "Foo", source: "src/foo-file.ts"}` with `source` being an optional path relative to the project root directory) +- A type defined in a file (`{from: "file", name: "Foo", path: "src/foo-file.ts"}` with `path` being an optional path relative to the project root directory) - A type from the default library (`{from: "lib", name: "Foo"}`) -- A type from a package (`{from: "package", name: "Foo", source: "foo-lib"}`, this also works for types defined in a typings package). +- A type from a package (`{from: "package", name: "Foo", package: "foo-lib"}`, this also works for types defined in a typings package). -Two additional formats are supported: - -- Multiple sources, as an array for `from` (`{from: ["file", "package"], name: "Foo"}`) -- A type may be defined just as a simple string, which then matches the type independently of its origin. +Additionally, a type may be defined just as a simple string, which then matches the type independently of its origin. Examples of code for this rule with: ```json { "allow": [ + "$", { "source": "file", "name": "Foo" }, { "source": "lib", "name": "HTMLElement" }, { "from": "package", "name": "Bar", "source": "bar-lib" } From a535fb69132f54af0e61d6b9cec81ee5807b9c8a Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Mon, 13 Mar 2023 16:16:03 -0400 Subject: [PATCH 60/64] Update docs too (again) --- .../eslint-plugin/docs/rules/prefer-readonly-parameter-types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md index d043c9d72ebd..703b16fa3f00 100644 --- a/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md +++ b/packages/eslint-plugin/docs/rules/prefer-readonly-parameter-types.md @@ -149,7 +149,7 @@ Examples of code for this rule with: "$", { "source": "file", "name": "Foo" }, { "source": "lib", "name": "HTMLElement" }, - { "from": "package", "name": "Bar", "source": "bar-lib" } + { "from": "package", "name": "Bar", "package": "bar-lib" } ] } ``` From 95bbaa5a4a59c696ee851b7f7fb593fe633aebbd Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Mon, 13 Mar 2023 17:00:23 -0400 Subject: [PATCH 61/64] Added test name helpers, and fixed test data --- .../tests/TypeOrValueSpecifier.test.ts | 84 +++++++++---------- 1 file changed, 42 insertions(+), 42 deletions(-) diff --git a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts index 8f8d9800ad7c..7cca677f6a37 100644 --- a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts +++ b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts @@ -23,7 +23,7 @@ describe('TypeOrValueSpecifier', () => { } it.each([['MyType'], ['myValue'], ['any'], ['void'], ['never']])( - 'matches a simple string specifier', + 'matches a simple string specifier %s', runTestPositive, ); @@ -34,38 +34,38 @@ describe('TypeOrValueSpecifier', () => { [undefined], [['MyType']], [(): void => {}], - ])("doesn't match any non-string basic type", runTestNegative); + ])("doesn't match any non-string basic type: %s", runTestNegative); it.each([ [{ from: 'file', name: 'MyType' }], [{ from: 'file', name: ['MyType', 'myValue'] }], - [{ from: 'file', name: 'MyType', source: './filename.js' }], - [{ from: 'file', name: ['MyType', 'myValue'], source: './filename.js' }], - ])('matches a file specifier', runTestPositive); + [{ from: 'file', name: 'MyType', path: './filename.js' }], + [{ from: 'file', name: ['MyType', 'myValue'], path: './filename.js' }], + ])('matches a file specifier: %s', runTestPositive); it.each([ [{ from: 'file', name: 42 }], [{ from: 'file', name: ['MyType', 42] }], [{ from: 'file', name: ['MyType', 'MyType'] }], [{ from: 'file', name: [] }], - [{ from: 'file', source: './filename.js' }], - [{ from: 'file', name: 'MyType', source: 42 }], - [{ from: 'file', name: ['MyType', 'MyType'], source: './filename.js' }], - [{ from: 'file', name: [], source: './filename.js' }], + [{ from: 'file', path: './filename.js' }], + [{ from: 'file', name: 'MyType', path: 42 }], + [{ from: 'file', name: ['MyType', 'MyType'], path: './filename.js' }], + [{ from: 'file', name: [], path: './filename.js' }], [ { from: 'file', name: ['MyType', 'myValue'], - source: ['./filename.js', './another-file.js'], + path: ['./filename.js', './another-file.js'], }, ], [{ from: 'file', name: 'MyType', unrelatedProperty: '' }], - ])("doesn't match a malformed file specifier", runTestNegative); + ])("doesn't match a malformed file specifier: %s", runTestNegative); it.each([ [{ from: 'lib', name: 'MyType' }], [{ from: 'lib', name: ['MyType', 'myValue'] }], - ])('matches a lib specifier', runTestPositive); + ])('matches a lib specifier: %s', runTestPositive); it.each([ [{ from: 'lib', name: 42 }], @@ -74,33 +74,33 @@ describe('TypeOrValueSpecifier', () => { [{ from: 'lib', name: [] }], [{ from: 'lib' }], [{ from: 'lib', name: 'MyType', unrelatedProperty: '' }], - ])("doesn't match a malformed lib specifier", runTestNegative); + ])("doesn't match a malformed lib specifier: %s", runTestNegative); it.each([ - [{ from: 'package', name: 'MyType', source: './filename.js' }], + [{ from: 'package', name: 'MyType', path: './filename.js' }], [ { from: 'package', name: ['MyType', 'myValue'], - source: './filename.js', + path: './filename.js', }, ], - ])('matches a package specifier', runTestPositive); + ])('matches a package specifier: %s', runTestPositive); it.each([ - [{ from: 'package', name: 42, source: './filename.js' }], - [{ from: 'package', name: ['MyType', 42], source: './filename.js' }], + [{ from: 'package', name: 42, path: './filename.js' }], + [{ from: 'package', name: ['MyType', 42], path: './filename.js' }], [ { from: 'package', name: ['MyType', 'MyType'], - source: './filename.js', + path: './filename.js', }, ], - [{ from: 'package', name: [], source: './filename.js' }], + [{ from: 'package', name: [], path: './filename.js' }], [{ from: 'package', name: 'MyType' }], - [{ from: 'package', source: './filename.js' }], - [{ from: 'package', name: 'MyType', source: 42 }], + [{ from: 'package', path: './filename.js' }], + [{ from: 'package', name: 'MyType', package: 42 }], [{ from: [], name: 'MyType' }], [{ from: ['file'], name: 'MyType' }], [{ from: ['lib'], name: 'MyType' }], @@ -109,18 +109,18 @@ describe('TypeOrValueSpecifier', () => { { from: 'package', name: ['MyType', 'myValue'], - source: ['./filename.js', './another-file.js'], + package: ['./filename.js', './another-file.js'], }, ], [ { from: 'package', name: 'MyType', - source: './filename.js', + path: './filename.js', unrelatedProperty: '', }, ], - ])("doesn't match a malformed package specifier", runTestNegative); + ])("doesn't match a malformed package specifier: %s", runTestNegative); }); describe('typeMatchesSpecifier', () => { @@ -187,17 +187,17 @@ describe('TypeOrValueSpecifier', () => { ], [ 'interface Foo {prop: string}; type Test = Foo;', - { from: 'file', name: 'Foo', source: 'tests/fixtures/file.ts' }, + { from: 'file', name: 'Foo', path: 'tests/fixtures/file.ts' }, ], [ 'interface Foo {prop: string}; type Test = Foo;', { from: 'file', name: ['Foo', 'Bar'], - source: 'tests/fixtures/file.ts', + path: 'tests/fixtures/file.ts', }, ], - ])('matches a matching file specifier', runTestPositive); + ])('matches a matching file specifier: %s', runTestPositive); it.each<[string, TypeOrValueSpecifier]>([ [ @@ -210,27 +210,27 @@ describe('TypeOrValueSpecifier', () => { ], [ 'interface Foo {prop: string}; type Test = Foo;', - { from: 'file', name: 'Foo', source: 'tests/fixtures/wrong-file.ts' }, + { from: 'file', name: 'Foo', path: 'tests/fixtures/wrong-file.ts' }, ], [ 'interface Foo {prop: string}; type Test = Foo;', { from: 'file', name: ['Foo', 'Bar'], - source: 'tests/fixtures/wrong-file.ts', + path: 'tests/fixtures/wrong-file.ts', }, ], - ])("doesn't match a mismatched file specifier", runTestNegative); + ])("doesn't match a mismatched file specifier: %s", runTestNegative); it.each<[string, TypeOrValueSpecifier]>([ ['type Test = RegExp;', { from: 'lib', name: 'RegExp' }], ['type Test = RegExp;', { from: 'lib', name: ['RegExp', 'BigInt'] }], - ])('matches a matching lib specifier', runTestPositive); + ])('matches a matching lib specifier: %s', runTestPositive); it.each<[string, TypeOrValueSpecifier]>([ ['type Test = RegExp;', { from: 'lib', name: 'BigInt' }], ['type Test = RegExp;', { from: 'lib', name: ['BigInt', 'Date'] }], - ])("doesn't match a mismatched lib specifier", runTestNegative); + ])("doesn't match a mismatched lib specifier: %s", runTestNegative); it.each<[string, TypeOrValueSpecifier]>([ [ @@ -243,46 +243,46 @@ describe('TypeOrValueSpecifier', () => { ], [ 'interface Foo {prop: string}; type Test = Foo;', - { from: 'package', name: 'Foo', source: 'foo-package' }, + { from: 'package', name: 'Foo', package: 'foo-package' }, ], [ 'interface Foo {prop: string}; type Test = Foo;', - { from: 'package', name: ['Foo', 'Bar'], source: 'foo-package' }, + { from: 'package', name: ['Foo', 'Bar'], package: 'foo-package' }, ], [ 'interface Foo {prop: string}; type Test = Foo;', - { from: 'package', name: 'Foo', source: 'foo-package' }, + { from: 'package', name: 'Foo', package: 'foo-package' }, ], [ 'interface Foo {prop: string}; type Test = Foo;', { from: 'package', name: ['Foo', 'Bar'], - source: 'foo-package', + package: 'foo-package', }, ], ['type Test = RegExp;', { from: 'file', name: 'RegExp' }], ['type Test = RegExp;', { from: 'file', name: ['RegExp', 'BigInt'] }], [ 'type Test = RegExp;', - { from: 'file', name: 'RegExp', source: 'tests/fixtures/file.ts' }, + { from: 'file', name: 'RegExp', path: 'tests/fixtures/file.ts' }, ], [ 'type Test = RegExp;', { from: 'file', name: ['RegExp', 'BigInt'], - source: 'tests/fixtures/file.ts', + path: 'tests/fixtures/file.ts', }, ], [ 'type Test = RegExp;', - { from: 'package', name: 'RegExp', source: 'foo-package' }, + { from: 'package', name: 'RegExp', package: 'foo-package' }, ], [ 'type Test = RegExp;', - { from: 'package', name: ['RegExp', 'BigInt'], source: 'foo-package' }, + { from: 'package', name: ['RegExp', 'BigInt'], package: 'foo-package' }, ], - ])("doesn't match a mismatched specifier type", runTestNegative); + ])("doesn't match a mismatched specifier type: %s", runTestNegative); }); }); From 5eae3177feefe76b05e712663306b36b6b158657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 15 Mar 2023 11:07:26 +0100 Subject: [PATCH 62/64] test(type-utils): fixed package schema tests --- .../tests/TypeOrValueSpecifier.test.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts index 7cca677f6a37..d768911528a3 100644 --- a/packages/type-utils/tests/TypeOrValueSpecifier.test.ts +++ b/packages/type-utils/tests/TypeOrValueSpecifier.test.ts @@ -77,29 +77,29 @@ describe('TypeOrValueSpecifier', () => { ])("doesn't match a malformed lib specifier: %s", runTestNegative); it.each([ - [{ from: 'package', name: 'MyType', path: './filename.js' }], + [{ from: 'package', name: 'MyType', package: 'jquery' }], [ { from: 'package', name: ['MyType', 'myValue'], - path: './filename.js', + package: 'jquery', }, ], ])('matches a package specifier: %s', runTestPositive); it.each([ - [{ from: 'package', name: 42, path: './filename.js' }], - [{ from: 'package', name: ['MyType', 42], path: './filename.js' }], + [{ from: 'package', name: 42, package: 'jquery' }], + [{ from: 'package', name: ['MyType', 42], package: 'jquery' }], [ { from: 'package', name: ['MyType', 'MyType'], - path: './filename.js', + package: 'jquery', }, ], - [{ from: 'package', name: [], path: './filename.js' }], + [{ from: 'package', name: [], package: 'jquery' }], [{ from: 'package', name: 'MyType' }], - [{ from: 'package', path: './filename.js' }], + [{ from: 'package', package: 'jquery' }], [{ from: 'package', name: 'MyType', package: 42 }], [{ from: [], name: 'MyType' }], [{ from: ['file'], name: 'MyType' }], @@ -109,14 +109,14 @@ describe('TypeOrValueSpecifier', () => { { from: 'package', name: ['MyType', 'myValue'], - package: ['./filename.js', './another-file.js'], + package: ['jquery', './another-file.js'], }, ], [ { from: 'package', name: 'MyType', - path: './filename.js', + package: 'jquery', unrelatedProperty: '', }, ], From 751e2de9d8717e015565687690d7322cd3554539 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20D=C4=9Bdi=C4=8D?= Date: Wed, 15 Mar 2023 11:25:15 +0100 Subject: [PATCH 63/64] test(eslint-plugin): fixed type whitelist schema in prefer-readonly-parameter-types tests --- .../tests/rules/prefer-readonly-parameter-types.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts index f50547751877..6d6a353c623e 100644 --- a/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts +++ b/packages/eslint-plugin/tests/rules/prefer-readonly-parameter-types.test.ts @@ -1035,7 +1035,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allow: [{ from: 'package', name: 'Foo', source: 'foo-lib' }], + allow: [{ from: 'package', name: 'Foo', package: 'foo-lib' }], }, ], errors: [ @@ -1071,7 +1071,7 @@ ruleTester.run('prefer-readonly-parameter-types', rule, { `, options: [ { - allow: [{ from: 'package', name: 'RegExp', source: 'regexp-lib' }], + allow: [{ from: 'package', name: 'RegExp', package: 'regexp-lib' }], }, ], errors: [ From 3d465ccf434c2b883d5b3ebe2f3eb778e85f9f13 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Mon, 20 Mar 2023 10:14:37 -0400 Subject: [PATCH 64/64] Applied lowercasing to typeDeclaredInFile --- packages/type-utils/src/TypeOrValueSpecifier.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/type-utils/src/TypeOrValueSpecifier.ts b/packages/type-utils/src/TypeOrValueSpecifier.ts index 4fac69ea1065..3ba6b02868d9 100644 --- a/packages/type-utils/src/TypeOrValueSpecifier.ts +++ b/packages/type-utils/src/TypeOrValueSpecifier.ts @@ -133,13 +133,16 @@ function typeDeclaredInFile( program: ts.Program, ): boolean { if (relativePath === undefined) { + const cwd = program.getCurrentDirectory().toLowerCase(); return declarationFiles.some(declaration => - declaration.fileName.startsWith(program.getCurrentDirectory()), + declaration.fileName.toLowerCase().startsWith(cwd), ); } - const absolutePath = path.join(program.getCurrentDirectory(), relativePath); + const absolutePath = path + .join(program.getCurrentDirectory(), relativePath) + .toLowerCase(); return declarationFiles.some( - declaration => declaration.fileName === absolutePath, + declaration => declaration.fileName.toLowerCase() === absolutePath, ); } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy