diff --git a/CHANGELOG.md b/CHANGELOG.md index 36df7d48a5b3..75e443872ce2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,15 @@ +## 8.47.0 (2025-11-17) + +### 🚀 Features + +- **eslint-plugin:** [no-unused-private-class-members] new extension rule ([#10913](https://github.com/typescript-eslint/typescript-eslint/pull/10913)) + +### ❤️ Thank You + +- Brad Zacher @bradzacher + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) ### 🩹 Fixes diff --git a/packages/ast-spec/CHANGELOG.md b/packages/ast-spec/CHANGELOG.md index 057df049c10e..3e0661fa9fc8 100644 --- a/packages/ast-spec/CHANGELOG.md +++ b/packages/ast-spec/CHANGELOG.md @@ -1,3 +1,9 @@ +## 8.47.0 (2025-11-17) + +This was a version bump only for ast-spec to align it with other projects, there were no code changes. + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) This was a version bump only for ast-spec to align it with other projects, there were no code changes. diff --git a/packages/ast-spec/package.json b/packages/ast-spec/package.json index 98f50fdac96c..5ce878af83fe 100644 --- a/packages/ast-spec/package.json +++ b/packages/ast-spec/package.json @@ -1,6 +1,6 @@ { "name": "@typescript-eslint/ast-spec", - "version": "8.46.4", + "version": "8.47.0", "description": "Complete specification for the TypeScript-ESTree AST", "private": true, "keywords": [ diff --git a/packages/eslint-plugin-internal/src/util/createRule.ts b/packages/eslint-plugin-internal/src/util/createRule.ts index ed6bcbca5198..aa845bbda267 100644 --- a/packages/eslint-plugin-internal/src/util/createRule.ts +++ b/packages/eslint-plugin-internal/src/util/createRule.ts @@ -1,14 +1,10 @@ import { ESLintUtils } from '@typescript-eslint/utils'; -import packageJson from './packagejson.js'; - -const { version } = packageJson; - export interface ESLintPluginInternalDocs { requiresTypeChecking?: true; } export const createRule = ESLintUtils.RuleCreator( name => - `https://github.com/typescript-eslint/typescript-eslint/blob/v${version}/packages/eslint-plugin-internal/src/rules/${name}.ts`, + `https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin-internal/src/rules/${name}.ts`, ); diff --git a/packages/eslint-plugin/CHANGELOG.md b/packages/eslint-plugin/CHANGELOG.md index 53995954dd83..7fa6467aada1 100644 --- a/packages/eslint-plugin/CHANGELOG.md +++ b/packages/eslint-plugin/CHANGELOG.md @@ -1,3 +1,15 @@ +## 8.47.0 (2025-11-17) + +### 🚀 Features + +- **eslint-plugin:** [no-unused-private-class-members] new extension rule ([#10913](https://github.com/typescript-eslint/typescript-eslint/pull/10913)) + +### ❤️ Thank You + +- Brad Zacher @bradzacher + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) ### 🩹 Fixes diff --git a/packages/eslint-plugin/docs/rules/no-unused-private-class-members.mdx b/packages/eslint-plugin/docs/rules/no-unused-private-class-members.mdx new file mode 100644 index 000000000000..1b96484955fa --- /dev/null +++ b/packages/eslint-plugin/docs/rules/no-unused-private-class-members.mdx @@ -0,0 +1,117 @@ +--- +description: 'Disallow unused private class members.' +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; + +> 🛑 This file is source code, not the primary documentation location! 🛑 +> +> See **https://typescript-eslint.io/rules/no-unused-private-class-members** for documentation. + +This rule extends the base [`eslint/no-unused-private-class-members`](https://eslint.org/docs/rules/no-unused-private-class-members) rule. +It adds support for members declared with TypeScript's `private` keyword. + +## Options + +This rule has no options. + +## Examples + + + + +```ts +class A { + private foo = 123; +} +``` + + + + +```tsx +class A { + private foo = 123; + + constructor() { + console.log(this.foo); + } +} +``` + + + + +## Limitations + +This rule does not detect the following cases: + +(1) Private members only used via a variable that would require type analysis to resolve the type. + +```ts +type T = Foo; +class Foo { + private prop = 123; + + method1(a: Foo) { + // ✅ Detected as a usage + const prop = this.prop; + + // ✅ Detected as a usage (variables with explicit and simple type annotations are handled) + const otherProp = a.prop; + } + + method2(a: T) { + // ❌ NOT detected as a usage (complex type annotation that requires type information to handle) + const prop = a.prop; + } +} +``` + +(2) Usages of the private member outside of the class: + +```ts +class Foo { + private prop = 123; +} + +const instance = new Foo(); +// ❌ NOT detected as a usage +console.log(foo['prop']); +``` + +(3) Reassignments of `this` multiple times: + +```ts +class Foo { + private prop = 123; + + foo() { + const self1 = this; + const self2 = self1; + return self2.prop; + } +} +``` + +(4) Mutable reassignments of `this`: + +```ts +class Foo { + private prop = 123; + private parent: Foo | null; + + foo() { + let self = this; + while (self.parent != null) { + self = self.parent; + } + return self.prop; + } +} +``` + +## When Not To Use It + +If you don't want to be notified about unused private class members, you can safely turn this rule off. diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 14aab4ecfd9b..522d8d846ea0 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -1,6 +1,6 @@ { "name": "@typescript-eslint/eslint-plugin", - "version": "8.46.4", + "version": "8.47.0", "description": "TypeScript plugin for ESLint", "files": [ "dist", @@ -59,10 +59,10 @@ }, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.46.4", - "@typescript-eslint/type-utils": "8.46.4", - "@typescript-eslint/utils": "8.46.4", - "@typescript-eslint/visitor-keys": "8.46.4", + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/type-utils": "8.47.0", + "@typescript-eslint/utils": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", @@ -71,8 +71,8 @@ "devDependencies": { "@types/mdast": "^4.0.3", "@types/natural-compare": "*", - "@typescript-eslint/rule-schema-to-typescript-types": "8.46.4", - "@typescript-eslint/rule-tester": "8.46.4", + "@typescript-eslint/rule-schema-to-typescript-types": "8.47.0", + "@typescript-eslint/rule-tester": "8.47.0", "@vitest/coverage-v8": "^3.1.3", "ajv": "^6.12.6", "cross-fetch": "*", @@ -92,7 +92,7 @@ "vitest": "^3.1.3" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.46.4", + "@typescript-eslint/parser": "^8.47.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" }, diff --git a/packages/eslint-plugin/src/configs/eslintrc/all.ts b/packages/eslint-plugin/src/configs/eslintrc/all.ts index 34f7fd540450..78c8420e2643 100644 --- a/packages/eslint-plugin/src/configs/eslintrc/all.ts +++ b/packages/eslint-plugin/src/configs/eslintrc/all.ts @@ -112,6 +112,8 @@ export = { '@typescript-eslint/no-unsafe-unary-minus': 'error', 'no-unused-expressions': 'off', '@typescript-eslint/no-unused-expressions': 'error', + 'no-unused-private-class-members': 'off', + '@typescript-eslint/no-unused-private-class-members': 'error', 'no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': 'error', 'no-use-before-define': 'off', diff --git a/packages/eslint-plugin/src/configs/flat/all.ts b/packages/eslint-plugin/src/configs/flat/all.ts index 777028d8580c..43792419ab3b 100644 --- a/packages/eslint-plugin/src/configs/flat/all.ts +++ b/packages/eslint-plugin/src/configs/flat/all.ts @@ -126,6 +126,8 @@ export default ( '@typescript-eslint/no-unsafe-unary-minus': 'error', 'no-unused-expressions': 'off', '@typescript-eslint/no-unused-expressions': 'error', + 'no-unused-private-class-members': 'off', + '@typescript-eslint/no-unused-private-class-members': 'error', 'no-unused-vars': 'off', '@typescript-eslint/no-unused-vars': 'error', 'no-use-before-define': 'off', diff --git a/packages/eslint-plugin/src/rules/index.ts b/packages/eslint-plugin/src/rules/index.ts index 2a82c7e18c6b..9ee5903aa5f7 100644 --- a/packages/eslint-plugin/src/rules/index.ts +++ b/packages/eslint-plugin/src/rules/index.ts @@ -88,6 +88,7 @@ import noUnsafeReturn from './no-unsafe-return'; import noUnsafeTypeAssertion from './no-unsafe-type-assertion'; import noUnsafeUnaryMinus from './no-unsafe-unary-minus'; import noUnusedExpressions from './no-unused-expressions'; +import noUnusedPrivateClassMembers from './no-unused-private-class-members'; import noUnusedVars from './no-unused-vars'; import noUseBeforeDefine from './no-use-before-define'; import noUselessConstructor from './no-useless-constructor'; @@ -222,6 +223,7 @@ const rules = { 'no-unsafe-type-assertion': noUnsafeTypeAssertion, 'no-unsafe-unary-minus': noUnsafeUnaryMinus, 'no-unused-expressions': noUnusedExpressions, + 'no-unused-private-class-members': noUnusedPrivateClassMembers, 'no-unused-vars': noUnusedVars, 'no-use-before-define': noUseBeforeDefine, 'no-useless-constructor': noUselessConstructor, diff --git a/packages/eslint-plugin/src/rules/no-unused-private-class-members.ts b/packages/eslint-plugin/src/rules/no-unused-private-class-members.ts new file mode 100644 index 000000000000..d120184d6e5a --- /dev/null +++ b/packages/eslint-plugin/src/rules/no-unused-private-class-members.ts @@ -0,0 +1,60 @@ +import { ESLintUtils } from '@typescript-eslint/utils'; + +import { createRule } from '../util'; +import { analyzeClassMemberUsage } from '../util/class-scope-analyzer/classScopeAnalyzer'; + +type Options = []; +export type MessageIds = 'unusedPrivateClassMember'; + +export default createRule({ + name: 'no-unused-private-class-members', + meta: { + type: 'problem', + docs: { + description: 'Disallow unused private class members', + extendsBaseRule: true, + requiresTypeChecking: false, + }, + + messages: { + unusedPrivateClassMember: + "Private class member '{{classMemberName}}' is defined but never used.", + }, + + schema: [], + }, + defaultOptions: [], + create(context) { + return { + 'Program:exit'(node) { + const result = analyzeClassMemberUsage( + node, + ESLintUtils.nullThrows( + context.sourceCode.scopeManager, + 'Missing required scope manager', + ), + ); + + for (const classScope of result.values()) { + for (const member of [ + ...classScope.members.instance.values(), + ...classScope.members.static.values(), + ]) { + if ( + (!member.isPrivate() && !member.isHashPrivate()) || + member.isUsed() + ) { + continue; + } + + context.report({ + node: member.nameNode, + messageId: 'unusedPrivateClassMember', + data: { classMemberName: member.name }, + }); + } + } + }, + }; + }, +}); diff --git a/packages/eslint-plugin/src/util/class-scope-analyzer/classScopeAnalyzer.ts b/packages/eslint-plugin/src/util/class-scope-analyzer/classScopeAnalyzer.ts new file mode 100644 index 000000000000..b72ece7f9a25 --- /dev/null +++ b/packages/eslint-plugin/src/util/class-scope-analyzer/classScopeAnalyzer.ts @@ -0,0 +1,716 @@ +/* eslint-disable @typescript-eslint/no-this-alias -- we do a bunch of "start iterating from here" code which isn't actually aliasing `this` */ +import type { + Scope, + ScopeManager, + Variable, +} from '@typescript-eslint/scope-manager'; +import type { TSESTree } from '@typescript-eslint/utils'; + +import { Visitor } from '@typescript-eslint/scope-manager'; +import { AST_NODE_TYPES } from '@typescript-eslint/utils'; + +import type { ClassNode, Key, MemberNode } from './types'; + +import { nullThrows, NullThrowsReasons } from '..'; +import { + extractNameForMember, + extractNameForMemberExpression, +} from './extractComputedName'; +import { privateKey } from './types'; + +export class Member { + /** + * The node that declares this member + */ + public readonly node: MemberNode; + + /** + * The resolved, unique key for this member. + */ + public readonly key: Key; + + /** + * The member name, as given in the source code. + */ + public readonly name: string; + + /** + * The node that represents the member name in the source code. + * Used for reporting errors. + */ + public readonly nameNode: TSESTree.Node; + + /** + * The number of writes to this member. + */ + public writeCount = 0; + + /** + * The number of reads from this member. + */ + public readCount = 0; + + private constructor( + node: MemberNode, + key: Key, + name: string, + nameNode: TSESTree.Node, + ) { + this.node = node; + this.key = key; + this.name = name; + this.nameNode = nameNode; + } + public static create(node: MemberNode): Member | null { + const name = extractNameForMember(node); + if (name == null) { + return null; + } + return new Member(node, name.key, name.codeName, name.nameNode); + } + + public isAccessor(): boolean { + if ( + this.node.type === AST_NODE_TYPES.MethodDefinition || + this.node.type === AST_NODE_TYPES.TSAbstractMethodDefinition + ) { + return this.node.kind === 'set' || this.node.kind === 'get'; + } + + return ( + this.node.type === AST_NODE_TYPES.AccessorProperty || + this.node.type === AST_NODE_TYPES.TSAbstractAccessorProperty + ); + } + + public isHashPrivate(): boolean { + return ( + 'key' in this.node && + this.node.key.type === AST_NODE_TYPES.PrivateIdentifier + ); + } + + public isPrivate(): boolean { + return this.node.accessibility === 'private'; + } + + public isStatic(): boolean { + return this.node.static; + } + + public isUsed(): boolean { + return ( + this.readCount > 0 || + // any usage of an accessor is considered a usage as accessor can have side effects + (this.writeCount > 0 && this.isAccessor()) + ); + } +} + +function isWriteOnlyUsage(node: TSESTree.Node, parent: TSESTree.Node): boolean { + if ( + parent.type !== AST_NODE_TYPES.AssignmentExpression && + parent.type !== AST_NODE_TYPES.ForInStatement && + parent.type !== AST_NODE_TYPES.ForOfStatement && + parent.type !== AST_NODE_TYPES.AssignmentPattern + ) { + return false; + } + + // If it's on the right then it's a read not a write + if (parent.left !== node) { + return false; + } + + if ( + parent.type === AST_NODE_TYPES.AssignmentExpression && + // For any other operator (such as '+=') we still consider it a read operation + parent.operator !== '=' + ) { + // if the read operation is "discarded" in an empty statement, then it is write only. + return parent.parent.type === AST_NODE_TYPES.ExpressionStatement; + } + + return true; +} + +function countReference(identifierParent: TSESTree.Node, member: Member) { + const identifierGrandparent = nullThrows( + identifierParent.parent, + NullThrowsReasons.MissingParent, + ); + + if (isWriteOnlyUsage(identifierParent, identifierGrandparent)) { + member.writeCount += 1; + return; + } + + const identifierGreatGrandparent = identifierGrandparent.parent; + + // A statement which only increments (`this.#x++;`) + if ( + identifierGrandparent.type === AST_NODE_TYPES.UpdateExpression && + identifierGreatGrandparent?.type === AST_NODE_TYPES.ExpressionStatement + ) { + member.writeCount += 1; + return; + } + + /* + * ({ x: this.#usedInDestructuring } = bar); + * + * But should treat the following as a read: + * ({ [this.#x]: a } = foo); + */ + if ( + identifierGrandparent.type === AST_NODE_TYPES.Property && + identifierGreatGrandparent?.type === AST_NODE_TYPES.ObjectPattern && + identifierGrandparent.value === identifierParent + ) { + member.writeCount += 1; + return; + } + + // [...this.#unusedInRestPattern] = bar; + if (identifierGrandparent.type === AST_NODE_TYPES.RestElement) { + member.writeCount += 1; + return; + } + + // [this.#unusedInAssignmentPattern] = bar; + if (identifierGrandparent.type === AST_NODE_TYPES.ArrayPattern) { + member.writeCount += 1; + return; + } + + member.readCount += 1; +} + +type IntermediateNode = + | TSESTree.FunctionDeclaration + | TSESTree.FunctionExpression + | TSESTree.Program + | TSESTree.StaticBlock; + +abstract class ThisScope extends Visitor { + /** + * True if the context is considered a static context and so `this` refers to + * the class and not an instance (eg a static method or a static block). + */ + protected readonly isStaticThisContext: boolean; + + /** + * The classes directly declared within this class -- for example a class declared within a method. + * This does not include grandchild classes. + */ + public readonly childScopes: ThisScope[] = []; + + /** + * The scope manager instance used to resolve variables to improve discovery of usages. + */ + public readonly scopeManager: ScopeManager; + + /** + * The parent class scope if one exists. + */ + public readonly upper: ThisScope | null; + + /** + * The context of the `this` reference in the current scope. + */ + protected readonly thisContext: ClassScope | null; + + constructor( + scopeManager: ScopeManager, + upper: ThisScope | null, + thisContext: 'none' | 'self' | ClassScope, + isStaticThisContext: boolean, + ) { + super({}); + this.scopeManager = scopeManager; + this.upper = upper; + this.isStaticThisContext = isStaticThisContext; + + if (thisContext === 'self') { + if (!(this instanceof ClassScope)) { + throw new Error('Cannot use `self` unless it is in a ClassScope'); + } + this.thisContext = this; + } else if (thisContext === 'none') { + this.thisContext = null; + } else { + this.thisContext = thisContext; + } + } + + private findNearestScope(node: TSESTree.Node): Scope | null { + let currentScope: Scope | null | undefined; + let currentNode: TSESTree.Node | undefined = node; + do { + currentScope = this.scopeManager.acquire(currentNode); + if (currentNode.parent == null) { + break; + } + currentNode = currentNode.parent; + } while (currentScope == null); + return currentScope; + } + private findVariableInScope( + node: TSESTree.Node, + name: string, + ): Variable | null { + let currentScope = this.findNearestScope(node); + let variable = null; + + while (currentScope != null) { + variable = currentScope.set.get(name) ?? null; + if (variable != null) { + break; + } + + currentScope = currentScope.upper; + } + + return variable; + } + + private getObjectClass(node: TSESTree.MemberExpression): { + thisContext: ThisScope['thisContext']; + type: 'instance' | 'static'; + } | null { + switch (node.object.type) { + case AST_NODE_TYPES.ThisExpression: { + if (this.thisContext == null) { + return null; + } + return { + thisContext: this.thisContext, + type: this.isStaticThisContext ? 'static' : 'instance', + }; + } + + case AST_NODE_TYPES.Identifier: { + const thisContext = this.findClassScopeWithName(node.object.name); + if (thisContext != null) { + return { thisContext, type: 'static' }; + } + + // the following code does some very rudimentary scope analysis to handle some trivial cases + const variable = this.findVariableInScope(node, node.object.name); + if (variable == null || variable.defs.length === 0) { + return null; + } + + const firstDef = variable.defs[0]; + switch (firstDef.node.type) { + // detect simple reassignment of `this` + // ``` + // class Foo { + // private prop: number; + // method(thing: Foo) { + // const self = this; + // return self.prop; + // } + // } + // ``` + case AST_NODE_TYPES.VariableDeclarator: { + const value = firstDef.node.init; + if (value == null || value.type !== AST_NODE_TYPES.ThisExpression) { + return null; + } + + if ( + variable.references.some( + ref => ref.isWrite() && ref.init !== true, + ) + ) { + // variable is assigned to multiple times so we can't be sure that it's still the same class + return null; + } + + // we have a case like `const self = this` or `let self = this` that is not reassigned + // so we can safely assume that it's still the same class! + return { + thisContext: this.thisContext, + type: this.isStaticThisContext ? 'static' : 'instance', + }; + } + + // Look for variables typed as the current class: + // ``` + // class Foo { + // private prop: number; + // method(thing: Foo) { + // // this references the private instance member but not via `this` so we can't see it + // thing.prop = 1; + // } + // } + // ``` + default: { + const typeAnnotation = (() => { + if ( + 'typeAnnotation' in firstDef.name && + firstDef.name.typeAnnotation != null + ) { + return firstDef.name.typeAnnotation.typeAnnotation; + } + + return null; + })(); + + if (typeAnnotation == null) { + return null; + } + + // Cases like `method(thing: Foo) { ... }` + if ( + typeAnnotation.type === AST_NODE_TYPES.TSTypeReference && + typeAnnotation.typeName.type === AST_NODE_TYPES.Identifier + ) { + const typeName = typeAnnotation.typeName.name; + const typeScope = this.findClassScopeWithName(typeName); + if (typeScope != null) { + return { thisContext: typeScope, type: 'instance' }; + } + } + + // Cases like `method(thing: typeof Foo) { ... }` + if ( + typeAnnotation.type === AST_NODE_TYPES.TSTypeQuery && + typeAnnotation.exprName.type === AST_NODE_TYPES.Identifier + ) { + const exprName = typeAnnotation.exprName.name; + const exprScope = this.findClassScopeWithName(exprName); + if (exprScope != null) { + return { thisContext: exprScope, type: 'static' }; + } + } + } + } + return null; + } + case AST_NODE_TYPES.MemberExpression: + // TODO - we could probably recurse here to do some more complex analysis and support like `foo.bar.baz` nested references + return null; + + default: + return null; + } + } + + private visitClass(node: ClassNode): void { + const classScope = new ClassScope(node, this, this.scopeManager); + this.childScopes.push(classScope); + classScope.visitChildren(node); + } + + private visitIntermediate(node: IntermediateNode): void { + const intermediateScope = new IntermediateScope( + this.scopeManager, + this, + node, + ); + this.childScopes.push(intermediateScope); + intermediateScope.visitChildren(node); + } + + /** + * Gets the nearest class scope with the given name. + */ + public findClassScopeWithName(name: string): ClassScope | null { + let currentScope: ThisScope | null = this; + while (currentScope != null) { + if ( + currentScope instanceof ClassScope && + currentScope.className === name + ) { + return currentScope; + } + currentScope = currentScope.upper; + } + return null; + } + + ///////////////////// + // Visit selectors // + ///////////////////// + + protected ClassDeclaration(node: TSESTree.ClassDeclaration): void { + this.visitClass(node); + } + + protected ClassExpression(node: TSESTree.ClassExpression): void { + this.visitClass(node); + } + + protected FunctionDeclaration(node: TSESTree.FunctionDeclaration): void { + this.visitIntermediate(node); + } + + protected FunctionExpression(node: TSESTree.FunctionExpression): void { + this.visitIntermediate(node); + } + + protected MemberExpression(node: TSESTree.MemberExpression): void { + this.visitChildren(node); + + if (node.property.type === AST_NODE_TYPES.PrivateIdentifier) { + // will be handled by the PrivateIdentifier visitor + return; + } + + const propertyName = extractNameForMemberExpression(node); + if (propertyName == null) { + return; + } + + const objectClassName = this.getObjectClass(node); + if (objectClassName == null) { + return; + } + + if (objectClassName.thisContext == null) { + return; + } + + const members = + objectClassName.type === 'instance' + ? objectClassName.thisContext.members.instance + : objectClassName.thisContext.members.static; + const member = members.get(propertyName.key); + if (member == null) { + return; + } + + countReference(node, member); + } + + protected PrivateIdentifier(node: TSESTree.PrivateIdentifier): void { + this.visitChildren(node); + + if ( + (node.parent.type === AST_NODE_TYPES.MethodDefinition || + node.parent.type === AST_NODE_TYPES.PropertyDefinition) && + node.parent.key === node + ) { + // ignore the member definition + return; + } + + // We can actually be pretty loose with our code here thanks to how private + // members are designed. + // + // 1) classes CANNOT have a static and instance private member with the + // same name, so we don't need to match up static access. + // 2) nested classes CANNOT access a private member of their parent class if + // the member has the same name as a private member of the nested class. + // + // together this means that we can just look for the member upwards until we + // find a match and we know that will be the correct match! + + let currentScope: ThisScope | null = this; + const key = privateKey(node); + while (currentScope != null) { + if (currentScope.thisContext != null) { + const member = + currentScope.thisContext.members.instance.get(key) ?? + currentScope.thisContext.members.static.get(key); + if (member != null) { + countReference(node.parent, member); + return; + } + } + + currentScope = currentScope.upper; + } + } + + protected StaticBlock(node: TSESTree.StaticBlock): void { + this.visitIntermediate(node); + } +} + +/** + * Any other scope that is not a class scope + * + * When we visit a function declaration/expression the `this` reference is + * rebound so it no longer refers to the class. + * + * This also supports a function's `this` parameter. + */ +class IntermediateScope extends ThisScope { + constructor( + scopeManager: ScopeManager, + upper: ThisScope | null, + node: IntermediateNode, + ) { + if (node.type === AST_NODE_TYPES.Program) { + super(scopeManager, upper, 'none', false); + return; + } + + if (node.type === AST_NODE_TYPES.StaticBlock) { + if (upper == null || !(upper instanceof ClassScope)) { + throw new Error( + 'Cannot have a static block without an upper ClassScope', + ); + } + super(scopeManager, upper, upper, true); + return; + } + + // method definition + if ( + (node.parent.type === AST_NODE_TYPES.MethodDefinition || + node.parent.type === AST_NODE_TYPES.PropertyDefinition) && + node.parent.value === node + ) { + if (upper == null || !(upper instanceof ClassScope)) { + throw new Error( + 'Cannot have a class method/property without an upper ClassScope', + ); + } + super(scopeManager, upper, upper, node.parent.static); + return; + } + + // function with a `this` parameter + if ( + upper != null && + node.params.length > 0 && + node.params[0].type === AST_NODE_TYPES.Identifier && + node.params[0].name === 'this' + ) { + const thisType = node.params[0].typeAnnotation?.typeAnnotation; + if ( + thisType?.type === AST_NODE_TYPES.TSTypeReference && + thisType.typeName.type === AST_NODE_TYPES.Identifier + ) { + const thisContext = upper.findClassScopeWithName( + thisType.typeName.name, + ); + if (thisContext != null) { + super(scopeManager, upper, thisContext, false); + return; + } + } + } + + super(scopeManager, upper, 'none', false); + } +} + +export interface ClassScopeResult { + /** + * The classes name as given in the source code. + * If this is `null` then the class is an anonymous class. + */ + readonly className: string | null; + /** + * The class's members, keyed by their name + */ + readonly members: { + readonly instance: Map; + readonly static: Map; + }; +} + +class ClassScope extends ThisScope implements ClassScopeResult { + public readonly className: string | null; + + /** + * The class's members, keyed by their name + */ + public readonly members: ClassScopeResult['members'] = { + instance: new Map(), + static: new Map(), + }; + + /** + * The node that declares this class. + */ + public readonly theClass: ClassNode; + + public constructor( + theClass: ClassNode, + upper: ClassScope | IntermediateScope | null, + scopeManager: ScopeManager, + ) { + super(scopeManager, upper, 'self', false); + + this.theClass = theClass; + this.className = theClass.id?.name ?? null; + + for (const memberNode of theClass.body.body) { + switch (memberNode.type) { + case AST_NODE_TYPES.MethodDefinition: + if (memberNode.kind === 'constructor') { + for (const parameter of memberNode.value.params) { + if (parameter.type !== AST_NODE_TYPES.TSParameterProperty) { + continue; + } + + const member = Member.create(parameter); + if (member == null) { + continue; + } + + this.members.instance.set(member.key, member); + } + + // break instead of falling through because the constructor is not a "member" we track + break; + } + // intentional fallthrough + case AST_NODE_TYPES.AccessorProperty: + case AST_NODE_TYPES.PropertyDefinition: + case AST_NODE_TYPES.TSAbstractAccessorProperty: + case AST_NODE_TYPES.TSAbstractMethodDefinition: + case AST_NODE_TYPES.TSAbstractPropertyDefinition: { + const member = Member.create(memberNode); + if (member == null) { + continue; + } + if (member.isStatic()) { + this.members.static.set(member.key, member); + } else { + this.members.instance.set(member.key, member); + } + break; + } + + case AST_NODE_TYPES.StaticBlock: + // static blocks declare no members + continue; + + case AST_NODE_TYPES.TSIndexSignature: + // index signatures are type signatures only and are fully computed + continue; + } + } + } +} + +export function analyzeClassMemberUsage( + program: TSESTree.Program, + scopeManager: ScopeManager, +): ReadonlyMap { + const rootScope = new IntermediateScope(scopeManager, null, program); + rootScope.visit(program); + return traverseScopes(rootScope); +} + +function traverseScopes( + currentScope: ThisScope, + analysisResults = new Map(), +) { + if (currentScope instanceof ClassScope) { + analysisResults.set(currentScope.theClass, currentScope); + } + + for (const childScope of currentScope.childScopes) { + traverseScopes(childScope, analysisResults); + } + + return analysisResults; +} diff --git a/packages/eslint-plugin/src/util/class-scope-analyzer/extractComputedName.ts b/packages/eslint-plugin/src/util/class-scope-analyzer/extractComputedName.ts new file mode 100644 index 000000000000..e100cce75900 --- /dev/null +++ b/packages/eslint-plugin/src/util/class-scope-analyzer/extractComputedName.ts @@ -0,0 +1,102 @@ +import type { TSESTree } from '@typescript-eslint/utils'; + +import { AST_NODE_TYPES } from '@typescript-eslint/utils'; + +import type { Key, MemberNode } from './types'; + +import { privateKey, publicKey } from './types'; + +export interface ExtractedName { + key: Key; + codeName: string; + nameNode: TSESTree.Node; +} + +function extractComputedName( + computedName: TSESTree.Expression, +): ExtractedName | null { + if (computedName.type === AST_NODE_TYPES.Literal) { + const name = computedName.value?.toString() ?? 'null'; + return { + codeName: name, + key: publicKey(name), + nameNode: computedName, + }; + } + if ( + computedName.type === AST_NODE_TYPES.TemplateLiteral && + computedName.expressions.length === 0 + ) { + const name = computedName.quasis[0].value.raw; + return { + codeName: name, + key: publicKey(name), + nameNode: computedName, + }; + } + return null; +} +function extractNonComputedName( + nonComputedName: TSESTree.Identifier | TSESTree.PrivateIdentifier, +): ExtractedName | null { + const name = nonComputedName.name; + if (nonComputedName.type === AST_NODE_TYPES.PrivateIdentifier) { + return { + codeName: `#${name}`, + key: privateKey(nonComputedName), + nameNode: nonComputedName, + }; + } + return { + codeName: name, + key: publicKey(name), + nameNode: nonComputedName, + }; +} +/** + * Extracts the string name for a member. + * @returns `null` if the name cannot be extracted due to it being computed. + */ +export function extractNameForMember(node: MemberNode): ExtractedName | null { + if (node.type === AST_NODE_TYPES.TSParameterProperty) { + switch (node.parameter.type) { + case AST_NODE_TYPES.ArrayPattern: + case AST_NODE_TYPES.ObjectPattern: + case AST_NODE_TYPES.RestElement: + // Nonsensical properties -- see https://github.com/typescript-eslint/typescript-eslint/issues/11708 + return null; + + case AST_NODE_TYPES.AssignmentPattern: + if (node.parameter.left.type !== AST_NODE_TYPES.Identifier) { + return null; + } + return extractNonComputedName(node.parameter.left); + + case AST_NODE_TYPES.Identifier: + return extractNonComputedName(node.parameter); + } + } + + if (node.computed) { + return extractComputedName(node.key); + } + + if (node.key.type === AST_NODE_TYPES.Literal) { + return extractComputedName(node.key); + } + + return extractNonComputedName(node.key); +} +/** + * Extracts the string property name for a member. + * @returns `null` if the name cannot be extracted due to it being a computed. + */ +export function extractNameForMemberExpression( + node: TSESTree.MemberExpression, +): ExtractedName | null { + if (node.computed) { + return extractComputedName(node.property); + } + + return extractNonComputedName(node.property); +} diff --git a/packages/eslint-plugin/src/util/class-scope-analyzer/types.ts b/packages/eslint-plugin/src/util/class-scope-analyzer/types.ts new file mode 100644 index 000000000000..72c308a6166f --- /dev/null +++ b/packages/eslint-plugin/src/util/class-scope-analyzer/types.ts @@ -0,0 +1,21 @@ +import type { TSESTree } from '@typescript-eslint/utils'; + +export type ClassNode = TSESTree.ClassDeclaration | TSESTree.ClassExpression; +export type MemberNode = + | TSESTree.AccessorProperty + | TSESTree.MethodDefinition + | TSESTree.PropertyDefinition + | TSESTree.TSAbstractAccessorProperty + | TSESTree.TSAbstractMethodDefinition + | TSESTree.TSAbstractPropertyDefinition + | TSESTree.TSParameterProperty; +export type PrivateKey = string & { __brand: 'private-key' }; +export type PublicKey = string & { __brand: 'public-key' }; +export type Key = PrivateKey | PublicKey; + +export function publicKey(name: string): PublicKey { + return name as PublicKey; +} +export function privateKey(node: TSESTree.PrivateIdentifier): PrivateKey { + return `#private@@${node.name}` as PrivateKey; +} diff --git a/packages/eslint-plugin/tests/docs-eslint-output-snapshots/no-unused-private-class-members.shot b/packages/eslint-plugin/tests/docs-eslint-output-snapshots/no-unused-private-class-members.shot new file mode 100644 index 000000000000..5e4a1df2eefd --- /dev/null +++ b/packages/eslint-plugin/tests/docs-eslint-output-snapshots/no-unused-private-class-members.shot @@ -0,0 +1,16 @@ +Incorrect + +class A { + private foo = 123; + ~~~ Private class member 'foo' is defined but never used. +} + +Correct + +class A { + private foo = 123; + + constructor() { + console.log(this.foo); + } +} diff --git a/packages/eslint-plugin/tests/rules/no-unused-private-class-members.test.ts b/packages/eslint-plugin/tests/rules/no-unused-private-class-members.test.ts new file mode 100644 index 000000000000..c6541fc7464c --- /dev/null +++ b/packages/eslint-plugin/tests/rules/no-unused-private-class-members.test.ts @@ -0,0 +1,1232 @@ +// The following tests are adapted from the tests in eslint. +// Original Code: https://github.com/eslint/eslint/blob/522d8a32f326c52886c531f43cf6a1ff15af8286/tests/lib/rules/no-unused-private-class-members.js +// License : https://github.com/eslint/eslint/blob/522d8a32f326c52886c531f43cf6a1ff15af8286/LICENSE + +import { RuleTester } from '@typescript-eslint/rule-tester'; + +import rule from '../../src/rules/no-unused-private-class-members'; + +const ruleTester = new RuleTester(); + +ruleTester.run('no-unused-private-class-members', rule, { + valid: [ + 'class Foo {}', + ` +class Foo { + publicMember = 42; +} + `, + ` +class Foo { + public publicMember = 42; +} + `, + ` +class Foo { + protected publicMember = 42; +} + `, + ` +class C { + #usedInInnerClass; + + method(a) { + return class { + foo = a.#usedInInnerClass; + }; + } +} + `, + ` +class C { + private accessor accessorMember = 42; + + method() { + return this.accessorMember; + } +} + `, + ` +class C { + private static staticMember = 42; + + static method() { + return this.staticMember; + } +} + `, + { + code: ` +class C { + private static staticMember = 42; + + method() { + return C.staticMember; + } +} + `, + }, + ` +class Test1 { + constructor(private parameterProperty: number) {} + method() { + return this.parameterProperty; + } +} + `, + ` +class Test1 { + constructor(private readonly parameterProperty: number) {} + method() { + return this.parameterProperty; + } +} + `, + ` +class Test1 { + constructor(private readonly parameterProperty: number = 1) {} + method() { + return this.parameterProperty; + } +} + `, + ` +class Foo { + private prop: number; + + method(thing: Foo) { + return thing.prop; + } +} + `, + ` +class Foo { + private static staticProp: number; + + method(thing: typeof Foo) { + return thing.staticProp; + } +} + `, + ` +class Foo { + private prop: number; + + method() { + const self = this; + return self.prop; + } +} + `, + + ` +class Foo { + #privateMember = 42; + method() { + return this.#privateMember; + } +} + `, + ` +class Foo { + private privateMember = 42; + method() { + return this.privateMember; + } +} + `, + ` +class Foo { + #privateMember = 42; + anotherMember = this.#privateMember; +} + `, + ` +class Foo { + private privateMember = 42; + anotherMember = this.privateMember; +} + `, + ` +class Foo { + #privateMember = 42; + foo() { + anotherMember = this.#privateMember; + } +} + `, + ` +class Foo { + private privateMember = 42; + foo() { + anotherMember = this.privateMember; + } +} + `, + ` +class C { + #privateMember; + + foo() { + bar((this.#privateMember += 1)); + } +} + `, + ` +class C { + private privateMember; + + foo() { + bar((this.privateMember += 1)); + } +} + `, + ` +class Foo { + #privateMember = 42; + method() { + return someGlobalMethod(this.#privateMember); + } +} + `, + ` +class Foo { + private privateMember = 42; + method() { + return someGlobalMethod(this.privateMember); + } +} + `, + ` +class C { + #privateMember; + + foo() { + return class {}; + } + + bar() { + return this.#privateMember; + } +} + `, + ` +class C { + private privateMember; + + foo() { + return class {}; + } + + bar() { + return this.privateMember; + } +} + `, + ` +class Foo { + #privateMember; + method() { + for (const bar in this.#privateMember) { + } + } +} + `, + ` +class Foo { + private privateMember; + method() { + for (const bar in this.privateMember) { + } + } +} + `, + ` +class Foo { + #privateMember; + method() { + for (const bar of this.#privateMember) { + } + } +} + `, + ` +class Foo { + private privateMember; + method() { + for (const bar of this.privateMember) { + } + } +} + `, + ` +class Foo { + #privateMember; + method() { + [bar = 1] = this.#privateMember; + } +} + `, + ` +class Foo { + private privateMember; + method() { + [bar = 1] = this.privateMember; + } +} + `, + ` +class Foo { + #privateMember; + method() { + [bar] = this.#privateMember; + } +} + `, + ` +class Foo { + private privateMember; + method() { + [bar] = this.privateMember; + } +} + `, + ` +class C { + #privateMember; + + method() { + ({ [this.#privateMember]: a } = foo); + } +} + `, + ` +class C { + private privateMember; + + method() { + ({ [this.privateMember]: a } = foo); + } +} + `, + ` +class C { + set #privateMember(value) { + doSomething(value); + } + get #privateMember() { + return something(); + } + method() { + this.#privateMember += 1; + } +} + `, + ` +class C { + private set privateMember(value) { + doSomething(value); + } + private get privateMember() { + return something(); + } + method() { + this.privateMember += 1; + } +} + `, + ` +class Foo { + set #privateMember(value) {} + + method(a) { + [this.#privateMember] = a; + } +} + `, + ` +class Foo { + private set privateMember(value) {} + + method(a) { + [this.privateMember] = a; + } +} + `, + ` +class C { + get #privateMember() { + return something(); + } + set #privateMember(value) { + doSomething(value); + } + method() { + this.#privateMember += 1; + } +} + `, + ` +class C { + private get privateMember() { + return something(); + } + private set privateMember(value) { + doSomething(value); + } + method() { + this.privateMember += 1; + } +} + `, + + //-------------------------------------------------------------------------- + // Method definitions + //-------------------------------------------------------------------------- + ` +class Foo { + #privateMember() { + return 42; + } + anotherMethod() { + return this.#privateMember(); + } +} + `, + ` +class Foo { + private privateMember() { + return 42; + } + anotherMethod() { + return this.privateMember(); + } +} + `, + ` +class C { + set #privateMember(value) { + doSomething(value); + } + + foo() { + this.#privateMember = 1; + } +} + `, + ` +class C { + private set privateMember(value) { + doSomething(value); + } + + foo() { + this.privateMember = 1; + } +} + `, + ], + invalid: [ + { + code: ` +class C { + #unusedInOuterClass; + + foo() { + return class D { + #unusedInOuterClass; + + bar() { + return this.#unusedInOuterClass; + } + }; + } +} + `, + errors: [ + { + data: { + classMemberName: '#unusedInOuterClass', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class C { + #unusedOnlyInSecondNestedClass; + + foo() { + return class { + #unusedOnlyInSecondNestedClass; + + bar() { + return this.#unusedOnlyInSecondNestedClass; + } + }; + } + + baz() { + return this.#unusedOnlyInSecondNestedClass; + } + + bar() { + return class { + #unusedOnlyInSecondNestedClass; + }; + } +} + `, + errors: [ + { + data: { + classMemberName: '#unusedOnlyInSecondNestedClass', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class C { + #usedOnlyInTheSecondInnerClass; + + method(a) { + return class { + #usedOnlyInTheSecondInnerClass; + + method2(b) { + foo = b.#usedOnlyInTheSecondInnerClass; + } + + method3(b) { + foo = b.#usedOnlyInTheSecondInnerClass; + } + }; + } +} + `, + errors: [ + { + data: { + classMemberName: '#usedOnlyInTheSecondInnerClass', + }, + line: 3, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class C { + private accessor accessorMember = 42; +} + `, + errors: [ + { + data: { + classMemberName: 'accessorMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class C { + private static staticMember = 42; +} + `, + errors: [ + { + data: { + classMemberName: 'staticMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Test1 { + constructor(private parameterProperty: number) {} +} + `, + errors: [ + { + data: { + classMemberName: 'parameterProperty', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Test1 { + constructor(private readonly parameterProperty: number) {} +} + `, + errors: [ + { + data: { + classMemberName: 'parameterProperty', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Test1 { + constructor(private readonly parameterProperty: number = 1) {} +} + `, + errors: [ + { + data: { + classMemberName: 'parameterProperty', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + + { + // usage of a property outside the class + code: ` +class C { + private usedOutsideClass; +} + +const instance = new C(); +console.log(instance.usedOutsideClass); + `, + errors: [ + { + data: { + classMemberName: 'usedOutsideClass', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + // usage of a property outside the class + code: ` +class C { + private usedOutsideClass; +} + +const instance = new C(); +console.log(instance['usedOutsideClass']); + `, + errors: [ + { + data: { + classMemberName: 'usedOutsideClass', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + // too much indirection so we just bail + code: ` +class Foo { + private prop: number; + + method() { + const self1 = this; + const self2 = self1; + return self2.prop; + } +} + `, + errors: [ + { + data: { + classMemberName: 'prop', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + + { + code: ` +class Foo { + #privateMember = 5; +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + private privateMember = 5; +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class First {} +class Second { + #privateMember = 5; +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class First {} +class Second { + private privateMember = 5; +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class First { + #privateMember = 5; +} +class Second {} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class First { + private privateMember = 5; +} +class Second {} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class First { + #privateMember = 5; + #privateMember2 = 5; +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + { + data: { + classMemberName: '#privateMember2', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class First { + private privateMember = 5; + private privateMember2 = 5; +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + { + data: { + classMemberName: 'privateMember2', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + #privateMember = 5; + method() { + this.#privateMember = 42; + } +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + private privateMember = 5; + method() { + this.privateMember = 42; + } +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + #privateMember = 5; + method() { + this.#privateMember += 42; + } +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + private privateMember = 5; + method() { + this.privateMember += 42; + } +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class C { + #privateMember; + + foo() { + this.#privateMember++; + } +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class C { + private privateMember; + + foo() { + this.privateMember++; + } +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + + //-------------------------------------------------------------------------- + // Unused method definitions + //-------------------------------------------------------------------------- + { + code: ` +class Foo { + #privateMember() {} +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + private privateMember() {} +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + #privateMember() {} + #privateMemberUsed() { + return 42; + } + publicMethod() { + return this.#privateMemberUsed(); + } +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + private privateMember() {} + private privateMemberUsed() { + return 42; + } + publicMethod() { + return this.privateMemberUsed(); + } +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + set #privateMember(value) {} +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + private set privateMember(value) {} +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + #privateMember; + method() { + for (this.#privateMember in bar) { + } + } +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + private privateMember; + method() { + for (this.privateMember in bar) { + } + } +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + #privateMember; + method() { + for (this.#privateMember of bar) { + } + } +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + private privateMember; + method() { + for (this.privateMember of bar) { + } + } +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + #privateMember; + method() { + ({ x: this.#privateMember } = bar); + } +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + private privateMember; + method() { + ({ x: this.privateMember } = bar); + } +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + #privateMember; + method() { + [...this.#privateMember] = bar; + } +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + private privateMember; + method() { + [...this.privateMember] = bar; + } +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + #privateMember; + method() { + [this.#privateMember = 1] = bar; + } +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + private privateMember; + method() { + [this.privateMember = 1] = bar; + } +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + #privateMember; + method() { + [this.#privateMember] = bar; + } +} + `, + errors: [ + { + data: { + classMemberName: '#privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + { + code: ` +class Foo { + private privateMember; + method() { + [this.privateMember] = bar; + } +} + `, + errors: [ + { + data: { + classMemberName: 'privateMember', + }, + messageId: 'unusedPrivateClassMember', + }, + ], + }, + ], +}); diff --git a/packages/eslint-plugin/tests/schema-snapshots/no-unused-private-class-members.shot b/packages/eslint-plugin/tests/schema-snapshots/no-unused-private-class-members.shot new file mode 100644 index 000000000000..cdd9f8375858 --- /dev/null +++ b/packages/eslint-plugin/tests/schema-snapshots/no-unused-private-class-members.shot @@ -0,0 +1,10 @@ + +# SCHEMA: + +[] + + +# TYPES: + +/** No options declared */ +type Options = []; diff --git a/packages/parser/CHANGELOG.md b/packages/parser/CHANGELOG.md index c9063221465a..4c49a7633558 100644 --- a/packages/parser/CHANGELOG.md +++ b/packages/parser/CHANGELOG.md @@ -1,3 +1,9 @@ +## 8.47.0 (2025-11-17) + +This was a version bump only for parser to align it with other projects, there were no code changes. + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) This was a version bump only for parser to align it with other projects, there were no code changes. diff --git a/packages/parser/package.json b/packages/parser/package.json index ab5e4f8e997f..53ec1a75869d 100644 --- a/packages/parser/package.json +++ b/packages/parser/package.json @@ -1,6 +1,6 @@ { "name": "@typescript-eslint/parser", - "version": "8.46.4", + "version": "8.47.0", "description": "An ESLint custom parser which leverages TypeScript ESTree", "files": [ "dist", @@ -51,10 +51,10 @@ "typescript": ">=4.8.4 <6.0.0" }, "dependencies": { - "@typescript-eslint/scope-manager": "8.46.4", - "@typescript-eslint/types": "8.46.4", - "@typescript-eslint/typescript-estree": "8.46.4", - "@typescript-eslint/visitor-keys": "8.46.4", + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", "debug": "^4.3.4" }, "devDependencies": { diff --git a/packages/project-service/CHANGELOG.md b/packages/project-service/CHANGELOG.md index bf9d4d7e5704..3066789d747d 100644 --- a/packages/project-service/CHANGELOG.md +++ b/packages/project-service/CHANGELOG.md @@ -1,3 +1,9 @@ +## 8.47.0 (2025-11-17) + +This was a version bump only for project-service to align it with other projects, there were no code changes. + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) This was a version bump only for project-service to align it with other projects, there were no code changes. diff --git a/packages/project-service/package.json b/packages/project-service/package.json index cff8b0af692c..3cf0f0a9ccc5 100644 --- a/packages/project-service/package.json +++ b/packages/project-service/package.json @@ -1,6 +1,6 @@ { "name": "@typescript-eslint/project-service", - "version": "8.46.4", + "version": "8.47.0", "description": "Standalone TypeScript project service wrapper for linting.", "files": [ "dist", @@ -49,8 +49,8 @@ "typescript": ">=4.8.4 <6.0.0" }, "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.46.4", - "@typescript-eslint/types": "^8.46.4", + "@typescript-eslint/tsconfig-utils": "^8.47.0", + "@typescript-eslint/types": "^8.47.0", "debug": "^4.3.4" }, "devDependencies": { diff --git a/packages/rule-schema-to-typescript-types/CHANGELOG.md b/packages/rule-schema-to-typescript-types/CHANGELOG.md index d240d23a74b3..fdb759518e94 100644 --- a/packages/rule-schema-to-typescript-types/CHANGELOG.md +++ b/packages/rule-schema-to-typescript-types/CHANGELOG.md @@ -1,3 +1,9 @@ +## 8.47.0 (2025-11-17) + +This was a version bump only for rule-schema-to-typescript-types to align it with other projects, there were no code changes. + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) This was a version bump only for rule-schema-to-typescript-types to align it with other projects, there were no code changes. diff --git a/packages/rule-schema-to-typescript-types/package.json b/packages/rule-schema-to-typescript-types/package.json index e6313346d319..c2671e0ef36e 100644 --- a/packages/rule-schema-to-typescript-types/package.json +++ b/packages/rule-schema-to-typescript-types/package.json @@ -1,6 +1,6 @@ { "name": "@typescript-eslint/rule-schema-to-typescript-types", - "version": "8.46.4", + "version": "8.47.0", "description": "Converts ESLint rule schemas to equivalent TypeScript type strings.", "type": "module", "exports": { @@ -32,8 +32,8 @@ "typecheck": "yarn run -BT nx typecheck" }, "dependencies": { - "@typescript-eslint/type-utils": "8.46.4", - "@typescript-eslint/utils": "8.46.4", + "@typescript-eslint/type-utils": "8.47.0", + "@typescript-eslint/utils": "8.47.0", "natural-compare": "^1.4.0" }, "devDependencies": { diff --git a/packages/rule-tester/CHANGELOG.md b/packages/rule-tester/CHANGELOG.md index 2ceadf00ab3c..5efc9041311a 100644 --- a/packages/rule-tester/CHANGELOG.md +++ b/packages/rule-tester/CHANGELOG.md @@ -1,3 +1,9 @@ +## 8.47.0 (2025-11-17) + +This was a version bump only for rule-tester to align it with other projects, there were no code changes. + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) This was a version bump only for rule-tester to align it with other projects, there were no code changes. diff --git a/packages/rule-tester/package.json b/packages/rule-tester/package.json index b63e19e2b7d5..cf69ec3e88cd 100644 --- a/packages/rule-tester/package.json +++ b/packages/rule-tester/package.json @@ -1,6 +1,6 @@ { "name": "@typescript-eslint/rule-tester", - "version": "8.46.4", + "version": "8.47.0", "description": "Tooling to test ESLint rules", "files": [ "dist", @@ -44,9 +44,9 @@ }, "//": "NOTE - AJV is out-of-date, but it's intentionally synced with ESLint - https://github.com/eslint/eslint/blob/ad9dd6a933fd098a0d99c6a9aa059850535c23ee/package.json#L70", "dependencies": { - "@typescript-eslint/parser": "8.46.4", - "@typescript-eslint/typescript-estree": "8.46.4", - "@typescript-eslint/utils": "8.46.4", + "@typescript-eslint/parser": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/utils": "8.47.0", "ajv": "^6.12.6", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "4.6.2", diff --git a/packages/scope-manager/CHANGELOG.md b/packages/scope-manager/CHANGELOG.md index de5fd4f62be6..1d83ee47c4fd 100644 --- a/packages/scope-manager/CHANGELOG.md +++ b/packages/scope-manager/CHANGELOG.md @@ -1,3 +1,9 @@ +## 8.47.0 (2025-11-17) + +This was a version bump only for scope-manager to align it with other projects, there were no code changes. + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) This was a version bump only for scope-manager to align it with other projects, there were no code changes. diff --git a/packages/scope-manager/package.json b/packages/scope-manager/package.json index 5214090600a6..4f0304095919 100644 --- a/packages/scope-manager/package.json +++ b/packages/scope-manager/package.json @@ -1,6 +1,6 @@ { "name": "@typescript-eslint/scope-manager", - "version": "8.46.4", + "version": "8.47.0", "description": "TypeScript scope analyser for ESLint", "files": [ "dist", @@ -47,11 +47,11 @@ "typecheck": "yarn run -BT nx typecheck" }, "dependencies": { - "@typescript-eslint/types": "8.46.4", - "@typescript-eslint/visitor-keys": "8.46.4" + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0" }, "devDependencies": { - "@typescript-eslint/typescript-estree": "8.46.4", + "@typescript-eslint/typescript-estree": "8.47.0", "@vitest/coverage-v8": "^3.1.3", "@vitest/pretty-format": "^3.1.3", "eslint": "*", diff --git a/packages/tsconfig-utils/CHANGELOG.md b/packages/tsconfig-utils/CHANGELOG.md index eccf448aa899..a2a36907cb3f 100644 --- a/packages/tsconfig-utils/CHANGELOG.md +++ b/packages/tsconfig-utils/CHANGELOG.md @@ -1,3 +1,9 @@ +## 8.47.0 (2025-11-17) + +This was a version bump only for tsconfig-utils to align it with other projects, there were no code changes. + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) This was a version bump only for tsconfig-utils to align it with other projects, there were no code changes. diff --git a/packages/tsconfig-utils/package.json b/packages/tsconfig-utils/package.json index 8fbaa26d1dfb..a4274d681783 100644 --- a/packages/tsconfig-utils/package.json +++ b/packages/tsconfig-utils/package.json @@ -1,6 +1,6 @@ { "name": "@typescript-eslint/tsconfig-utils", - "version": "8.46.4", + "version": "8.47.0", "description": "Utilities for collecting TSConfigs for linting scenarios.", "files": [ "dist", diff --git a/packages/type-utils/CHANGELOG.md b/packages/type-utils/CHANGELOG.md index 9257f2c6b57e..2eec584f475b 100644 --- a/packages/type-utils/CHANGELOG.md +++ b/packages/type-utils/CHANGELOG.md @@ -1,3 +1,9 @@ +## 8.47.0 (2025-11-17) + +This was a version bump only for type-utils to align it with other projects, there were no code changes. + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) This was a version bump only for type-utils to align it with other projects, there were no code changes. diff --git a/packages/type-utils/package.json b/packages/type-utils/package.json index 59271a4bb535..632d9478fd1d 100644 --- a/packages/type-utils/package.json +++ b/packages/type-utils/package.json @@ -1,6 +1,6 @@ { "name": "@typescript-eslint/type-utils", - "version": "8.46.4", + "version": "8.47.0", "description": "Type utilities for working with TypeScript + ESLint together", "files": [ "dist", @@ -44,9 +44,9 @@ "typecheck": "yarn run -BT nx typecheck" }, "dependencies": { - "@typescript-eslint/types": "8.46.4", - "@typescript-eslint/typescript-estree": "8.46.4", - "@typescript-eslint/utils": "8.46.4", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/utils": "8.47.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, @@ -55,7 +55,7 @@ "typescript": ">=4.8.4 <6.0.0" }, "devDependencies": { - "@typescript-eslint/parser": "8.46.4", + "@typescript-eslint/parser": "8.47.0", "@vitest/coverage-v8": "^3.1.3", "ajv": "^6.12.6", "eslint": "*", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 7085c62c42b4..167cc6c8c1bc 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,3 +1,9 @@ +## 8.47.0 (2025-11-17) + +This was a version bump only for types to align it with other projects, there were no code changes. + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) This was a version bump only for types to align it with other projects, there were no code changes. diff --git a/packages/types/package.json b/packages/types/package.json index 961fec65b815..8b103568746c 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@typescript-eslint/types", - "version": "8.46.4", + "version": "8.47.0", "description": "Types for the TypeScript-ESTree AST spec", "files": [ "dist", diff --git a/packages/typescript-eslint/CHANGELOG.md b/packages/typescript-eslint/CHANGELOG.md index f26f3626d103..3e4bd06180c6 100644 --- a/packages/typescript-eslint/CHANGELOG.md +++ b/packages/typescript-eslint/CHANGELOG.md @@ -1,3 +1,9 @@ +## 8.47.0 (2025-11-17) + +This was a version bump only for typescript-eslint to align it with other projects, there were no code changes. + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) This was a version bump only for typescript-eslint to align it with other projects, there were no code changes. diff --git a/packages/typescript-eslint/package.json b/packages/typescript-eslint/package.json index ff1414887fc1..9334a320109c 100644 --- a/packages/typescript-eslint/package.json +++ b/packages/typescript-eslint/package.json @@ -1,6 +1,6 @@ { "name": "typescript-eslint", - "version": "8.46.4", + "version": "8.47.0", "description": "Tooling which enables you to use TypeScript with ESLint", "files": [ "dist", @@ -50,10 +50,10 @@ "typecheck": "yarn run -BT nx typecheck" }, "dependencies": { - "@typescript-eslint/eslint-plugin": "8.46.4", - "@typescript-eslint/parser": "8.46.4", - "@typescript-eslint/typescript-estree": "8.46.4", - "@typescript-eslint/utils": "8.46.4" + "@typescript-eslint/eslint-plugin": "8.47.0", + "@typescript-eslint/parser": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0", + "@typescript-eslint/utils": "8.47.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", diff --git a/packages/typescript-estree/CHANGELOG.md b/packages/typescript-estree/CHANGELOG.md index 0406f93e5141..5544bf977778 100644 --- a/packages/typescript-estree/CHANGELOG.md +++ b/packages/typescript-estree/CHANGELOG.md @@ -1,3 +1,9 @@ +## 8.47.0 (2025-11-17) + +This was a version bump only for typescript-estree to align it with other projects, there were no code changes. + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) ### 🩹 Fixes diff --git a/packages/typescript-estree/package.json b/packages/typescript-estree/package.json index e3a732a412ab..e7bd58960daf 100644 --- a/packages/typescript-estree/package.json +++ b/packages/typescript-estree/package.json @@ -1,6 +1,6 @@ { "name": "@typescript-eslint/typescript-estree", - "version": "8.46.4", + "version": "8.47.0", "description": "A parser that converts TypeScript source code into an ESTree compatible form", "files": [ "dist", @@ -52,10 +52,10 @@ "typecheck": "yarn run -BT nx typecheck" }, "dependencies": { - "@typescript-eslint/project-service": "8.46.4", - "@typescript-eslint/tsconfig-utils": "8.46.4", - "@typescript-eslint/types": "8.46.4", - "@typescript-eslint/visitor-keys": "8.46.4", + "@typescript-eslint/project-service": "8.47.0", + "@typescript-eslint/tsconfig-utils": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/visitor-keys": "8.47.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", diff --git a/packages/utils/CHANGELOG.md b/packages/utils/CHANGELOG.md index 4e097649dc91..7caa39657a3b 100644 --- a/packages/utils/CHANGELOG.md +++ b/packages/utils/CHANGELOG.md @@ -1,3 +1,9 @@ +## 8.47.0 (2025-11-17) + +This was a version bump only for utils to align it with other projects, there were no code changes. + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) This was a version bump only for utils to align it with other projects, there were no code changes. diff --git a/packages/utils/package.json b/packages/utils/package.json index 8b569c25913c..3621d7a1e47d 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "@typescript-eslint/utils", - "version": "8.46.4", + "version": "8.47.0", "description": "Utilities for working with TypeScript + ESLint together", "files": [ "dist", @@ -62,9 +62,9 @@ }, "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", - "@typescript-eslint/scope-manager": "8.46.4", - "@typescript-eslint/types": "8.46.4", - "@typescript-eslint/typescript-estree": "8.46.4" + "@typescript-eslint/scope-manager": "8.47.0", + "@typescript-eslint/types": "8.47.0", + "@typescript-eslint/typescript-estree": "8.47.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", diff --git a/packages/visitor-keys/CHANGELOG.md b/packages/visitor-keys/CHANGELOG.md index f5c5a0aec14c..377db5b76353 100644 --- a/packages/visitor-keys/CHANGELOG.md +++ b/packages/visitor-keys/CHANGELOG.md @@ -1,3 +1,9 @@ +## 8.47.0 (2025-11-17) + +This was a version bump only for visitor-keys to align it with other projects, there were no code changes. + +You can read about our [versioning strategy](https://typescript-eslint.io/users/versioning) and [releases](https://typescript-eslint.io/users/releases) on our website. + ## 8.46.4 (2025-11-10) This was a version bump only for visitor-keys to align it with other projects, there were no code changes. diff --git a/packages/visitor-keys/package.json b/packages/visitor-keys/package.json index 6ac04b9ebd70..7e9159da6db3 100644 --- a/packages/visitor-keys/package.json +++ b/packages/visitor-keys/package.json @@ -1,6 +1,6 @@ { "name": "@typescript-eslint/visitor-keys", - "version": "8.46.4", + "version": "8.47.0", "description": "Visitor keys used to help traverse the TypeScript-ESTree AST", "files": [ "dist", @@ -45,7 +45,7 @@ "typecheck": "yarn run -BT nx typecheck" }, "dependencies": { - "@typescript-eslint/types": "8.46.4", + "@typescript-eslint/types": "8.47.0", "eslint-visitor-keys": "^4.2.1" }, "devDependencies": { diff --git a/packages/website-eslint/package.json b/packages/website-eslint/package.json index 149eb9cf736e..f9e06638677b 100644 --- a/packages/website-eslint/package.json +++ b/packages/website-eslint/package.json @@ -40,7 +40,7 @@ "@typescript-eslint/scope-manager": "workspace:*", "@typescript-eslint/typescript-estree": "workspace:*", "@typescript-eslint/visitor-keys": "workspace:*", - "esbuild": "~0.25.0", + "esbuild": "~0.27.0", "eslint": "*", "esquery": "*", "rimraf": "*", diff --git a/yarn.lock b/yarn.lock index dd7f79df6a26..41cffe290e31 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1565,36 +1565,36 @@ __metadata: languageName: node linkType: hard -"@cspell/cspell-bundled-dicts@npm:9.2.0": - version: 9.2.0 - resolution: "@cspell/cspell-bundled-dicts@npm:9.2.0" +"@cspell/cspell-bundled-dicts@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/cspell-bundled-dicts@npm:9.3.1" dependencies: "@cspell/dict-ada": ^4.1.1 "@cspell/dict-al": ^1.1.1 - "@cspell/dict-aws": ^4.0.12 - "@cspell/dict-bash": ^4.2.1 - "@cspell/dict-companies": ^3.2.2 - "@cspell/dict-cpp": ^6.0.9 + "@cspell/dict-aws": ^4.0.15 + "@cspell/dict-bash": ^4.2.2 + "@cspell/dict-companies": ^3.2.7 + "@cspell/dict-cpp": ^6.0.14 "@cspell/dict-cryptocurrencies": ^5.0.5 "@cspell/dict-csharp": ^4.0.7 "@cspell/dict-css": ^4.0.18 "@cspell/dict-dart": ^2.3.1 - "@cspell/dict-data-science": ^2.0.9 + "@cspell/dict-data-science": ^2.0.11 "@cspell/dict-django": ^4.1.5 - "@cspell/dict-docker": ^1.1.15 + "@cspell/dict-docker": ^1.1.16 "@cspell/dict-dotnet": ^5.0.10 "@cspell/dict-elixir": ^4.0.8 - "@cspell/dict-en-common-misspellings": ^2.1.3 - "@cspell/dict-en-gb-mit": ^3.1.5 - "@cspell/dict-en_us": ^4.4.15 - "@cspell/dict-filetypes": ^3.0.13 + "@cspell/dict-en-common-misspellings": ^2.1.8 + "@cspell/dict-en-gb-mit": ^3.1.14 + "@cspell/dict-en_us": ^4.4.24 + "@cspell/dict-filetypes": ^3.0.14 "@cspell/dict-flutter": ^1.1.1 "@cspell/dict-fonts": ^4.0.5 "@cspell/dict-fsharp": ^1.1.1 "@cspell/dict-fullstack": ^3.2.7 "@cspell/dict-gaming-terms": ^1.1.2 "@cspell/dict-git": ^3.0.7 - "@cspell/dict-golang": ^6.0.23 + "@cspell/dict-golang": ^6.0.24 "@cspell/dict-google": ^1.0.9 "@cspell/dict-haskell": ^4.0.6 "@cspell/dict-html": ^4.0.12 @@ -1610,63 +1610,63 @@ __metadata: "@cspell/dict-markdown": ^2.0.12 "@cspell/dict-monkeyc": ^1.0.11 "@cspell/dict-node": ^5.0.8 - "@cspell/dict-npm": ^5.2.12 - "@cspell/dict-php": ^4.0.15 + "@cspell/dict-npm": ^5.2.20 + "@cspell/dict-php": ^4.1.0 "@cspell/dict-powershell": ^5.0.15 - "@cspell/dict-public-licenses": ^2.0.14 - "@cspell/dict-python": ^4.2.19 + "@cspell/dict-public-licenses": ^2.0.15 + "@cspell/dict-python": ^4.2.21 "@cspell/dict-r": ^2.1.1 "@cspell/dict-ruby": ^5.0.9 "@cspell/dict-rust": ^4.0.12 "@cspell/dict-scala": ^5.0.8 - "@cspell/dict-shell": ^1.1.1 - "@cspell/dict-software-terms": ^5.1.4 + "@cspell/dict-shell": ^1.1.2 + "@cspell/dict-software-terms": ^5.1.11 "@cspell/dict-sql": ^2.2.1 "@cspell/dict-svelte": ^1.0.7 "@cspell/dict-swift": ^2.0.6 "@cspell/dict-terraform": ^1.1.3 "@cspell/dict-typescript": ^3.2.3 "@cspell/dict-vue": ^3.0.5 - checksum: 82de44ecf01637f065f8a5db7fa947918f0d3758725bb8b4f26215219e9b4b5f36d9588432b4dd9bb211d23beb12048b58f02f31111e4a4bba2acca4d0c73099 + checksum: 7c0d4a4cc62c405394a9778fc4c405856f169841e595dc3ba1ad17a7bc72612619246146773a10be3be7eb13682088e8b03a50bf89c12fbdbdcb5fa48b0f9bea languageName: node linkType: hard -"@cspell/cspell-json-reporter@npm:9.2.0": - version: 9.2.0 - resolution: "@cspell/cspell-json-reporter@npm:9.2.0" +"@cspell/cspell-json-reporter@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/cspell-json-reporter@npm:9.3.1" dependencies: - "@cspell/cspell-types": 9.2.0 - checksum: dd6b5e7184edd43e02e986416b6e6300b9fb987fdf6757fdada763115b1b7792181a5e976cdf16658f6dcad0ce6f2fd587ba93f96a2e6084fe0b8d96aba34d0b + "@cspell/cspell-types": 9.3.1 + checksum: 7452345aad8512d5e90901b12e5fd67bbe141c0c0f8e395911f138c8fa7ab47d47f48394160156de03ca54882cab5caf16c18b85df25ad685751211bb5b665ab languageName: node linkType: hard -"@cspell/cspell-pipe@npm:9.2.0": - version: 9.2.0 - resolution: "@cspell/cspell-pipe@npm:9.2.0" - checksum: fceb9b6d6df117d73bfcd08be9121ccb9828a27c1813651d6c24dcae8c89d467b24cba7df927b326c77a6b91b1bae8ec7a9558a6039335656be673132fee9469 +"@cspell/cspell-pipe@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/cspell-pipe@npm:9.3.1" + checksum: d20df305a67f738e4a6f35774a419f2048b2bb1d0e9f8870d3fb99bdf8134e4198c71b0f7d82603098f32e202e7da53af280abfa0b2a988a3515d57bb648af4c languageName: node linkType: hard -"@cspell/cspell-resolver@npm:9.2.0": - version: 9.2.0 - resolution: "@cspell/cspell-resolver@npm:9.2.0" +"@cspell/cspell-resolver@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/cspell-resolver@npm:9.3.1" dependencies: global-directory: ^4.0.1 - checksum: 8435d5d8da9ac5e67f9365986e245083703d82f23f04256808e0283885857401d88481672061eba5192447ca0155cc2fbfd3ac324dd14102135fe327a753ea0f + checksum: 10d3bb2e391d8b2cef70942058c0a1b8a84c15211141c943a6d3b37e543ab08538e2493b920bbc66c294602d08222803dcee13a703faf73539f4e11210880964 languageName: node linkType: hard -"@cspell/cspell-service-bus@npm:9.2.0": - version: 9.2.0 - resolution: "@cspell/cspell-service-bus@npm:9.2.0" - checksum: 0e9e84319980cb02cbbb33786458dc923f2936f1a74276b6fee470361eea86c5d1c2e28a1408dbd0efa309a3d5a58350c6c9f18736cb8a1f684322841ea77950 +"@cspell/cspell-service-bus@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/cspell-service-bus@npm:9.3.1" + checksum: 2c06e15b4801bec9d7dad6330cd68ac1bc909fe225cd0fda3be785386b7fbdf9aa4641c9e6fadc5beb99b476cd7a0dd087005e69106f1cd3569d9b812986b2ff languageName: node linkType: hard -"@cspell/cspell-types@npm:9.2.0": - version: 9.2.0 - resolution: "@cspell/cspell-types@npm:9.2.0" - checksum: 7ed6fe3c2f5be94b8a2439fcfaaff4389253f5f5a300d38ca05ef5460841731baf3ed0c347af56984fa56d911e73cd484bdc3b796fe5634fb6b6f383c0b21ed4 +"@cspell/cspell-types@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/cspell-types@npm:9.3.1" + checksum: 3e7906eb8899773dfd4d027b6e68de75ece31831dd5608eb9ce308cf086a2aeb454e0249fdbe6e22c5963041f1027acd9895bd9838ea90d99ea33c386a5c202b languageName: node linkType: hard @@ -1684,33 +1684,33 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-aws@npm:^4.0.12": - version: 4.0.14 - resolution: "@cspell/dict-aws@npm:4.0.14" - checksum: 9c5cf416c8d17bebd7555bb450068582d47c803dff738f5a92d3457942da4ebf6ac6400359359aeaeacac86a270c7971979a0d03cfa9decf9262342a6a56bb97 +"@cspell/dict-aws@npm:^4.0.15": + version: 4.0.15 + resolution: "@cspell/dict-aws@npm:4.0.15" + checksum: 7a865cbc3ed31b22623c343483df47e9874bc238497405aae6e8c7975355b1ee57b0d2616706d1cb335c1037a72a6bb3a8d020edea9157035675101f547b1ff8 languageName: node linkType: hard -"@cspell/dict-bash@npm:^4.2.1": - version: 4.2.1 - resolution: "@cspell/dict-bash@npm:4.2.1" +"@cspell/dict-bash@npm:^4.2.2": + version: 4.2.2 + resolution: "@cspell/dict-bash@npm:4.2.2" dependencies: - "@cspell/dict-shell": 1.1.1 - checksum: 607611fcbcc0609ddfb7afec91472876301346cd7dafe13d9afed653ef714cd2ac83d6d68e5218426edc135c085217ab1e0927654aa83b170cc1685248df4b80 + "@cspell/dict-shell": 1.1.2 + checksum: 0223269db3c438a32ade8865f27b8e65f7ba59dded358d6c9c244049071b3cb156f4fa62ec87fe210b09e09a298547ee9f4809fd9ce1aaade30199ea9b808870 languageName: node linkType: hard -"@cspell/dict-companies@npm:^3.2.2": - version: 3.2.4 - resolution: "@cspell/dict-companies@npm:3.2.4" - checksum: 7d7c1e0936f4000b5865d920e8d57e5d865d1d69c9acca8aac32d1d3fb118b772a6099f7c0e12b78db1aa9fc787b1a44a271757da37af8a6f569b6543f30e06d +"@cspell/dict-companies@npm:^3.2.7": + version: 3.2.7 + resolution: "@cspell/dict-companies@npm:3.2.7" + checksum: 714079295b75cd950b7cae7ee5c8b14bb6512e38e7a1a4df49d606c5423d2ed489bfae35bddbabd5ad71b0320b7434bba68f92dc07492868838379357d243ebe languageName: node linkType: hard -"@cspell/dict-cpp@npm:^6.0.9": - version: 6.0.9 - resolution: "@cspell/dict-cpp@npm:6.0.9" - checksum: 743bf1f12d8e70aebec525f648c657abe0bbad637c515ac27f16e3eee4ac258741cafd4997fe1021b1f9a14e1983bc91e7de38fe95b889675e317581b22b0b48 +"@cspell/dict-cpp@npm:^6.0.14": + version: 6.0.14 + resolution: "@cspell/dict-cpp@npm:6.0.14" + checksum: be71603fb55e4d4db12417fbf96ba60e613888bdfe5bab303cddf555b019d453e54b8c4388566d1eeb671233051fc3f977e79b1c9c621cd4010c0cf778aad973 languageName: node linkType: hard @@ -1742,10 +1742,10 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-data-science@npm:^2.0.9": - version: 2.0.9 - resolution: "@cspell/dict-data-science@npm:2.0.9" - checksum: f5c02e9be57093993e6764ac74c940003beaff67637bf69051f3a6c9c27fee9ed58e01b2f4134297aa75c1f4d24ca09d15f5e94b87b7f3dce05532dfbd6e030a +"@cspell/dict-data-science@npm:^2.0.11": + version: 2.0.11 + resolution: "@cspell/dict-data-science@npm:2.0.11" + checksum: 2efebe09848e259419f6005485a1b6e627881292b5fab5ae5a72a7c38474d44945d78de8b16b029b798428f58923266a3da5566ca292790b9851d2b39e645a72 languageName: node linkType: hard @@ -1756,7 +1756,7 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-docker@npm:^1.1.15": +"@cspell/dict-docker@npm:^1.1.16": version: 1.1.16 resolution: "@cspell/dict-docker@npm:1.1.16" checksum: dc126d94203fa23c0a9d1466fa634b1ee4b4770d5762dbbbc868198318cf8d860de26d1632700a3e613eb81d27d0e46c72cbf74ba0cca5cca0032dbf056ae472 @@ -1777,31 +1777,31 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-en-common-misspellings@npm:^2.1.3": - version: 2.1.3 - resolution: "@cspell/dict-en-common-misspellings@npm:2.1.3" - checksum: af56e0bf00629fc1d9e1b81f3019facd85837db3de7df6ed9cd1838e81822d6545f5e74ccb27d157221ed1a08e12dfedaa404ee4f499f8faf80a90ab86860613 +"@cspell/dict-en-common-misspellings@npm:^2.1.8": + version: 2.1.8 + resolution: "@cspell/dict-en-common-misspellings@npm:2.1.8" + checksum: 014e32fb84ec8ac70dc3dc4254f17756c864b3ea1f653f4367fb42953cdba1462f955c358b82e646cb228986bbdfbbbba69d982933c7e17582f8f0b2e23d3c1b languageName: node linkType: hard -"@cspell/dict-en-gb-mit@npm:^3.1.5": - version: 3.1.6 - resolution: "@cspell/dict-en-gb-mit@npm:3.1.6" - checksum: cdfb51de8d344221b257b696f3d437beadd73b423129b3840f9b6ef6f7c37447bf71ce524f0716ec4052a15a7ad259f9cbd7e9c99ce11ba1bf413ea7d0694579 +"@cspell/dict-en-gb-mit@npm:^3.1.14": + version: 3.1.14 + resolution: "@cspell/dict-en-gb-mit@npm:3.1.14" + checksum: b3613ec1dcd81f624f90f12725359cff64334be7a4e8b5e6765de2e667e6841152347807b66c2e60aceb51b9c40d765bdf7229de98bae93258b8b5acc52a504a languageName: node linkType: hard -"@cspell/dict-en_us@npm:^4.4.15": - version: 4.4.16 - resolution: "@cspell/dict-en_us@npm:4.4.16" - checksum: 2790f892d62f43ca9abe5a3b0b23b5688eef34f4359335cd4f9b2df7a309b4be1657f632a8a5fb3a49c4e477a30db3199457bd20c1b0b15e2267a41cd4b6fe34 +"@cspell/dict-en_us@npm:^4.4.24": + version: 4.4.24 + resolution: "@cspell/dict-en_us@npm:4.4.24" + checksum: bac87847f44b22975e781df33490e8020320377f9ca211e886ea2679ebc955a0aa68b0f58a1226bb0c7103ba16808a33dc291462b3e4454c5650670f800089c6 languageName: node linkType: hard -"@cspell/dict-filetypes@npm:^3.0.13": - version: 3.0.13 - resolution: "@cspell/dict-filetypes@npm:3.0.13" - checksum: d8ffa9e72b82dc0ee8fc05440175c898d363552fa769b4b6cb5c5544f47bcbc50b4761a97c9b835e182aaade0ca86df64984058342e46f41a4225dfc45502b6c +"@cspell/dict-filetypes@npm:^3.0.14": + version: 3.0.14 + resolution: "@cspell/dict-filetypes@npm:3.0.14" + checksum: 545eee0cb4a80491a1fbb03b964d31569379a775528b090c992ba72d3ae6fe4dfae5c484b5a50226f8e52979238875476c688937096486bebfa0c8f3a72da499 languageName: node linkType: hard @@ -1847,10 +1847,10 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-golang@npm:^6.0.23": - version: 6.0.23 - resolution: "@cspell/dict-golang@npm:6.0.23" - checksum: 0cdfe3ed9245b9e0d5a26c72371b38dca86d4de7e016dc37e499ea98147626184c211dd4dd9efe3a533444391ce45259783d640ef8f2daf7d75c964ba53ab697 +"@cspell/dict-golang@npm:^6.0.24": + version: 6.0.24 + resolution: "@cspell/dict-golang@npm:6.0.24" + checksum: 479205a675eab8de1a5f35f274a0fc9e767096d33f72033345c807f7e22cfc6f3623cce085c2b37c1a7d36671eea6f1be46402cbc55a48bf4fceadf14e3a42db languageName: node linkType: hard @@ -1964,17 +1964,17 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-npm@npm:^5.2.12": - version: 5.2.14 - resolution: "@cspell/dict-npm@npm:5.2.14" - checksum: 59ef1f0d0f1401246d0b2824bb8ff3fa494ceecbd7cf085d56136af9de74fe0d9bc3f209b2e423ad7490db86f9be5e09a6711905c59ebdf961b413b48d22c9fb +"@cspell/dict-npm@npm:^5.2.20": + version: 5.2.20 + resolution: "@cspell/dict-npm@npm:5.2.20" + checksum: 2d386aa3686c796726ab20726f6296c85dff6140b30a32523c70d5b9b18be959a72efd65f0be84aab4b446691392185dc149aa1bc836b793f88258c6c7d248aa languageName: node linkType: hard -"@cspell/dict-php@npm:^4.0.15": - version: 4.0.15 - resolution: "@cspell/dict-php@npm:4.0.15" - checksum: 45c25abae5262d2acf03d79914ee6bd82e80fe60c36d6e39b6a403575b5ca902e07a7737f87816d146135cabf2df56262a5fd8ec6dedb573504f116a627e3f83 +"@cspell/dict-php@npm:^4.1.0": + version: 4.1.0 + resolution: "@cspell/dict-php@npm:4.1.0" + checksum: 7953125cbdc29ced77d9ba82eb2bdf51f9de405bb00b7a3f9a53e96d7e979ca212a3562118ed9b75b775d098a5e5e05ec9f1abfa5e4edaafb0596e93bf635235 languageName: node linkType: hard @@ -1985,19 +1985,19 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-public-licenses@npm:^2.0.14": +"@cspell/dict-public-licenses@npm:^2.0.15": version: 2.0.15 resolution: "@cspell/dict-public-licenses@npm:2.0.15" checksum: a8580441c964a8c3ce4c4fed74189fa5752eb98e56baeb2608753e4deefb202c8f9d9f1869e17c5f2f1fc7bb1976854525ac50750109bb377b4cfa0a4eb12fe2 languageName: node linkType: hard -"@cspell/dict-python@npm:^4.2.19": - version: 4.2.19 - resolution: "@cspell/dict-python@npm:4.2.19" +"@cspell/dict-python@npm:^4.2.21": + version: 4.2.21 + resolution: "@cspell/dict-python@npm:4.2.21" dependencies: - "@cspell/dict-data-science": ^2.0.9 - checksum: b46d9d608bc57a0e0564c052290309604ddcd9b9b764d77b70d29860c89e76e548bd9d97553fd34ac7af635c393908be2d16b2e5743f70b1b180b51b3116926b + "@cspell/dict-data-science": ^2.0.11 + checksum: 92b689de5c965a737867e8a19537cef677792bfae40baf77c55544f49fe86c7890d4272f06454f737ad3b769b1d7951e30b9dba3a0d5b1415c92607b940a15e9 languageName: node linkType: hard @@ -2029,17 +2029,17 @@ __metadata: languageName: node linkType: hard -"@cspell/dict-shell@npm:1.1.1, @cspell/dict-shell@npm:^1.1.1": - version: 1.1.1 - resolution: "@cspell/dict-shell@npm:1.1.1" - checksum: 4fdd6c2fb623b3a72f4e46bfc55113799fbe79141bbbc85384cc1b0e9ae7699d2bbedbfc2749dd8bad977da856f0dda10c5e08fedf3d0822a2eccfeee9e4116c +"@cspell/dict-shell@npm:1.1.2, @cspell/dict-shell@npm:^1.1.2": + version: 1.1.2 + resolution: "@cspell/dict-shell@npm:1.1.2" + checksum: d194465e6f05e8f09b691e02098dbc6e98360876c486af96c219524870315cfb91a76356d94d683ae5f6cd9cf8b35270b9e5f0d5dddab656ffe4d0d7c4b766b8 languageName: node linkType: hard -"@cspell/dict-software-terms@npm:^5.1.4": - version: 5.1.5 - resolution: "@cspell/dict-software-terms@npm:5.1.5" - checksum: 8aa3a101f7656bde09d301bcb1a4a620aeaa38eb8ff8fe65d64198e11e6857d8eb7265414f4084177941385a601f72794154fec66fbeff272ecbca891642861e +"@cspell/dict-software-terms@npm:^5.1.11": + version: 5.1.11 + resolution: "@cspell/dict-software-terms@npm:5.1.11" + checksum: f24cc0a6149237d8f4f9f6841ed9ae1c228c675429f5edd1d3324e87396058f07de9dae9f281654075c1dfc4ba6647956826cd544808fa7d7c6b86d1abd91fab languageName: node linkType: hard @@ -2085,34 +2085,34 @@ __metadata: languageName: node linkType: hard -"@cspell/dynamic-import@npm:9.2.0": - version: 9.2.0 - resolution: "@cspell/dynamic-import@npm:9.2.0" +"@cspell/dynamic-import@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/dynamic-import@npm:9.3.1" dependencies: - "@cspell/url": 9.2.0 - import-meta-resolve: ^4.1.0 - checksum: 2f0e9c4a351021be52baea297f6f4ff734a37e47bdd50b283e77028a49b4e0e0302b75fd78c1954426ceb7e4a37ed71284160c83aedc703e5ac1891d80fc36d5 + "@cspell/url": 9.3.1 + import-meta-resolve: ^4.2.0 + checksum: dcba8075c8a5ad7cbf9ecae5f4475268cb2685f7c9691c721417e44c584fe2ed177d9f4c19993ec06fc3753f2e1481c04a541ca6f0e9410c8ed47f7089a8d922 languageName: node linkType: hard -"@cspell/filetypes@npm:9.2.0": - version: 9.2.0 - resolution: "@cspell/filetypes@npm:9.2.0" - checksum: 631ace9f62085ad8178499f0045d16da7314068e45d126f91ec6f28a54f8638413a45e6162f301a190dd62127090a3057c3424b2af248a247a3db47f43ef36d8 +"@cspell/filetypes@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/filetypes@npm:9.3.1" + checksum: c61662bdeda0fd99efe9518189f812a95fa79aa1766cfdebab7a763173669968552b8861063bacb30d1a0ccdf5c54adf70dcc80604194eef0f2d45757961ba95 languageName: node linkType: hard -"@cspell/strong-weak-map@npm:9.2.0": - version: 9.2.0 - resolution: "@cspell/strong-weak-map@npm:9.2.0" - checksum: 3a9faecdc164d425a65e7a0ea4e6847feab537056b6d8b1506d14b1363f35390d866412f14cdbb066b26cc2acafd8fe55d7969e3b2b6e46fffc58485b18616c8 +"@cspell/strong-weak-map@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/strong-weak-map@npm:9.3.1" + checksum: 1df8a8c9b80a48edc49916263e56bd05403af7a82a4ef389ab3e6db0d37dfb1bbe88076abf93928a5674ab01c3abea15ea4c0100eb9a032fd40d47d1e46c53ad languageName: node linkType: hard -"@cspell/url@npm:9.2.0": - version: 9.2.0 - resolution: "@cspell/url@npm:9.2.0" - checksum: 0dc83ea7e51458f4065083bc65316b822bf6db644ad91ad88bb6693738b521ccece7cb56f71358e50794a9506ac753d958add96b935777d28cda5952dbaaaec3 +"@cspell/url@npm:9.3.1": + version: 9.3.1 + resolution: "@cspell/url@npm:9.3.1" + checksum: bb5b9ecb9d211772615e4699636d3bdec95778d50be94f9505f8ed06bd1a1e8a21ee3852b2cfaf52cac6fa464965b34142b42dfc4dc6c78265da2cd94322cb57 languageName: node linkType: hard @@ -3354,6 +3354,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/aix-ppc64@npm:0.27.0" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/android-arm64@npm:0.20.2" @@ -3368,6 +3375,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/android-arm64@npm:0.27.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/android-arm@npm:0.20.2" @@ -3382,6 +3396,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/android-arm@npm:0.27.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/android-x64@npm:0.20.2" @@ -3396,6 +3417,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/android-x64@npm:0.27.0" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/darwin-arm64@npm:0.20.2" @@ -3410,6 +3438,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/darwin-arm64@npm:0.27.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/darwin-x64@npm:0.20.2" @@ -3424,6 +3459,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/darwin-x64@npm:0.27.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/freebsd-arm64@npm:0.20.2" @@ -3438,6 +3480,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/freebsd-arm64@npm:0.27.0" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/freebsd-x64@npm:0.20.2" @@ -3452,6 +3501,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/freebsd-x64@npm:0.27.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-arm64@npm:0.20.2" @@ -3466,6 +3522,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-arm64@npm:0.27.0" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-arm@npm:0.20.2" @@ -3480,6 +3543,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-arm@npm:0.27.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-ia32@npm:0.20.2" @@ -3494,6 +3564,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-ia32@npm:0.27.0" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-loong64@npm:0.20.2" @@ -3508,6 +3585,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-loong64@npm:0.27.0" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-mips64el@npm:0.20.2" @@ -3522,6 +3606,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-mips64el@npm:0.27.0" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-ppc64@npm:0.20.2" @@ -3536,6 +3627,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-ppc64@npm:0.27.0" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-riscv64@npm:0.20.2" @@ -3550,6 +3648,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-riscv64@npm:0.27.0" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-s390x@npm:0.20.2" @@ -3564,6 +3669,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-s390x@npm:0.27.0" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/linux-x64@npm:0.20.2" @@ -3578,6 +3690,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/linux-x64@npm:0.27.0" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-arm64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/netbsd-arm64@npm:0.25.5" @@ -3585,6 +3704,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/netbsd-arm64@npm:0.27.0" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/netbsd-x64@npm:0.20.2" @@ -3599,6 +3725,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/netbsd-x64@npm:0.27.0" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/openbsd-arm64@npm:0.25.5": version: 0.25.5 resolution: "@esbuild/openbsd-arm64@npm:0.25.5" @@ -3606,6 +3739,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/openbsd-arm64@npm:0.27.0" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/openbsd-x64@npm:0.20.2" @@ -3620,6 +3760,20 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/openbsd-x64@npm:0.27.0" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openharmony-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/openharmony-arm64@npm:0.27.0" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/sunos-x64@npm:0.20.2" @@ -3634,6 +3788,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/sunos-x64@npm:0.27.0" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/win32-arm64@npm:0.20.2" @@ -3648,6 +3809,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/win32-arm64@npm:0.27.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/win32-ia32@npm:0.20.2" @@ -3662,6 +3830,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/win32-ia32@npm:0.27.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.20.2": version: 0.20.2 resolution: "@esbuild/win32-x64@npm:0.20.2" @@ -3676,6 +3851,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.27.0": + version: 0.27.0 + resolution: "@esbuild/win32-x64@npm:0.27.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-plugin-eslint-comments@npm:^4.4.1": version: 4.5.0 resolution: "@eslint-community/eslint-plugin-eslint-comments@npm:4.5.0" @@ -4067,28 +4249,29 @@ __metadata: languageName: node linkType: hard -"@microsoft/api-extractor-model@npm:7.31.1": - version: 7.31.1 - resolution: "@microsoft/api-extractor-model@npm:7.31.1" +"@microsoft/api-extractor-model@npm:7.31.3": + version: 7.31.3 + resolution: "@microsoft/api-extractor-model@npm:7.31.3" dependencies: "@microsoft/tsdoc": ~0.15.1 "@microsoft/tsdoc-config": ~0.17.1 - "@rushstack/node-core-library": 5.17.0 - checksum: 8d70dbc73822c97bf678686b40ce7fb2dd2e2a5151e4a96a5fe59bc33b3b4e53c43fb1543bd7af1ab8157ee81bb069554d37849916842fde355e22b02a514194 + "@rushstack/node-core-library": 5.18.0 + checksum: 8f97f164e1191f3093505e1398e73dd3adb7b5a1df8d3ee7456769345e04b5b7d487ff6325bbb12e7ac513be8d0c96575672896085f0777bea9666a66273522e languageName: node linkType: hard "@microsoft/api-extractor@npm:^7.47.11": - version: 7.53.1 - resolution: "@microsoft/api-extractor@npm:7.53.1" + version: 7.54.0 + resolution: "@microsoft/api-extractor@npm:7.54.0" dependencies: - "@microsoft/api-extractor-model": 7.31.1 + "@microsoft/api-extractor-model": 7.31.3 "@microsoft/tsdoc": ~0.15.1 "@microsoft/tsdoc-config": ~0.17.1 - "@rushstack/node-core-library": 5.17.0 + "@rushstack/node-core-library": 5.18.0 "@rushstack/rig-package": 0.6.0 - "@rushstack/terminal": 0.19.1 - "@rushstack/ts-command-line": 5.1.1 + "@rushstack/terminal": 0.19.3 + "@rushstack/ts-command-line": 5.1.3 + diff: ~8.0.2 lodash: ~4.17.15 minimatch: 10.0.3 resolve: ~1.22.1 @@ -4097,7 +4280,7 @@ __metadata: typescript: 5.8.2 bin: api-extractor: bin/api-extractor - checksum: 6111b26fd9340876eafaaf45f8676530de96e98b0a27adba7fc2818574244b8299519c7197f57f31340d750c784fa40bf6ec39741798c696b0a49de7caf6ea6f + checksum: 53c396675dc0622d71dc484fd2918bc910ef3144303d6659d416b14eeaf2ac0f18e90a5aeb88b6ac5f116fe87927fcbd19a9e69a409c64e4c3a4a88e8ded32e0 languageName: node linkType: hard @@ -4772,9 +4955,9 @@ __metadata: languageName: node linkType: hard -"@rushstack/node-core-library@npm:5.17.0": - version: 5.17.0 - resolution: "@rushstack/node-core-library@npm:5.17.0" +"@rushstack/node-core-library@npm:5.18.0": + version: 5.18.0 + resolution: "@rushstack/node-core-library@npm:5.18.0" dependencies: ajv: ~8.13.0 ajv-draft-04: ~1.0.0 @@ -4789,7 +4972,7 @@ __metadata: peerDependenciesMeta: "@types/node": optional: true - checksum: 375c07898cc4684b2232119e4aa06924df5ce990a6a835915acc1310f047535f583a96d025c6fddb865c71ab8e5e3610b96c393cff0b3ec83058f06ff4113592 + checksum: 153d1c31128e0afbf230b0d068e1d2b236afa867fec1ead934e38f533c3be292a54113401d4fa0fc5e4828bfaf8192051a050a1d24f34e7587770e78ca7eb4e3 languageName: node linkType: hard @@ -4815,11 +4998,11 @@ __metadata: languageName: node linkType: hard -"@rushstack/terminal@npm:0.19.1": - version: 0.19.1 - resolution: "@rushstack/terminal@npm:0.19.1" +"@rushstack/terminal@npm:0.19.3": + version: 0.19.3 + resolution: "@rushstack/terminal@npm:0.19.3" dependencies: - "@rushstack/node-core-library": 5.17.0 + "@rushstack/node-core-library": 5.18.0 "@rushstack/problem-matcher": 0.1.1 supports-color: ~8.1.1 peerDependencies: @@ -4827,19 +5010,19 @@ __metadata: peerDependenciesMeta: "@types/node": optional: true - checksum: 106a55eef7336e74f2e98b0e4f7e04792e6ba03f263f9da9ee9fc9552926dd390947a29313e49d2162fd5617ea7f7e49fdf0394e4ea65727c7e9ac2cc537d408 + checksum: 4ba155ed7818883cd81745ceb5cf47763be525f179312d46c9a25f0fb62b50d7d8d14aa0120d3d9b5d85a7265b0b267f54205b1f552e4a1a4e7045869caad163 languageName: node linkType: hard -"@rushstack/ts-command-line@npm:5.1.1": - version: 5.1.1 - resolution: "@rushstack/ts-command-line@npm:5.1.1" +"@rushstack/ts-command-line@npm:5.1.3": + version: 5.1.3 + resolution: "@rushstack/ts-command-line@npm:5.1.3" dependencies: - "@rushstack/terminal": 0.19.1 + "@rushstack/terminal": 0.19.3 "@types/argparse": 1.0.38 argparse: ~1.0.9 string-argv: ~0.3.1 - checksum: 7298df112849dd9c4da0b1363416d0a14908ff346205093f38be0bf1b38e5c0d94ec5f57912744bd3062f1958c86cb308c8acbe4c7829f47e42b65744416b478 + checksum: 8daf8dd0aae062f8fae847b31566ef83812529985e6e4ed0eb8ae9f41d140c85737df1253f694223e886bf9ce4a9ee7ffa7abdf25f079e05bc379073660d15b9 languageName: node linkType: hard @@ -5683,11 +5866,11 @@ __metadata: linkType: hard "@types/node@npm:^22.0.0": - version: 22.18.0 - resolution: "@types/node@npm:22.18.0" + version: 22.19.0 + resolution: "@types/node@npm:22.19.0" dependencies: undici-types: ~6.21.0 - checksum: a110b66f079ea882be1e300e72978cd3a5e7be8217b362b72152e09f64087731a235a0557fca72d621912a8ba1347d9ba49468c35755dd2581edb7f3f6e016e2 + checksum: ed841e6de297eb9e73661b595d21c5d8ab55af9fb5b35649ae4aee2ae9b6c5db5408aa903cafeef224c205799cd0aa48d2133b6d0e7b0eacdef323d8c5f225f7 languageName: node linkType: hard @@ -5930,19 +6113,19 @@ __metadata: languageName: unknown linkType: soft -"@typescript-eslint/eslint-plugin@8.46.4, @typescript-eslint/eslint-plugin@workspace:*, @typescript-eslint/eslint-plugin@workspace:^, @typescript-eslint/eslint-plugin@workspace:packages/eslint-plugin": +"@typescript-eslint/eslint-plugin@8.47.0, @typescript-eslint/eslint-plugin@workspace:*, @typescript-eslint/eslint-plugin@workspace:^, @typescript-eslint/eslint-plugin@workspace:packages/eslint-plugin": version: 0.0.0-use.local resolution: "@typescript-eslint/eslint-plugin@workspace:packages/eslint-plugin" dependencies: "@eslint-community/regexpp": ^4.10.0 "@types/mdast": ^4.0.3 "@types/natural-compare": "*" - "@typescript-eslint/rule-schema-to-typescript-types": 8.46.4 - "@typescript-eslint/rule-tester": 8.46.4 - "@typescript-eslint/scope-manager": 8.46.4 - "@typescript-eslint/type-utils": 8.46.4 - "@typescript-eslint/utils": 8.46.4 - "@typescript-eslint/visitor-keys": 8.46.4 + "@typescript-eslint/rule-schema-to-typescript-types": 8.47.0 + "@typescript-eslint/rule-tester": 8.47.0 + "@typescript-eslint/scope-manager": 8.47.0 + "@typescript-eslint/type-utils": 8.47.0 + "@typescript-eslint/utils": 8.47.0 + "@typescript-eslint/visitor-keys": 8.47.0 "@vitest/coverage-v8": ^3.1.3 ajv: ^6.12.6 cross-fetch: "*" @@ -5965,7 +6148,7 @@ __metadata: unist-util-visit: ^5.0.0 vitest: ^3.1.3 peerDependencies: - "@typescript-eslint/parser": ^8.46.4 + "@typescript-eslint/parser": ^8.47.0 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" languageName: unknown @@ -5981,14 +6164,14 @@ __metadata: languageName: unknown linkType: soft -"@typescript-eslint/parser@8.46.4, @typescript-eslint/parser@workspace:*, @typescript-eslint/parser@workspace:^, @typescript-eslint/parser@workspace:packages/parser": +"@typescript-eslint/parser@8.47.0, @typescript-eslint/parser@workspace:*, @typescript-eslint/parser@workspace:^, @typescript-eslint/parser@workspace:packages/parser": version: 0.0.0-use.local resolution: "@typescript-eslint/parser@workspace:packages/parser" dependencies: - "@typescript-eslint/scope-manager": 8.46.4 - "@typescript-eslint/types": 8.46.4 - "@typescript-eslint/typescript-estree": 8.46.4 - "@typescript-eslint/visitor-keys": 8.46.4 + "@typescript-eslint/scope-manager": 8.47.0 + "@typescript-eslint/types": 8.47.0 + "@typescript-eslint/typescript-estree": 8.47.0 + "@typescript-eslint/visitor-keys": 8.47.0 "@vitest/coverage-v8": ^3.1.3 debug: ^4.3.4 eslint: "*" @@ -6002,12 +6185,12 @@ __metadata: languageName: unknown linkType: soft -"@typescript-eslint/project-service@8.46.4, @typescript-eslint/project-service@workspace:packages/project-service": +"@typescript-eslint/project-service@8.47.0, @typescript-eslint/project-service@workspace:packages/project-service": version: 0.0.0-use.local resolution: "@typescript-eslint/project-service@workspace:packages/project-service" dependencies: - "@typescript-eslint/tsconfig-utils": ^8.46.4 - "@typescript-eslint/types": ^8.46.4 + "@typescript-eslint/tsconfig-utils": ^8.47.0 + "@typescript-eslint/types": ^8.47.0 "@vitest/coverage-v8": ^3.1.3 debug: ^4.3.4 rimraf: "*" @@ -6018,12 +6201,12 @@ __metadata: languageName: unknown linkType: soft -"@typescript-eslint/rule-schema-to-typescript-types@8.46.4, @typescript-eslint/rule-schema-to-typescript-types@workspace:*, @typescript-eslint/rule-schema-to-typescript-types@workspace:packages/rule-schema-to-typescript-types": +"@typescript-eslint/rule-schema-to-typescript-types@8.47.0, @typescript-eslint/rule-schema-to-typescript-types@workspace:*, @typescript-eslint/rule-schema-to-typescript-types@workspace:packages/rule-schema-to-typescript-types": version: 0.0.0-use.local resolution: "@typescript-eslint/rule-schema-to-typescript-types@workspace:packages/rule-schema-to-typescript-types" dependencies: - "@typescript-eslint/type-utils": 8.46.4 - "@typescript-eslint/utils": 8.46.4 + "@typescript-eslint/type-utils": 8.47.0 + "@typescript-eslint/utils": 8.47.0 "@vitest/coverage-v8": ^3.1.3 eslint: "*" natural-compare: ^1.4.0 @@ -6033,15 +6216,15 @@ __metadata: languageName: unknown linkType: soft -"@typescript-eslint/rule-tester@8.46.4, @typescript-eslint/rule-tester@workspace:*, @typescript-eslint/rule-tester@workspace:packages/rule-tester": +"@typescript-eslint/rule-tester@8.47.0, @typescript-eslint/rule-tester@workspace:*, @typescript-eslint/rule-tester@workspace:packages/rule-tester": version: 0.0.0-use.local resolution: "@typescript-eslint/rule-tester@workspace:packages/rule-tester" dependencies: "@types/json-stable-stringify-without-jsonify": ^1.0.2 "@types/lodash.merge": 4.6.9 - "@typescript-eslint/parser": 8.46.4 - "@typescript-eslint/typescript-estree": 8.46.4 - "@typescript-eslint/utils": 8.46.4 + "@typescript-eslint/parser": 8.47.0 + "@typescript-eslint/typescript-estree": 8.47.0 + "@typescript-eslint/utils": 8.47.0 "@vitest/coverage-v8": ^3.1.3 ajv: ^6.12.6 eslint: "*" @@ -6056,13 +6239,13 @@ __metadata: languageName: unknown linkType: soft -"@typescript-eslint/scope-manager@8.46.4, @typescript-eslint/scope-manager@^8.46.1, @typescript-eslint/scope-manager@workspace:*, @typescript-eslint/scope-manager@workspace:^, @typescript-eslint/scope-manager@workspace:packages/scope-manager": +"@typescript-eslint/scope-manager@8.47.0, @typescript-eslint/scope-manager@^8.46.1, @typescript-eslint/scope-manager@workspace:*, @typescript-eslint/scope-manager@workspace:^, @typescript-eslint/scope-manager@workspace:packages/scope-manager": version: 0.0.0-use.local resolution: "@typescript-eslint/scope-manager@workspace:packages/scope-manager" dependencies: - "@typescript-eslint/types": 8.46.4 - "@typescript-eslint/typescript-estree": 8.46.4 - "@typescript-eslint/visitor-keys": 8.46.4 + "@typescript-eslint/types": 8.47.0 + "@typescript-eslint/typescript-estree": 8.47.0 + "@typescript-eslint/visitor-keys": 8.47.0 "@vitest/coverage-v8": ^3.1.3 "@vitest/pretty-format": ^3.1.3 eslint: "*" @@ -6073,7 +6256,7 @@ __metadata: languageName: unknown linkType: soft -"@typescript-eslint/tsconfig-utils@8.46.4, @typescript-eslint/tsconfig-utils@^8.46.4, @typescript-eslint/tsconfig-utils@workspace:packages/tsconfig-utils": +"@typescript-eslint/tsconfig-utils@8.47.0, @typescript-eslint/tsconfig-utils@^8.47.0, @typescript-eslint/tsconfig-utils@workspace:packages/tsconfig-utils": version: 0.0.0-use.local resolution: "@typescript-eslint/tsconfig-utils@workspace:packages/tsconfig-utils" dependencies: @@ -6086,14 +6269,14 @@ __metadata: languageName: unknown linkType: soft -"@typescript-eslint/type-utils@8.46.4, @typescript-eslint/type-utils@workspace:*, @typescript-eslint/type-utils@workspace:packages/type-utils": +"@typescript-eslint/type-utils@8.47.0, @typescript-eslint/type-utils@workspace:*, @typescript-eslint/type-utils@workspace:packages/type-utils": version: 0.0.0-use.local resolution: "@typescript-eslint/type-utils@workspace:packages/type-utils" dependencies: - "@typescript-eslint/parser": 8.46.4 - "@typescript-eslint/types": 8.46.4 - "@typescript-eslint/typescript-estree": 8.46.4 - "@typescript-eslint/utils": 8.46.4 + "@typescript-eslint/parser": 8.47.0 + "@typescript-eslint/types": 8.47.0 + "@typescript-eslint/typescript-estree": 8.47.0 + "@typescript-eslint/utils": 8.47.0 "@vitest/coverage-v8": ^3.1.3 ajv: ^6.12.6 debug: ^4.3.4 @@ -6108,7 +6291,7 @@ __metadata: languageName: unknown linkType: soft -"@typescript-eslint/types@8.46.4, @typescript-eslint/types@^8.11.0, @typescript-eslint/types@^8.34.1, @typescript-eslint/types@^8.46.4, @typescript-eslint/types@workspace:*, @typescript-eslint/types@workspace:^, @typescript-eslint/types@workspace:packages/types": +"@typescript-eslint/types@8.47.0, @typescript-eslint/types@^8.11.0, @typescript-eslint/types@^8.34.1, @typescript-eslint/types@^8.47.0, @typescript-eslint/types@workspace:*, @typescript-eslint/types@workspace:^, @typescript-eslint/types@workspace:packages/types": version: 0.0.0-use.local resolution: "@typescript-eslint/types@workspace:packages/types" dependencies: @@ -6182,15 +6365,15 @@ __metadata: languageName: unknown linkType: soft -"@typescript-eslint/typescript-estree@8.46.4, @typescript-eslint/typescript-estree@workspace:*, @typescript-eslint/typescript-estree@workspace:^, @typescript-eslint/typescript-estree@workspace:packages/typescript-estree": +"@typescript-eslint/typescript-estree@8.47.0, @typescript-eslint/typescript-estree@workspace:*, @typescript-eslint/typescript-estree@workspace:^, @typescript-eslint/typescript-estree@workspace:packages/typescript-estree": version: 0.0.0-use.local resolution: "@typescript-eslint/typescript-estree@workspace:packages/typescript-estree" dependencies: "@types/is-glob": ^4.0.4 - "@typescript-eslint/project-service": 8.46.4 - "@typescript-eslint/tsconfig-utils": 8.46.4 - "@typescript-eslint/types": 8.46.4 - "@typescript-eslint/visitor-keys": 8.46.4 + "@typescript-eslint/project-service": 8.47.0 + "@typescript-eslint/tsconfig-utils": 8.47.0 + "@typescript-eslint/types": 8.47.0 + "@typescript-eslint/visitor-keys": 8.47.0 "@vitest/coverage-v8": ^3.1.3 debug: ^4.3.4 eslint: "*" @@ -6208,14 +6391,14 @@ __metadata: languageName: unknown linkType: soft -"@typescript-eslint/utils@8.46.4, @typescript-eslint/utils@^8.34.1, @typescript-eslint/utils@^8.46.1, @typescript-eslint/utils@workspace:*, @typescript-eslint/utils@workspace:^, @typescript-eslint/utils@workspace:packages/utils": +"@typescript-eslint/utils@8.47.0, @typescript-eslint/utils@^8.34.1, @typescript-eslint/utils@^8.46.1, @typescript-eslint/utils@workspace:*, @typescript-eslint/utils@workspace:^, @typescript-eslint/utils@workspace:packages/utils": version: 0.0.0-use.local resolution: "@typescript-eslint/utils@workspace:packages/utils" dependencies: "@eslint-community/eslint-utils": ^4.7.0 - "@typescript-eslint/scope-manager": 8.46.4 - "@typescript-eslint/types": 8.46.4 - "@typescript-eslint/typescript-estree": 8.46.4 + "@typescript-eslint/scope-manager": 8.47.0 + "@typescript-eslint/types": 8.47.0 + "@typescript-eslint/typescript-estree": 8.47.0 "@vitest/coverage-v8": ^3.1.3 eslint: "*" rimraf: "*" @@ -6227,11 +6410,11 @@ __metadata: languageName: unknown linkType: soft -"@typescript-eslint/visitor-keys@8.46.4, @typescript-eslint/visitor-keys@workspace:*, @typescript-eslint/visitor-keys@workspace:packages/visitor-keys": +"@typescript-eslint/visitor-keys@8.47.0, @typescript-eslint/visitor-keys@workspace:*, @typescript-eslint/visitor-keys@workspace:packages/visitor-keys": version: 0.0.0-use.local resolution: "@typescript-eslint/visitor-keys@workspace:packages/visitor-keys" dependencies: - "@typescript-eslint/types": 8.46.4 + "@typescript-eslint/types": 8.47.0 "@vitest/coverage-v8": ^3.1.3 eslint: "*" eslint-visitor-keys: ^4.2.1 @@ -6251,7 +6434,7 @@ __metadata: "@typescript-eslint/scope-manager": "workspace:*" "@typescript-eslint/typescript-estree": "workspace:*" "@typescript-eslint/visitor-keys": "workspace:*" - esbuild: ~0.25.0 + esbuild: ~0.27.0 eslint: "*" esquery: "*" rimraf: "*" @@ -7803,12 +7986,12 @@ __metadata: languageName: node linkType: hard -"chalk-template@npm:^1.1.0": - version: 1.1.0 - resolution: "chalk-template@npm:1.1.0" +"chalk-template@npm:^1.1.2": + version: 1.1.2 + resolution: "chalk-template@npm:1.1.2" dependencies: chalk: ^5.2.0 - checksum: 868aae8d4e7556ad2f35de4e04fe65dbe1ea6c5c80ad783f1c156d0a5c33f444c6814f49cbb68fe348c78e99daf2bcf566b47ad7e13603e4691ca78b2f422824 + checksum: d0bbd70339d4258e5d0ef171f1b9925ef0055c8a5cf6383aa3f0bb6950d110747e10790b6b885bc4455da9b073811294bb10b856d20f642a5d4392caadf855df languageName: node linkType: hard @@ -7822,10 +8005,10 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^5.0.1, chalk@npm:^5.2.0, chalk@npm:^5.4.1": - version: 5.4.1 - resolution: "chalk@npm:5.4.1" - checksum: 0c656f30b782fed4d99198825c0860158901f449a6b12b818b0aabad27ec970389e7e8767d0e00762175b23620c812e70c4fd92c0210e55fc2d993638b74e86e +"chalk@npm:^5.0.1, chalk@npm:^5.2.0, chalk@npm:^5.4.1, chalk@npm:^5.6.2": + version: 5.6.2 + resolution: "chalk@npm:5.6.2" + checksum: 4ee2d47a626d79ca27cb5299ecdcce840ef5755e287412536522344db0fc51ca0f6d6433202332c29e2288c6a90a2b31f3bd626bc8c14743b6b6ee28abd3b796 languageName: node linkType: hard @@ -8186,10 +8369,10 @@ __metadata: languageName: node linkType: hard -"commander@npm:^14.0.0": - version: 14.0.0 - resolution: "commander@npm:14.0.0" - checksum: 6e9bdaf2e8e4f512855ffc10579eeae2e84c4a7697a91b1a5f62aab3c9849182207855268dd7c3952ae7a2334312a7138f58e929e4b428aef5bf8af862685c9b +"commander@npm:^14.0.2": + version: 14.0.2 + resolution: "commander@npm:14.0.2" + checksum: 0a9e549565d368dde2965821833324069b92b099b415c2106996e47db1f0b8c10c77367e9876873c00a52ca627af4c7472eba9b51dc0d6a3ef152ea063d3e9e9 languageName: node linkType: hard @@ -8228,16 +8411,14 @@ __metadata: languageName: node linkType: hard -"comment-json@npm:^4.2.5": - version: 4.2.5 - resolution: "comment-json@npm:4.2.5" +"comment-json@npm:^4.4.1": + version: 4.4.1 + resolution: "comment-json@npm:4.4.1" dependencies: array-timsort: ^1.0.3 core-util-is: ^1.0.3 esprima: ^4.0.1 - has-own-prop: ^2.0.0 - repeat-string: ^1.6.1 - checksum: 6dfc7b83d079595f3fd397af1fe2c48537c0a6fe537f718c4a9e5fbdbb78bb8c2bf0aebc0cc64d14c4807eb030f3e5357235a5adcc366457ab4059256d57f59c + checksum: e46b2d330f246bcceb3ddf600bb88afe6f2a91761cba8a7d6b139fb424a401e838f58539249d88383b4b0d9b832dced9ef6d56effc4a2c3d815b98a1b4455dea languageName: node linkType: hard @@ -8552,144 +8733,142 @@ __metadata: languageName: node linkType: hard -"cspell-config-lib@npm:9.2.0": - version: 9.2.0 - resolution: "cspell-config-lib@npm:9.2.0" +"cspell-config-lib@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-config-lib@npm:9.3.1" dependencies: - "@cspell/cspell-types": 9.2.0 - comment-json: ^4.2.5 - smol-toml: ^1.4.1 - yaml: ^2.8.0 - checksum: 6d355d379f374ed49fcd87f26865fa9232090f328d58072e747b0b06a71f2428afef98e9823bcc2528e06d09406d18f2958743fc28ccbc3ff71a897e5f9f66f4 + "@cspell/cspell-types": 9.3.1 + comment-json: ^4.4.1 + smol-toml: ^1.4.2 + yaml: ^2.8.1 + checksum: 0f5969764bff138a0c9fd19d24a9e05e39427662dc5b8e70685a99defc3623b48fe0c1a8b55e28221c1b954424fcae57275975731cadca713995c4424ac5b680 languageName: node linkType: hard -"cspell-dictionary@npm:9.2.0": - version: 9.2.0 - resolution: "cspell-dictionary@npm:9.2.0" +"cspell-dictionary@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-dictionary@npm:9.3.1" dependencies: - "@cspell/cspell-pipe": 9.2.0 - "@cspell/cspell-types": 9.2.0 - cspell-trie-lib: 9.2.0 - fast-equals: ^5.2.2 - checksum: 4677e036376b4fc83cf72f4e9e7d08c81883f90ea9c98608db7aa39f2e296e63de15866e9c7c97517721afacbbcc089d4d6394ccf784d85d75ab6d0aff8e7b0c + "@cspell/cspell-pipe": 9.3.1 + "@cspell/cspell-types": 9.3.1 + cspell-trie-lib: 9.3.1 + fast-equals: ^5.3.2 + checksum: fee04e844dd287d80748990027f60b59f460f4854fbb497ea59e9f0cfb64836c3fe274f4fc57d6ba7cf7108e4ff8a8a33740c841d145bb0d220d80868932a943 languageName: node linkType: hard -"cspell-gitignore@npm:9.2.0": - version: 9.2.0 - resolution: "cspell-gitignore@npm:9.2.0" +"cspell-gitignore@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-gitignore@npm:9.3.1" dependencies: - "@cspell/url": 9.2.0 - cspell-glob: 9.2.0 - cspell-io: 9.2.0 + "@cspell/url": 9.3.1 + cspell-glob: 9.3.1 + cspell-io: 9.3.1 bin: cspell-gitignore: bin.mjs - checksum: fadd4948839276630d07a94243778192359c23a4fc86dcf800be0185ee9fe007d0bff8fa70b4c18efc04387d0438342cd345aa19bb16b3ce63d64af4ff0d51a3 + checksum: 4416034bc854cbfdadb7abd635a7405285ec610a5b4904529f60507d21bb3bb013b9bc29e58ff1ef4a772187b742c550dd9781627f42031291a8b4f1f326d6d0 languageName: node linkType: hard -"cspell-glob@npm:9.2.0": - version: 9.2.0 - resolution: "cspell-glob@npm:9.2.0" +"cspell-glob@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-glob@npm:9.3.1" dependencies: - "@cspell/url": 9.2.0 + "@cspell/url": 9.3.1 picomatch: ^4.0.3 - checksum: 4e339dd10c6201d6c4e7d97f6a36848af13fc6e550e09518bae1b28434f918e1057c8cff8e9437d7b885117c40c20b506d211bf240ffe75fa346f6c7e5db97db + checksum: 1feaf198b6680b0b8a58e8ae65063cd72d42774f86c6cff905950df52d6474cf50b5c984655b18b60f9ff4693369b9e195bf2b53c3479d337496b2c9433d5649 languageName: node linkType: hard -"cspell-grammar@npm:9.2.0": - version: 9.2.0 - resolution: "cspell-grammar@npm:9.2.0" +"cspell-grammar@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-grammar@npm:9.3.1" dependencies: - "@cspell/cspell-pipe": 9.2.0 - "@cspell/cspell-types": 9.2.0 + "@cspell/cspell-pipe": 9.3.1 + "@cspell/cspell-types": 9.3.1 bin: cspell-grammar: bin.mjs - checksum: 51bc5df067ac87ce3ce0bf9a128e6737d4f87a1d754d7bac260f95ed3d96510ac56818245aa327844edfae57a672d413430ab48b2dc026730e6e090cd20a2ac5 + checksum: 1ec40070f972fe634acfec4b84a4b666b92f311ac66ca9ca060eb3f9254e78e03ba33c1b150f77b6555511d5956854f662cebcaf1c1dc24c784d4597e4d10a7d languageName: node linkType: hard -"cspell-io@npm:9.2.0": - version: 9.2.0 - resolution: "cspell-io@npm:9.2.0" +"cspell-io@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-io@npm:9.3.1" dependencies: - "@cspell/cspell-service-bus": 9.2.0 - "@cspell/url": 9.2.0 - checksum: 1b25bace27a5308cc5e7898d9a0463f2ffbba00592442007ac36760010915add5f2bc2d1aebc858d0d5f718235137d16e3320cd4d49dd7a93d2ae102cf51b296 + "@cspell/cspell-service-bus": 9.3.1 + "@cspell/url": 9.3.1 + checksum: fe5cf7b7e89a324813f83a611947830ee1ce8cabfe501c63252a43963f5c352d23f2089d7df8ce15b66bb4f74d33931e5795a387e8ecb0043cff5d0e6f092b72 languageName: node linkType: hard -"cspell-lib@npm:9.2.0": - version: 9.2.0 - resolution: "cspell-lib@npm:9.2.0" +"cspell-lib@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-lib@npm:9.3.1" dependencies: - "@cspell/cspell-bundled-dicts": 9.2.0 - "@cspell/cspell-pipe": 9.2.0 - "@cspell/cspell-resolver": 9.2.0 - "@cspell/cspell-types": 9.2.0 - "@cspell/dynamic-import": 9.2.0 - "@cspell/filetypes": 9.2.0 - "@cspell/strong-weak-map": 9.2.0 - "@cspell/url": 9.2.0 + "@cspell/cspell-bundled-dicts": 9.3.1 + "@cspell/cspell-pipe": 9.3.1 + "@cspell/cspell-resolver": 9.3.1 + "@cspell/cspell-types": 9.3.1 + "@cspell/dynamic-import": 9.3.1 + "@cspell/filetypes": 9.3.1 + "@cspell/strong-weak-map": 9.3.1 + "@cspell/url": 9.3.1 clear-module: ^4.1.2 - comment-json: ^4.2.5 - cspell-config-lib: 9.2.0 - cspell-dictionary: 9.2.0 - cspell-glob: 9.2.0 - cspell-grammar: 9.2.0 - cspell-io: 9.2.0 - cspell-trie-lib: 9.2.0 + cspell-config-lib: 9.3.1 + cspell-dictionary: 9.3.1 + cspell-glob: 9.3.1 + cspell-grammar: 9.3.1 + cspell-io: 9.3.1 + cspell-trie-lib: 9.3.1 env-paths: ^3.0.0 - fast-equals: ^5.2.2 - gensequence: ^7.0.0 + gensequence: ^8.0.8 import-fresh: ^3.3.1 resolve-from: ^5.0.0 vscode-languageserver-textdocument: ^1.0.12 vscode-uri: ^3.1.0 xdg-basedir: ^5.1.0 - checksum: 48de0fa29594886613ea273d0bdbc70bdd5e8a9b9f8e7297755b1d4585f131cfc0589367e8ad275b93811a23ea7a9a055265bd7dae29b08dc05998144ac1fb1d + checksum: 65319dbd5e78305a51b0adf4122b99866516fc30ff8134f45def3c445627fc48e6b0945668dca735d05fba531b2e09ba0c90b94a6dae92750576ae0e5a5ae092 languageName: node linkType: hard -"cspell-trie-lib@npm:9.2.0": - version: 9.2.0 - resolution: "cspell-trie-lib@npm:9.2.0" +"cspell-trie-lib@npm:9.3.1": + version: 9.3.1 + resolution: "cspell-trie-lib@npm:9.3.1" dependencies: - "@cspell/cspell-pipe": 9.2.0 - "@cspell/cspell-types": 9.2.0 - gensequence: ^7.0.0 - checksum: 8a5907d9b787a4c16ef05f46a897eed9ed686a8e897da939ee5e4cb6d8d0423623fe5528bc76c049816f52b6c6fe6d2c8e82907ccbb67031e8dd1d9879eab844 + "@cspell/cspell-pipe": 9.3.1 + "@cspell/cspell-types": 9.3.1 + gensequence: ^8.0.8 + checksum: 4fa4ed8cdb7245794d3299cab5e2ec541e55efe84e10aef876f67c3eba7f8bba037c690b5345e17d46e21c4b89f0fa57ac8ee43278d5961fa790bb56250a8842 languageName: node linkType: hard "cspell@npm:^9.0.0": - version: 9.2.0 - resolution: "cspell@npm:9.2.0" - dependencies: - "@cspell/cspell-json-reporter": 9.2.0 - "@cspell/cspell-pipe": 9.2.0 - "@cspell/cspell-types": 9.2.0 - "@cspell/dynamic-import": 9.2.0 - "@cspell/url": 9.2.0 - chalk: ^5.4.1 - chalk-template: ^1.1.0 - commander: ^14.0.0 - cspell-config-lib: 9.2.0 - cspell-dictionary: 9.2.0 - cspell-gitignore: 9.2.0 - cspell-glob: 9.2.0 - cspell-io: 9.2.0 - cspell-lib: 9.2.0 + version: 9.3.1 + resolution: "cspell@npm:9.3.1" + dependencies: + "@cspell/cspell-json-reporter": 9.3.1 + "@cspell/cspell-pipe": 9.3.1 + "@cspell/cspell-types": 9.3.1 + "@cspell/dynamic-import": 9.3.1 + "@cspell/url": 9.3.1 + chalk: ^5.6.2 + chalk-template: ^1.1.2 + commander: ^14.0.2 + cspell-config-lib: 9.3.1 + cspell-dictionary: 9.3.1 + cspell-gitignore: 9.3.1 + cspell-glob: 9.3.1 + cspell-io: 9.3.1 + cspell-lib: 9.3.1 fast-json-stable-stringify: ^2.1.0 flatted: ^3.3.3 - semver: ^7.7.2 - tinyglobby: ^0.2.14 + semver: ^7.7.3 + tinyglobby: ^0.2.15 bin: cspell: bin.mjs cspell-esm: bin.mjs - checksum: 2b30b950606adb56ccbcec151a08a440e62b50581b0a4818dfe6b55d46a1885a8340814406c18da29f5ce0343d546ce9fc1b66e7ed101087c3a96a9e7fbcc2a0 + checksum: f24dbcfd66bcd3d09d95c0db9fdd94d0f9d27911d583053dc9fa1f06454d88c790e52d1865f7cf6f8e6873e773fed23cf680942b78b18ca4fd90a2ace3da5703 languageName: node linkType: hard @@ -9259,6 +9438,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:~8.0.2": + version: 8.0.2 + resolution: "diff@npm:8.0.2" + checksum: 0d5556beff9aa688117ef79b1c88eb663df9959bc59946122330932c01e8db5529f914dcc87bf00fd1fecbca75731e6be7c8fabe1e34e10d6557e0536b7c856c + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -9778,7 +9964,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.25.0, esbuild@npm:~0.25.0": +"esbuild@npm:^0.25.0": version: 0.25.5 resolution: "esbuild@npm:0.25.5" dependencies: @@ -9944,6 +10130,95 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:~0.27.0": + version: 0.27.0 + resolution: "esbuild@npm:0.27.0" + dependencies: + "@esbuild/aix-ppc64": 0.27.0 + "@esbuild/android-arm": 0.27.0 + "@esbuild/android-arm64": 0.27.0 + "@esbuild/android-x64": 0.27.0 + "@esbuild/darwin-arm64": 0.27.0 + "@esbuild/darwin-x64": 0.27.0 + "@esbuild/freebsd-arm64": 0.27.0 + "@esbuild/freebsd-x64": 0.27.0 + "@esbuild/linux-arm": 0.27.0 + "@esbuild/linux-arm64": 0.27.0 + "@esbuild/linux-ia32": 0.27.0 + "@esbuild/linux-loong64": 0.27.0 + "@esbuild/linux-mips64el": 0.27.0 + "@esbuild/linux-ppc64": 0.27.0 + "@esbuild/linux-riscv64": 0.27.0 + "@esbuild/linux-s390x": 0.27.0 + "@esbuild/linux-x64": 0.27.0 + "@esbuild/netbsd-arm64": 0.27.0 + "@esbuild/netbsd-x64": 0.27.0 + "@esbuild/openbsd-arm64": 0.27.0 + "@esbuild/openbsd-x64": 0.27.0 + "@esbuild/openharmony-arm64": 0.27.0 + "@esbuild/sunos-x64": 0.27.0 + "@esbuild/win32-arm64": 0.27.0 + "@esbuild/win32-ia32": 0.27.0 + "@esbuild/win32-x64": 0.27.0 + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-arm64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/openharmony-arm64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: db33b01d8f9234843e411c87527587f646b5ac082e3759fe796a71878dcb1180da0d4f8b33525c492d918c0262befe0e724c2d5d8a2c4b611c2c75549a3dbf91 + languageName: node + linkType: hard + "escalade@npm:^3.1.1, escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" @@ -10010,14 +10285,14 @@ __metadata: linkType: hard "eslint-plugin-eslint-plugin@npm:^7.0.0": - version: 7.0.0 - resolution: "eslint-plugin-eslint-plugin@npm:7.0.0" + version: 7.2.0 + resolution: "eslint-plugin-eslint-plugin@npm:7.2.0" dependencies: "@eslint-community/eslint-utils": ^4.4.0 estraverse: ^5.3.0 peerDependencies: eslint: ">=9.0.0" - checksum: b67099bbb56a2abc28e09f296ae9b04e23401c72cf2f611c50010644f8a5ab732801c7367f1784c6522ca4e727e1144d4590878065c84b384bb634b70c4d0f5e + checksum: f099c2d55b8d890fb60586a5786ebe69fe645580b9da5a79280cc6f27a4c64b8aa3027edb161bc8fd3a2ca36390c9c01a612ab25e6beb7908aafbf677b4ab3d2 languageName: node linkType: hard @@ -10587,10 +10862,10 @@ __metadata: languageName: node linkType: hard -"fast-equals@npm:^5.2.2": - version: 5.2.2 - resolution: "fast-equals@npm:5.2.2" - checksum: 7156bcade0be5ee4dc335969d255a5815348d57080e1876fa1584451eafd0c92588de5f5840e55f81841b6d907ade2a49a46e4ec33e6f7a283a209c0fd8f8a59 +"fast-equals@npm:^5.3.2": + version: 5.3.3 + resolution: "fast-equals@npm:5.3.3" + checksum: 52f9e48d12185abe112d54653b8a410845560db2f05fd2140e4f993f47283c060b9ec63eab72c254091bb601103b081912b6a6385e882c09fd686806bd2bf476 languageName: node linkType: hard @@ -11098,10 +11373,10 @@ __metadata: languageName: node linkType: hard -"gensequence@npm:^7.0.0": - version: 7.0.0 - resolution: "gensequence@npm:7.0.0" - checksum: 85ab3a47c9900e5263713277f7c54f1599d8ee180e0e978c5130bef5eeba04922e7fd1bcdfcf82e72bcab124e475b427b0acdb51b98f0e184cb3c48872fef964 +"gensequence@npm:^8.0.8": + version: 8.0.8 + resolution: "gensequence@npm:8.0.8" + checksum: d5efc23d27522d4e5a77ebc19479b5fbfd694f53a4ca09971e4789d3024f5ac0928bb90d622329f8c1dfa2b45bacd2548472a4088874829e11802c83559a34c6 languageName: node linkType: hard @@ -11512,13 +11787,6 @@ __metadata: languageName: node linkType: hard -"has-own-prop@npm:^2.0.0": - version: 2.0.0 - resolution: "has-own-prop@npm:2.0.0" - checksum: ca6336e85ead2295c9603880cbc199e2d3ff7eaea0e9035d68fbc79892e9cf681abc62c0909520f112c671dad9961be2173b21dff951358cc98425c560e789e0 - languageName: node - linkType: hard - "has-property-descriptors@npm:^1.0.0, has-property-descriptors@npm:^1.0.2": version: 1.0.2 resolution: "has-property-descriptors@npm:1.0.2" @@ -12132,10 +12400,10 @@ __metadata: languageName: node linkType: hard -"import-meta-resolve@npm:^4.1.0": - version: 4.1.0 - resolution: "import-meta-resolve@npm:4.1.0" - checksum: 6497af27bf3ee384ad4efd4e0ec3facf9a114863f35a7b35f248659f32faa5e1ae07baa74d603069f35734ae3718a78b3f66926f98dc9a62e261e7df37854a62 +"import-meta-resolve@npm:^4.2.0": + version: 4.2.0 + resolution: "import-meta-resolve@npm:4.2.0" + checksum: fe5ca3258f22dc3dd4e2f2e8f6b54324c1cf0261216c7d9aae801b2eadf664bbd61e26cfb907a1238761285a3e9c8c23403321d52ca0e579c341b8d90c97fa52 languageName: node linkType: hard @@ -17646,7 +17914,7 @@ __metadata: languageName: node linkType: hard -"repeat-string@npm:^1.0.0, repeat-string@npm:^1.6.1": +"repeat-string@npm:^1.0.0": version: 1.6.1 resolution: "repeat-string@npm:1.6.1" checksum: 1b809fc6db97decdc68f5b12c4d1a671c8e3f65ec4a40c238bc5200e44e85bcc52a54f78268ab9c29fcf5fe4f1343e805420056d1f30fa9a9ee4c2d93e3cc6c0 @@ -18179,12 +18447,12 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3, semver@npm:^7.7.1, semver@npm:^7.7.2": - version: 7.7.2 - resolution: "semver@npm:7.7.2" +"semver@npm:^7.0.0, semver@npm:^7.1.2, semver@npm:^7.3.2, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3, semver@npm:^7.7.1, semver@npm:^7.7.2, semver@npm:^7.7.3": + version: 7.7.3 + resolution: "semver@npm:7.7.3" bin: semver: bin/semver.js - checksum: dd94ba8f1cbc903d8eeb4dd8bf19f46b3deb14262b6717d0de3c804b594058ae785ef2e4b46c5c3b58733c99c83339068203002f9e37cfe44f7e2cc5e3d2f621 + checksum: f013a3ee4607857bcd3503b6ac1d80165f7f8ea94f5d55e2d3e33df82fce487aa3313b987abf9b39e0793c83c9fc67b76c36c067625141a9f6f704ae0ea18db2 languageName: node linkType: hard @@ -18552,7 +18820,7 @@ __metadata: languageName: node linkType: hard -"smol-toml@npm:^1.4.1": +"smol-toml@npm:^1.4.1, smol-toml@npm:^1.4.2": version: 1.4.2 resolution: "smol-toml@npm:1.4.2" checksum: f12d3fbc2d49396ec523170828a5c9a89bc7740eb7b205f8d8553af18629d936474c1ce55b70c7839aa239a11252e16fd1c3fc955b966b81c9dec00155df4f85 @@ -19702,10 +19970,10 @@ __metadata: version: 0.0.0-use.local resolution: "typescript-eslint@workspace:packages/typescript-eslint" dependencies: - "@typescript-eslint/eslint-plugin": 8.46.4 - "@typescript-eslint/parser": 8.46.4 - "@typescript-eslint/typescript-estree": 8.46.4 - "@typescript-eslint/utils": 8.46.4 + "@typescript-eslint/eslint-plugin": 8.47.0 + "@typescript-eslint/parser": 8.47.0 + "@typescript-eslint/typescript-estree": 8.47.0 + "@typescript-eslint/utils": 8.47.0 "@vitest/coverage-v8": ^3.1.3 eslint: "*" rimraf: "*" @@ -21063,7 +21331,7 @@ __metadata: languageName: node linkType: hard -"yaml@npm:^2.6.0, yaml@npm:^2.7.0, yaml@npm:^2.7.1, yaml@npm:^2.8.0": +"yaml@npm:^2.6.0, yaml@npm:^2.7.0, yaml@npm:^2.7.1, yaml@npm:^2.8.1": version: 2.8.1 resolution: "yaml@npm:2.8.1" bin: