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 ed3e4ba284b..54b6dd22520 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 54b6dd22520..2e24d45bb4f 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 650afd1ceb6..783d1b1edce 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 783d1b1edce..43da243ccf7 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 43da243ccf7..eff22be9341 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 d5d05e94a0e..6bb95a49a9e 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 eff22be9341..074f96830c5 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 6bb95a49a9e..34c51f65322 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 074f96830c5..eec0a4bab82 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 34c51f65322..0edd1e5e5ec 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 7ff53268e42..26b92a12154 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 f17a19f1f6d..c2fa259da88 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 6790b55113e..d96d2f546a4 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 d96d2f546a4..d325437d33b 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 55289177930..d4ab895f685 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 f6f2cebd12b..fa7ee893780 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 eec0a4bab82..9b51181622d 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 c2fa259da88..d6952315817 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 d4ab895f685..da861c8cced 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 9b51181622d..0cd2c109a4c 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 0cd2c109a4c..bf90a5a0c85 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 00000000000..be3039d1c19 --- /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 44eb35ec945..5726594554b 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 da861c8cced..29a44ad90bf 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 d325437d33b..3eac5eafb2d 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 3eac5eafb2d..e078f70eb95 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 d6952315817..cd8660174ac 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 bf90a5a0c85..fd9abba60a3 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 29a44ad90bf..fa76d2f052e 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 fd9abba60a3..1a2f452c60d 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 fa76d2f052e..0907a3c6e92 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 0907a3c6e92..770c9c0b94c 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 e078f70eb95..dfde552ad29 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 26b92a12154..7ff53268e42 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 cd8660174ac..c50f46178e0 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 1a2f452c60d..4fb4c99d6ba 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 c50f46178e0..1fad339ad6e 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 be3039d1c19..77ee0a40ece 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 770c9c0b94c..ee6ef48a623 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 dfde552ad29..c9e07897c60 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 759b63796e1..106d04fc6c9 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 106d04fc6c9..054b261f344 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 77ee0a40ece..ebba5751210 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 79c9a5280e2..fbf46cc7f4f 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 62a5034067b..824697e1eea 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 ce0d7e61be7..f007b522402 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 00000000000..4856e3cb22b --- /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 00000000000..c7b6e9a578c --- /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 2d237c3ce2c..23d07819200 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 54147ae58d5..388086cbef2 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 ebba5751210..00000000000 --- 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 4856e3cb22b..3206b6036f2 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 832f36dcb00..9fc499aa8f3 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 047ef6c1e39..efcf5b1cbd5 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 e0d7b34f123..28c5e03d548 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 23d07819200..358a2db9893 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 0fc1583b55f..9da20bd8147 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 efcf5b1cbd5..e633ad1243b 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 3206b6036f2..67aba1580a9 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 358a2db9893..c43e938c8db 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 c3323e4edbb..56d2488c3a9 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 56d2488c3a9..1660f274aa8 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 1660f274aa8..54e443bc19f 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 c7b6e9a578c..5f5646a2002 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 67aba1580a9..f6eb717452d 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 f6eb717452d..a31ffe81191 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 a31ffe81191..49ddd139420 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 5f5646a2002..4bcd2f632eb 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 54e443bc19f..a9dc9c737d7 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 a9dc9c737d7..2cff7b3fca8 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 49ddd139420..e0dedac4c8f 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 4bcd2f632eb..67a0ff46826 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 67a0ff46826..2b384caa2ce 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 7d70b1598d9..89ff0d9c07f 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 2cff7b3fca8..1d8dd162839 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 57557cca5ba..2b4abe4f4a8 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 9da20bd8147..df2e6c95355 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 e633ad1243b..5adc11ab7ad 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 c556a976076..4b204a80986 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 2b384caa2ce..2fbb24aa2f7 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 4b204a80986..2adfaaec7aa 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 2b4abe4f4a8..a0219130a81 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 e0dedac4c8f..c01d6a00980 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 cc876b344a5..16eeb73449c 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 c01d6a00980..3ce9edb354d 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 3ce9edb354d..9f8b7c9abd7 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 2fbb24aa2f7..8f8d9800ad7 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 1d8dd162839..acfab64b667 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 9f8b7c9abd7..4fac69ea106 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 acfab64b667..d043c9d72eb 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 d043c9d72eb..703b16fa3f0 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 8f8d9800ad7..7cca677f6a3 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 7cca677f6a3..d768911528a 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 f5054775187..6d6a353c623 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 4fac69ea106..3ba6b02868d 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, ); }