From 92b73a8e22d021a909e8a91485401149f49c2894 Mon Sep 17 00:00:00 2001 From: Brad Zacher Date: Wed, 25 Jan 2023 13:50:29 +1030 Subject: [PATCH 1/3] feat(eslint-plugin): [naming-convention] improve performance by removing unnecessary selectors --- .../src/rules/naming-convention.ts | 582 ++++++++++-------- 1 file changed, 313 insertions(+), 269 deletions(-) diff --git a/packages/eslint-plugin/src/rules/naming-convention.ts b/packages/eslint-plugin/src/rules/naming-convention.ts index 3b500b0b347e..69f97552ca1c 100644 --- a/packages/eslint-plugin/src/rules/naming-convention.ts +++ b/packages/eslint-plugin/src/rules/naming-convention.ts @@ -95,7 +95,7 @@ export default util.createRule({ .getParserServices(context, true) .program.getCompilerOptions(); function handleMember( - validator: ValidatorFunction | null, + validator: ValidatorFunction, node: | TSESTree.PropertyNonComputedName | TSESTree.PropertyDefinitionNonComputedName @@ -215,176 +215,198 @@ export default util.createRule({ ); } - return { + const selectors: { + readonly [k in keyof TSESLint.RuleListener]: Readonly<{ + validator: ValidatorFunction | null; + handler: ( + node: Parameters>[0], + validator: ValidatorFunction, + ) => void; + }>; + } = { // #region variable - VariableDeclarator(node: TSESTree.VariableDeclarator): void { - const validator = validators.variable; - if (!validator) { - return; - } - const identifiers = getIdentifiersFromPattern(node.id); + VariableDeclarator: { + validator: validators.variable, + handler: (node, validator): void => { + const identifiers = getIdentifiersFromPattern(node.id); - const baseModifiers = new Set(); - const parent = node.parent; - if (parent?.type === AST_NODE_TYPES.VariableDeclaration) { - if (parent.kind === 'const') { - baseModifiers.add(Modifiers.const); - } + const baseModifiers = new Set(); + const parent = node.parent; + if (parent?.type === AST_NODE_TYPES.VariableDeclaration) { + if (parent.kind === 'const') { + baseModifiers.add(Modifiers.const); + } - if (isGlobal(context.getScope())) { - baseModifiers.add(Modifiers.global); + if (isGlobal(context.getScope())) { + baseModifiers.add(Modifiers.global); + } } - } - identifiers.forEach(id => { - const modifiers = new Set(baseModifiers); + identifiers.forEach(id => { + const modifiers = new Set(baseModifiers); - if (isDestructured(id)) { - modifiers.add(Modifiers.destructured); - } + if (isDestructured(id)) { + modifiers.add(Modifiers.destructured); + } - if (isExported(parent, id.name, context.getScope())) { - modifiers.add(Modifiers.exported); - } + if (isExported(parent, id.name, context.getScope())) { + modifiers.add(Modifiers.exported); + } - if (isUnused(id.name)) { - modifiers.add(Modifiers.unused); - } + if (isUnused(id.name)) { + modifiers.add(Modifiers.unused); + } - if (isAsyncVariableIdentifier(id)) { - modifiers.add(Modifiers.async); - } + if (isAsyncVariableIdentifier(id)) { + modifiers.add(Modifiers.async); + } - validator(id, modifiers); - }); + validator(id, modifiers); + }); + }, }, // #endregion // #region function - 'FunctionDeclaration, TSDeclareFunction, FunctionExpression'( - node: - | TSESTree.FunctionDeclaration - | TSESTree.TSDeclareFunction - | TSESTree.FunctionExpression, - ): void { - const validator = validators.function; - if (!validator || node.id === null) { - return; - } + 'FunctionDeclaration, TSDeclareFunction, FunctionExpression': { + validator: validators.function, + handler: ( + node: + | TSESTree.FunctionDeclaration + | TSESTree.TSDeclareFunction + | TSESTree.FunctionExpression, + validator, + ): void => { + if (node.id === null) { + return; + } - const modifiers = new Set(); - // functions create their own nested scope - const scope = context.getScope().upper; + const modifiers = new Set(); + // functions create their own nested scope + const scope = context.getScope().upper; - if (isGlobal(scope)) { - modifiers.add(Modifiers.global); - } + if (isGlobal(scope)) { + modifiers.add(Modifiers.global); + } - if (isExported(node, node.id.name, scope)) { - modifiers.add(Modifiers.exported); - } + if (isExported(node, node.id.name, scope)) { + modifiers.add(Modifiers.exported); + } - if (isUnused(node.id.name, scope)) { - modifiers.add(Modifiers.unused); - } + if (isUnused(node.id.name, scope)) { + modifiers.add(Modifiers.unused); + } - if (node.async) { - modifiers.add(Modifiers.async); - } + if (node.async) { + modifiers.add(Modifiers.async); + } - validator(node.id, modifiers); + validator(node.id, modifiers); + }, }, // #endregion function // #region parameter - 'FunctionDeclaration, TSDeclareFunction, TSEmptyBodyFunctionExpression, FunctionExpression, ArrowFunctionExpression'( - node: - | TSESTree.FunctionDeclaration - | TSESTree.TSDeclareFunction - | TSESTree.TSEmptyBodyFunctionExpression - | TSESTree.FunctionExpression - | TSESTree.ArrowFunctionExpression, - ): void { - const validator = validators.parameter; - if (!validator) { - return; - } - - node.params.forEach(param => { - if (param.type === AST_NODE_TYPES.TSParameterProperty) { - return; - } - - const identifiers = getIdentifiersFromPattern(param); - - identifiers.forEach(i => { - const modifiers = new Set(); - - if (isDestructured(i)) { - modifiers.add(Modifiers.destructured); - } - - if (isUnused(i.name)) { - modifiers.add(Modifiers.unused); - } - - validator(i, modifiers); - }); - }); - }, + 'FunctionDeclaration, TSDeclareFunction, TSEmptyBodyFunctionExpression, FunctionExpression, ArrowFunctionExpression': + { + validator: validators.parameter, + handler: ( + node: + | TSESTree.FunctionDeclaration + | TSESTree.TSDeclareFunction + | TSESTree.TSEmptyBodyFunctionExpression + | TSESTree.FunctionExpression + | TSESTree.ArrowFunctionExpression, + validator, + ): void => { + node.params.forEach(param => { + if (param.type === AST_NODE_TYPES.TSParameterProperty) { + return; + } + + const identifiers = getIdentifiersFromPattern(param); + + identifiers.forEach(i => { + const modifiers = new Set(); + + if (isDestructured(i)) { + modifiers.add(Modifiers.destructured); + } + + if (isUnused(i.name)) { + modifiers.add(Modifiers.unused); + } + + validator(i, modifiers); + }); + }); + }, + }, // #endregion parameter // #region parameterProperty - TSParameterProperty(node): void { - const validator = validators.parameterProperty; - if (!validator) { - return; - } - - const modifiers = getMemberModifiers(node); + TSParameterProperty: { + validator: validators.parameterProperty, + handler: (node, validator): void => { + const modifiers = getMemberModifiers(node); - const identifiers = getIdentifiersFromPattern(node.parameter); + const identifiers = getIdentifiersFromPattern(node.parameter); - identifiers.forEach(i => { - validator(i, modifiers); - }); + identifiers.forEach(i => { + validator(i, modifiers); + }); + }, }, // #endregion parameterProperty // #region property - ':not(ObjectPattern) > Property[computed = false][kind = "init"][value.type != "ArrowFunctionExpression"][value.type != "FunctionExpression"][value.type != "TSEmptyBodyFunctionExpression"]'( - node: TSESTree.PropertyNonComputedName, - ): void { - const modifiers = new Set([Modifiers.public]); - handleMember(validators.objectLiteralProperty, node, modifiers); - }, - - ':matches(PropertyDefinition, TSAbstractPropertyDefinition)[computed = false][value.type != "ArrowFunctionExpression"][value.type != "FunctionExpression"][value.type != "TSEmptyBodyFunctionExpression"]'( - node: - | TSESTree.PropertyDefinitionNonComputedName - | TSESTree.TSAbstractPropertyDefinitionNonComputedName, - ): void { - const modifiers = getMemberModifiers(node); - handleMember(validators.classProperty, node, modifiers); - }, - - 'TSPropertySignature[computed = false]'( - node: TSESTree.TSPropertySignatureNonComputedName, - ): void { - const modifiers = new Set([Modifiers.public]); - if (node.readonly) { - modifiers.add(Modifiers.readonly); - } + ':not(ObjectPattern) > Property[computed = false][kind = "init"][value.type != "ArrowFunctionExpression"][value.type != "FunctionExpression"][value.type != "TSEmptyBodyFunctionExpression"]': + { + validator: validators.objectLiteralProperty, + handler: ( + node: TSESTree.PropertyNonComputedName, + validator, + ): void => { + const modifiers = new Set([Modifiers.public]); + handleMember(validator, node, modifiers); + }, + }, + + ':matches(PropertyDefinition, TSAbstractPropertyDefinition)[computed = false][value.type != "ArrowFunctionExpression"][value.type != "FunctionExpression"][value.type != "TSEmptyBodyFunctionExpression"]': + { + validator: validators.classProperty, + handler: ( + node: + | TSESTree.PropertyDefinitionNonComputedName + | TSESTree.TSAbstractPropertyDefinitionNonComputedName, + validator, + ): void => { + const modifiers = getMemberModifiers(node); + handleMember(validator, node, modifiers); + }, + }, + + 'TSPropertySignature[computed = false]': { + validator: validators.typeProperty, + handler: ( + node: TSESTree.TSPropertySignatureNonComputedName, + validator, + ): void => { + const modifiers = new Set([Modifiers.public]); + if (node.readonly) { + modifiers.add(Modifiers.readonly); + } - handleMember(validators.typeProperty, node, modifiers); + handleMember(validator, node, modifiers); + }, }, // #endregion property @@ -395,18 +417,22 @@ export default util.createRule({ 'Property[computed = false][kind = "init"][value.type = "ArrowFunctionExpression"]', 'Property[computed = false][kind = "init"][value.type = "FunctionExpression"]', 'Property[computed = false][kind = "init"][value.type = "TSEmptyBodyFunctionExpression"]', - ].join(', ')]( - node: - | TSESTree.PropertyNonComputedName - | TSESTree.TSMethodSignatureNonComputedName, - ): void { - const modifiers = new Set([Modifiers.public]); - - if (isAsyncMemberOrProperty(node)) { - modifiers.add(Modifiers.async); - } + ].join(', ')]: { + validator: validators.objectLiteralMethod, + handler: ( + node: + | TSESTree.PropertyNonComputedName + | TSESTree.TSMethodSignatureNonComputedName, + validator, + ): void => { + const modifiers = new Set([Modifiers.public]); + + if (isAsyncMemberOrProperty(node)) { + modifiers.add(Modifiers.async); + } - handleMember(validators.objectLiteralMethod, node, modifiers); + handleMember(validator, node, modifiers); + }, }, [[ @@ -414,203 +440,221 @@ export default util.createRule({ ':matches(PropertyDefinition, TSAbstractPropertyDefinition)[computed = false][value.type = "FunctionExpression"]', ':matches(PropertyDefinition, TSAbstractPropertyDefinition)[computed = false][value.type = "TSEmptyBodyFunctionExpression"]', ':matches(MethodDefinition, TSAbstractMethodDefinition)[computed = false][kind = "method"]', - ].join(', ')]( - node: - | TSESTree.PropertyDefinitionNonComputedName - | TSESTree.TSAbstractPropertyDefinitionNonComputedName - | TSESTree.MethodDefinitionNonComputedName - | TSESTree.TSAbstractMethodDefinitionNonComputedName, - ): void { - const modifiers = getMemberModifiers(node); - - if (isAsyncMemberOrProperty(node)) { - modifiers.add(Modifiers.async); - } + ].join(', ')]: { + validator: validators.classMethod, + handler: ( + node: + | TSESTree.PropertyDefinitionNonComputedName + | TSESTree.TSAbstractPropertyDefinitionNonComputedName + | TSESTree.MethodDefinitionNonComputedName + | TSESTree.TSAbstractMethodDefinitionNonComputedName, + validator, + ): void => { + const modifiers = getMemberModifiers(node); + + if (isAsyncMemberOrProperty(node)) { + modifiers.add(Modifiers.async); + } - handleMember(validators.classMethod, node, modifiers); + handleMember(validator, node, modifiers); + }, }, - 'TSMethodSignature[computed = false]'( - node: TSESTree.TSMethodSignatureNonComputedName, - ): void { - const modifiers = new Set([Modifiers.public]); - handleMember(validators.typeMethod, node, modifiers); + 'TSMethodSignature[computed = false]': { + validator: validators.typeMethod, + handler: ( + node: TSESTree.TSMethodSignatureNonComputedName, + validator, + ): void => { + const modifiers = new Set([Modifiers.public]); + handleMember(validator, node, modifiers); + }, }, // #endregion method // #region accessor - 'Property[computed = false]:matches([kind = "get"], [kind = "set"])'( - node: TSESTree.PropertyNonComputedName, - ): void { - const modifiers = new Set([Modifiers.public]); - handleMember(validators.accessor, node, modifiers); + 'Property[computed = false]:matches([kind = "get"], [kind = "set"])': { + validator: validators.accessor, + handler: (node: TSESTree.PropertyNonComputedName, validator): void => { + const modifiers = new Set([Modifiers.public]); + handleMember(validator, node, modifiers); + }, }, - 'MethodDefinition[computed = false]:matches([kind = "get"], [kind = "set"])'( - node: TSESTree.MethodDefinitionNonComputedName, - ): void { - const modifiers = getMemberModifiers(node); - handleMember(validators.accessor, node, modifiers); - }, + 'MethodDefinition[computed = false]:matches([kind = "get"], [kind = "set"])': + { + validator: validators.accessor, + handler: ( + node: TSESTree.MethodDefinitionNonComputedName, + validator, + ): void => { + const modifiers = getMemberModifiers(node); + handleMember(validator, node, modifiers); + }, + }, // #endregion accessor // #region enumMember // computed is optional, so can't do [computed = false] - 'TSEnumMember[computed != true]'( - node: TSESTree.TSEnumMemberNonComputedName, - ): void { - const validator = validators.enumMember; - if (!validator) { - return; - } - - const id = node.id; - const modifiers = new Set(); - - if (requiresQuoting(id, compilerOptions.target)) { - modifiers.add(Modifiers.requiresQuotes); - } + 'TSEnumMember[computed != true]': { + validator: validators.enumMember, + handler: ( + node: TSESTree.TSEnumMemberNonComputedName, + validator, + ): void => { + const id = node.id; + const modifiers = new Set(); + + if (requiresQuoting(id, compilerOptions.target)) { + modifiers.add(Modifiers.requiresQuotes); + } - validator(id, modifiers); + validator(id, modifiers); + }, }, // #endregion enumMember // #region class - 'ClassDeclaration, ClassExpression'( - node: TSESTree.ClassDeclaration | TSESTree.ClassExpression, - ): void { - const validator = validators.class; - if (!validator) { - return; - } - - const id = node.id; - if (id === null) { - return; - } + 'ClassDeclaration, ClassExpression': { + validator: validators.class, + handler: ( + node: TSESTree.ClassDeclaration | TSESTree.ClassExpression, + validator, + ): void => { + const id = node.id; + if (id === null) { + return; + } - const modifiers = new Set(); - // classes create their own nested scope - const scope = context.getScope().upper; + const modifiers = new Set(); + // classes create their own nested scope + const scope = context.getScope().upper; - if (node.abstract) { - modifiers.add(Modifiers.abstract); - } + if (node.abstract) { + modifiers.add(Modifiers.abstract); + } - if (isExported(node, id.name, scope)) { - modifiers.add(Modifiers.exported); - } + if (isExported(node, id.name, scope)) { + modifiers.add(Modifiers.exported); + } - if (isUnused(id.name, scope)) { - modifiers.add(Modifiers.unused); - } + if (isUnused(id.name, scope)) { + modifiers.add(Modifiers.unused); + } - validator(id, modifiers); + validator(id, modifiers); + }, }, // #endregion class // #region interface - TSInterfaceDeclaration(node): void { - const validator = validators.interface; - if (!validator) { - return; - } - - const modifiers = new Set(); - const scope = context.getScope(); + TSInterfaceDeclaration: { + validator: validators.interface, + handler: (node, validator): void => { + const modifiers = new Set(); + const scope = context.getScope(); - if (isExported(node, node.id.name, scope)) { - modifiers.add(Modifiers.exported); - } + if (isExported(node, node.id.name, scope)) { + modifiers.add(Modifiers.exported); + } - if (isUnused(node.id.name, scope)) { - modifiers.add(Modifiers.unused); - } + if (isUnused(node.id.name, scope)) { + modifiers.add(Modifiers.unused); + } - validator(node.id, modifiers); + validator(node.id, modifiers); + }, }, // #endregion interface // #region typeAlias - TSTypeAliasDeclaration(node): void { - const validator = validators.typeAlias; - if (!validator) { - return; - } - - const modifiers = new Set(); - const scope = context.getScope(); + TSTypeAliasDeclaration: { + validator: validators.typeAlias, + handler: (node, validator): void => { + const modifiers = new Set(); + const scope = context.getScope(); - if (isExported(node, node.id.name, scope)) { - modifiers.add(Modifiers.exported); - } + if (isExported(node, node.id.name, scope)) { + modifiers.add(Modifiers.exported); + } - if (isUnused(node.id.name, scope)) { - modifiers.add(Modifiers.unused); - } + if (isUnused(node.id.name, scope)) { + modifiers.add(Modifiers.unused); + } - validator(node.id, modifiers); + validator(node.id, modifiers); + }, }, // #endregion typeAlias // #region enum - TSEnumDeclaration(node): void { - const validator = validators.enum; - if (!validator) { - return; - } - - const modifiers = new Set(); - // enums create their own nested scope - const scope = context.getScope().upper; + TSEnumDeclaration: { + validator: validators.enum, + handler: (node, validator): void => { + const modifiers = new Set(); + // enums create their own nested scope + const scope = context.getScope().upper; - if (isExported(node, node.id.name, scope)) { - modifiers.add(Modifiers.exported); - } + if (isExported(node, node.id.name, scope)) { + modifiers.add(Modifiers.exported); + } - if (isUnused(node.id.name, scope)) { - modifiers.add(Modifiers.unused); - } + if (isUnused(node.id.name, scope)) { + modifiers.add(Modifiers.unused); + } - validator(node.id, modifiers); + validator(node.id, modifiers); + }, }, // #endregion enum // #region typeParameter - 'TSTypeParameterDeclaration > TSTypeParameter'( - node: TSESTree.TSTypeParameter, - ): void { - const validator = validators.typeParameter; - if (!validator) { - return; - } + 'TSTypeParameterDeclaration > TSTypeParameter': { + validator: validators.typeParameter, + handler: (node: TSESTree.TSTypeParameter, validator): void => { + const modifiers = new Set(); + const scope = context.getScope(); - const modifiers = new Set(); - const scope = context.getScope(); - - if (isUnused(node.name.name, scope)) { - modifiers.add(Modifiers.unused); - } + if (isUnused(node.name.name, scope)) { + modifiers.add(Modifiers.unused); + } - validator(node.name, modifiers); + validator(node.name, modifiers); + }, }, // #endregion typeParameter }; + + return Object.fromEntries( + Object.entries(selectors) + .map(([selector, { validator, handler }]) => { + if (validator == null) { + return null; + } + return [ + selector, + (node: Parameters[0]): void => { + handler(node, validator); + }, + ] as const; + }) + .filter((s): s is NonNullable => s != null), + ); }, }); From 3a7aed341c14f4aa3a0c34a0608f82e23431fc03 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Tue, 31 Jan 2023 15:06:21 -0500 Subject: [PATCH 2/3] Non-nullable validators --- .../eslint-plugin/src/rules/naming-convention-utils/types.ts | 2 +- packages/eslint-plugin/src/rules/naming-convention.ts | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/packages/eslint-plugin/src/rules/naming-convention-utils/types.ts b/packages/eslint-plugin/src/rules/naming-convention-utils/types.ts index e900b4c5f171..d5c15994b8bb 100644 --- a/packages/eslint-plugin/src/rules/naming-convention-utils/types.ts +++ b/packages/eslint-plugin/src/rules/naming-convention-utils/types.ts @@ -64,7 +64,7 @@ type ValidatorFunction = ( node: TSESTree.Identifier | TSESTree.PrivateIdentifier | TSESTree.Literal, modifiers?: Set, ) => void; -type ParsedOptions = Record; +type ParsedOptions = Record; type Context = Readonly>; export type { diff --git a/packages/eslint-plugin/src/rules/naming-convention.ts b/packages/eslint-plugin/src/rules/naming-convention.ts index e3737749d268..f5a59614851d 100644 --- a/packages/eslint-plugin/src/rules/naming-convention.ts +++ b/packages/eslint-plugin/src/rules/naming-convention.ts @@ -217,7 +217,7 @@ export default util.createRule({ const selectors: { readonly [k in keyof TSESLint.RuleListener]: Readonly<{ - validator: ValidatorFunction | null; + validator: ValidatorFunction; handler: ( node: Parameters>[0], validator: ValidatorFunction, @@ -643,9 +643,6 @@ export default util.createRule({ return Object.fromEntries( Object.entries(selectors) .map(([selector, { validator, handler }]) => { - if (validator == null) { - return null; - } return [ selector, (node: Parameters[0]): void => { From 84767a59b06168d9beca67bff89c8007f568ba81 Mon Sep 17 00:00:00 2001 From: Josh Goldberg Date: Tue, 31 Jan 2023 15:28:25 -0500 Subject: [PATCH 3/3] Undo yarn.lock changes --- yarn.lock | 38 ++++++++++++-------------------------- 1 file changed, 12 insertions(+), 26 deletions(-) diff --git a/yarn.lock b/yarn.lock index 1c5ec83ed4aa..bbe5aba913b6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3246,13 +3246,6 @@ read-package-json-fast "^2.0.3" which "^2.0.2" -"@nrwl/cli@15.5.3": - version "15.5.3" - resolved "https://registry.yarnpkg.com/@nrwl/cli/-/cli-15.5.3.tgz#13277e5a0e8ba713850bcf13fa76717ea747a2bb" - integrity sha512-NWf9CWswvdYM6YzXuweaZPAZ2erMtQrrHZdgFbUGeojZBZ+b4TCGzLWNodZj4yQOa/eTwlyPMYO2LEw9CoapDQ== - dependencies: - nx "15.5.3" - "@nrwl/cli@15.6.3": version "15.6.3" resolved "https://registry.npmjs.org/@nrwl/cli/-/cli-15.6.3.tgz#999531d6efb30afc39373bdcbd7e78254a3a3fd3" @@ -3324,13 +3317,6 @@ tar "6.1.11" yargs-parser ">=21.0.1" -"@nrwl/tao@15.5.3": - version "15.5.3" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-15.5.3.tgz#08c05715d2ecb108ed8b2c5381b9017cf1448b4a" - integrity sha512-vgPLIW9IoBfQ4IkHRT5RC4LqNwFBK5jmHYmFIRgbIeFRudFBbnpmOaKRME0OwN7qJ6964PVVbzahAPvYVD02xw== - dependencies: - nx "15.5.3" - "@nrwl/tao@15.6.3": version "15.6.3" resolved "https://registry.npmjs.org/@nrwl/tao/-/tao-15.6.3.tgz#b24e11345375dea96bc386c60b9b1102a7584932" @@ -10794,13 +10780,13 @@ nth-check@^2.0.0, nth-check@^2.0.1: dependencies: boolbase "^1.0.0" -nx@15.5.3, "nx@>=15.4.2 < 16": - version "15.5.3" - resolved "https://registry.npmjs.org/nx/-/nx-15.5.3.tgz#bf6252e7d9e17121dd82dec4f6fce319b9e005fa" - integrity sha512-PHB8VbiBLP108xb+yR8IGEsYWr7OcmDDOjHL+73oP4lVjyPgT8wdTMe6tI5LdBgv+KZ+0kiThK3ckvcPsfgvLQ== +nx@15.6.3: + version "15.6.3" + resolved "https://registry.npmjs.org/nx/-/nx-15.6.3.tgz#900087bce38c6e5975660c23ebd41ead1bf54f98" + integrity sha512-3t0A0GPLNen1yPAyE+VGZ3nkAzZYb5nfXtAcx8SHBlKq4u42yBY3khBmP1y4Og3jhIwFIj7J7Npeh8ZKrthmYQ== dependencies: - "@nrwl/cli" "15.5.3" - "@nrwl/tao" "15.5.3" + "@nrwl/cli" "15.6.3" + "@nrwl/tao" "15.6.3" "@parcel/watcher" "2.0.4" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "^3.0.0-rc.18" @@ -10835,13 +10821,13 @@ nx@15.5.3, "nx@>=15.4.2 < 16": yargs "^17.6.2" yargs-parser "21.1.1" -nx@15.6.3: - version "15.6.3" - resolved "https://registry.npmjs.org/nx/-/nx-15.6.3.tgz#900087bce38c6e5975660c23ebd41ead1bf54f98" - integrity sha512-3t0A0GPLNen1yPAyE+VGZ3nkAzZYb5nfXtAcx8SHBlKq4u42yBY3khBmP1y4Og3jhIwFIj7J7Npeh8ZKrthmYQ== +"nx@>=15.4.2 < 16": + version "15.5.3" + resolved "https://registry.npmjs.org/nx/-/nx-15.5.3.tgz#bf6252e7d9e17121dd82dec4f6fce319b9e005fa" + integrity sha512-PHB8VbiBLP108xb+yR8IGEsYWr7OcmDDOjHL+73oP4lVjyPgT8wdTMe6tI5LdBgv+KZ+0kiThK3ckvcPsfgvLQ== dependencies: - "@nrwl/cli" "15.6.3" - "@nrwl/tao" "15.6.3" + "@nrwl/cli" "15.5.3" + "@nrwl/tao" "15.5.3" "@parcel/watcher" "2.0.4" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "^3.0.0-rc.18"