From e5afe5104338a3ec980d81ad425250aa694cfb73 Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Wed, 26 Feb 2025 12:48:04 -0700 Subject: [PATCH 01/12] Upgrade to MM `eslint-config-*` v15 + ESLint 9 The ESLint configuration is behind for this package. Keeping up to date with our current lint rules and lint config format helps to debug issues with ESLint now and in the future, and aligns this repo with our other repos. A list of changes: - Upgrade `@metamask/eslint-config` and `@metamask/eslint-config-*` packages to 15.0.0 - Upgrade ESLint to 9.x - Upgrade TypeScript ESLint packages to 8.25.x - Upgrade other ESLint packages to fulfill peer dependencies - Fix lint violations as a result of the upgrade Note that the rules for `jsdoc/require-jsdoc` have been refined. In performing this upgrade, many violations appeared that I thought didn't help readability. --- .eslintrc.cjs | 53 - babel.config.cjs | 6 +- bin/create-release-branch.js | 9 +- eslint.config.mjs | 131 ++ package.json | 29 +- src/cli.ts | 2 +- src/command-line-arguments.ts | 5 +- src/dirname.ts | 9 +- src/editor.test.ts | 1 + src/editor.ts | 13 +- src/env.test.ts | 4 + src/env.ts | 9 + src/fs.test.ts | 7 +- src/fs.ts | 3 +- src/initial-parameters.test.ts | 11 +- src/initial-parameters.ts | 13 +- src/main.test.ts | 5 +- src/main.ts | 3 +- src/misc-utils.test.ts | 3 +- src/misc-utils.ts | 17 +- src/monorepo-workflow-operations.test.ts | 778 +++---- src/monorepo-workflow-operations.ts | 7 +- src/package-manifest.test.ts | 3 +- src/package-manifest.ts | 21 +- src/package.test.ts | 23 +- src/package.ts | 34 +- src/project.test.ts | 27 +- src/project.ts | 69 +- src/release-plan.test.ts | 5 +- src/release-plan.ts | 41 +- src/release-specification.test.ts | 11 +- src/release-specification.ts | 99 +- src/repo.test.ts | 3 +- src/repo.ts | 11 +- src/ui.ts | 108 +- src/ui/types.ts | 16 + src/workflow-operations.test.ts | 4 +- src/workflow-operations.ts | 2 +- src/yarn-commands.test.ts | 3 +- tests/functional/helpers/constants.ts | 7 + tests/functional/helpers/environment.ts | 21 +- tests/functional/helpers/local-monorepo.ts | 32 +- tests/functional/helpers/local-repo.ts | 27 +- .../helpers/monorepo-environment.ts | 27 +- tests/functional/helpers/remote-repo.ts | 5 +- tests/functional/helpers/repo.ts | 20 +- tests/functional/helpers/utils.ts | 11 +- tests/functional/helpers/with.ts | 4 +- tests/helpers.ts | 26 +- tests/setupAfterEnv.ts | 17 +- tests/unit/helpers.ts | 20 +- vite.config.mjs | 4 +- yarn.lock | 1899 +++++++++-------- 53 files changed, 1962 insertions(+), 1756 deletions(-) delete mode 100644 .eslintrc.cjs create mode 100644 eslint.config.mjs diff --git a/.eslintrc.cjs b/.eslintrc.cjs deleted file mode 100644 index c8b462f5..00000000 --- a/.eslintrc.cjs +++ /dev/null @@ -1,53 +0,0 @@ -module.exports = { - root: true, - - extends: ['@metamask/eslint-config', '@metamask/eslint-config-nodejs'], - - parserOptions: { - sourceType: 'module', - }, - - rules: { - // This makes integration tests easier to read by allowing setup code and - // assertions to be grouped together better - 'padding-line-between-statements': [ - 'error', - { - blankLine: 'always', - prev: 'directive', - next: '*', - }, - { - blankLine: 'any', - prev: 'directive', - next: 'directive', - }, - { - blankLine: 'always', - prev: 'multiline-block-like', - next: '*', - }, - { - blankLine: 'always', - prev: '*', - next: 'multiline-block-like', - }, - ], - // It's common for scripts to access `process.env` - 'node/no-process-env': 'off', - }, - - overrides: [ - { - files: ['*.ts'], - extends: ['@metamask/eslint-config-typescript'], - }, - - { - files: ['*.test.ts'], - extends: ['@metamask/eslint-config-jest'], - }, - ], - - ignorePatterns: ['!.eslintrc.js', '!.prettierrc.js', 'dist/'], -}; diff --git a/babel.config.cjs b/babel.config.cjs index e0d092a6..35937620 100644 --- a/babel.config.cjs +++ b/babel.config.cjs @@ -4,7 +4,7 @@ module.exports = { env: { test: { presets: ['@babel/preset-env', '@babel/preset-typescript'], - plugins: ['@babel/plugin-transform-modules-commonjs'] - } - } + plugins: ['@babel/plugin-transform-modules-commonjs'], + }, + }, }; diff --git a/bin/create-release-branch.js b/bin/create-release-branch.js index f71e12c5..0e568f87 100755 --- a/bin/create-release-branch.js +++ b/bin/create-release-branch.js @@ -1,5 +1,10 @@ #!/usr/bin/env node -/* eslint-disable import/extensions */ -// eslint-disable-next-line import/no-unassigned-import, import/no-unresolved +// Three things: +// - This file doesn't export anything, as it's a script. +// - We are using a `.js` extension because that's what appears in `dist/`. +// - This file will only exist after running `yarn build`. We don't want +// developers or CI to receive a lint error if the script has not been run. +// (A warning will appear if the script *has* been run, but that is okay.) +// eslint-disable-next-line import-x/no-unassigned-import, import-x/extensions, import-x/no-unresolved import '../dist/cli.js'; diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000..1fe55bc8 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,131 @@ +import base, { createConfig } from '@metamask/eslint-config'; +import jest from '@metamask/eslint-config-jest'; +import nodejs from '@metamask/eslint-config-nodejs'; +import typescript from '@metamask/eslint-config-typescript'; + +const config = createConfig([ + { + ignores: ['dist/', 'docs/', '.yarn/'], + }, + + { + extends: base, + + languageOptions: { + sourceType: 'module', + parserOptions: { + tsconfigRootDir: import.meta.dirname, + }, + }, + + rules: { + // Consider copying this to @metamask/eslint-config + 'jsdoc/require-jsdoc': [ + 'error', + { + require: { + // Classes + ClassDeclaration: true, + // Function declarations + FunctionDeclaration: true, + // Methods + MethodDefinition: true, + }, + contexts: [ + // Type interfaces that are not defined within `declare` blocks + ':not(TSModuleBlock) > TSInterfaceDeclaration', + // Type aliases + 'TSTypeAliasDeclaration', + // Enums + 'TSEnumDeclaration', + // Arrow functions that are not contained within plain objects or + // are not arguments to functions or methods + ':not(Property, NewExpression, CallExpression) > ArrowFunctionExpression', + // Function expressions that are not contained within plain objects + // or are not arguments to functions or methods + ':not(Property, NewExpression, CallExpression) > FunctionExpression', + // Exported variables at the root + 'ExportNamedDeclaration:has(> VariableDeclaration)', + ], + }, + ], + // Consider copying this to @metamask/eslint-config + 'jsdoc/no-blank-blocks': 'error', + }, + + settings: { + 'import-x/extensions': ['.js', '.mjs'], + }, + }, + + { + files: ['**/*.ts'], + extends: typescript, + rules: { + // Consider copying this to @metamask/eslint-config + '@typescript-eslint/explicit-function-return-type': [ + 'error', + { + allowExpressions: true, + }, + ], + // Consider copying this to @metamask/eslint-config + 'jsdoc/require-jsdoc': [ + 'error', + { + require: { + // Classes + ClassDeclaration: true, + // Function declarations + FunctionDeclaration: true, + // Methods + MethodDefinition: true, + }, + contexts: [ + // Type interfaces that are not defined within `declare` blocks + ':not(TSModuleBlock) > TSInterfaceDeclaration', + // Type aliases + 'TSTypeAliasDeclaration', + // Enums + 'TSEnumDeclaration', + // Arrow functions that are not contained within plain objects or + // are not arguments to functions or methods + ':not(Property, NewExpression, CallExpression) > ArrowFunctionExpression', + // Function expressions that are not contained within plain objects + // or are not arguments to functions or methods + ':not(Property, NewExpression, CallExpression) > FunctionExpression', + // Exported variables at the root + 'ExportNamedDeclaration:has(> VariableDeclaration)', + ], + }, + ], + // Consider copying this to @metamask/eslint-config + 'jsdoc/no-blank-blocks': 'error', + }, + }, + + { + files: ['**/*.js', '**/*.cjs', '**/*.ts', '**/*.test.ts', '**/*.test.js'], + ignores: ['src/ui/**'], + extends: nodejs, + }, + + { + files: ['**/*.test.ts'], + extends: jest, + }, + + // List this last to override any settings inherited from plugins, + // especially `eslint-config-n`, which mistakenly assumes that all `.cjs` + // files are modules (since we specified `type: module` in `package.json`) + { + files: ['**/*.js', '**/*.cjs'], + // This *is* a script, but is written using ESM. + ignores: ['bin/create-release-branch.js'], + languageOptions: { + sourceType: 'script', + }, + }, +]); + +export default config; diff --git a/package.json b/package.json index f00170b9..7f36fea5 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "build:ui": "vite build", "build:clean": "rimraf dist && yarn build", "lint": "yarn lint:eslint && yarn lint:misc --check", - "lint:eslint": "eslint . --cache --ext js,ts", + "lint:eslint": "eslint .", "lint:fix": "yarn lint:eslint --fix && yarn lint:misc --write", "lint:misc": "prettier '**/*.json' '**/*.md' '!CHANGELOG.md' '**/*.yml' '!.yarnrc.yml' --ignore-path .gitignore --no-error-on-unmatched-pattern", "prepack": "./scripts/prepack.sh", @@ -46,10 +46,10 @@ "@babel/preset-env": "^7.23.5", "@babel/preset-typescript": "^7.23.3", "@lavamoat/allow-scripts": "^3.1.0", - "@metamask/eslint-config": "^10.0.0", - "@metamask/eslint-config-jest": "^10.0.0", - "@metamask/eslint-config-nodejs": "^10.0.0", - "@metamask/eslint-config-typescript": "^10.0.0", + "@metamask/eslint-config": "^15.0.0", + "@metamask/eslint-config-jest": "^15.0.0", + "@metamask/eslint-config-nodejs": "^15.0.0", + "@metamask/eslint-config-typescript": "^15.0.0", "@tailwindcss/vite": "^4.0.9", "@types/debug": "^4.1.7", "@types/express": "^5.0.0", @@ -63,18 +63,21 @@ "@types/validate-npm-package-name": "^4.0.2", "@types/which": "^3.0.0", "@types/yargs": "^17.0.10", - "@typescript-eslint/eslint-plugin": "^5.62.0", - "@typescript-eslint/parser": "^5.62.0", + "@typescript-eslint/eslint-plugin": "^8.25.0", + "@typescript-eslint/parser": "^8.25.0", "@vitejs/plugin-react": "^4.3.4", "babel-jest": "^29.7.0", "deepmerge": "^4.2.2", - "eslint": "^8.27.0", + "eslint": "^9.21.0", "eslint-config-prettier": "^9.1.0", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-jest": "^26.9.0", - "eslint-plugin-jsdoc": "^39.6.2", + "eslint-import-resolver-typescript": "^3.8.3", + "eslint-plugin-import-x": "^4.6.1", + "eslint-plugin-jest": "^28.11.0", + "eslint-plugin-jsdoc": "^50.6.3", + "eslint-plugin-n": "^17.15.1", "eslint-plugin-node": "^11.1.0", "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-promise": "^7.2.1", "jest": "^29.7.0", "jest-it-up": "^3.0.0", "jest-when": "^3.5.2", @@ -89,6 +92,7 @@ "tailwindcss": "^4.0.9", "tsx": "^4.6.1", "typescript": "~5.1.6", + "typescript-eslint": "^8.49.0", "vite": "^6.2.0" }, "peerDependencies": { @@ -106,7 +110,8 @@ "allowScripts": { "@lavamoat/preinstall-always-fail": false, "tsx>esbuild": false, - "vite>esbuild": false + "vite>esbuild": false, + "eslint-plugin-import-x>unrs-resolver": false } } } diff --git a/src/cli.ts b/src/cli.ts index efc326b1..b23333f3 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -3,7 +3,7 @@ import { main } from './main.js'; /** * The entrypoint to this tool. */ -async function cli() { +async function cli(): Promise { await main({ argv: process.argv, cwd: process.cwd(), diff --git a/src/command-line-arguments.ts b/src/command-line-arguments.ts index 383cc39d..f184de55 100644 --- a/src/command-line-arguments.ts +++ b/src/command-line-arguments.ts @@ -1,6 +1,9 @@ -import yargs from 'yargs/yargs'; import { hideBin } from 'yargs/helpers'; +import yargs from 'yargs/yargs'; +/** + * The set of positional and named arguments that can be passed to this tool. + */ export type CommandLineArguments = { projectDirectory: string; tempDirectory: string | undefined; diff --git a/src/dirname.ts b/src/dirname.ts index d3723895..efdae826 100644 --- a/src/dirname.ts +++ b/src/dirname.ts @@ -1,14 +1,11 @@ -import { fileURLToPath } from 'url'; import { dirname } from 'path'; - -const __filename = fileURLToPath(import.meta.url); -const __dirname = dirname(__filename); +import { fileURLToPath } from 'url'; /** * Get the current directory path. * * @returns The current directory path. */ -export function getCurrentDirectoryPath() { - return __dirname; +export function getCurrentDirectoryPath(): string { + return dirname(fileURLToPath(import.meta.url)); } diff --git a/src/editor.test.ts b/src/editor.test.ts index 70b8a957..177d352b 100644 --- a/src/editor.test.ts +++ b/src/editor.test.ts @@ -1,4 +1,5 @@ import { when } from 'jest-when'; + import { determineEditor } from './editor.js'; import * as envModule from './env.js'; import * as miscUtils from './misc-utils.js'; diff --git a/src/editor.ts b/src/editor.ts index ba1b376a..37d3b4d5 100644 --- a/src/editor.ts +++ b/src/editor.ts @@ -1,12 +1,15 @@ +import { getErrorMessage } from '@metamask/utils'; + import { getEnvironmentVariables } from './env.js'; import { debug, resolveExecutable } from './misc-utils.js'; /** * Information about the editor present on the user's computer. * - * @property path - The path to the executable representing the editor. - * @property args - Command-line arguments to pass to the executable when - * calling it. + * Properties: + * + * - `path` - The path to the executable representing the editor. + * - `args` - Command-line arguments to pass to the executable when calling it. */ export type Editor = { path: string; @@ -31,7 +34,7 @@ export async function determineEditor(): Promise { executablePath = await resolveExecutable(EDITOR); } catch (error) { debug( - `Could not resolve executable ${EDITOR} (${error}), falling back to VSCode`, + `Could not resolve executable ${EDITOR} (${getErrorMessage(error)}), falling back to VSCode`, ); } } @@ -43,7 +46,7 @@ export async function determineEditor(): Promise { executableArgs.push('--wait'); } catch (error) { debug( - `Could not resolve path to VSCode: ${error}, continuing regardless`, + `Could not resolve path to VSCode: ${getErrorMessage(error)}, continuing regardless`, ); } } diff --git a/src/env.test.ts b/src/env.test.ts index 5a8c6f4e..a88591c5 100644 --- a/src/env.test.ts +++ b/src/env.test.ts @@ -1,3 +1,7 @@ +// This file tests a file that is concerned with accessing environment +// variables. +/* eslint-disable n/no-process-env */ + import { getEnvironmentVariables } from './env.js'; describe('env', () => { diff --git a/src/env.ts b/src/env.ts index 58d63af3..7d784229 100644 --- a/src/env.ts +++ b/src/env.ts @@ -1,4 +1,13 @@ +// This file tests a file that is concerned with accessing environment +// variables. +/* eslint-disable n/no-process-env */ + +/** + * Environment variables that this tool uses. + */ type Env = { + // Environment variables are uppercase by convention. + // eslint-disable-next-line @typescript-eslint/naming-convention EDITOR: string | undefined; }; diff --git a/src/fs.test.ts b/src/fs.test.ts index 474a6039..ab712e0d 100644 --- a/src/fs.test.ts +++ b/src/fs.test.ts @@ -1,9 +1,9 @@ +import * as actionUtils from '@metamask/action-utils'; import fs from 'fs'; +import { when } from 'jest-when'; import path from 'path'; import { rimraf } from 'rimraf'; -import { when } from 'jest-when'; -import * as actionUtils from '@metamask/action-utils'; -import { withSandbox } from '../tests/helpers.js'; + import { readFile, writeFile, @@ -13,6 +13,7 @@ import { ensureDirectoryPathExists, removeFile, } from './fs.js'; +import { withSandbox } from '../tests/helpers.js'; jest.mock('@metamask/action-utils'); diff --git a/src/fs.ts b/src/fs.ts index c9afd136..793bedac 100644 --- a/src/fs.ts +++ b/src/fs.ts @@ -1,8 +1,9 @@ -import fs from 'fs'; import { readJsonObjectFile as underlyingReadJsonObjectFile, writeJsonFile as underlyingWriteJsonFile, } from '@metamask/action-utils'; +import fs from 'fs'; + import { wrapError, isErrorWithCode } from './misc-utils.js'; /** diff --git a/src/initial-parameters.test.ts b/src/initial-parameters.test.ts index 8b7d4759..bb499ed3 100644 --- a/src/initial-parameters.test.ts +++ b/src/initial-parameters.test.ts @@ -1,15 +1,16 @@ +import { when } from 'jest-when'; import os from 'os'; import path from 'path'; -import { when } from 'jest-when'; + +import * as commandLineArgumentsModule from './command-line-arguments.js'; +import * as envModule from './env.js'; +import { determineInitialParameters } from './initial-parameters.js'; +import * as projectModule from './project.js'; import { buildMockProject, buildMockPackage, createNoopWriteStream, } from '../tests/unit/helpers.js'; -import { determineInitialParameters } from './initial-parameters.js'; -import * as commandLineArgumentsModule from './command-line-arguments.js'; -import * as envModule from './env.js'; -import * as projectModule from './project.js'; jest.mock('./command-line-arguments'); jest.mock('./env'); diff --git a/src/initial-parameters.ts b/src/initial-parameters.ts index 5ed3f54e..acd82087 100644 --- a/src/initial-parameters.ts +++ b/src/initial-parameters.ts @@ -1,5 +1,6 @@ import os from 'os'; import path from 'path'; + import { readCommandLineArguments } from './command-line-arguments.js'; import { WriteStreamLike } from './fs.js'; import { readProject, Project } from './project.js'; @@ -7,14 +8,18 @@ import { readProject, Project } from './project.js'; /** * The type of release being created as determined by the parent release. * - * - An *ordinary* release includes features or fixes applied against the - * latest release and is designated by bumping the first part of that release's - * version string. + * - An *ordinary* release includes features or fixes applied against the latest + * release and is designated by bumping the first part of that release's + * version string. * - A *backport* release includes fixes applied against a previous release and - * is designated by bumping the second part of that release's version string. + * is designated by bumping the second part of that release's version string. */ export type ReleaseType = 'ordinary' | 'backport'; +/** + * Various pieces of information that the tool uses to run, derived from + * command-line arguments. + */ type InitialParameters = { project: Project; tempDirectoryPath: string; diff --git a/src/main.test.ts b/src/main.test.ts index 6e51dc73..a7cbdf93 100644 --- a/src/main.test.ts +++ b/src/main.test.ts @@ -1,9 +1,10 @@ import fs from 'fs'; -import { buildMockProject } from '../tests/unit/helpers.js'; -import { main } from './main.js'; + import * as initialParametersModule from './initial-parameters.js'; +import { main } from './main.js'; import * as monorepoWorkflowOperations from './monorepo-workflow-operations.js'; import * as ui from './ui.js'; +import { buildMockProject } from '../tests/unit/helpers.js'; jest.mock('./initial-parameters'); jest.mock('./monorepo-workflow-operations'); diff --git a/src/main.ts b/src/main.ts index 88ba8522..184bb909 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,4 +1,5 @@ import type { WriteStream } from 'fs'; + import { determineInitialParameters } from './initial-parameters.js'; import { followMonorepoWorkflow } from './monorepo-workflow-operations.js'; import { startUI } from './ui.js'; @@ -25,7 +26,7 @@ export async function main({ cwd: string; stdout: Pick; stderr: Pick; -}) { +}): Promise { const { project, tempDirectoryPath, diff --git a/src/misc-utils.test.ts b/src/misc-utils.test.ts index cccf8a6a..f9a6252d 100644 --- a/src/misc-utils.test.ts +++ b/src/misc-utils.test.ts @@ -1,5 +1,6 @@ -import * as whichModule from 'which'; import * as execaModule from 'execa'; +import * as whichModule from 'which'; + import { isErrorWithCode, isErrorWithMessage, diff --git a/src/misc-utils.ts b/src/misc-utils.ts index 0c1e777c..e4abd3b1 100644 --- a/src/misc-utils.ts +++ b/src/misc-utils.ts @@ -1,8 +1,8 @@ -import which from 'which'; -import { execa, Options } from 'execa'; +import { getErrorMessage, isObject } from '@metamask/utils'; import createDebug from 'debug'; +import { execa, Options } from 'execa'; import { ErrorWithCause } from 'pony-cause'; -import { isObject } from '@metamask/utils'; +import which from 'which'; export { isTruthyString } from '@metamask/action-utils'; export { hasProperty, isNullOrUndefined } from '@metamask/utils'; @@ -94,18 +94,23 @@ export function isErrorWithStack(error: unknown): error is { stack: string } { * something throwable). * @returns A new error object. */ -export function wrapError(message: string, originalError: unknown) { +export function wrapError( + message: string, + originalError: unknown, +): Error & { code?: string } { if (isError(originalError)) { - const error: any = new ErrorWithCause(message, { cause: originalError }); + const error = new ErrorWithCause(message, { cause: originalError }); if (isErrorWithCode(originalError)) { + // @ts-expect-error `code` does not exist on ErrorWithCause, but we add it + // anyway error.code = originalError.code; } return error; } - return new Error(`${message}: ${originalError}`); + return new Error(`${message}: ${getErrorMessage(originalError)}`); } /** diff --git a/src/monorepo-workflow-operations.test.ts b/src/monorepo-workflow-operations.test.ts index cd47c022..a5a68e2d 100644 --- a/src/monorepo-workflow-operations.test.ts +++ b/src/monorepo-workflow-operations.test.ts @@ -1,19 +1,29 @@ import fs from 'fs'; -import path from 'path'; import { when } from 'jest-when'; +import path from 'path'; import { MockWritable } from 'stdio-mock'; -import { withSandbox, Sandbox, isErrorWithCode } from '../tests/helpers.js'; -import { buildMockProject, Require } from '../tests/unit/helpers.js'; -import { followMonorepoWorkflow } from './monorepo-workflow-operations.js'; -import * as editorModule from './editor.js'; + +import { determineEditor } from './editor.js'; import type { Editor } from './editor.js'; -import * as releaseSpecificationModule from './release-specification.js'; -import type { ReleaseSpecification } from './release-specification.js'; -import * as releasePlanModule from './release-plan.js'; +import { followMonorepoWorkflow } from './monorepo-workflow-operations.js'; +import { Project } from './project.js'; +import { executeReleasePlan, planRelease } from './release-plan.js'; import type { ReleasePlan } from './release-plan.js'; -import * as repoModule from './repo.js'; -import * as yarnCommands from './yarn-commands.js'; -import * as workflowOperations from './workflow-operations.js'; +import { + generateReleaseSpecificationTemplateForMonorepo, + waitForUserToEditReleaseSpecification, + validateReleaseSpecification, +} from './release-specification.js'; +import type { ReleaseSpecification } from './release-specification.js'; +import { commitAllChanges } from './repo.js'; +import * as workflowOperationsModule from './workflow-operations.js'; +import { + deduplicateDependencies, + fixConstraints, + updateYarnLockfile, +} from './yarn-commands.js'; +import { withSandbox, Sandbox, isErrorWithCode } from '../tests/helpers.js'; +import { buildMockProject, Require } from '../tests/unit/helpers.js'; jest.mock('./editor'); jest.mock('./release-plan'); @@ -21,6 +31,23 @@ jest.mock('./release-specification'); jest.mock('./repo'); jest.mock('./yarn-commands.js'); +const determineEditorMock = jest.mocked(determineEditor); +const generateReleaseSpecificationTemplateForMonorepoMock = jest.mocked( + generateReleaseSpecificationTemplateForMonorepo, +); +const waitForUserToEditReleaseSpecificationMock = jest.mocked( + waitForUserToEditReleaseSpecification, +); +const validateReleaseSpecificationMock = jest.mocked( + validateReleaseSpecification, +); +const planReleaseMock = jest.mocked(planRelease); +const executeReleasePlanMock = jest.mocked(executeReleasePlan); +const commitAllChangesMock = jest.mocked(commitAllChanges); +const fixConstraintsMock = jest.mocked(fixConstraints); +const updateYarnLockfileMock = jest.mocked(updateYarnLockfile); +const deduplicateDependenciesMock = jest.mocked(deduplicateDependencies); + /** * Tests the given path to determine whether it represents a file. * @@ -40,42 +67,6 @@ async function fileExists(entryPath: string): Promise { } } -/** - * Mocks the dependencies for `followMonorepoWorkflow`. - * - * @returns The corresponding mock functions for each of the dependencies. - */ -function getDependencySpies() { - return { - determineEditorSpy: jest.spyOn(editorModule, 'determineEditor'), - createReleaseBranchSpy: jest.spyOn( - workflowOperations, - 'createReleaseBranch', - ), - generateReleaseSpecificationTemplateForMonorepoSpy: jest.spyOn( - releaseSpecificationModule, - 'generateReleaseSpecificationTemplateForMonorepo', - ), - waitForUserToEditReleaseSpecificationSpy: jest.spyOn( - releaseSpecificationModule, - 'waitForUserToEditReleaseSpecification', - ), - validateReleaseSpecificationSpy: jest.spyOn( - releaseSpecificationModule, - 'validateReleaseSpecification', - ), - planReleaseSpy: jest.spyOn(releasePlanModule, 'planRelease'), - executeReleasePlanSpy: jest.spyOn(releasePlanModule, 'executeReleasePlan'), - commitAllChangesSpy: jest.spyOn(repoModule, 'commitAllChanges'), - fixConstraintsSpy: jest.spyOn(yarnCommands, 'fixConstraints'), - updateYarnLockfileSpy: jest.spyOn(yarnCommands, 'updateYarnLockfile'), - deduplicateDependenciesSpy: jest.spyOn( - yarnCommands, - 'deduplicateDependencies', - ), - }; -} - /** * Builds a release specification object for use in tests. All properties have * default values, so you can specify only the properties you care about. @@ -178,20 +169,16 @@ async function setupFollowMonorepoWorkflow({ errorUponPlanningRelease?: Error; errorUponExecutingReleasePlan?: Error; releaseVersion?: string; -}) { - const { - determineEditorSpy, - createReleaseBranchSpy, - generateReleaseSpecificationTemplateForMonorepoSpy, - waitForUserToEditReleaseSpecificationSpy, - validateReleaseSpecificationSpy, - planReleaseSpy, - executeReleasePlanSpy, - commitAllChangesSpy, - fixConstraintsSpy, - updateYarnLockfileSpy, - deduplicateDependenciesSpy, - } = getDependencySpies(); +}): Promise<{ + project: Project; + projectDirectoryPath: string; + stdout: MockWritable; + stderr: MockWritable; + releaseSpecification: ReleaseSpecification; + releasePlan: ReleasePlan; + releaseVersion: string; + releaseSpecificationPath: string; +}> { const editor = buildMockEditor(); const releaseSpecificationPath = path.join( sandbox.directoryPath, @@ -205,33 +192,33 @@ async function setupFollowMonorepoWorkflow({ const project = buildMockProject({ directoryPath: projectDirectoryPath }); const stdout = new MockWritable(); const stderr = new MockWritable(); - determineEditorSpy.mockResolvedValue(isEditorAvailable ? editor : null); - when(generateReleaseSpecificationTemplateForMonorepoSpy) + determineEditorMock.mockResolvedValue(isEditorAvailable ? editor : null); + when(generateReleaseSpecificationTemplateForMonorepoMock) .calledWith({ project, isEditorAvailable }) .mockResolvedValue(''); if (errorUponEditingReleaseSpec) { - when(waitForUserToEditReleaseSpecificationSpy) + when(waitForUserToEditReleaseSpecificationMock) .calledWith(releaseSpecificationPath, editor) .mockRejectedValue(errorUponEditingReleaseSpec); } else { - when(waitForUserToEditReleaseSpecificationSpy) + when(waitForUserToEditReleaseSpecificationMock) .calledWith(releaseSpecificationPath, editor) .mockResolvedValue(); } if (errorUponValidatingReleaseSpec) { - when(validateReleaseSpecificationSpy) + when(validateReleaseSpecificationMock) .calledWith(project, releaseSpecificationPath) .mockRejectedValue(errorUponValidatingReleaseSpec); } else { - when(validateReleaseSpecificationSpy) + when(validateReleaseSpecificationMock) .calledWith(project, releaseSpecificationPath) .mockResolvedValue(releaseSpecification); } if (errorUponPlanningRelease) { - when(planReleaseSpy) + when(planReleaseMock) .calledWith({ project, releaseSpecificationPackages: releaseSpecification.packages, @@ -239,7 +226,7 @@ async function setupFollowMonorepoWorkflow({ }) .mockRejectedValue(errorUponPlanningRelease); } else { - when(planReleaseSpy) + when(planReleaseMock) .calledWith({ project, releaseSpecificationPackages: releaseSpecification.packages, @@ -249,16 +236,16 @@ async function setupFollowMonorepoWorkflow({ } if (errorUponExecutingReleasePlan) { - when(executeReleasePlanSpy) + when(executeReleasePlanMock) .calledWith(project, releasePlan, stderr) .mockRejectedValue(errorUponExecutingReleasePlan); } else { - when(executeReleasePlanSpy) + when(executeReleasePlanMock) .calledWith(project, releasePlan, stderr) .mockResolvedValue(undefined); } - when(commitAllChangesSpy) + when(commitAllChangesMock) .calledWith(projectDirectoryPath, '') .mockResolvedValue(); @@ -274,19 +261,10 @@ async function setupFollowMonorepoWorkflow({ projectDirectoryPath, stdout, stderr, - generateReleaseSpecificationTemplateForMonorepoSpy, - waitForUserToEditReleaseSpecificationSpy, releaseSpecification, - planReleaseSpy, - executeReleasePlanSpy, - commitAllChangesSpy, - createReleaseBranchSpy, releasePlan, releaseVersion, releaseSpecificationPath, - fixConstraintsSpy, - updateYarnLockfileSpy, - deduplicateDependenciesSpy, }; } @@ -295,12 +273,17 @@ describe('monorepo-workflow-operations', () => { describe('when firstRemovingExistingReleaseSpecification is false, the release spec file does not already exist, and an editor is available', () => { it('should call createReleaseBranch with the correct arguments if given releaseType: "ordinary"', async () => { await withSandbox(async (sandbox) => { - const { project, stdout, stderr, createReleaseBranchSpy } = - await setupFollowMonorepoWorkflow({ + const createReleaseBranchMock = jest.spyOn( + workflowOperationsModule, + 'createReleaseBranch', + ); + const { project, stdout, stderr } = await setupFollowMonorepoWorkflow( + { sandbox, doesReleaseSpecFileExist: false, isEditorAvailable: true, - }); + }, + ); await followMonorepoWorkflow({ project, @@ -312,7 +295,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(createReleaseBranchSpy).toHaveBeenCalledWith({ + expect(createReleaseBranchMock).toHaveBeenCalledWith({ project, releaseType: 'ordinary', }); @@ -321,12 +304,17 @@ describe('monorepo-workflow-operations', () => { it('should call createReleaseBranch with the correct arguments if given releaseType: "backport"', async () => { await withSandbox(async (sandbox) => { - const { project, stdout, stderr, createReleaseBranchSpy } = - await setupFollowMonorepoWorkflow({ + const createReleaseBranchMock = jest.spyOn( + workflowOperationsModule, + 'createReleaseBranch', + ); + const { project, stdout, stderr } = await setupFollowMonorepoWorkflow( + { sandbox, doesReleaseSpecFileExist: false, isEditorAvailable: true, - }); + }, + ); await followMonorepoWorkflow({ project, @@ -338,7 +326,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(createReleaseBranchSpy).toHaveBeenCalledWith({ + expect(createReleaseBranchMock).toHaveBeenCalledWith({ project, releaseType: 'backport', }); @@ -347,17 +335,12 @@ describe('monorepo-workflow-operations', () => { it('plans an ordinary release if given releaseType: "ordinary"', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - releaseSpecification, - planReleaseSpy, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: false, - isEditorAvailable: true, - }); + const { project, stdout, stderr, releaseSpecification } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: false, + isEditorAvailable: true, + }); await followMonorepoWorkflow({ project, @@ -369,7 +352,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(planReleaseSpy).toHaveBeenCalledWith({ + expect(planReleaseMock).toHaveBeenCalledWith({ project, releaseSpecificationPackages: releaseSpecification.packages, newReleaseVersion: '2.0.0', @@ -379,17 +362,12 @@ describe('monorepo-workflow-operations', () => { it('plans a backport release if given releaseType: "backport"', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - releaseSpecification, - planReleaseSpy, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: false, - isEditorAvailable: true, - }); + const { project, stdout, stderr, releaseSpecification } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: false, + isEditorAvailable: true, + }); await followMonorepoWorkflow({ project, @@ -401,7 +379,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(planReleaseSpy).toHaveBeenCalledWith({ + expect(planReleaseMock).toHaveBeenCalledWith({ project, releaseSpecificationPackages: releaseSpecification.packages, newReleaseVersion: '1.1.0', @@ -412,24 +390,19 @@ describe('monorepo-workflow-operations', () => { it('follows the workflow correctly when executed twice', async () => { await withSandbox(async (sandbox) => { const releaseVersion = '1.1.0'; - const { - project, - stdout, - stderr, - createReleaseBranchSpy, - commitAllChangesSpy, - projectDirectoryPath, - fixConstraintsSpy, - updateYarnLockfileSpy, - deduplicateDependenciesSpy, - } = await setupFollowMonorepoWorkflow({ - sandbox, - releaseVersion, - doesReleaseSpecFileExist: false, - isEditorAvailable: true, - }); + const createReleaseBranchMock = jest.spyOn( + workflowOperationsModule, + 'createReleaseBranch', + ); + const { project, stdout, stderr, projectDirectoryPath } = + await setupFollowMonorepoWorkflow({ + sandbox, + releaseVersion, + doesReleaseSpecFileExist: false, + isEditorAvailable: true, + }); - createReleaseBranchSpy.mockResolvedValueOnce({ + createReleaseBranchMock.mockResolvedValueOnce({ version: releaseVersion, firstRun: true, }); @@ -444,40 +417,40 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(createReleaseBranchSpy).toHaveBeenCalledTimes(1); - expect(createReleaseBranchSpy).toHaveBeenLastCalledWith({ + expect(createReleaseBranchMock).toHaveBeenCalledTimes(1); + expect(createReleaseBranchMock).toHaveBeenLastCalledWith({ project, releaseType: 'ordinary', }); - expect(commitAllChangesSpy).toHaveBeenCalledTimes(2); - expect(commitAllChangesSpy).toHaveBeenNthCalledWith( + expect(commitAllChangesMock).toHaveBeenCalledTimes(2); + expect(commitAllChangesMock).toHaveBeenNthCalledWith( 1, projectDirectoryPath, `Initialize Release ${releaseVersion}`, ); - expect(commitAllChangesSpy).toHaveBeenNthCalledWith( + expect(commitAllChangesMock).toHaveBeenNthCalledWith( 2, projectDirectoryPath, `Update Release ${releaseVersion}`, ); - expect(fixConstraintsSpy).toHaveBeenCalledTimes(1); - expect(fixConstraintsSpy).toHaveBeenCalledWith(projectDirectoryPath); + expect(fixConstraintsMock).toHaveBeenCalledTimes(1); + expect(fixConstraintsMock).toHaveBeenCalledWith(projectDirectoryPath); - expect(updateYarnLockfileSpy).toHaveBeenCalledTimes(1); - expect(updateYarnLockfileSpy).toHaveBeenCalledWith( + expect(updateYarnLockfileMock).toHaveBeenCalledTimes(1); + expect(updateYarnLockfileMock).toHaveBeenCalledWith( projectDirectoryPath, ); - expect(deduplicateDependenciesSpy).toHaveBeenCalledTimes(1); - expect(deduplicateDependenciesSpy).toHaveBeenCalledWith( + expect(deduplicateDependenciesMock).toHaveBeenCalledTimes(1); + expect(deduplicateDependenciesMock).toHaveBeenCalledWith( projectDirectoryPath, ); // Second call of followMonorepoWorkflow - createReleaseBranchSpy.mockResolvedValueOnce({ + createReleaseBranchMock.mockResolvedValueOnce({ version: releaseVersion, firstRun: false, // It's no longer the first run }); @@ -492,14 +465,14 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(createReleaseBranchSpy).toHaveBeenCalledTimes(2); - expect(createReleaseBranchSpy).toHaveBeenLastCalledWith({ + expect(createReleaseBranchMock).toHaveBeenCalledTimes(2); + expect(createReleaseBranchMock).toHaveBeenLastCalledWith({ project, releaseType: 'ordinary', }); - expect(commitAllChangesSpy).toHaveBeenCalledTimes(3); - expect(commitAllChangesSpy).toHaveBeenNthCalledWith( + expect(commitAllChangesMock).toHaveBeenCalledTimes(3); + expect(commitAllChangesMock).toHaveBeenNthCalledWith( 3, projectDirectoryPath, `Update Release ${releaseVersion}`, @@ -509,18 +482,13 @@ describe('monorepo-workflow-operations', () => { it('attempts to execute the release spec if it was successfully edited', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - executeReleasePlanSpy, - releasePlan, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: false, - isEditorAvailable: true, - releaseVersion: '2.0.0', - }); + const { project, stdout, stderr, releasePlan } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: false, + isEditorAvailable: true, + releaseVersion: '2.0.0', + }); await followMonorepoWorkflow({ project, @@ -532,7 +500,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(executeReleasePlanSpy).toHaveBeenCalledWith( + expect(executeReleasePlanMock).toHaveBeenCalledWith( project, releasePlan, stderr, @@ -542,18 +510,13 @@ describe('monorepo-workflow-operations', () => { it('should make exactly two commits named after the generated release version if editing, validating, and executing the release spec succeeds', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - commitAllChangesSpy, - projectDirectoryPath, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: false, - isEditorAvailable: true, - releaseVersion: '4.38.0', - }); + const { project, stdout, stderr, projectDirectoryPath } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: false, + isEditorAvailable: true, + releaseVersion: '4.38.0', + }); await followMonorepoWorkflow({ project, @@ -565,12 +528,12 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(commitAllChangesSpy).toHaveBeenCalledWith( + expect(commitAllChangesMock).toHaveBeenCalledWith( projectDirectoryPath, 'Initialize Release 2.0.0', ); - expect(commitAllChangesSpy).toHaveBeenCalledWith( + expect(commitAllChangesMock).toHaveBeenCalledWith( projectDirectoryPath, 'Update Release 2.0.0', ); @@ -602,13 +565,14 @@ describe('monorepo-workflow-operations', () => { it('does not attempt to execute the release spec if it was not successfully edited', async () => { await withSandbox(async (sandbox) => { - const { project, stdout, stderr, executeReleasePlanSpy } = - await setupFollowMonorepoWorkflow({ + const { project, stdout, stderr } = await setupFollowMonorepoWorkflow( + { sandbox, doesReleaseSpecFileExist: false, isEditorAvailable: true, errorUponEditingReleaseSpec: new Error('oops'), - }); + }, + ); await expect( followMonorepoWorkflow({ @@ -622,24 +586,19 @@ describe('monorepo-workflow-operations', () => { }), ).rejects.toThrow(expect.anything()); - expect(executeReleasePlanSpy).not.toHaveBeenCalled(); + expect(executeReleasePlanMock).not.toHaveBeenCalled(); }); }); it('does not attempt to make the final release update commit when release spec was not successfully edited', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - commitAllChangesSpy, - projectDirectoryPath, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: false, - isEditorAvailable: true, - errorUponEditingReleaseSpec: new Error('oops'), - }); + const { project, stdout, stderr, projectDirectoryPath } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: false, + isEditorAvailable: true, + errorUponEditingReleaseSpec: new Error('oops'), + }); await expect( followMonorepoWorkflow({ @@ -653,11 +612,11 @@ describe('monorepo-workflow-operations', () => { }), ).rejects.toThrow(expect.anything()); - expect(commitAllChangesSpy).toHaveBeenCalledWith( + expect(commitAllChangesMock).toHaveBeenCalledWith( projectDirectoryPath, 'Initialize Release 2.0.0', ); - expect(commitAllChangesSpy).not.toHaveBeenCalledWith( + expect(commitAllChangesMock).not.toHaveBeenCalledWith( projectDirectoryPath, 'Update Release 2.0.0', ); @@ -802,12 +761,13 @@ describe('monorepo-workflow-operations', () => { describe('when firstRemovingExistingReleaseSpecification is false, the release spec file does not already exist, and an editor is not available', () => { it('does not attempt to execute the edited release spec', async () => { await withSandbox(async (sandbox) => { - const { project, stdout, stderr, executeReleasePlanSpy } = - await setupFollowMonorepoWorkflow({ + const { project, stdout, stderr } = await setupFollowMonorepoWorkflow( + { sandbox, doesReleaseSpecFileExist: false, isEditorAvailable: false, - }); + }, + ); await followMonorepoWorkflow({ project, @@ -819,23 +779,18 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(executeReleasePlanSpy).not.toHaveBeenCalled(); + expect(executeReleasePlanMock).not.toHaveBeenCalled(); }); }); it('does not attempt to make the release update commit', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - commitAllChangesSpy, - projectDirectoryPath, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: false, - isEditorAvailable: false, - }); + const { project, stdout, stderr, projectDirectoryPath } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: false, + isEditorAvailable: false, + }); await followMonorepoWorkflow({ project, @@ -847,7 +802,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(commitAllChangesSpy).not.toHaveBeenCalledWith( + expect(commitAllChangesMock).not.toHaveBeenCalledWith( projectDirectoryPath, 'Update Release 2.0.0', ); @@ -907,15 +862,12 @@ describe('monorepo-workflow-operations', () => { describe('when firstRemovingExistingReleaseSpecification is false and the release spec file already exists', () => { it('does not open the editor', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - waitForUserToEditReleaseSpecificationSpy, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: true, - }); + const { project, stdout, stderr } = await setupFollowMonorepoWorkflow( + { + sandbox, + doesReleaseSpecFileExist: true, + }, + ); await followMonorepoWorkflow({ project, @@ -928,23 +880,18 @@ describe('monorepo-workflow-operations', () => { }); expect( - waitForUserToEditReleaseSpecificationSpy, + waitForUserToEditReleaseSpecificationMock, ).not.toHaveBeenCalled(); }); }); it('plans an ordinary release if given releaseType: "ordinary"', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - releaseSpecification, - planReleaseSpy, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: true, - }); + const { project, stdout, stderr, releaseSpecification } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: true, + }); await followMonorepoWorkflow({ project, @@ -956,7 +903,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(planReleaseSpy).toHaveBeenCalledWith({ + expect(planReleaseMock).toHaveBeenCalledWith({ project, releaseSpecificationPackages: releaseSpecification.packages, newReleaseVersion: '2.0.0', @@ -966,16 +913,11 @@ describe('monorepo-workflow-operations', () => { it('plans a backport release if given releaseType: "backport"', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - releaseSpecification, - planReleaseSpy, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: true, - }); + const { project, stdout, stderr, releaseSpecification } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: true, + }); await followMonorepoWorkflow({ project, @@ -987,7 +929,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(planReleaseSpy).toHaveBeenCalledWith({ + expect(planReleaseMock).toHaveBeenCalledWith({ project, releaseSpecificationPackages: releaseSpecification.packages, newReleaseVersion: '1.1.0', @@ -997,17 +939,12 @@ describe('monorepo-workflow-operations', () => { it('attempts to execute the edited release spec', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - executeReleasePlanSpy, - releasePlan, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: true, - releaseVersion: '2.0.0', - }); + const { project, stdout, stderr, releasePlan } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: true, + releaseVersion: '2.0.0', + }); await followMonorepoWorkflow({ project, @@ -1019,7 +956,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(executeReleasePlanSpy).toHaveBeenCalledWith( + expect(executeReleasePlanMock).toHaveBeenCalledWith( project, releasePlan, stderr, @@ -1029,17 +966,12 @@ describe('monorepo-workflow-operations', () => { it('should make exactly two commits named after the generated release version if validating and executing the release spec succeeds', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - commitAllChangesSpy, - projectDirectoryPath, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: true, - releaseVersion: '4.38.0', - }); + const { project, stdout, stderr, projectDirectoryPath } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: true, + releaseVersion: '4.38.0', + }); await followMonorepoWorkflow({ project, @@ -1051,12 +983,12 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(commitAllChangesSpy).toHaveBeenCalledWith( + expect(commitAllChangesMock).toHaveBeenCalledWith( projectDirectoryPath, 'Initialize Release 2.0.0', ); - expect(commitAllChangesSpy).toHaveBeenCalledWith( + expect(commitAllChangesMock).toHaveBeenCalledWith( projectDirectoryPath, 'Update Release 2.0.0', ); @@ -1169,17 +1101,12 @@ describe('monorepo-workflow-operations', () => { describe('when firstRemovingExistingReleaseSpecification is true, the release spec file does not already exist, and an editor is available', () => { it('plans an ordinary release if given releaseType: "ordinary"', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - releaseSpecification, - planReleaseSpy, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: false, - isEditorAvailable: true, - }); + const { project, stdout, stderr, releaseSpecification } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: false, + isEditorAvailable: true, + }); await followMonorepoWorkflow({ project, @@ -1191,7 +1118,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(planReleaseSpy).toHaveBeenCalledWith({ + expect(planReleaseMock).toHaveBeenCalledWith({ project, releaseSpecificationPackages: releaseSpecification.packages, newReleaseVersion: '2.0.0', @@ -1201,17 +1128,12 @@ describe('monorepo-workflow-operations', () => { it('plans a backport release if given releaseType: "backport"', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - releaseSpecification, - planReleaseSpy, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: false, - isEditorAvailable: true, - }); + const { project, stdout, stderr, releaseSpecification } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: false, + isEditorAvailable: true, + }); await followMonorepoWorkflow({ project, @@ -1223,7 +1145,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(planReleaseSpy).toHaveBeenCalledWith({ + expect(planReleaseMock).toHaveBeenCalledWith({ project, releaseSpecificationPackages: releaseSpecification.packages, newReleaseVersion: '1.1.0', @@ -1233,18 +1155,13 @@ describe('monorepo-workflow-operations', () => { it('attempts to execute the release spec if it was successfully edited', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - executeReleasePlanSpy, - releasePlan, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: false, - isEditorAvailable: true, - releaseVersion: '2.0.0', - }); + const { project, stdout, stderr, releasePlan } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: false, + isEditorAvailable: true, + releaseVersion: '2.0.0', + }); await followMonorepoWorkflow({ project, @@ -1256,7 +1173,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(executeReleasePlanSpy).toHaveBeenCalledWith( + expect(executeReleasePlanMock).toHaveBeenCalledWith( project, releasePlan, stderr, @@ -1266,18 +1183,13 @@ describe('monorepo-workflow-operations', () => { it('should make exactly two commits named after the generated release version if editing, validating, and executing the release spec succeeds', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - commitAllChangesSpy, - projectDirectoryPath, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: false, - isEditorAvailable: true, - releaseVersion: '4.38.0', - }); + const { project, stdout, stderr, projectDirectoryPath } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: false, + isEditorAvailable: true, + releaseVersion: '4.38.0', + }); await followMonorepoWorkflow({ project, @@ -1289,12 +1201,12 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(commitAllChangesSpy).toHaveBeenCalledWith( + expect(commitAllChangesMock).toHaveBeenCalledWith( projectDirectoryPath, 'Initialize Release 2.0.0', ); - expect(commitAllChangesSpy).toHaveBeenCalledWith( + expect(commitAllChangesMock).toHaveBeenCalledWith( projectDirectoryPath, 'Update Release 2.0.0', ); @@ -1326,13 +1238,14 @@ describe('monorepo-workflow-operations', () => { it('does not attempt to execute the release spec if it was not successfully edited', async () => { await withSandbox(async (sandbox) => { - const { project, stdout, stderr, executeReleasePlanSpy } = - await setupFollowMonorepoWorkflow({ + const { project, stdout, stderr } = await setupFollowMonorepoWorkflow( + { sandbox, doesReleaseSpecFileExist: false, isEditorAvailable: true, errorUponEditingReleaseSpec: new Error('oops'), - }); + }, + ); await expect( followMonorepoWorkflow({ @@ -1346,24 +1259,19 @@ describe('monorepo-workflow-operations', () => { }), ).rejects.toThrow(expect.anything()); - expect(executeReleasePlanSpy).not.toHaveBeenCalled(); + expect(executeReleasePlanMock).not.toHaveBeenCalled(); }); }); it('does not attempt to make the release update commit if the release spec was not successfully edited', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - commitAllChangesSpy, - projectDirectoryPath, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: false, - isEditorAvailable: true, - errorUponEditingReleaseSpec: new Error('oops'), - }); + const { project, stdout, stderr, projectDirectoryPath } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: false, + isEditorAvailable: true, + errorUponEditingReleaseSpec: new Error('oops'), + }); await expect( followMonorepoWorkflow({ @@ -1377,7 +1285,7 @@ describe('monorepo-workflow-operations', () => { }), ).rejects.toThrow(expect.anything()); - expect(commitAllChangesSpy).not.toHaveBeenCalledWith( + expect(commitAllChangesMock).not.toHaveBeenCalledWith( projectDirectoryPath, 'Update Release 2.0.0', ); @@ -1522,12 +1430,13 @@ describe('monorepo-workflow-operations', () => { describe('when firstRemovingExistingReleaseSpecification is true, the release spec file does not already exist, and an editor is not available', () => { it('does not attempt to execute the edited release spec', async () => { await withSandbox(async (sandbox) => { - const { project, stdout, stderr, executeReleasePlanSpy } = - await setupFollowMonorepoWorkflow({ + const { project, stdout, stderr } = await setupFollowMonorepoWorkflow( + { sandbox, doesReleaseSpecFileExist: false, isEditorAvailable: false, - }); + }, + ); await followMonorepoWorkflow({ project, @@ -1539,23 +1448,18 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(executeReleasePlanSpy).not.toHaveBeenCalled(); + expect(executeReleasePlanMock).not.toHaveBeenCalled(); }); }); it('does not attempt to make the release update commit', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - commitAllChangesSpy, - projectDirectoryPath, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: false, - isEditorAvailable: false, - }); + const { project, stdout, stderr, projectDirectoryPath } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: false, + isEditorAvailable: false, + }); await followMonorepoWorkflow({ project, @@ -1567,7 +1471,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(commitAllChangesSpy).not.toHaveBeenCalledWith( + expect(commitAllChangesMock).not.toHaveBeenCalledWith( projectDirectoryPath, 'Update Release 2.0.0', ); @@ -1627,16 +1531,13 @@ describe('monorepo-workflow-operations', () => { describe('when firstRemovingExistingReleaseSpecification is true, the release spec file already exists, and an editor is available', () => { it('generates a new release spec instead of using the existing one', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - generateReleaseSpecificationTemplateForMonorepoSpy, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: true, - isEditorAvailable: true, - }); + const { project, stdout, stderr } = await setupFollowMonorepoWorkflow( + { + sandbox, + doesReleaseSpecFileExist: true, + isEditorAvailable: true, + }, + ); await followMonorepoWorkflow({ project, @@ -1649,7 +1550,7 @@ describe('monorepo-workflow-operations', () => { }); expect( - generateReleaseSpecificationTemplateForMonorepoSpy, + generateReleaseSpecificationTemplateForMonorepoMock, ).toHaveBeenCalledWith({ project, isEditorAvailable: true, @@ -1659,17 +1560,12 @@ describe('monorepo-workflow-operations', () => { it('plans an ordinary release if given releaseType: "ordinary"', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - releaseSpecification, - planReleaseSpy, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: true, - isEditorAvailable: true, - }); + const { project, stdout, stderr, releaseSpecification } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: true, + isEditorAvailable: true, + }); await followMonorepoWorkflow({ project, @@ -1681,7 +1577,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(planReleaseSpy).toHaveBeenCalledWith({ + expect(planReleaseMock).toHaveBeenCalledWith({ project, releaseSpecificationPackages: releaseSpecification.packages, newReleaseVersion: '2.0.0', @@ -1691,17 +1587,12 @@ describe('monorepo-workflow-operations', () => { it('plans a backport release if given releaseType: "backport"', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - releaseSpecification, - planReleaseSpy, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: true, - isEditorAvailable: true, - }); + const { project, stdout, stderr, releaseSpecification } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: true, + isEditorAvailable: true, + }); await followMonorepoWorkflow({ project, @@ -1713,7 +1604,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(planReleaseSpy).toHaveBeenCalledWith({ + expect(planReleaseMock).toHaveBeenCalledWith({ project, releaseSpecificationPackages: releaseSpecification.packages, newReleaseVersion: '1.1.0', @@ -1723,18 +1614,13 @@ describe('monorepo-workflow-operations', () => { it('attempts to execute the release spec if it was successfully edited', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - executeReleasePlanSpy, - releasePlan, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: true, - isEditorAvailable: true, - releaseVersion: '2.0.0', - }); + const { project, stdout, stderr, releasePlan } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: true, + isEditorAvailable: true, + releaseVersion: '2.0.0', + }); await followMonorepoWorkflow({ project, @@ -1746,7 +1632,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(executeReleasePlanSpy).toHaveBeenCalledWith( + expect(executeReleasePlanMock).toHaveBeenCalledWith( project, releasePlan, stderr, @@ -1756,18 +1642,13 @@ describe('monorepo-workflow-operations', () => { it('should make exactly two commits named after the generated release version if editing, validating, and executing the release spec succeeds', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - commitAllChangesSpy, - projectDirectoryPath, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: true, - isEditorAvailable: true, - releaseVersion: '4.38.0', - }); + const { project, stdout, stderr, projectDirectoryPath } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: true, + isEditorAvailable: true, + releaseVersion: '4.38.0', + }); await followMonorepoWorkflow({ project, @@ -1779,12 +1660,12 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(commitAllChangesSpy).toHaveBeenCalledWith( + expect(commitAllChangesMock).toHaveBeenCalledWith( projectDirectoryPath, 'Initialize Release 2.0.0', ); - expect(commitAllChangesSpy).toHaveBeenCalledWith( + expect(commitAllChangesMock).toHaveBeenCalledWith( projectDirectoryPath, 'Update Release 2.0.0', ); @@ -1816,13 +1697,14 @@ describe('monorepo-workflow-operations', () => { it('does not attempt to execute the release spec if it was not successfully edited', async () => { await withSandbox(async (sandbox) => { - const { project, stdout, stderr, executeReleasePlanSpy } = - await setupFollowMonorepoWorkflow({ + const { project, stdout, stderr } = await setupFollowMonorepoWorkflow( + { sandbox, doesReleaseSpecFileExist: true, isEditorAvailable: true, errorUponEditingReleaseSpec: new Error('oops'), - }); + }, + ); await expect( followMonorepoWorkflow({ @@ -1836,24 +1718,19 @@ describe('monorepo-workflow-operations', () => { }), ).rejects.toThrow(expect.anything()); - expect(executeReleasePlanSpy).not.toHaveBeenCalled(); + expect(executeReleasePlanMock).not.toHaveBeenCalled(); }); }); it('does not attempt to make the release update commit if the release spec was not successfully edited', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - commitAllChangesSpy, - projectDirectoryPath, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: true, - isEditorAvailable: true, - errorUponEditingReleaseSpec: new Error('oops'), - }); + const { project, stdout, stderr, projectDirectoryPath } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: true, + isEditorAvailable: true, + errorUponEditingReleaseSpec: new Error('oops'), + }); await expect( followMonorepoWorkflow({ @@ -1867,7 +1744,7 @@ describe('monorepo-workflow-operations', () => { }), ).rejects.toThrow(expect.anything()); - expect(commitAllChangesSpy).not.toHaveBeenCalledWith( + expect(commitAllChangesMock).not.toHaveBeenCalledWith( projectDirectoryPath, 'Update Release 2.0.0', ); @@ -2012,16 +1889,13 @@ describe('monorepo-workflow-operations', () => { describe('when firstRemovingExistingReleaseSpecification is true, the release spec file already exists, and an editor is not available', () => { it('generates a new release spec instead of using the existing one', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - generateReleaseSpecificationTemplateForMonorepoSpy, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: true, - isEditorAvailable: false, - }); + const { project, stdout, stderr } = await setupFollowMonorepoWorkflow( + { + sandbox, + doesReleaseSpecFileExist: true, + isEditorAvailable: false, + }, + ); await followMonorepoWorkflow({ project, @@ -2034,7 +1908,7 @@ describe('monorepo-workflow-operations', () => { }); expect( - generateReleaseSpecificationTemplateForMonorepoSpy, + generateReleaseSpecificationTemplateForMonorepoMock, ).toHaveBeenCalledWith({ project, isEditorAvailable: false, @@ -2044,12 +1918,13 @@ describe('monorepo-workflow-operations', () => { it('does not attempt to execute the edited release spec', async () => { await withSandbox(async (sandbox) => { - const { project, stdout, stderr, executeReleasePlanSpy } = - await setupFollowMonorepoWorkflow({ + const { project, stdout, stderr } = await setupFollowMonorepoWorkflow( + { sandbox, doesReleaseSpecFileExist: true, isEditorAvailable: false, - }); + }, + ); await followMonorepoWorkflow({ project, @@ -2061,23 +1936,18 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(executeReleasePlanSpy).not.toHaveBeenCalled(); + expect(executeReleasePlanMock).not.toHaveBeenCalled(); }); }); it('does not attempt to make the release update commit', async () => { await withSandbox(async (sandbox) => { - const { - project, - stdout, - stderr, - commitAllChangesSpy, - projectDirectoryPath, - } = await setupFollowMonorepoWorkflow({ - sandbox, - doesReleaseSpecFileExist: true, - isEditorAvailable: false, - }); + const { project, stdout, stderr, projectDirectoryPath } = + await setupFollowMonorepoWorkflow({ + sandbox, + doesReleaseSpecFileExist: true, + isEditorAvailable: false, + }); await followMonorepoWorkflow({ project, @@ -2089,7 +1959,7 @@ describe('monorepo-workflow-operations', () => { stderr, }); - expect(commitAllChangesSpy).not.toHaveBeenCalledWith( + expect(commitAllChangesMock).not.toHaveBeenCalledWith( projectDirectoryPath, 'Update Release 2.0.0', ); diff --git a/src/monorepo-workflow-operations.ts b/src/monorepo-workflow-operations.ts index 231fc37f..f9bc28a1 100644 --- a/src/monorepo-workflow-operations.ts +++ b/src/monorepo-workflow-operations.ts @@ -1,12 +1,13 @@ import type { WriteStream } from 'fs'; import path from 'path'; + +import { determineEditor } from './editor.js'; import { ensureDirectoryPathExists, fileExists, removeFile, writeFile, } from './fs.js'; -import { determineEditor } from './editor.js'; import { ReleaseType } from './initial-parameters.js'; import { Project, @@ -14,12 +15,12 @@ import { restoreChangelogsForSkippedPackages, } from './project.js'; import { planRelease, executeReleasePlan } from './release-plan.js'; -import { commitAllChanges } from './repo.js'; import { generateReleaseSpecificationTemplateForMonorepo, waitForUserToEditReleaseSpecification, validateReleaseSpecification, } from './release-specification.js'; +import { commitAllChanges } from './repo.js'; import { createReleaseBranch } from './workflow-operations.js'; import { deduplicateDependencies, @@ -76,7 +77,7 @@ export async function followMonorepoWorkflow({ defaultBranch: string; stdout: Pick; stderr: Pick; -}) { +}): Promise { const { version: newReleaseVersion, firstRun } = await createReleaseBranch({ project, releaseType, diff --git a/src/package-manifest.test.ts b/src/package-manifest.test.ts index 08c02cca..3c0afd8c 100644 --- a/src/package-manifest.test.ts +++ b/src/package-manifest.test.ts @@ -1,8 +1,9 @@ import fs from 'fs'; import path from 'path'; import { SemVer } from 'semver'; -import { withSandbox } from '../tests/helpers.js'; + import { readPackageManifest } from './package-manifest.js'; +import { withSandbox } from '../tests/helpers.js'; describe('package-manifest', () => { describe('readPackageManifest', () => { diff --git a/src/package-manifest.ts b/src/package-manifest.ts index eea83e56..89bea2b8 100644 --- a/src/package-manifest.ts +++ b/src/package-manifest.ts @@ -1,10 +1,11 @@ -import path from 'path'; import { ManifestFieldNames as PackageManifestFieldNames, ManifestDependencyFieldNames as PackageManifestDependenciesFieldNames, } from '@metamask/action-utils'; import { isPlainObject } from '@metamask/utils'; +import path from 'path'; import validateNPMPackageName from 'validate-npm-package-name'; + import { readJsonObjectFile } from './fs.js'; import { isTruthyString } from './misc-utils.js'; import { semver, SemVer } from './semver.js'; @@ -19,12 +20,14 @@ export type UnvalidatedPackageManifest = Readonly>; /** * A type-checked representation of the data in a package's `package.json`. * - * @property name - The name of the package. - * @property version - The version of the package. - * @property private - Whether the package is private. - * @property workspaces - Paths to subpackages within the package. - * @property bundledDependencies - The set of packages that are expected to be - * bundled when publishing the package. + * Properties: + * + * - `name` - The name of the package. + * - `version` - The version of the package. + * - `private` - Whether the package is private. + * - `workspaces` - Paths to subpackages within the package. + * - `bundledDependencies` - The set of packages that are expected to be bundled + * when publishing the package. */ export type ValidatedPackageManifest = { readonly [PackageManifestFieldNames.Name]: string; @@ -60,7 +63,7 @@ function buildPackageManifestFieldValidationErrorMessage({ parentDirectory: string; fieldName: keyof UnvalidatedPackageManifest; verbPhrase: string; -}) { +}): string { const subject = isTruthyString(manifest[PackageManifestFieldNames.Name]) ? `The value of "${fieldName}" in the manifest for "${ manifest[PackageManifestFieldNames.Name] @@ -184,7 +187,7 @@ function isValidPackageManifestDependencyValue( validateNPMPackageName(redirectedName)?.validForOldPackages && isValidPackageManifestVersionField(redirectedVersion) ); - } catch (e) /* istanbul ignore next */ { + } catch /* istanbul ignore next */ { return false; } } diff --git a/src/package.test.ts b/src/package.test.ts index 6e972da6..c097ec3f 100644 --- a/src/package.test.ts +++ b/src/package.test.ts @@ -1,16 +1,12 @@ +import * as autoChangelog from '@metamask/auto-changelog'; import fs from 'fs'; -import path from 'path'; import { when } from 'jest-when'; -import * as autoChangelog from '@metamask/auto-changelog'; +import path from 'path'; import { SemVer } from 'semver'; import { MockWritable } from 'stdio-mock'; -import { buildChangelog, withSandbox } from '../tests/helpers.js'; -import { - buildMockPackage, - buildMockProject, - buildMockManifest, - createNoopWriteStream, -} from '../tests/unit/helpers.js'; + +import * as fsModule from './fs.js'; +import * as packageManifestModule from './package-manifest.js'; import { formatChangelog, readMonorepoRootPackage, @@ -18,9 +14,14 @@ import { updatePackage, updatePackageChangelog, } from './package.js'; -import * as fsModule from './fs.js'; -import * as packageManifestModule from './package-manifest.js'; import * as repoModule from './repo.js'; +import { buildChangelog, withSandbox } from '../tests/helpers.js'; +import { + buildMockPackage, + buildMockProject, + buildMockManifest, + createNoopWriteStream, +} from '../tests/unit/helpers.js'; jest.mock('./package-manifest'); jest.mock('./repo'); diff --git a/src/package.ts b/src/package.ts index 15f5f529..aacfae00 100644 --- a/src/package.ts +++ b/src/package.ts @@ -1,9 +1,10 @@ +import { parseChangelog, updateChangelog } from '@metamask/auto-changelog'; import fs, { WriteStream } from 'fs'; import path from 'path'; -import { format } from 'util'; -import { parseChangelog, updateChangelog } from '@metamask/auto-changelog'; -import { format as formatPrettier } from 'prettier/standalone'; import * as markdown from 'prettier/plugins/markdown'; +import { format as formatPrettier } from 'prettier/standalone'; +import { format } from 'util'; + import { WriteStreamLike, readFile, writeFile, writeJsonFile } from './fs.js'; import { isErrorWithCode } from './misc-utils.js'; import { @@ -22,12 +23,13 @@ const CHANGELOG_FILE_NAME = 'CHANGELOG.md'; /** * Information about a package within a project. * - * @property directoryPath - The path to the directory where the package is - * located. - * @property manifestPath - The path to the manifest file. - * @property manifest - The data extracted from the manifest. - * @property changelogPath - The path to the changelog file (which may or may - * not exist). + * Properties: + * + * - `directoryPath` - The path to the directory where the package is located. + * - `manifestPath` - The path to the manifest file. + * - `manifest` - The data extracted from the manifest. + * - `changelogPath` - The path to the changelog file (which may or may not + * exist). */ export type Package = { directoryPath: string; @@ -45,7 +47,9 @@ export type Package = { * @param packageVersion - The version of the package. * @returns An array of possible release tag names. */ -function generateMonorepoRootPackageReleaseTagName(packageVersion: string) { +function generateMonorepoRootPackageReleaseTagName( + packageVersion: string, +): string { return `v${packageVersion}`; } @@ -61,7 +65,7 @@ function generateMonorepoRootPackageReleaseTagName(packageVersion: string) { function generateMonorepoWorkspacePackageReleaseTagName( packageName: string, packageVersion: string, -) { +): string { return `${packageName}@${packageVersion}`; } @@ -89,7 +93,7 @@ export async function readMonorepoRootPackage({ await readPackageManifest(manifestPath); const expectedTagNameForLatestRelease = generateMonorepoRootPackageReleaseTagName( - validatedManifest.version.toString(), + validatedManifest.version.version, ); const matchingTagNameForLatestRelease = projectTagNames.find( (tagName) => tagName === expectedTagNameForLatestRelease, @@ -164,10 +168,10 @@ export async function readMonorepoWorkspacePackage({ const expectedTagNameForWorkspacePackageLatestRelease = generateMonorepoWorkspacePackageReleaseTagName( validatedManifest.name, - validatedManifest.version.toString(), + validatedManifest.version.version, ); const expectedTagNameForRootPackageLatestRelease = - generateMonorepoRootPackageReleaseTagName(rootPackageVersion.toString()); + generateMonorepoRootPackageReleaseTagName(rootPackageVersion.version); const matchingTagNameForWorkspacePackageLatestRelease = projectTagNames.find( (tagName) => tagName === expectedTagNameForWorkspacePackageLatestRelease, ); @@ -289,7 +293,7 @@ export async function migrateUnreleasedChangelogChangesToRelease({ * @param changelog - The changelog to format. * @returns The formatted changelog. */ -export async function formatChangelog(changelog: string) { +export async function formatChangelog(changelog: string): Promise { return await formatPrettier(changelog, { parser: 'markdown', plugins: [markdown], diff --git a/src/project.test.ts b/src/project.test.ts index 5907bd5a..6f79551f 100644 --- a/src/project.test.ts +++ b/src/project.test.ts @@ -1,25 +1,26 @@ +import * as actionUtils from '@metamask/action-utils'; import { mkdir } from 'fs/promises'; -import path from 'path'; import { when } from 'jest-when'; +import path from 'path'; import { SemVer } from 'semver'; -import * as actionUtils from '@metamask/action-utils'; -import { withProtectedProcessEnv, withSandbox } from '../tests/helpers.js'; -import { - buildMockPackage, - buildMockProject, - createNoopWriteStream, -} from '../tests/unit/helpers.js'; + +import * as fs from './fs.js'; import * as miscUtils from './misc-utils.js'; +import * as packageModule from './package.js'; import { getValidRepositoryUrl, readProject, restoreChangelogsForSkippedPackages, updateChangelogsForChangedPackages, } from './project.js'; -import * as packageModule from './package.js'; -import * as repoModule from './repo.js'; -import * as fs from './fs.js'; import { IncrementableVersionParts } from './release-specification.js'; +import * as repoModule from './repo.js'; +import { withProtectedProcessEnv, withSandbox } from '../tests/helpers.js'; +import { + buildMockPackage, + buildMockProject, + createNoopWriteStream, +} from '../tests/unit/helpers.js'; jest.mock('./package'); jest.mock('./repo'); @@ -135,6 +136,10 @@ describe('project', () => { describe('if the `npm_package_repository_url` environment variable is set', () => { it('returns the HTTPS version of this URL', async () => { await withProtectedProcessEnv(async () => { + // This function consults an environment variable that NPM sets + // in order to know the repository URL. + // Changes to environment variables are protected in this test. + // eslint-disable-next-line n/no-process-env process.env.npm_package_repository_url = 'git@github.com:example-org/example-repo.git'; const packageManifest = {}; diff --git a/src/project.ts b/src/project.ts index fe639f14..c07eeec2 100644 --- a/src/project.ts +++ b/src/project.ts @@ -1,38 +1,41 @@ -import { WriteStream } from 'fs'; -import { resolve } from 'path'; import { getWorkspaceLocations } from '@metamask/action-utils'; import { isPlainObject } from '@metamask/utils'; +import { WriteStream } from 'fs'; +import { resolve } from 'path'; + import { WriteStreamLike, fileExists } from './fs.js'; +import { + convertToHttpsGitHubRepositoryUrl, + getStdoutFromCommand, +} from './misc-utils.js'; +import { + PackageManifestFieldNames, + UnvalidatedPackageManifest, +} from './package-manifest.js'; import { Package, readMonorepoRootPackage, readMonorepoWorkspacePackage, updatePackageChangelog, } from './package.js'; +import { ReleaseSpecification } from './release-specification.js'; import { getTagNames, restoreFiles } from './repo.js'; import { SemVer } from './semver.js'; -import { - PackageManifestFieldNames, - UnvalidatedPackageManifest, -} from './package-manifest.js'; -import { ReleaseSpecification } from './release-specification.js'; -import { - convertToHttpsGitHubRepositoryUrl, - getStdoutFromCommand, -} from './misc-utils.js'; /** * The release version of the root package of a monorepo extracted from its * version string. * - * @property ordinaryNumber - The number assigned to the release if it - * introduces new changes that haven't appeared in any previous release; it will - * be 0 if there haven't been any releases yet. - * @property backportNumber - A backport release is a change ported from one - * ordinary release to a previous ordinary release. This, then, is the number - * which identifies this release relative to other backport releases under the - * same ordinary release, starting from 1; it will be 0 if there aren't any - * backport releases for the ordinary release yet. + * Properties: + * + * - `ordinaryNumber` - The number assigned to the release if it introduces new + * changes that haven't appeared in any previous release; it will be 0 if + * there haven't been any releases yet. + * - `backportNumber` - A backport release is a change ported from one ordinary + * release to a previous ordinary release. This, then, is the number which + * identifies this release relative to other backport releases under the same + * ordinary release, starting from 1; it will be 0 if there aren't any + * backport releases for the ordinary release yet. */ type ReleaseVersion = { ordinaryNumber: number; @@ -42,13 +45,15 @@ type ReleaseVersion = { /** * Represents the entire codebase on which this tool is operating. * - * @property directoryPath - The directory in which the project lives. - * @property repositoryUrl - The public URL of the Git repository where the - * codebase for the project lives. - * @property rootPackage - Information about the root package (assuming that the - * project is a monorepo). - * @property workspacePackages - Information about packages that are referenced - * via workspaces (assuming that the project is a monorepo). + * Properties: + * + * - `directoryPath` - The directory in which the project lives. + * - `repositoryUrl` - The public URL of the Git repository where the codebase + * for the project lives. + * - `rootPackage` - Information about the root package (assuming that the + * project is a monorepo). + * - `workspacePackages` - Information about packages that are referenced via + * workspaces (assuming that the project is a monorepo). */ export type Project = { directoryPath: string; @@ -124,12 +129,9 @@ export async function readProject( }); }), ) - ).reduce( - (obj, pkg) => { - return { ...obj, [pkg.validatedManifest.name]: pkg }; - }, - {} as Record, - ); + ).reduce>((obj, pkg) => { + return { ...obj, [pkg.validatedManifest.name]: pkg }; + }, {}); const isMonorepo = Object.keys(workspacePackages).length > 0; @@ -174,6 +176,7 @@ export async function getValidRepositoryUrl( repositoryDirectoryPath: string, ): Promise { // Set automatically by NPM or Yarn 1.x + // eslint-disable-next-line n/no-process-env const npmPackageRepositoryUrl = process.env.npm_package_repository_url; if (npmPackageRepositoryUrl) { @@ -222,7 +225,7 @@ export async function updateChangelogsForChangedPackages({ .filter( ({ hasChangesSinceLatestRelease }) => hasChangesSinceLatestRelease, ) - .map((pkg) => + .map(async (pkg) => updatePackageChangelog({ project, package: pkg, diff --git a/src/release-plan.test.ts b/src/release-plan.test.ts index c0d7692e..18a3b4e8 100644 --- a/src/release-plan.test.ts +++ b/src/release-plan.test.ts @@ -1,9 +1,10 @@ import fs from 'fs'; import { SemVer } from 'semver'; -import { buildMockProject, buildMockPackage } from '../tests/unit/helpers.js'; + +import * as packageUtils from './package.js'; import { planRelease, executeReleasePlan } from './release-plan.js'; import { IncrementableVersionParts } from './release-specification.js'; -import * as packageUtils from './package.js'; +import { buildMockProject, buildMockPackage } from '../tests/unit/helpers.js'; jest.mock('./package'); diff --git a/src/release-plan.ts b/src/release-plan.ts index df35039d..444ca7f3 100644 --- a/src/release-plan.ts +++ b/src/release-plan.ts @@ -1,5 +1,6 @@ import { WriteStream } from 'fs'; import { SemVer } from 'semver'; + import { debug } from './misc-utils.js'; import { Package, updatePackage } from './package.js'; import { Project } from './project.js'; @@ -9,18 +10,20 @@ import { ReleaseSpecification } from './release-specification.js'; * Instructions for how to update the project in order to prepare it for a new * release. * - * @property newVersion - The new version that should be released, encompassing - * one or more updates to packages within the project. This is always a - * SemVer-compatible string, though the meaning of each number depends on the - * type of project. For a polyrepo package or a monorepo with fixed versions, - * the format of the version string is "MAJOR.MINOR.PATCH"; for a monorepo with - * independent versions, it is "ORDINARY.BACKPORT.0", where `BACKPORT` is used - * to name a release that sits between two ordinary releases, and `ORDINARY` is - * used to name any other (non-backport) release. - * @property packages - Describes how the packages in the project should be - * updated. For a polyrepo package, this list will only contain the package - * itself; for a monorepo package it will consist of the root package and any - * workspace packages that will be included in the release. + * Properties: + * + * - `newVersion` - The new version that should be released, encompassing one or + * more updates to packages within the project. This is always a + * SemVer-compatible string, though the meaning of each number depends on the + * type of project. For a polyrepo package or a monorepo with fixed versions, + * the format of the version string is "MAJOR.MINOR.PATCH"; for a monorepo + * with independent versions, it is "ORDINARY.BACKPORT.0", where `BACKPORT` is + * used to name a release that sits between two ordinary releases, and + * `ORDINARY` is used to name any other (non-backport) release. + * - `packages` - Describes how the packages in the project should be updated. + * For a polyrepo package, this list will only contain the package itself; for + * a monorepo package it will consist of the root package and any workspace + * packages that will be included in the release. */ export type ReleasePlan = { newVersion: string; @@ -31,9 +34,11 @@ export type ReleasePlan = { * Instructions for how to update a package within a project in order to prepare * it for a new release. * - * @property package - Information about the package. - * @property newVersion - The new version for the package, as a - * SemVer-compatible string. + * Properties: + * + * - `package` - Information about the package. + * - `newVersion` - The new version for the package, as a SemVer-compatible + * string. */ export type PackageReleasePlan = { package: Package; @@ -75,11 +80,11 @@ export async function planRelease({ const newVersion = versionSpecifier instanceof SemVer ? versionSpecifier - : new SemVer(currentVersion.toString()).inc(versionSpecifier); + : new SemVer(currentVersion.version).inc(versionSpecifier); return { package: pkg, - newVersion: newVersion.toString(), + newVersion: newVersion.version, }; }); @@ -102,7 +107,7 @@ export async function executeReleasePlan( project: Project, releasePlan: ReleasePlan, stderr: Pick, -) { +): Promise { await Promise.all( releasePlan.packages.map(async (workspaceReleasePlan) => { debug( diff --git a/src/release-specification.test.ts b/src/release-specification.test.ts index 9c4b2c6e..1cf9e907 100644 --- a/src/release-specification.test.ts +++ b/src/release-specification.test.ts @@ -1,17 +1,18 @@ import fs from 'fs'; -import path from 'path'; import { when } from 'jest-when'; +import path from 'path'; +import { SemVer } from 'semver'; import { MockWritable } from 'stdio-mock'; import YAML from 'yaml'; -import { SemVer } from 'semver'; -import { withSandbox } from '../tests/helpers.js'; -import { buildMockProject, buildMockPackage } from '../tests/unit/helpers.js'; + +import * as miscUtils from './misc-utils.js'; import { generateReleaseSpecificationTemplateForMonorepo, waitForUserToEditReleaseSpecification, validateReleaseSpecification, } from './release-specification.js'; -import * as miscUtils from './misc-utils.js'; +import { withSandbox } from '../tests/helpers.js'; +import { buildMockProject, buildMockPackage } from '../tests/unit/helpers.js'; jest.mock('./misc-utils', () => { return { diff --git a/src/release-specification.ts b/src/release-specification.ts index e551a2ef..5497da99 100644 --- a/src/release-specification.ts +++ b/src/release-specification.ts @@ -1,6 +1,7 @@ import fs, { WriteStream } from 'fs'; -import YAML from 'yaml'; import { diff } from 'semver'; +import YAML from 'yaml'; + import { Editor } from './editor.js'; import { readFile } from './fs.js'; import { @@ -10,32 +11,40 @@ import { isObject, runCommand, } from './misc-utils.js'; +import { Package } from './package.js'; import { Project } from './project.js'; import { isValidSemver, semver, SemVer } from './semver.js'; -import { Package } from './package.js'; /** * The SemVer-compatible parts of a version string that can be bumped by this * tool. */ -export enum IncrementableVersionParts { - major = 'major', - minor = 'minor', - patch = 'patch', -} +export const IncrementableVersionParts = { + major: 'major', + minor: 'minor', + patch: 'patch', +} as const; + +/** + * The SemVer-compatible parts of a version string that can be bumped by this + * tool. + */ +export type IncrementableVersionParts = + (typeof IncrementableVersionParts)[keyof typeof IncrementableVersionParts]; /** * Describes how to update the version for a package, either by bumping a part * of the version or by setting that version exactly. */ -type VersionSpecifier = IncrementableVersionParts | SemVer; +export type VersionSpecifier = IncrementableVersionParts | SemVer; /** * User-provided instructions for how to update this project in order to prepare * it for a new release. * - * @property packages - A mapping of package names to version specifiers. - * @property path - The path to the original release specification file. + * packages - A mapping of package names to version specifiers. + * + * path - The path to the original release specification file. */ export type ReleaseSpecification = { packages: Record; @@ -61,7 +70,7 @@ export async function generateReleaseSpecificationTemplateForMonorepo({ }: { project: Project; isEditorAvailable: boolean; -}) { +}): Promise { const afterEditingInstructions = isEditorAvailable ? ` # When you're finished, save this file and close it. The tool will update the @@ -132,7 +141,7 @@ export async function waitForUserToEditReleaseSpecification( releaseSpecificationPath: string, editor: Editor, stdout: Pick = fs.createWriteStream('/dev/null'), -) { +): Promise { let caughtError: unknown; debug( @@ -368,7 +377,7 @@ export function validateAllPackageEntries( errors.push({ message: [ `${JSON.stringify(versionSpecifierOrDirective)} is not a valid version specifier for package "${changedPackageName}"`, - `("${changedPackageName}" is at a greater version "${project.workspacePackages[changedPackageName].validatedManifest.version}")`, + `("${changedPackageName}" is at a greater version "${project.workspacePackages[changedPackageName].validatedManifest.version.version}")`, ], lineNumber, }); @@ -515,11 +524,8 @@ export async function validateReleaseSpecification( .flatMap((error) => { const itemPrefix = '* '; - if (error.lineNumber === undefined) { - return `${itemPrefix}${error.message}`; - } - - const lineNumberPrefix = `Line ${error.lineNumber}: `; + const lineNumberPrefix = + error.lineNumber === undefined ? '' : `Line ${error.lineNumber}: `; if (Array.isArray(error.message)) { return [ @@ -540,41 +546,38 @@ export async function validateReleaseSpecification( throw new Error(message); } - const packages = Object.keys(unvalidatedReleaseSpecification.packages).reduce( - (obj, packageName) => { - const versionSpecifierOrDirective = - unvalidatedReleaseSpecification.packages[packageName]; - - if ( - versionSpecifierOrDirective !== SKIP_PACKAGE_DIRECTIVE && - versionSpecifierOrDirective !== INTENTIONALLY_SKIP_PACKAGE_DIRECTIVE - ) { - if ( - Object.values(IncrementableVersionParts).includes( - // Typecast: It doesn't matter what type versionSpecifierOrDirective - // is as we are checking for inclusion. - versionSpecifierOrDirective as any, - ) - ) { - return { - ...obj, - // Typecast: We know what this is as we've checked it above. - [packageName]: - versionSpecifierOrDirective as IncrementableVersionParts, - }; - } - + const packages = Object.keys(unvalidatedReleaseSpecification.packages).reduce< + ReleaseSpecification['packages'] + >((obj, packageName) => { + const versionSpecifierOrDirective = + unvalidatedReleaseSpecification.packages[packageName]; + // Downcast this so that we can check for inclusion below. + const incrementableVersionParts = Object.values( + IncrementableVersionParts, + ) as string[]; + + if ( + versionSpecifierOrDirective !== SKIP_PACKAGE_DIRECTIVE && + versionSpecifierOrDirective !== INTENTIONALLY_SKIP_PACKAGE_DIRECTIVE + ) { + if (incrementableVersionParts.includes(versionSpecifierOrDirective)) { return { ...obj, - // Typecast: We know that this will safely parse. - [packageName]: semver.parse(versionSpecifierOrDirective) as SemVer, + // Typecast: We know what this is as we've checked it above. + [packageName]: + versionSpecifierOrDirective as IncrementableVersionParts, }; } - return obj; - }, - {} as ReleaseSpecification['packages'], - ); + return { + ...obj, + // Typecast: We know that this will safely parse. + [packageName]: semver.parse(versionSpecifierOrDirective) as SemVer, + }; + } + + return obj; + }, {}); return { packages, path: releaseSpecificationPath }; } diff --git a/src/repo.test.ts b/src/repo.test.ts index c9c81a29..957c1105 100644 --- a/src/repo.test.ts +++ b/src/repo.test.ts @@ -1,4 +1,6 @@ import { when } from 'jest-when'; + +import * as miscUtils from './misc-utils.js'; import { commitAllChanges, getTagNames, @@ -7,7 +9,6 @@ import { branchExists, restoreFiles, } from './repo.js'; -import * as miscUtils from './misc-utils.js'; jest.mock('./misc-utils'); diff --git a/src/repo.ts b/src/repo.ts index ec4074f9..bfc7a2ba 100644 --- a/src/repo.ts +++ b/src/repo.ts @@ -1,4 +1,5 @@ import path from 'path'; + import { runCommand, getStdoutFromCommand, @@ -135,7 +136,7 @@ async function getFilesChangedSince( export async function commitAllChanges( repositoryDirectoryPath: string, commitMessage: string, -) { +): Promise { await getStdoutFromGitCommandWithin(repositoryDirectoryPath, 'add', ['-A']); await getStdoutFromGitCommandWithin(repositoryDirectoryPath, 'commit', [ '-m', @@ -149,7 +150,9 @@ export async function commitAllChanges( * @param repositoryDirectoryPath - The file system path to the git repository. * @returns The name of the current branch in the specified repository. */ -export function getCurrentBranchName(repositoryDirectoryPath: string) { +export async function getCurrentBranchName( + repositoryDirectoryPath: string, +): Promise { return getStdoutFromGitCommandWithin(repositoryDirectoryPath, 'rev-parse', [ '--abbrev-ref', 'HEAD', @@ -173,7 +176,7 @@ export async function restoreFiles( repositoryDirectoryPath: string, repositoryDefaultBranch: string, filePaths: string[], -) { +): Promise { const ancestorCommitSha = await getStdoutFromGitCommandWithin( repositoryDirectoryPath, 'merge-base', @@ -197,7 +200,7 @@ export async function restoreFiles( export async function branchExists( repositoryDirectoryPath: string, branchName: string, -) { +): Promise { const branchNames = await getLinesFromGitCommandWithin( repositoryDirectoryPath, 'branch', diff --git a/src/ui.ts b/src/ui.ts index f4661f63..7ba71f7e 100644 --- a/src/ui.ts +++ b/src/ui.ts @@ -1,14 +1,18 @@ +import { getErrorMessage } from '@metamask/utils'; +import express, { static as expressStatic, json as expressJson } from 'express'; import type { WriteStream } from 'fs'; -import { join } from 'path'; -import express from 'express'; import open from 'open'; +import { join } from 'path'; +import { getCurrentDirectoryPath } from './dirname.js'; +import { readFile } from './fs.js'; +import { Package } from './package.js'; import { restoreChangelogsForSkippedPackages, updateChangelogsForChangedPackages, - type Project, } from './project.js'; -import { Package } from './package.js'; +import type { Project } from './project.js'; +import { executeReleasePlan, planRelease } from './release-plan.js'; import { findAllWorkspacePackagesThatDependOnPackage, findMissingUnreleasedDependenciesForRelease, @@ -17,20 +21,20 @@ import { ReleaseSpecification, validateAllPackageEntries, } from './release-specification.js'; -import { createReleaseBranch } from './workflow-operations.js'; import { commitAllChanges } from './repo.js'; import { SemVer, semver } from './semver.js'; -import { executeReleasePlan, planRelease } from './release-plan.js'; +import { createReleaseBranch } from './workflow-operations.js'; import { deduplicateDependencies, fixConstraints, updateYarnLockfile, } from './yarn-commands.js'; -import { readFile } from './fs.js'; -import { getCurrentDirectoryPath } from './dirname.js'; const UI_BUILD_DIR = join(getCurrentDirectoryPath(), 'ui'); +/** + * The set of options that can be used to start the UI. + */ type UIOptions = { project: Project; releaseType: 'ordinary' | 'backport'; @@ -84,20 +88,22 @@ export async function startUI({ }, }); - const server = app.listen(port, async () => { + const server = app.listen(port, () => { const url = `http://localhost:${port}`; - try { - stdout.write(`\nAttempting to open UI in browser...`); - await open(url); - stdout.write(`\nUI server running at ${url}\n`); - } catch (error) { - stderr.write(`\n---------------------------------------------------\n`); - stderr.write(`Error automatically opening browser: ${error}\n`); - stderr.write(`Please open the following URL manually:\n`); - stderr.write(`${url}\n`); - stderr.write(`---------------------------------------------------\n\n`); - } + stdout.write(`\nAttempting to open UI in browser...`); + open(url) + .then(() => { + stdout.write(`\nUI server running at ${url}\n`); + return undefined; + }) + .catch((error) => { + stderr.write(`\n---------------------------------------------------\n`); + stderr.write(`Error automatically opening browser: ${error}\n`); + stderr.write(`Please open the following URL manually:\n`); + stderr.write(`${url}\n`); + stderr.write(`---------------------------------------------------\n\n`); + }); }); return new Promise((resolve, reject) => { @@ -138,8 +144,8 @@ function createApp({ }): express.Application { const app = express(); - app.use(express.static(UI_BUILD_DIR)); - app.use(express.json()); + app.use(expressStatic(UI_BUILD_DIR)); + app.use(expressJson()); app.get('/api/packages', (req, res) => { const { majorBumps } = req.query; @@ -147,7 +153,7 @@ function createApp({ const majorBumpsArray = typeof majorBumps === 'string' ? majorBumps.split(',').filter(Boolean) - : (req.query.majorBumps as string[] | undefined) || []; + : ((req.query.majorBumps as string[] | undefined) ?? []); const requiredDependents = new Set( majorBumpsArray.flatMap((majorBump) => @@ -181,7 +187,7 @@ function createApp({ res.send(changelogContent); } catch (error) { - stderr.write(`Changelog error: ${error}\n`); + stderr.write(`Changelog error: ${getErrorMessage(error)}\n`); res.status(500).send('Internal Server Error'); } }); @@ -241,7 +247,7 @@ function createApp({ res.json({ status: 'success' }); } catch (error) { - stderr.write(`Release error: ${error}\n`); + stderr.write(`Release error: ${getErrorMessage(error)}\n`); res.status(400).send('Invalid request'); } }, @@ -265,35 +271,37 @@ function createApp({ const releaseSpecificationPackages = Object.keys( releasedPackages, - ).reduce( - (obj, packageName) => { - const versionSpecifierOrDirective = releasedPackages[packageName]; - - if (versionSpecifierOrDirective !== 'intentionally-skip') { - if ( - Object.values(IncrementableVersionParts).includes( - versionSpecifierOrDirective as any, - ) - ) { - return { - ...obj, - [packageName]: - versionSpecifierOrDirective as IncrementableVersionParts, - }; - } - + ).reduce((obj, packageName) => { + const versionSpecifierOrDirective = releasedPackages[packageName]; + // Downcast this so that we can check for inclusion below. + const incrementableVersionParts = Object.values( + IncrementableVersionParts, + ) as string[]; + + if (versionSpecifierOrDirective !== 'intentionally-skip') { + if ( + versionSpecifierOrDirective && + incrementableVersionParts.includes(versionSpecifierOrDirective) + ) { return { ...obj, - [packageName]: semver.parse( - versionSpecifierOrDirective, - ) as SemVer, + [packageName]: + // Typecast: We know what this is as we've checked it above. + versionSpecifierOrDirective as IncrementableVersionParts, }; } - return obj; - }, - {} as ReleaseSpecification['packages'], - ); + return { + ...obj, + // Typecast: We know that this will safely parse. + [packageName]: semver.parse( + versionSpecifierOrDirective, + ) as SemVer, + }; + } + + return obj; + }, {}); await restoreChangelogsForSkippedPackages({ project, @@ -319,7 +327,7 @@ function createApp({ closeServer(); } catch (error) { - stderr.write(`Release error: ${error}\n`); + stderr.write(`Release error: ${getErrorMessage(error)}\n`); res.status(400).send('Invalid request'); } }, diff --git a/src/ui/types.ts b/src/ui/types.ts index a76ca839..5bc0c2c2 100644 --- a/src/ui/types.ts +++ b/src/ui/types.ts @@ -1,3 +1,13 @@ +/** + * What action to take for a package: + * + * - `"major"`: Include the package in the release; bump the version by a major + * - `"minor"`: Include the package in the release; bump the version by a minor + * - `"patch"`: Include the package in the release; bump the version by a patch + * - `"intentionally-skip"`: Do not include the package in the release + * - `"custom"`: Include the package in the release, but use a custom version + * - `string`: Take no action. (Really, an empty string.) + */ export type ReleaseType = | 'major' | 'minor' @@ -6,11 +16,17 @@ export type ReleaseType = | 'custom' | string; +/** + * A package in the monorepo. + */ export type Package = { name: string; version: string; }; +/** + * Options in the "release type" dropdown for each package. + */ export const RELEASE_TYPE_OPTIONS = [ { label: 'Major', value: 'major' }, { label: 'Minor', value: 'minor' }, diff --git a/src/workflow-operations.test.ts b/src/workflow-operations.test.ts index 76b4cf9d..94e7e5cb 100644 --- a/src/workflow-operations.test.ts +++ b/src/workflow-operations.test.ts @@ -1,8 +1,8 @@ import { when } from 'jest-when'; -import { buildMockProject } from '../tests/unit/helpers'; -import { createReleaseBranch } from './workflow-operations.js'; import * as repoModule from './repo.js'; +import { createReleaseBranch } from './workflow-operations.js'; +import { buildMockProject } from '../tests/unit/helpers'; jest.mock('./repo'); diff --git a/src/workflow-operations.ts b/src/workflow-operations.ts index f3ae129d..96bbd9dc 100644 --- a/src/workflow-operations.ts +++ b/src/workflow-operations.ts @@ -1,5 +1,5 @@ -import { debug } from './misc-utils.js'; import { ReleaseType } from './initial-parameters.js'; +import { debug } from './misc-utils.js'; import { Project } from './project.js'; import { branchExists, diff --git a/src/yarn-commands.test.ts b/src/yarn-commands.test.ts index 355b857f..b158ff2a 100644 --- a/src/yarn-commands.test.ts +++ b/src/yarn-commands.test.ts @@ -1,10 +1,11 @@ import { when } from 'jest-when'; + +import * as miscUtils from './misc-utils.js'; import { deduplicateDependencies, fixConstraints, updateYarnLockfile, } from './yarn-commands.js'; -import * as miscUtils from './misc-utils.js'; jest.mock('./misc-utils'); diff --git a/tests/functional/helpers/constants.ts b/tests/functional/helpers/constants.ts index 7fd1bee2..c82e4c18 100644 --- a/tests/functional/helpers/constants.ts +++ b/tests/functional/helpers/constants.ts @@ -1,6 +1,13 @@ import path from 'path'; const ROOT_DIR = path.resolve(__dirname, '../../..'); + +/** + * The path to the entrypoint of the tool, locally. + */ export const TOOL_EXECUTABLE_PATH = path.join(ROOT_DIR, 'src', 'cli.ts'); +/** + * The path to `tsx`, locally. + */ export const TSX_PATH = path.join(ROOT_DIR, 'node_modules', '.bin', 'tsx'); diff --git a/tests/functional/helpers/environment.ts b/tests/functional/helpers/environment.ts index 779fe9b3..3599232b 100644 --- a/tests/functional/helpers/environment.ts +++ b/tests/functional/helpers/environment.ts @@ -1,4 +1,5 @@ import path from 'path'; + import LocalRepo from './local-repo.js'; import RemoteRepo from './remote-repo.js'; import Repo from './repo.js'; @@ -7,9 +8,11 @@ import Repo from './repo.js'; * Describes the package that is used to initialize a polyrepo, or one of the * packages that is used to initialize a monorepo. * - * @property name - The desired name of the package. - * @property version - The desired version of the package. - * @property directory - The path relative to the repo's root directory that + * name - The desired name of the package. + * + * version - The desired version of the package. + * + * directory - The path relative to the repo's root directory that * holds this package. */ export type PackageSpecification = { @@ -21,9 +24,10 @@ export type PackageSpecification = { /** * A set of configuration options for an {@link Environment}. * - * @property directoryPath - The directory out of which this environment will + * directoryPath - The directory out of which this environment will * operate. - * @property createInitialCommit - Usually when a repo is initialized, a commit + * + * createInitialCommit - Usually when a repo is initialized, a commit * is created (which will contain starting `package.json` files). You can use * this option to disable that if you need to create your own commits for * clarity. @@ -62,6 +66,11 @@ export default abstract class Environment { createCommit: SpecificLocalRepo['createCommit']; + /** + * Creates an Environment. + * + * @param options - The options. + */ constructor(options: EnvironmentOptions) { const { directoryPath, createInitialCommit = true } = options; this.directoryPath = directoryPath; @@ -88,7 +97,7 @@ export default abstract class Environment { * as `git fetch --tags`, and a "local" repo, which is the one against which * the tool is run. */ - async initialize() { + async initialize(): Promise { await this.remoteRepo.initialize(); await this.localRepo.initialize(); } diff --git a/tests/functional/helpers/local-monorepo.ts b/tests/functional/helpers/local-monorepo.ts index bd0338f1..1ac670e9 100644 --- a/tests/functional/helpers/local-monorepo.ts +++ b/tests/functional/helpers/local-monorepo.ts @@ -1,4 +1,5 @@ import path from 'path'; + import { PackageSpecification } from './environment.js'; import LocalRepo, { LocalRepoOptions } from './local-repo.js'; import { knownKeysOf } from './utils.js'; @@ -7,9 +8,10 @@ import { knownKeysOf } from './utils.js'; * A set of configuration options for a {@link LocalMonorepo}. In addition * to the options listed in {@link LocalRepoOptions}, these include: * - * @property packages - The known packages within this repo (including the + * packages - The known packages within this repo (including the * root). - * @property workspaces - The known workspaces within this repo. + * + * workspaces - The known workspaces within this repo. */ export type LocalMonorepoOptions = { packages: Record; @@ -26,13 +28,23 @@ export default class LocalMonorepo< /** * The known packages within this repo (including the root). */ - #packages: Record<'$root$' | WorkspacePackageNickname, PackageSpecification>; + readonly #packages: Record< + '$root$' | WorkspacePackageNickname, + PackageSpecification + >; /** * The known workspaces within this repo. */ - #workspaces: LocalMonorepoOptions['workspaces']; + readonly #workspaces: LocalMonorepoOptions['workspaces']; + /** + * Creates a LocalMonorepo. + * + * @param args - The arguments. + * @param args.packages - The packages in the monorepo. + * @param args.workspaces - The workspaces in the monorepo. + */ constructor({ packages, workspaces, @@ -62,7 +74,7 @@ export default class LocalMonorepo< async readFileWithinPackage( packageNickname: '$root$' | WorkspacePackageNickname, partialFilePath: string, - ) { + ): Promise { const packageDirectoryPath = this.#packages[packageNickname].directoryPath; return await this.readFile( path.join(packageDirectoryPath, partialFilePath), @@ -81,7 +93,7 @@ export default class LocalMonorepo< async readJsonFileWithinPackage( packageNickname: '$root$' | WorkspacePackageNickname, partialFilePath: string, - ) { + ): Promise> { const packageDirectoryPath = this.#packages[packageNickname].directoryPath; return await this.readJsonFile( path.join(packageDirectoryPath, partialFilePath), @@ -156,7 +168,7 @@ export default class LocalMonorepo< * Writes an initial package.json for the root package as well as any * workspace packages (if specified). */ - protected async afterCreate() { + protected async afterCreate(): Promise { await super.afterCreate(); await this.updateJsonFile('package.json', { @@ -167,7 +179,7 @@ export default class LocalMonorepo< // Update manifests for root and workspace packages with `name`, `version`, // and (optionally) `workspaces` await Promise.all( - knownKeysOf(this.#packages).map((packageName) => { + knownKeysOf(this.#packages).map(async (packageName) => { const pkg = this.#packages[packageName]; const content = { name: pkg.name, @@ -191,7 +203,7 @@ export default class LocalMonorepo< * * @returns The name of the root package. */ - protected getPackageName() { + protected getPackageName(): string { return this.#packages.$root$.name; } @@ -200,7 +212,7 @@ export default class LocalMonorepo< * * @returns The version of the root package. */ - protected getPackageVersion() { + protected getPackageVersion(): string | undefined { return this.#packages.$root$.version; } } diff --git a/tests/functional/helpers/local-repo.ts b/tests/functional/helpers/local-repo.ts index cef7843d..afac370a 100644 --- a/tests/functional/helpers/local-repo.ts +++ b/tests/functional/helpers/local-repo.ts @@ -1,14 +1,16 @@ import path from 'path'; -import { buildChangelog } from '../../helpers.js'; + import Repo, { RepoOptions } from './repo.js'; +import { buildChangelog } from '../../helpers.js'; /** * A set of configuration options for a {@link LocalRepo}. In addition to the * options listed in {@link RepoOptions}, these include: * - * @property remoteRepoDirectoryPath - The directory that holds the "remote" + * remoteRepoDirectoryPath - The directory that holds the "remote" * companion of this repo. - * @property createInitialCommit - Usually when this repo is initialized, a + * + * createInitialCommit - Usually when this repo is initialized, a * commit is created (which will contain starting `package.json` files). You can * use this option to disable that if you need to create your own commits for * clarity. @@ -26,15 +28,24 @@ export default abstract class LocalRepo extends Repo { /** * The directory that holds the "remote" companion of this repo. */ - #remoteRepoDirectoryPath: string; + readonly #remoteRepoDirectoryPath: string; /** * Usually when this repo is initialized, a commit is created (which will * contain starting `package.json` files). You can use this option to disable * that if you need to create your own commits for clarity. */ - #createInitialCommit: boolean; + readonly #createInitialCommit: boolean; + /** + * Creates a LocalRepo. + * + * @param args - The arguments. + * @param args.remoteRepoDirectoryPath - The path to the remote repo that this + * repo should appear to be cloned from. + * @param args.createInitialCommit - Whether to create an initial commit in + * the repo upon initialization. + */ constructor({ remoteRepoDirectoryPath, createInitialCommit, @@ -48,7 +59,7 @@ export default abstract class LocalRepo extends Repo { /** * Clones the "remote" repo. */ - protected async create() { + protected async create(): Promise { await this.runCommand( 'git', ['clone', this.#remoteRepoDirectoryPath, this.getWorkingDirectoryPath()], @@ -61,7 +72,7 @@ export default abstract class LocalRepo extends Repo { * and changelog. Also creates an initial commit if this repo was configured * with `createInitialCommit: true`. */ - protected async afterCreate() { + protected async afterCreate(): Promise { await super.afterCreate(); // We reconfigure the repo such that it ostensibly has a remote that points @@ -111,7 +122,7 @@ export default abstract class LocalRepo extends Repo { * * @returns `local-repo` within the environment directory. */ - getWorkingDirectoryPath() { + getWorkingDirectoryPath(): string { return path.join(this.environmentDirectoryPath, 'local-repo'); } diff --git a/tests/functional/helpers/monorepo-environment.ts b/tests/functional/helpers/monorepo-environment.ts index 270e95e9..1c45c2f9 100644 --- a/tests/functional/helpers/monorepo-environment.ts +++ b/tests/functional/helpers/monorepo-environment.ts @@ -1,7 +1,8 @@ +import type { ExecaReturnValue } from 'execa'; import fs from 'fs'; import path from 'path'; -import type { ExecaReturnValue } from 'execa'; import YAML from 'yaml'; + import { TOOL_EXECUTABLE_PATH, TSX_PATH } from './constants.js'; import Environment, { EnvironmentOptions, @@ -14,9 +15,10 @@ import { debug, knownKeysOf } from './utils.js'; * A set of configuration options for a {@link MonorepoEnvironment}. In addition * to the options listed in {@link EnvironmentOptions}, these include: * - * @property packages - The known packages within this repo (including the + * packages - The known packages within this repo (including the * root). - * @property workspaces - The known workspaces within this repo. + * + * workspaces - The known workspaces within this repo. */ export type MonorepoEnvironmentOptions< WorkspacePackageNickname extends string, @@ -28,7 +30,7 @@ export type MonorepoEnvironmentOptions< /** * The release specification data. * - * @property packages - The workspace packages within this repo that will be + * packages - The workspace packages within this repo that will be * released. */ type ReleaseSpecification = { @@ -50,8 +52,13 @@ export default class MonorepoEnvironment< updateJsonFileWithinPackage: LocalMonorepo['updateJsonFileWithinPackage']; - #packages: MonorepoEnvironmentOptions['packages']; + readonly #packages: MonorepoEnvironmentOptions['packages']; + /** + * Creates a MonorepoEnvironment. + * + * @param options - The options. + */ constructor(options: MonorepoEnvironmentOptions) { super(options); this.#packages = options.packages; @@ -147,6 +154,16 @@ cat "${releaseSpecificationPath}" > "$1" return result; } + /** + * Creates a local monorepo. + * + * @param args - The arguments. + * @param args.packages - The packages to include in the monorepo. + * @param args.workspaces - The workspaces to include in the monorepo. + * @param args.createInitialCommit - Whether to create an initial commit + * when the monorepo is initialized. + * @returns The local monorepo. + */ protected buildLocalRepo({ packages, workspaces, diff --git a/tests/functional/helpers/remote-repo.ts b/tests/functional/helpers/remote-repo.ts index 7ffc8b39..85f928db 100644 --- a/tests/functional/helpers/remote-repo.ts +++ b/tests/functional/helpers/remote-repo.ts @@ -1,5 +1,6 @@ import fs from 'fs'; import path from 'path'; + import Repo from './repo.js'; /** @@ -10,7 +11,7 @@ export default class RemoteRepo extends Repo { /** * Creates a bare repo. */ - async create() { + async create(): Promise { await fs.promises.mkdir(this.getWorkingDirectoryPath(), { recursive: true, }); @@ -22,7 +23,7 @@ export default class RemoteRepo extends Repo { * * @returns `remote-repo` within the environment directory. */ - getWorkingDirectoryPath() { + getWorkingDirectoryPath(): string { return path.join(this.environmentDirectoryPath, 'remote-repo'); } } diff --git a/tests/functional/helpers/repo.ts b/tests/functional/helpers/repo.ts index 0d8e4b42..78a7cf4b 100644 --- a/tests/functional/helpers/repo.ts +++ b/tests/functional/helpers/repo.ts @@ -1,14 +1,15 @@ +import deepmerge from 'deepmerge'; +import { execa, ExecaChildProcess, Options as ExecaOptions } from 'execa'; import fs from 'fs'; import path from 'path'; -import { execa, ExecaChildProcess, Options as ExecaOptions } from 'execa'; -import deepmerge from 'deepmerge'; -import { isErrorWithCode } from '../../helpers.js'; + import { debug, sleepFor } from './utils.js'; +import { isErrorWithCode } from '../../helpers.js'; /** * A set of configuration options for a {@link Repo}. * - * @property environmentDirectoryPath - The directory that holds the environment + * environmentDirectoryPath - The directory that holds the environment * that created this repo. */ export type RepoOptions = { @@ -37,6 +38,12 @@ export default abstract class Repo { */ #latestCommitTime: Date | undefined; + /** + * Creates a Repo instance. + * + * @param args - The arguments. + * @param args.environmentDirectoryPath - The environment directory path. + */ constructor({ environmentDirectoryPath }: RepoOptions) { this.environmentDirectoryPath = environmentDirectoryPath; this.#latestCommitTime = undefined; @@ -45,7 +52,7 @@ export default abstract class Repo { /** * Sets up the repo. */ - async initialize() { + async initialize(): Promise { await this.create(); await this.afterCreate(); } @@ -180,8 +187,7 @@ export default abstract class Repo { args?: readonly string[] | undefined, options?: ExecaOptions | undefined, ): Promise> { - const { env, ...remainingOptions } = - options === undefined ? { env: {} } : options; + const { env, ...remainingOptions } = options ?? { env: {} }; debug( 'Running command `%s %s`...', diff --git a/tests/functional/helpers/utils.ts b/tests/functional/helpers/utils.ts index 065fc422..01a38bb5 100644 --- a/tests/functional/helpers/utils.ts +++ b/tests/functional/helpers/utils.ts @@ -1,5 +1,8 @@ import createDebug from 'debug'; +/** + * Logger for development only. + */ export const debug = createDebug('create-release-branch:tests'); /** @@ -13,10 +16,10 @@ export const debug = createDebug('create-release-branch:tests'); * @returns The keys of an object, typed according to the type of the object * itself. */ -export function knownKeysOf( - object: Partial>, -) { - return Object.keys(object) as K[]; +export function knownKeysOf( + object: Partial>, +): Key[] { + return Object.keys(object) as Key[]; } /** diff --git a/tests/functional/helpers/with.ts b/tests/functional/helpers/with.ts index f8cbe6ab..f627c348 100644 --- a/tests/functional/helpers/with.ts +++ b/tests/functional/helpers/with.ts @@ -1,7 +1,7 @@ -import { withProtectedProcessEnv, withSandbox } from '../../helpers.js'; import MonorepoEnvironment, { MonorepoEnvironmentOptions, } from './monorepo-environment.js'; +import { withProtectedProcessEnv, withSandbox } from '../../helpers.js'; /** * Builds a monorepo project in a temporary directory, then calls the given @@ -23,7 +23,7 @@ export async function withMonorepoProjectEnvironment< callback: ( environment: MonorepoEnvironment, ) => Promise, -) { +): Promise { return withProtectedProcessEnv(async () => { return withSandbox(async (sandbox) => { const environment = new MonorepoEnvironment({ diff --git a/tests/helpers.ts b/tests/helpers.ts index 4debd2cd..b5a84194 100644 --- a/tests/helpers.ts +++ b/tests/helpers.ts @@ -1,9 +1,9 @@ +import { hasProperty, isObject } from '@metamask/utils'; +import type { ExecaError } from 'execa'; import fs from 'fs'; +import { nanoid } from 'nanoid'; import os from 'os'; import path from 'path'; -import { nanoid } from 'nanoid'; -import type { ExecaError } from 'execa'; -import { hasProperty, isObject } from '@metamask/utils'; /** * Information about the sandbox provided to tests that need access to the @@ -36,8 +36,13 @@ async function ensureFileEntryDoesNotExist(entryPath: string): Promise { try { await fs.promises.access(entryPath); throw new Error(`${entryPath} already exists, cannot continue`); - } catch (error: any) { - if (error.code !== 'ENOENT') { + } catch (error) { + if ( + typeof error === 'object' && + error !== null && + hasProperty(error, 'code') && + error.code !== 'ENOENT' + ) { throw error; } } @@ -51,7 +56,9 @@ async function ensureFileEntryDoesNotExist(entryPath: string): Promise { * @throws If the temporary directory already exists for some reason. This would * indicate a bug in how the names of the directory is determined. */ -export async function withSandbox(fn: (sandbox: Sandbox) => any) { +export async function withSandbox( + fn: (sandbox: Sandbox) => ReturnValue, +): Promise { const directoryPath = path.join(TEMP_DIRECTORY_PATH, nanoid()); await ensureFileEntryDoesNotExist(directoryPath); await fs.promises.mkdir(directoryPath, { recursive: true }); @@ -136,6 +143,8 @@ export function buildChangelog(variantContent: string): string { return `${invariantContent}\n${normalizeMultilineString(variantContent)}`; } +// This function is concerned with reading and writing environment variables. +/* eslint-disable n/no-process-env */ /** * Runs the given function and ensures that even if `process.env` is changed * during the function, it is restored afterward. @@ -144,7 +153,9 @@ export function buildChangelog(variantContent: string): string { * `process.env`. * @returns Whatever the callback returns. */ -export async function withProtectedProcessEnv(callback: () => Promise) { +export async function withProtectedProcessEnv( + callback: () => Promise, +): Promise { const originalEnv = { ...process.env }; try { @@ -164,3 +175,4 @@ export async function withProtectedProcessEnv(callback: () => Promise) { }); } } +/* eslint-enable n/no-process-env */ diff --git a/tests/setupAfterEnv.ts b/tests/setupAfterEnv.ts index 3ff14471..f0d58316 100644 --- a/tests/setupAfterEnv.ts +++ b/tests/setupAfterEnv.ts @@ -1,4 +1,6 @@ +import { getErrorMessage } from '@metamask/utils'; import type { ExecaReturnValue } from 'execa'; + import { isExecaError } from './helpers.js'; /** @@ -21,8 +23,9 @@ declare global { // defined. /* eslint-disable-next-line @typescript-eslint/no-namespace */ namespace jest { - // interface is used here to allow for declaration merging - // eslint-disable-next-line @typescript-eslint/consistent-type-definitions + // We need to use `interface`, as well the same name for the type parameter, + // because we are augmenting a type + // eslint-disable-next-line @typescript-eslint/consistent-type-definitions, @typescript-eslint/naming-convention interface Matchers { toResolve(): Promise; toThrowExecaError( @@ -56,7 +59,9 @@ const END = '▲▲▲ END ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲ * this function. * @returns A promise that resolves to a symbol. */ -const treatUnresolvedAfter = (duration: number): Promise => { +const treatUnresolvedAfter = async ( + duration: number, +): Promise => { return new Promise((resolve) => { originalSetTimeout(resolve, duration, UNRESOLVED); }); @@ -88,8 +93,8 @@ expect.extend({ promise, treatUnresolvedAfter(TIME_TO_WAIT_UNTIL_UNRESOLVED), ]); - } catch (e) { - rejectionValue = e; + } catch (error) { + rejectionValue = error; } return rejectionValue !== undefined || resolutionValue === UNRESOLVED @@ -149,7 +154,7 @@ expect.extend({ return { message: () => - `Expected running the tool to fail with an error from \`execa\`, but it failed with:\n\n${error}`, + `Expected running the tool to fail with an error from \`execa\`, but it failed with:\n\n${getErrorMessage(error)}`, pass: false, }; } diff --git a/tests/unit/helpers.ts b/tests/unit/helpers.ts index bace8803..9303d5eb 100644 --- a/tests/unit/helpers.ts +++ b/tests/unit/helpers.ts @@ -1,8 +1,8 @@ +import { isPlainObject } from '@metamask/utils'; import fs from 'fs'; import path from 'path'; import { SemVer } from 'semver'; -import { isPlainObject } from '@metamask/utils'; -import type { Package } from '../../src/package.js'; + import { PackageManifestDependenciesFieldNames, PackageManifestFieldNames, @@ -11,22 +11,32 @@ import type { UnvalidatedPackageManifest, ValidatedPackageManifest, } from '../../src/package-manifest.js'; +import type { Package } from '../../src/package.js'; import type { Project } from '../../src/project.js'; /** * Returns a version of the given record type where optionality is removed from * the designated keys. */ -export type Require = Omit & { [P in K]-?: T[P] }; +export type Require = Omit< + ObjectType, + Key +> & { [P in Key]-?: ObjectType[P] }; /** * Returns a version of the given record type where optionality is added to * the designated keys. */ -type Unrequire = Omit & { - [P in K]+?: T[P]; +type Unrequire = Omit< + ObjectType, + Key +> & { + [P in Key]+?: ObjectType[P]; }; +/** + * Specifies how a mock package should be defined. + */ type MockPackageOverrides = Omit< Unrequire< Package, diff --git a/vite.config.mjs b/vite.config.mjs index a455985d..c40258ac 100644 --- a/vite.config.mjs +++ b/vite.config.mjs @@ -1,6 +1,6 @@ -import { defineConfig } from 'vite'; -import react from '@vitejs/plugin-react'; import tailwindcss from '@tailwindcss/vite'; +import react from '@vitejs/plugin-react'; +import { defineConfig } from 'vite'; export default defineConfig({ plugins: [react(), tailwindcss()], diff --git a/yarn.lock b/yarn.lock index 58390303..3db3c4e6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1585,14 +1585,44 @@ __metadata: languageName: node linkType: hard -"@es-joy/jsdoccomment@npm:~0.36.0": - version: 0.36.0 - resolution: "@es-joy/jsdoccomment@npm:0.36.0" +"@emnapi/core@npm:^1.4.3": + version: 1.7.1 + resolution: "@emnapi/core@npm:1.7.1" dependencies: - comment-parser: 1.3.1 - esquery: ^1.4.0 - jsdoc-type-pratt-parser: ~3.1.0 - checksum: c2fa95bc01f6b2a0caa521adaa37562b10b12095b5308948f3e122880d2ae9684c09e5b0e0809ac3e31e17580886d2d3b41fbf4ff4831649efce8cba8e30cf5c + "@emnapi/wasi-threads": 1.1.0 + tslib: ^2.4.0 + checksum: 45274d4916c29ca39bb1833269524b8ccccc4295902193e640843df37ae4c35cf65a9d557d34d2eff770745116542af75feeb60d73088086fee791192cbee292 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.4.3": + version: 1.7.1 + resolution: "@emnapi/runtime@npm:1.7.1" + dependencies: + tslib: ^2.4.0 + checksum: a7429af887703bae05c360bc089d1ffbb99a8b5fd2645d8e1034737523f0323e9d29510c3569c3b8f5a516e86975aa9fcdb3601d1907c216f972e1b8d3ce82e1 + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.1.0": + version: 1.1.0 + resolution: "@emnapi/wasi-threads@npm:1.1.0" + dependencies: + tslib: ^2.4.0 + checksum: 6cffe35f3e407ae26236092991786db5968b4265e6e55f4664bf6f2ce0508e2a02a44ce6ebb16f2acd2f6589efb293f4f9d09cc9fbf80c00fc1a203accc94196 + languageName: node + linkType: hard + +"@es-joy/jsdoccomment@npm:~0.50.2": + version: 0.50.2 + resolution: "@es-joy/jsdoccomment@npm:0.50.2" + dependencies: + "@types/estree": ^1.0.6 + "@typescript-eslint/types": ^8.11.0 + comment-parser: 1.4.1 + esquery: ^1.6.0 + jsdoc-type-pratt-parser: ~4.1.0 + checksum: 5bbbc4e6f85a729c3353d3cb395a4b4766a405ce6228994b662cb2c755060f07ee45e507c091b8f8d6c4fdc805d017f1ff6ec2686afa54c8bd4e91c480ab932b languageName: node linkType: hard @@ -1925,45 +1955,91 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.2.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" +"@eslint-community/eslint-utils@npm:^4.1.2, @eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.5.0, @eslint-community/eslint-utils@npm:^4.7.0, @eslint-community/eslint-utils@npm:^4.8.0": + version: 4.9.0 + resolution: "@eslint-community/eslint-utils@npm:4.9.0" dependencies: - eslint-visitor-keys: ^3.3.0 + eslint-visitor-keys: ^3.4.3 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: cdfe3ae42b4f572cbfb46d20edafe6f36fc5fb52bf2d90875c58aefe226892b9677fef60820e2832caf864a326fe4fc225714c46e8389ccca04d5f9288aabd22 + checksum: ae9b98eea006d1354368804b0116b8b45017a4e47b486d1b9cfa048a8ed3dc69b9b074eb2b2acb14034e6897c24048fd42b6a6816d9dc8bb9daad79db7d478d2 languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.4.0": - version: 4.5.0 - resolution: "@eslint-community/regexpp@npm:4.5.0" - checksum: 99c01335947dbd7f2129e954413067e217ccaa4e219fe0917b7d2bd96135789384b8fedbfb8eb09584d5130b27a7b876a7150ab7376f51b3a0c377d5ce026a10 +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.11.0, @eslint-community/regexpp@npm:^4.12.1": + version: 4.12.2 + resolution: "@eslint-community/regexpp@npm:4.12.2" + checksum: 1770bc81f676a72f65c7200b5675ff7a349786521f30e66125faaf767fde1ba1c19c3790e16ba8508a62a3933afcfc806a893858b3b5906faf693d862b9e4120 languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.0.2": - version: 2.0.2 - resolution: "@eslint/eslintrc@npm:2.0.2" +"@eslint/config-array@npm:^0.21.1": + version: 0.21.1 + resolution: "@eslint/config-array@npm:0.21.1" + dependencies: + "@eslint/object-schema": ^2.1.7 + debug: ^4.3.1 + minimatch: ^3.1.2 + checksum: fc5b57803b059f7c1f62950ef83baf045a01887fc00551f9e87ac119246fcc6d71c854a7f678accc79cbf829ed010e8135c755a154b0f54b129c538950cd7e6a + languageName: node + linkType: hard + +"@eslint/config-helpers@npm:^0.4.2": + version: 0.4.2 + resolution: "@eslint/config-helpers@npm:0.4.2" + dependencies: + "@eslint/core": ^0.17.0 + checksum: 63ff6a0730c9fff2edb80c89b39b15b28d6a635a1c3f32cf0d7eb3e2625f2efbc373c5531ae84e420ae36d6e37016dd40c365b6e5dee6938478e9907aaadae0b + languageName: node + linkType: hard + +"@eslint/core@npm:^0.17.0": + version: 0.17.0 + resolution: "@eslint/core@npm:0.17.0" + dependencies: + "@types/json-schema": ^7.0.15 + checksum: ff9b5b4987f0bae4f2a4cfcdc7ae584ad3b0cb58526ca562fb281d6837700a04c7f3c86862e95126462318f33f60bf38e1cb07ed0e2449532d4b91cd5f4ab1f2 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.3.1": + version: 3.3.3 + resolution: "@eslint/eslintrc@npm:3.3.3" dependencies: ajv: ^6.12.4 debug: ^4.3.2 - espree: ^9.5.1 - globals: ^13.19.0 + espree: ^10.0.1 + globals: ^14.0.0 ignore: ^5.2.0 import-fresh: ^3.2.1 - js-yaml: ^4.1.0 + js-yaml: ^4.1.1 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: cfcf5e12c7b2c4476482e7f12434e76eae16fcd163ee627309adb10b761e5caa4a4e52ed7be464423320ff3d11eca5b50de5bf8be3e25834222470835dd5c801 + checksum: d1e16e47f1bb29af32defa597eaf84ac0ff8c06760c0a5f4933c604cd9d931d48c89bed96252222f22abac231898a53bc41385a5e6129257f0060b5ec431bdb2 + languageName: node + linkType: hard + +"@eslint/js@npm:9.39.1, @eslint/js@npm:^9.11.0": + version: 9.39.1 + resolution: "@eslint/js@npm:9.39.1" + checksum: b651930aec03a5aef97bc144627aebb05070afec5364cd3c5fd7c5dbb97f4fd82faf1b200b3be17572d5ebb7f8805211b655f463be96f2b02202ec7250868048 languageName: node linkType: hard -"@eslint/js@npm:8.39.0": - version: 8.39.0 - resolution: "@eslint/js@npm:8.39.0" - checksum: 63fe36e2bfb5ff5705d1c1a8ccecd8eb2f81d9af239713489e767b0e398759c0177fcc75ad62581d02942f2776903a8496d5fae48dc2d883dff1b96fcb19e9e2 +"@eslint/object-schema@npm:^2.1.7": + version: 2.1.7 + resolution: "@eslint/object-schema@npm:2.1.7" + checksum: fc5708f192476956544def13455d60fd1bafbf8f062d1e05ec5c06dd470b02078eaf721e696a8b31c1c45d2056723a514b941ae5eea1398cc7e38eba6711a775 + languageName: node + linkType: hard + +"@eslint/plugin-kit@npm:^0.4.1": + version: 0.4.1 + resolution: "@eslint/plugin-kit@npm:0.4.1" + dependencies: + "@eslint/core": ^0.17.0 + levn: ^0.4.1 + checksum: 3f4492e02a3620e05d46126c5cfeff5f651ecf33466c8f88efb4812ae69db5f005e8c13373afabc070ecca7becd319b656d6670ad5093f05ca63c2a8841d99ba languageName: node linkType: hard @@ -2016,14 +2092,20 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.8": - version: 0.11.8 - resolution: "@humanwhocodes/config-array@npm:0.11.8" +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 611e0545146f55ddfdd5c20239cfb7911f9d0e28258787c4fc1a1f6214250830c9367aaaeace0096ed90b6739bee1e9c52ad5ba8adaf74ab8b449119303babfe + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.7 + resolution: "@humanfs/node@npm:0.16.7" dependencies: - "@humanwhocodes/object-schema": ^1.2.1 - debug: ^4.1.1 - minimatch: ^3.0.5 - checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 + "@humanfs/core": ^0.19.1 + "@humanwhocodes/retry": ^0.4.0 + checksum: 7d2a396a94d80158ce320c0fd7df9aebb82edb8b667e5aaf8f87f4ca50518d0941ca494e0cd68e06b061e777ce5f7d26c45f93ac3fa9f7b11fd1ff26e3cd1440 languageName: node linkType: hard @@ -2034,10 +2116,10 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 +"@humanwhocodes/retry@npm:^0.4.0, @humanwhocodes/retry@npm:^0.4.2": + version: 0.4.3 + resolution: "@humanwhocodes/retry@npm:0.4.3" + checksum: d423455b9d53cf01f778603404512a4246fb19b83e74fe3e28c70d9a80e9d4ae147d2411628907ca983e91a855a52535859a8bb218050bc3f6dbd7a553b7b442 languageName: node linkType: hard @@ -2081,6 +2163,22 @@ __metadata: languageName: node linkType: hard +"@isaacs/balanced-match@npm:^4.0.1": + version: 4.0.1 + resolution: "@isaacs/balanced-match@npm:4.0.1" + checksum: 102fbc6d2c0d5edf8f6dbf2b3feb21695a21bc850f11bc47c4f06aa83bd8884fde3fe9d6d797d619901d96865fdcb4569ac2a54c937992c48885c5e3d9967fe8 + languageName: node + linkType: hard + +"@isaacs/brace-expansion@npm:^5.0.0": + version: 5.0.0 + resolution: "@isaacs/brace-expansion@npm:5.0.0" + dependencies: + "@isaacs/balanced-match": ^4.0.1 + checksum: d7a3b8b0ddbf0ccd8eeb1300e29dd0a0c02147e823d8138f248375a365682360620895c66d113e05ee02389318c654379b0e538b996345b83c914941786705b1 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -2479,10 +2577,10 @@ __metadata: "@lavamoat/allow-scripts": ^3.1.0 "@metamask/action-utils": ^1.0.0 "@metamask/auto-changelog": ^4.0.0 - "@metamask/eslint-config": ^10.0.0 - "@metamask/eslint-config-jest": ^10.0.0 - "@metamask/eslint-config-nodejs": ^10.0.0 - "@metamask/eslint-config-typescript": ^10.0.0 + "@metamask/eslint-config": ^15.0.0 + "@metamask/eslint-config-jest": ^15.0.0 + "@metamask/eslint-config-nodejs": ^15.0.0 + "@metamask/eslint-config-typescript": ^15.0.0 "@metamask/utils": ^9.0.0 "@tailwindcss/vite": ^4.0.9 "@types/debug": ^4.1.7 @@ -2497,19 +2595,22 @@ __metadata: "@types/validate-npm-package-name": ^4.0.2 "@types/which": ^3.0.0 "@types/yargs": ^17.0.10 - "@typescript-eslint/eslint-plugin": ^5.62.0 - "@typescript-eslint/parser": ^5.62.0 + "@typescript-eslint/eslint-plugin": ^8.25.0 + "@typescript-eslint/parser": ^8.25.0 "@vitejs/plugin-react": ^4.3.4 babel-jest: ^29.7.0 debug: ^4.3.4 deepmerge: ^4.2.2 - eslint: ^8.27.0 + eslint: ^9.21.0 eslint-config-prettier: ^9.1.0 - eslint-plugin-import: ^2.26.0 - eslint-plugin-jest: ^26.9.0 - eslint-plugin-jsdoc: ^39.6.2 + eslint-import-resolver-typescript: ^3.8.3 + eslint-plugin-import-x: ^4.6.1 + eslint-plugin-jest: ^28.11.0 + eslint-plugin-jsdoc: ^50.6.3 + eslint-plugin-n: ^17.15.1 eslint-plugin-node: ^11.1.0 eslint-plugin-prettier: ^5.2.1 + eslint-plugin-promise: ^7.2.1 execa: ^8.0.1 express: ^4.21.2 jest: ^29.7.0 @@ -2529,6 +2630,7 @@ __metadata: tailwindcss: ^4.0.9 tsx: ^4.6.1 typescript: ~5.1.6 + typescript-eslint: ^8.49.0 validate-npm-package-name: ^5.0.0 vite: ^6.2.0 which: ^3.0.0 @@ -2541,52 +2643,66 @@ __metadata: languageName: unknown linkType: soft -"@metamask/eslint-config-jest@npm:^10.0.0": - version: 10.0.0 - resolution: "@metamask/eslint-config-jest@npm:10.0.0" +"@metamask/eslint-config-jest@npm:^15.0.0": + version: 15.0.0 + resolution: "@metamask/eslint-config-jest@npm:15.0.0" + dependencies: + "@eslint/js": ^9.11.0 + globals: ^15.9.0 peerDependencies: - "@metamask/eslint-config": ^10.0.0 - eslint: ^8.21.0 - eslint-plugin-jest: ^26.8.2 - checksum: 60a6f849d21cefef6956680b9dd229d76b961ac6d291de3d5eb0df401e08fcb849b65feecef00a3506e254b967d615c63cca7ca4145acc110e084d49cc6c6f13 + "@metamask/eslint-config": ^15.0.0 + eslint: ^9.11.0 + eslint-plugin-jest: ^28.8.3 + checksum: 9f77ac980e447e5254d733ee7c54585a2f0c51425863cb791d197281273f2bac9ec3178e7eab5b1b714ebbafe62d41d15b687ba5a10982edd659f0bf0273eb8f languageName: node linkType: hard -"@metamask/eslint-config-nodejs@npm:^10.0.0": - version: 10.0.0 - resolution: "@metamask/eslint-config-nodejs@npm:10.0.0" +"@metamask/eslint-config-nodejs@npm:^15.0.0": + version: 15.0.0 + resolution: "@metamask/eslint-config-nodejs@npm:15.0.0" + dependencies: + "@eslint/js": ^9.11.0 + globals: ^15.9.0 peerDependencies: - "@metamask/eslint-config": ^10.0.0 - eslint: ^8.21.0 - eslint-plugin-node: ^11.1.0 - checksum: eef19eb8ab7949e6e56119a38ba351c25a1002515bc6e47e7b103cc12f73b7af30bc2abde2129eeca573c741986ce352086f79e5385b9b171ce4a7437bc016dd + "@metamask/eslint-config": ^15.0.0 + eslint: ^9.11.0 + eslint-plugin-n: ^17.10.3 + checksum: d905cd60e6ace27bae8a262e9197be06be411befa35ef7359626f8a06d6bd6e5fa641addbdfb12e9c2837e897a53669fceba516f79e8b93d3c28caee79e71dcb languageName: node linkType: hard -"@metamask/eslint-config-typescript@npm:^10.0.0": - version: 10.0.0 - resolution: "@metamask/eslint-config-typescript@npm:10.0.0" +"@metamask/eslint-config-typescript@npm:^15.0.0": + version: 15.0.0 + resolution: "@metamask/eslint-config-typescript@npm:15.0.0" + dependencies: + "@eslint/js": ^9.11.0 peerDependencies: - "@metamask/eslint-config": ^10.0.0 - "@typescript-eslint/eslint-plugin": ^5.33.0 - "@typescript-eslint/parser": ^5.33.0 - eslint: ^8.21.0 - typescript: ^4.0.7 - checksum: a1593d8d11f3d476aba24c0aa5e829724dd9dce6539cb2b33b75d5a1623ae9950370920fb666504d5192aee17f88fcecdcaf76465e66d67ece7dcb3ad90efd9b + "@metamask/eslint-config": ^15.0.0 + eslint: ^9.11.0 + eslint-import-resolver-typescript: ^3.6.3 + eslint-plugin-import-x: ^4.3.0 + eslint-plugin-jsdoc: ^50.2.4 + typescript: ">=4.8.4 <6" + typescript-eslint: ^8.39.0 + checksum: 07434b045305a118e2a88587205382cd630b9c3bdff1b3226d6c6a8478a0e69758ed357fd92d6fa8cfbfff18cd03de765bc756e7908ac6029aa9a2648fc5aab0 languageName: node linkType: hard -"@metamask/eslint-config@npm:^10.0.0": - version: 10.0.0 - resolution: "@metamask/eslint-config@npm:10.0.0" +"@metamask/eslint-config@npm:^15.0.0": + version: 15.0.0 + resolution: "@metamask/eslint-config@npm:15.0.0" + dependencies: + "@eslint/js": ^9.11.0 + globals: ^15.9.0 peerDependencies: - eslint: ^8.21.0 - eslint-config-prettier: ^8.1.0 - eslint-plugin-import: ^2.26.0 - eslint-plugin-jsdoc: ^39.2.9 - eslint-plugin-prettier: ^4.2.1 - prettier: ^2.2.1 - checksum: e6d7de595cb5ea536ce4cc5585c2970d6ae863cf2348d82fbfb5cafb8ca720d4612b1183a4ac6f9df8c7d641175de228ee705568735d56297f96ac4736b21da5 + eslint: ^9.11.0 + eslint-config-prettier: ^9.1.0 + eslint-plugin-import-x: ^4.3.0 + eslint-plugin-jsdoc: ^50.2.4 + eslint-plugin-prettier: ^5.2.1 + eslint-plugin-promise: ^7.1.0 + prettier: ^3.3.3 + checksum: 6762439e7d1b645fd83011d12490bd75fb2e72e6a47620633e11a5794f90f42e27adc8254f79a61244cd7985cd8a6950c2798ccfbc710d3dbe773180d35cb8f3 languageName: node linkType: hard @@ -2614,6 +2730,17 @@ __metadata: languageName: node linkType: hard +"@napi-rs/wasm-runtime@npm:^0.2.11": + version: 0.2.12 + resolution: "@napi-rs/wasm-runtime@npm:0.2.12" + dependencies: + "@emnapi/core": ^1.4.3 + "@emnapi/runtime": ^1.4.3 + "@tybys/wasm-util": ^0.10.0 + checksum: 676271082b2e356623faa1fefd552a82abb8c00f8218e333091851456c52c81686b98f77fcd119b9b2f4f215d924e4b23acd6401d9934157c80da17be783ec3d + languageName: node + linkType: hard + "@noble/curves@npm:1.1.0, @noble/curves@npm:~1.1.0": version: 1.1.0 resolution: "@noble/curves@npm:1.1.0" @@ -2654,7 +2781,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -2664,6 +2791,13 @@ __metadata: languageName: node linkType: hard +"@nolyfill/is-core-module@npm:1.0.39": + version: 1.0.39 + resolution: "@nolyfill/is-core-module@npm:1.0.39" + checksum: 0d6e098b871eca71d875651288e1f0fa770a63478b0b50479c99dc760c64175a56b5b04f58d5581bbcc6b552b8191ab415eada093d8df9597ab3423c8cac1815 + languageName: node + linkType: hard + "@npmcli/agent@npm:^2.0.0": version: 2.2.2 resolution: "@npmcli/agent@npm:2.2.2" @@ -3118,6 +3252,15 @@ __metadata: languageName: node linkType: hard +"@tybys/wasm-util@npm:^0.10.0": + version: 0.10.1 + resolution: "@tybys/wasm-util@npm:0.10.1" + dependencies: + tslib: ^2.4.0 + checksum: b8b281ffa9cd01cb6d45a4dddca2e28fd0cb6ad67cf091ba4a73ac87c0d6bd6ce188c332c489e87c20b0750b0b6fe3b99e30e1cd2227ec16da692f51c778944e + languageName: node + linkType: hard + "@types/babel__core@npm:^7.1.14": version: 7.1.19 resolution: "@types/babel__core@npm:7.1.19" @@ -3225,6 +3368,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:^1.0.6": + version: 1.0.8 + resolution: "@types/estree@npm:1.0.8" + checksum: bd93e2e415b6f182ec4da1074e1f36c480f1d26add3e696d54fb30c09bc470897e41361c8fd957bf0985024f8fbf1e6e2aff977d79352ef7eb93a5c6dcff6c11 + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:^5.0.0": version: 5.0.6 resolution: "@types/express-serve-static-core@npm:5.0.6" @@ -3318,17 +3468,10 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:^7.0.9": - version: 7.0.11 - resolution: "@types/json-schema@npm:7.0.11" - checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d - languageName: node - linkType: hard - -"@types/json5@npm:^0.0.29": - version: 0.0.29 - resolution: "@types/json5@npm:0.0.29" - checksum: e60b153664572116dfea673c5bda7778dbff150498f44f998e34b5886d8afc47f16799280e4b6e241c0472aef1bc36add771c569c68fc5125fc2ae519a3eb9ac +"@types/json-schema@npm:^7.0.15": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 97ed0cb44d4070aecea772b7b2e2ed971e10c81ec87dd4ecc160322ffa55ff330dace1793489540e3e318d90942064bb697cc0f8989391797792d919737b3b98 languageName: node linkType: hard @@ -3428,7 +3571,7 @@ __metadata: languageName: node linkType: hard -"@types/semver@npm:^7.3.12, @types/semver@npm:^7.3.6": +"@types/semver@npm:^7.3.6": version: 7.5.1 resolution: "@types/semver@npm:7.5.1" checksum: 2fffe938c7ac168711f245a16e1856a3578d77161ca17e29a05c3e02c7be3e9c5beefa29a3350f6c1bd982fb70aa28cc52e4845eb7d36246bcdc0377170d584d @@ -3514,124 +3657,138 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.62.0" +"@typescript-eslint/eslint-plugin@npm:8.49.0, @typescript-eslint/eslint-plugin@npm:^8.25.0": + version: 8.49.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.49.0" dependencies: - "@eslint-community/regexpp": ^4.4.0 - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/type-utils": 5.62.0 - "@typescript-eslint/utils": 5.62.0 + "@eslint-community/regexpp": ^4.10.0 + "@typescript-eslint/scope-manager": 8.49.0 + "@typescript-eslint/type-utils": 8.49.0 + "@typescript-eslint/utils": 8.49.0 + "@typescript-eslint/visitor-keys": 8.49.0 + ignore: ^7.0.0 + natural-compare: ^1.4.0 + ts-api-utils: ^2.1.0 + peerDependencies: + "@typescript-eslint/parser": ^8.49.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 0bae18dda8e8c86d8da311c382642e4e321e708ca7bad1ae86e43981b1679e99e7d9bd4e32d4874e8016cbe2e39f5a255a71f16cc2c64ec3471b23161e51afec + languageName: node + linkType: hard + +"@typescript-eslint/parser@npm:8.49.0, @typescript-eslint/parser@npm:^8.25.0": + version: 8.49.0 + resolution: "@typescript-eslint/parser@npm:8.49.0" + dependencies: + "@typescript-eslint/scope-manager": 8.49.0 + "@typescript-eslint/types": 8.49.0 + "@typescript-eslint/typescript-estree": 8.49.0 + "@typescript-eslint/visitor-keys": 8.49.0 debug: ^4.3.4 - graphemer: ^1.4.0 - ignore: ^5.2.0 - natural-compare-lite: ^1.4.0 - semver: ^7.3.7 - tsutils: ^3.21.0 peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: fc104b389c768f9fa7d45a48c86d5c1ad522c1d0512943e782a56b1e3096b2cbcc1eea3fcc590647bf0658eef61aac35120a9c6daf979bf629ad2956deb516a1 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: 27a157372fec09d72b9d3b266ca18cc6d4db040df6d507c5c9d30f97375e0be373d5fde9d02bcd997e40f21738edcc7a2e51d5a56e3cdd600147637bc96d920b languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/parser@npm:5.62.0" +"@typescript-eslint/project-service@npm:8.49.0": + version: 8.49.0 + resolution: "@typescript-eslint/project-service@npm:8.49.0" dependencies: - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/typescript-estree": 5.62.0 + "@typescript-eslint/tsconfig-utils": ^8.49.0 + "@typescript-eslint/types": ^8.49.0 debug: ^4.3.4 peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: d168f4c7f21a7a63f47002e2d319bcbb6173597af5c60c1cf2de046b46c76b4930a093619e69faf2d30214c29ab27b54dcf1efc7046a6a6bd6f37f59a990e752 + typescript: ">=4.8.4 <6.0.0" + checksum: 378cd7e6982820aa0bb1dfe78a8cf133dc8192ad68b4e2a3ed1615a1a1b4542a1a20da08de6f5dee2a5804192aeceabe06e6c16a0453a8aaa43e495527e6af6a languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/scope-manager@npm:5.62.0" +"@typescript-eslint/scope-manager@npm:8.49.0": + version: 8.49.0 + resolution: "@typescript-eslint/scope-manager@npm:8.49.0" dependencies: - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/visitor-keys": 5.62.0 - checksum: 6062d6b797fe1ce4d275bb0d17204c827494af59b5eaf09d8a78cdd39dadddb31074dded4297aaf5d0f839016d601032857698b0e4516c86a41207de606e9573 + "@typescript-eslint/types": 8.49.0 + "@typescript-eslint/visitor-keys": 8.49.0 + checksum: 85aae146729547df03a2ffdb4e447a10023e7c71b426a2a5d7eb3b2a82ec1bbd8ba214d619363994c500a4cf742fbb3f3743723aa13784649e0b9e909ab4529f + languageName: node + linkType: hard + +"@typescript-eslint/tsconfig-utils@npm:8.49.0, @typescript-eslint/tsconfig-utils@npm:^8.49.0": + version: 8.49.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.49.0" + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: be26283df8cf05a3a8d17596ac52e51ec27017f27ec5588e2fa3b804c31758864732a24e1ab777ac3e3567dda9b55de5b18d318b6a6e56025baa4f117f371804 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/type-utils@npm:5.62.0" +"@typescript-eslint/type-utils@npm:8.49.0": + version: 8.49.0 + resolution: "@typescript-eslint/type-utils@npm:8.49.0" dependencies: - "@typescript-eslint/typescript-estree": 5.62.0 - "@typescript-eslint/utils": 5.62.0 + "@typescript-eslint/types": 8.49.0 + "@typescript-eslint/typescript-estree": 8.49.0 + "@typescript-eslint/utils": 8.49.0 debug: ^4.3.4 - tsutils: ^3.21.0 + ts-api-utils: ^2.1.0 peerDependencies: - eslint: "*" - peerDependenciesMeta: - typescript: - optional: true - checksum: fc41eece5f315dfda14320be0da78d3a971d650ea41300be7196934b9715f3fe1120a80207551eb71d39568275dbbcf359bde540d1ca1439d8be15e9885d2739 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: ce5795464be57b0a1cf5970103547a148e8971fe7cf1aafb9a62b40251c670fd1b03535edfc4622c520112705cd6ee5efd88124a7432d2fbbcfc5be54fbf131f languageName: node linkType: hard -"@typescript-eslint/types@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/types@npm:5.62.0" - checksum: 48c87117383d1864766486f24de34086155532b070f6264e09d0e6139449270f8a9559cfef3c56d16e3bcfb52d83d42105d61b36743626399c7c2b5e0ac3b670 +"@typescript-eslint/types@npm:8.49.0, @typescript-eslint/types@npm:^8.11.0, @typescript-eslint/types@npm:^8.35.0, @typescript-eslint/types@npm:^8.49.0": + version: 8.49.0 + resolution: "@typescript-eslint/types@npm:8.49.0" + checksum: e604e27f9ff7dd4c7ae0060db5f506338b64cc302563841e729f4da7730a1e94176db8ae1f1c4c0c0c8df5086f127408dc050f27595a36d412f60ed0e09f5a64 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" +"@typescript-eslint/typescript-estree@npm:8.49.0": + version: 8.49.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.49.0" dependencies: - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/visitor-keys": 5.62.0 + "@typescript-eslint/project-service": 8.49.0 + "@typescript-eslint/tsconfig-utils": 8.49.0 + "@typescript-eslint/types": 8.49.0 + "@typescript-eslint/visitor-keys": 8.49.0 debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 3624520abb5807ed8f57b1197e61c7b1ed770c56dfcaca66372d584ff50175225798bccb701f7ef129d62c5989070e1ee3a0aa2d84e56d9524dcf011a2bb1a52 + minimatch: ^9.0.4 + semver: ^7.6.0 + tinyglobby: ^0.2.15 + ts-api-utils: ^2.1.0 + peerDependencies: + typescript: ">=4.8.4 <6.0.0" + checksum: a03545eefdf2487172602930fdd27c8810dc775bdfa4d9c3a45651c5f5465c5e1fc652f318c61ece7f4f35425231961434e96d4ffca84f10149fca111e1fc520 languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.62.0, @typescript-eslint/utils@npm:^5.10.0": - version: 5.62.0 - resolution: "@typescript-eslint/utils@npm:5.62.0" +"@typescript-eslint/utils@npm:8.49.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0": + version: 8.49.0 + resolution: "@typescript-eslint/utils@npm:8.49.0" dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@types/json-schema": ^7.0.9 - "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.62.0 - "@typescript-eslint/types": 5.62.0 - "@typescript-eslint/typescript-estree": 5.62.0 - eslint-scope: ^5.1.1 - semver: ^7.3.7 + "@eslint-community/eslint-utils": ^4.7.0 + "@typescript-eslint/scope-manager": 8.49.0 + "@typescript-eslint/types": 8.49.0 + "@typescript-eslint/typescript-estree": 8.49.0 peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: ee9398c8c5db6d1da09463ca7bf36ed134361e20131ea354b2da16a5fdb6df9ba70c62a388d19f6eebb421af1786dbbd79ba95ddd6ab287324fc171c3e28d931 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: be1bdf2e4a8bb56bb0c39ba8b8a5f1fc187fb17a53af0ef4d50be95914027076dfac385b54d969fdaa2a42fa8a95f31d105457a3768875054a5507ebe6f6257a languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" +"@typescript-eslint/visitor-keys@npm:8.49.0": + version: 8.49.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.49.0" dependencies: - "@typescript-eslint/types": 5.62.0 - eslint-visitor-keys: ^3.3.0 - checksum: 976b05d103fe8335bef5c93ad3f76d781e3ce50329c0243ee0f00c0fcfb186c81df50e64bfdd34970148113f8ade90887f53e3c4938183afba830b4ba8e30a35 + "@typescript-eslint/types": 8.49.0 + eslint-visitor-keys: ^4.2.1 + checksum: 446d6345d9702bcdf8713a47561ea52657bbec1c8170b1559d9462e1d815b122adff35f1cc778ecb94f4459d51ac7aac7cafe9ec8d8319b2c7d7984a0edee6ba languageName: node linkType: hard @@ -3642,6 +3799,141 @@ __metadata: languageName: node linkType: hard +"@unrs/resolver-binding-android-arm-eabi@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-android-arm-eabi@npm:1.11.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-android-arm64@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-android-arm64@npm:1.11.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-arm64@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.11.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-x64@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-darwin-x64@npm:1.11.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-freebsd-x64@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.11.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.11.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.11.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm64-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.11.1" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm64-musl@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.11.1" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.11.1" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-riscv64-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-riscv64-gnu@npm:1.11.1" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-riscv64-musl@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-riscv64-musl@npm:1.11.1" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-s390x-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.11.1" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-x64-gnu@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.11.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-x64-musl@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.11.1" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-wasm32-wasi@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.11.1" + dependencies: + "@napi-rs/wasm-runtime": ^0.2.11 + conditions: cpu=wasm32 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-arm64-msvc@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.11.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-ia32-msvc@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.11.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-x64-msvc@npm:1.11.1": + version: 1.11.1 + resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.11.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@vitejs/plugin-react@npm:^4.3.4": version: 4.3.4 resolution: "@vitejs/plugin-react@npm:4.3.4" @@ -3690,12 +3982,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.8.0": - version: 8.8.1 - resolution: "acorn@npm:8.8.1" +"acorn@npm:^8.15.0": + version: 8.15.0 + resolution: "acorn@npm:8.15.0" bin: acorn: bin/acorn - checksum: 4079b67283b94935157698831967642f24a075c52ce3feaaaafe095776dfbe15d86a1b33b1e53860fc0d062ed6c83f4284a5c87c85b9ad51853a01173da6097f + checksum: 309c6b49aedf1a2e34aaf266de06de04aab6eb097c02375c66fdeb0f64556a6a823540409914fb364d9a11bc30d79d485a2eba29af47992d3490e9886c4391c3 languageName: node linkType: hard @@ -3738,7 +4030,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.10.0, ajv@npm:^6.12.4": +"ajv@npm:^6.12.4": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -3829,6 +4121,13 @@ __metadata: languageName: node linkType: hard +"are-docs-informative@npm:^0.0.2": + version: 0.0.2 + resolution: "are-docs-informative@npm:0.0.2" + checksum: 7a48ca90d66e29afebc4387d7029d86cfe97bad7e796c8e7de01309e02dcfc027250231c02d4ca208d2984170d09026390b946df5d3d02ac638ab35f74501c74 + languageName: node + linkType: hard + "are-we-there-yet@npm:^3.0.0": version: 3.0.0 resolution: "are-we-there-yet@npm:3.0.0" @@ -3862,38 +4161,6 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.4": - version: 3.1.5 - resolution: "array-includes@npm:3.1.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.19.5 - get-intrinsic: ^1.1.1 - is-string: ^1.0.7 - checksum: f6f24d834179604656b7bec3e047251d5cc87e9e87fab7c175c61af48e80e75acd296017abcde21fb52292ab6a2a449ab2ee37213ee48c8709f004d75983f9c5 - languageName: node - linkType: hard - -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - -"array.prototype.flat@npm:^1.2.5": - version: 1.3.0 - resolution: "array.prototype.flat@npm:1.3.0" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.2 - es-shim-unscopables: ^1.0.0 - checksum: 2a652b3e8dc0bebb6117e42a5ab5738af0203a14c27341d7bb2431467bdb4b348e2c5dc555dfcda8af0a5e4075c400b85311ded73861c87290a71a17c3e0a257 - languageName: node - linkType: hard - "babel-jest@npm:^29.7.0": version: 29.7.0 resolution: "babel-jest@npm:29.7.0" @@ -4196,16 +4463,6 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" - dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 - languageName: node - linkType: hard - "call-bound@npm:^1.0.2": version: 1.0.3 resolution: "call-bound@npm:1.0.3" @@ -4443,10 +4700,10 @@ __metadata: languageName: node linkType: hard -"comment-parser@npm:1.3.1": - version: 1.3.1 - resolution: "comment-parser@npm:1.3.1" - checksum: 421e6a113a3afd548500e7174ab46a2049dccf92e82bbaa3b209031b1bdf97552aabfa1ae2a120c0b62df17e1ba70e0d8b05d68504fee78e1ef974c59bcfe718 +"comment-parser@npm:1.4.1, comment-parser@npm:^1.4.1": + version: 1.4.1 + resolution: "comment-parser@npm:1.4.1" + checksum: e0f6f60c5139689c4b1b208ea63e0730d9195a778e90dd909205f74f00b39eb0ead05374701ec5e5c29d6f28eb778cd7bc41c1366ab1d271907f1def132d6bf1 languageName: node linkType: hard @@ -4545,7 +4802,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -4556,6 +4813,17 @@ __metadata: languageName: node linkType: hard +"cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: ^3.1.0 + shebang-command: ^2.0.0 + which: ^2.0.1 + checksum: 8d306efacaf6f3f60e0224c287664093fa9185680b2d195852ba9a863f85d02dcc737094c6e512175f8ee0161f9b87c73c6826034c2422e39de7d6569cf4503b + languageName: node + linkType: hard + "csstype@npm:^3.0.2": version: 3.1.3 resolution: "csstype@npm:3.1.3" @@ -4563,7 +4831,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.6.9": +"debug@npm:2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -4584,15 +4852,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:^3.2.7": - version: 3.2.7 - resolution: "debug@npm:3.2.7" - dependencies: - ms: ^2.1.1 - checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c - languageName: node - linkType: hard - "debug@npm:^4.0.0, debug@npm:^4.3.1": version: 4.4.0 resolution: "debug@npm:4.4.0" @@ -4605,6 +4864,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.4.0, debug@npm:^4.4.1": + version: 4.4.3 + resolution: "debug@npm:4.4.3" + dependencies: + ms: ^2.1.3 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 4805abd570e601acdca85b6aa3757186084a45cff9b2fa6eee1f3b173caa776b45f478b2a71a572d616d2010cea9211d0ac4a02a610e4c18ac4324bde3760834 + languageName: node + linkType: hard + "decode-named-character-reference@npm:^1.0.0": version: 1.0.2 resolution: "decode-named-character-reference@npm:1.0.2" @@ -4664,16 +4935,6 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": - version: 1.1.4 - resolution: "define-properties@npm:1.1.4" - dependencies: - has-property-descriptors: ^1.0.0 - object-keys: ^1.1.1 - checksum: ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b - languageName: node - linkType: hard - "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" @@ -4771,24 +5032,6 @@ __metadata: languageName: node linkType: hard -"doctrine@npm:^2.1.0": - version: 2.1.0 - resolution: "doctrine@npm:2.1.0" - dependencies: - esutils: ^2.0.2 - checksum: a45e277f7feaed309fe658ace1ff286c6e2002ac515af0aaf37145b8baa96e49899638c7cd47dccf84c3d32abfc113246625b3ac8f552d1046072adee13b0dc8 - languageName: node - linkType: hard - -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - "dunder-proto@npm:^1.0.1": version: 1.0.1 resolution: "dunder-proto@npm:1.0.1" @@ -4872,6 +5115,16 @@ __metadata: languageName: node linkType: hard +"enhanced-resolve@npm:^5.17.1": + version: 5.18.3 + resolution: "enhanced-resolve@npm:5.18.3" + dependencies: + graceful-fs: ^4.2.4 + tapable: ^2.2.0 + checksum: e2b2188a7f9b68616984b5ce1f43b97bef3c5fde4d193c24ea4cfdb4eb784a700093f049f14155733a3cb3ae1204550590aa37dda7e742022c8f447f618a4816 + languageName: node + linkType: hard + "enhanced-resolve@npm:^5.18.1": version: 5.18.1 resolution: "enhanced-resolve@npm:5.18.1" @@ -4905,37 +5158,6 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.19.2, es-abstract@npm:^1.19.5": - version: 1.20.1 - resolution: "es-abstract@npm:1.20.1" - dependencies: - call-bind: ^1.0.2 - es-to-primitive: ^1.2.1 - function-bind: ^1.1.1 - function.prototype.name: ^1.1.5 - get-intrinsic: ^1.1.1 - get-symbol-description: ^1.0.0 - has: ^1.0.3 - has-property-descriptors: ^1.0.0 - has-symbols: ^1.0.3 - internal-slot: ^1.0.3 - is-callable: ^1.2.4 - is-negative-zero: ^2.0.2 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.2 - is-string: ^1.0.7 - is-weakref: ^1.0.2 - object-inspect: ^1.12.0 - object-keys: ^1.1.1 - object.assign: ^4.1.2 - regexp.prototype.flags: ^1.4.3 - string.prototype.trimend: ^1.0.5 - string.prototype.trimstart: ^1.0.5 - unbox-primitive: ^1.0.2 - checksum: 28da27ae0ed9c76df7ee8ef5c278df79dcfdb554415faf7068bb7c58f8ba8e2a16bfb59e586844be6429ab4c302ca7748979d48442224cb1140b051866d74b7f - languageName: node - linkType: hard - "es-define-property@npm:^1.0.1": version: 1.0.1 resolution: "es-define-property@npm:1.0.1" @@ -4959,26 +5181,6 @@ __metadata: languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0": - version: 1.0.0 - resolution: "es-shim-unscopables@npm:1.0.0" - dependencies: - has: ^1.0.3 - checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1 - languageName: node - linkType: hard - -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" - dependencies: - is-callable: ^1.1.4 - is-date-object: ^1.0.1 - is-symbol: ^1.0.2 - checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed - languageName: node - linkType: hard - "esbuild@npm:^0.25.0": version: 0.25.0 resolution: "esbuild@npm:0.25.0" @@ -5184,6 +5386,17 @@ __metadata: languageName: node linkType: hard +"eslint-compat-utils@npm:^0.5.1": + version: 0.5.1 + resolution: "eslint-compat-utils@npm:0.5.1" + dependencies: + semver: ^7.5.4 + peerDependencies: + eslint: ">=6.0.0" + checksum: beccf2a5bd7c7974e3584b269f8a02667c83bca64cfd4c866f3055867f187e78b00ee826721765bdee9b13efaaa248f8068c581f7bb05803e8f47abb116e68fc + languageName: node + linkType: hard + "eslint-config-prettier@npm:^9.1.0": version: 9.1.0 resolution: "eslint-config-prettier@npm:9.1.0" @@ -5195,23 +5408,55 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.6": - version: 0.3.6 - resolution: "eslint-import-resolver-node@npm:0.3.6" +"eslint-import-context@npm:^0.1.9": + version: 0.1.9 + resolution: "eslint-import-context@npm:0.1.9" dependencies: - debug: ^3.2.7 - resolve: ^1.20.0 - checksum: 6266733af1e112970e855a5bcc2d2058fb5ae16ad2a6d400705a86b29552b36131ffc5581b744c23d550de844206fb55e9193691619ee4dbf225c4bde526b1c8 + get-tsconfig: ^4.10.1 + stable-hash-x: ^0.2.0 + peerDependencies: + unrs-resolver: ^1.0.0 + peerDependenciesMeta: + unrs-resolver: + optional: true + checksum: f0778126bb3aae57c8c68946c71c4418927e9d39f72099b799d9c47a3b5712d6c9166b63ee8be58a020961dcc9216df09c856b825336af375ccbbdeedfc82a99 languageName: node linkType: hard -"eslint-module-utils@npm:^2.7.3": - version: 2.7.3 - resolution: "eslint-module-utils@npm:2.7.3" +"eslint-import-resolver-typescript@npm:^3.8.3": + version: 3.10.1 + resolution: "eslint-import-resolver-typescript@npm:3.10.1" dependencies: - debug: ^3.2.7 - find-up: ^2.1.0 - checksum: 77048263f309167a1e6a1e1b896bfb5ddd1d3859b2e2abbd9c32c432aee13d610d46e6820b1ca81b37fba437cf423a404bc6649be64ace9148a3062d1886a678 + "@nolyfill/is-core-module": 1.0.39 + debug: ^4.4.0 + get-tsconfig: ^4.10.0 + is-bun-module: ^2.0.0 + stable-hash: ^0.0.5 + tinyglobby: ^0.2.13 + unrs-resolver: ^1.6.2 + peerDependencies: + eslint: "*" + eslint-plugin-import: "*" + eslint-plugin-import-x: "*" + peerDependenciesMeta: + eslint-plugin-import: + optional: true + eslint-plugin-import-x: + optional: true + checksum: 57acb58fe28257024236b52ebfe6a3d2e3970a88002e02e771ff327c850c76b2a6b90175b54a980e9efe4787ac09bafe53cb3ebabf3fd165d3ff2a80b2d7e50d + languageName: node + linkType: hard + +"eslint-plugin-es-x@npm:^7.8.0": + version: 7.8.0 + resolution: "eslint-plugin-es-x@npm:7.8.0" + dependencies: + "@eslint-community/eslint-utils": ^4.1.2 + "@eslint-community/regexpp": ^4.11.0 + eslint-compat-utils: ^0.5.1 + peerDependencies: + eslint: ">=8" + checksum: c30fc6bd94f86781eaf34dec59e7d52ee68b8a12305ae76222d8d0ff6cc0a5c94e8306ed079b4234d64f7464bcd162a5fef59e7cc69a978ba77950e0395c79f8 languageName: node linkType: hard @@ -5227,60 +5472,86 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-import@npm:^2.26.0": - version: 2.26.0 - resolution: "eslint-plugin-import@npm:2.26.0" +"eslint-plugin-import-x@npm:^4.6.1": + version: 4.16.1 + resolution: "eslint-plugin-import-x@npm:4.16.1" dependencies: - array-includes: ^3.1.4 - array.prototype.flat: ^1.2.5 - debug: ^2.6.9 - doctrine: ^2.1.0 - eslint-import-resolver-node: ^0.3.6 - eslint-module-utils: ^2.7.3 - has: ^1.0.3 - is-core-module: ^2.8.1 + "@typescript-eslint/types": ^8.35.0 + comment-parser: ^1.4.1 + debug: ^4.4.1 + eslint-import-context: ^0.1.9 is-glob: ^4.0.3 - minimatch: ^3.1.2 - object.values: ^1.1.5 - resolve: ^1.22.0 - tsconfig-paths: ^3.14.1 - peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 0bf77ad80339554481eafa2b1967449e1f816b94c7a6f9614ce33fb4083c4e6c050f10d241dd50b4975d47922880a34de1e42ea9d8e6fd663ebb768baa67e655 + minimatch: ^9.0.3 || ^10.0.1 + semver: ^7.7.2 + stable-hash-x: ^0.2.0 + unrs-resolver: ^1.9.2 + peerDependencies: + "@typescript-eslint/utils": ^8.0.0 + eslint: ^8.57.0 || ^9.0.0 + eslint-import-resolver-node: "*" + peerDependenciesMeta: + "@typescript-eslint/utils": + optional: true + eslint-import-resolver-node: + optional: true + checksum: d54cf676c65c9ae9a897b91d17ea3f26ee0139bb9b5d09e3bebb513ca4ad53ababa09e00052564f1634e3a81494233d029f95ecc17b697993d130e5e1979f92a languageName: node linkType: hard -"eslint-plugin-jest@npm:^26.9.0": - version: 26.9.0 - resolution: "eslint-plugin-jest@npm:26.9.0" +"eslint-plugin-jest@npm:^28.11.0": + version: 28.14.0 + resolution: "eslint-plugin-jest@npm:28.14.0" dependencies: - "@typescript-eslint/utils": ^5.10.0 + "@typescript-eslint/utils": ^6.0.0 || ^7.0.0 || ^8.0.0 peerDependencies: - "@typescript-eslint/eslint-plugin": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + "@typescript-eslint/eslint-plugin": ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + jest: "*" peerDependenciesMeta: "@typescript-eslint/eslint-plugin": optional: true jest: optional: true - checksum: 6d5fd5c95368f1ca2640389aeb7ce703d6202493c3ec6bdedb4eaca37233710508b0c75829e727765a16fd27029a466d34202bc7f2811c752038ccbbce224400 + checksum: 7daeb0ebc360ba159474246cef8ea7f0a3e020652571d948022af73bec7a53dd436b48de81332fd4d5d5556ef1046cec0e6a2213287a461e4e81390ce76ad2e7 languageName: node linkType: hard -"eslint-plugin-jsdoc@npm:^39.6.2": - version: 39.6.2 - resolution: "eslint-plugin-jsdoc@npm:39.6.2" +"eslint-plugin-jsdoc@npm:^50.6.3": + version: 50.8.0 + resolution: "eslint-plugin-jsdoc@npm:50.8.0" dependencies: - "@es-joy/jsdoccomment": ~0.36.0 - comment-parser: 1.3.1 - debug: ^4.3.4 + "@es-joy/jsdoccomment": ~0.50.2 + are-docs-informative: ^0.0.2 + comment-parser: 1.4.1 + debug: ^4.4.1 escape-string-regexp: ^4.0.0 - esquery: ^1.4.0 - semver: ^7.3.8 - spdx-expression-parse: ^3.0.1 + espree: ^10.3.0 + esquery: ^1.6.0 + parse-imports-exports: ^0.2.4 + semver: ^7.7.2 + spdx-expression-parse: ^4.0.0 peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - checksum: 613c541a644d441e5465139b2a1934842a29c701fb89f0380f105be28180c1fa2f3c08b421b134b87fef194d4fb4dab4006a972a084e476eebb14cf5bb9399fe + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + checksum: 79512f79f0d707c998ff24b74db3e87594bb2716f30e30c0e67941f71a0ab47114a5f792b5fa00d33d97ef349e1c276898e8bfed28e068695623db81c8114b77 + languageName: node + linkType: hard + +"eslint-plugin-n@npm:^17.15.1": + version: 17.23.1 + resolution: "eslint-plugin-n@npm:17.23.1" + dependencies: + "@eslint-community/eslint-utils": ^4.5.0 + enhanced-resolve: ^5.17.1 + eslint-plugin-es-x: ^7.8.0 + get-tsconfig: ^4.8.1 + globals: ^15.11.0 + globrex: ^0.1.2 + ignore: ^5.3.2 + semver: ^7.6.3 + ts-declaration-location: ^1.0.6 + peerDependencies: + eslint: ">=8.23.0" + checksum: fb3fe778f999ea22fd4a41b8eb9ac8487add4e79ea99d722b41c7777588baae76f691d9909b1b141de639e8a08f22648aa83a4c88ec2c7269ea049993f6ed8cf languageName: node linkType: hard @@ -5320,23 +5591,24 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" +"eslint-plugin-promise@npm:^7.2.1": + version: 7.2.1 + resolution: "eslint-plugin-promise@npm:7.2.1" dependencies: - esrecurse: ^4.3.0 - estraverse: ^4.1.1 - checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb + "@eslint-community/eslint-utils": ^4.4.0 + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 + checksum: 9101a93efd79f5202d0239d7666935c1d5655f64f4527cea6e82e1438b4de4304351de60f2c26201289a22eed1da4b3a21e7996fa3268b9943b98d12c80b2030 languageName: node linkType: hard -"eslint-scope@npm:^7.2.0": - version: 7.2.0 - resolution: "eslint-scope@npm:7.2.0" +"eslint-scope@npm:^8.4.0": + version: 8.4.0 + resolution: "eslint-scope@npm:8.4.0" dependencies: esrecurse: ^4.3.0 estraverse: ^5.2.0 - checksum: 64591a2d8b244ade9c690b59ef238a11d5c721a98bcee9e9f445454f442d03d3e04eda88e95a4daec558220a99fa384309d9faae3d459bd40e7a81b4063980ae + checksum: cf88f42cd5e81490d549dc6d350fe01e6fe420f9d9ea34f134bb359b030e3c4ef888d36667632e448937fe52449f7181501df48c08200e3d3b0fee250d05364e languageName: node linkType: hard @@ -5356,71 +5628,77 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.0": - version: 3.4.0 - resolution: "eslint-visitor-keys@npm:3.4.0" - checksum: 33159169462d3989321a1ec1e9aaaf6a24cc403d5d347e9886d1b5bfe18ffa1be73bdc6203143a28a606b142b1af49787f33cff0d6d0813eb5f2e8d2e1a6043c +"eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60 languageName: node linkType: hard -"eslint@npm:^8.27.0": - version: 8.39.0 - resolution: "eslint@npm:8.39.0" +"eslint-visitor-keys@npm:^4.2.1": + version: 4.2.1 + resolution: "eslint-visitor-keys@npm:4.2.1" + checksum: 3a77e3f99a49109f6fb2c5b7784bc78f9743b834d238cdba4d66c602c6b52f19ed7bcd0a5c5dbbeae3a8689fd785e76c001799f53d2228b278282cf9f699fff5 + languageName: node + linkType: hard + +"eslint@npm:^9.21.0": + version: 9.39.1 + resolution: "eslint@npm:9.39.1" dependencies: - "@eslint-community/eslint-utils": ^4.2.0 - "@eslint-community/regexpp": ^4.4.0 - "@eslint/eslintrc": ^2.0.2 - "@eslint/js": 8.39.0 - "@humanwhocodes/config-array": ^0.11.8 + "@eslint-community/eslint-utils": ^4.8.0 + "@eslint-community/regexpp": ^4.12.1 + "@eslint/config-array": ^0.21.1 + "@eslint/config-helpers": ^0.4.2 + "@eslint/core": ^0.17.0 + "@eslint/eslintrc": ^3.3.1 + "@eslint/js": 9.39.1 + "@eslint/plugin-kit": ^0.4.1 + "@humanfs/node": ^0.16.6 "@humanwhocodes/module-importer": ^1.0.1 - "@nodelib/fs.walk": ^1.2.8 - ajv: ^6.10.0 + "@humanwhocodes/retry": ^0.4.2 + "@types/estree": ^1.0.6 + ajv: ^6.12.4 chalk: ^4.0.0 - cross-spawn: ^7.0.2 + cross-spawn: ^7.0.6 debug: ^4.3.2 - doctrine: ^3.0.0 escape-string-regexp: ^4.0.0 - eslint-scope: ^7.2.0 - eslint-visitor-keys: ^3.4.0 - espree: ^9.5.1 - esquery: ^1.4.2 + eslint-scope: ^8.4.0 + eslint-visitor-keys: ^4.2.1 + espree: ^10.4.0 + esquery: ^1.5.0 esutils: ^2.0.2 fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 + file-entry-cache: ^8.0.0 find-up: ^5.0.0 glob-parent: ^6.0.2 - globals: ^13.19.0 - grapheme-splitter: ^1.0.4 ignore: ^5.2.0 - import-fresh: ^3.0.0 imurmurhash: ^0.1.4 is-glob: ^4.0.0 - is-path-inside: ^3.0.3 - js-sdsl: ^4.1.4 - js-yaml: ^4.1.0 json-stable-stringify-without-jsonify: ^1.0.1 - levn: ^0.4.1 lodash.merge: ^4.6.2 minimatch: ^3.1.2 natural-compare: ^1.4.0 - optionator: ^0.9.1 - strip-ansi: ^6.0.1 - strip-json-comments: ^3.1.0 - text-table: ^0.2.0 + optionator: ^0.9.3 + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true bin: eslint: bin/eslint.js - checksum: d7a074ff326e7ea482500dc0427a7d4b0260460f0f812d19b46b1cca681806b67309f23da9d17cd3de8eb74dd3c14cb549c4d58b05b140564d14cc1a391122a0 + checksum: 35583d4d93f431ea2716e18c912e0b10980e27377a89d2c644a3a755921e42a2665dfd7367b8e9b54c7e4e9f193dea4126ce503c866f5795b170934ffd3f1dd9 languageName: node linkType: hard -"espree@npm:^9.5.1": - version: 9.5.1 - resolution: "espree@npm:9.5.1" +"espree@npm:^10.0.1, espree@npm:^10.3.0, espree@npm:^10.4.0": + version: 10.4.0 + resolution: "espree@npm:10.4.0" dependencies: - acorn: ^8.8.0 + acorn: ^8.15.0 acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.4.0 - checksum: cdf6e43540433d917c4f2ee087c6e987b2063baa85a1d9cdaf51533d78275ebd5910c42154e7baf8e3e89804b386da0a2f7fad2264d8f04420e7506bf87b3b88 + eslint-visitor-keys: ^4.2.1 + checksum: 5f9d0d7c81c1bca4bfd29a55270067ff9d575adb8c729a5d7f779c2c7b910bfc68ccf8ec19b29844b707440fc159a83868f22c8e87bbf7cbcb225ed067df6c85 languageName: node linkType: hard @@ -5434,12 +5712,12 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.0, esquery@npm:^1.4.2": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" +"esquery@npm:^1.5.0, esquery@npm:^1.6.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: estraverse: ^5.1.0 - checksum: aefb0d2596c230118656cd4ec7532d447333a410a48834d80ea648b1e7b5c9bc9ed8b5e33a89cb04e487b60d622f44cf5713bf4abed7c97343edefdc84a35900 + checksum: 08ec4fe446d9ab27186da274d979558557fbdbbd10968fa9758552482720c54152a5640e08b9009e5a30706b66aba510692054d4129d32d0e12e05bbc0b96fb2 languageName: node linkType: hard @@ -5452,13 +5730,6 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 - languageName: node - linkType: hard - "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" @@ -5620,7 +5891,7 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0": +"fast-glob@npm:^3.3.0": version: 3.3.2 resolution: "fast-glob@npm:3.3.2" dependencies: @@ -5665,6 +5936,18 @@ __metadata: languageName: node linkType: hard +"fdir@npm:^6.5.0": + version: 6.5.0 + resolution: "fdir@npm:6.5.0" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: bd537daa9d3cd53887eed35efa0eab2dbb1ca408790e10e024120e7a36c6e9ae2b33710cb8381e35def01bc9c1d7eaba746f886338413e68ff6ebaee07b9a6e8 + languageName: node + linkType: hard + "figures@npm:^3.2.0": version: 3.2.0 resolution: "figures@npm:3.2.0" @@ -5674,12 +5957,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + flat-cache: ^4.0.0 + checksum: f67802d3334809048c69b3d458f672e1b6d26daefda701761c81f203b80149c35dea04d78ea4238969dd617678e530876722a0634c43031a0957f10cc3ed190f languageName: node linkType: hard @@ -5707,15 +5990,6 @@ __metadata: languageName: node linkType: hard -"find-up@npm:^2.1.0": - version: 2.1.0 - resolution: "find-up@npm:2.1.0" - dependencies: - locate-path: ^2.0.0 - checksum: 43284fe4da09f89011f08e3c32cd38401e786b19226ea440b75386c1b12a4cb738c94969808d53a84f564ede22f732c8409e3cfc3f7fb5b5c32378ad0bbf28bd - languageName: node - linkType: hard - "find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -5736,20 +6010,20 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" dependencies: - flatted: ^3.1.0 - rimraf: ^3.0.2 - checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 + flatted: ^3.2.9 + keyv: ^4.5.4 + checksum: 899fc86bf6df093547d76e7bfaeb900824b869d7d457d02e9b8aae24836f0a99fbad79328cfd6415ee8908f180699bf259dc7614f793447cb14f707caf5996f6 languageName: node linkType: hard -"flatted@npm:^3.1.0": - version: 3.2.6 - resolution: "flatted@npm:3.2.6" - checksum: 33b87aa88dfa40ca6ee31d7df61712bbbad3d3c05c132c23e59b9b61d34631b337a18ff2b8dc5553acdc871ec72b741e485f78969cf006124a3f57174de29a0e +"flatted@npm:^3.2.9": + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 8c96c02fbeadcf4e8ffd0fa24983241e27698b0781295622591fc13585e2f226609d95e422bcf2ef044146ffacb6b68b1f20871454eddf75ab3caa6ee5f4a1fe languageName: node linkType: hard @@ -5821,32 +6095,13 @@ __metadata: languageName: node linkType: hard -"function-bind@npm:^1.1.1, function-bind@npm:^1.1.2": +"function-bind@npm:^1.1.2": version: 1.1.2 resolution: "function-bind@npm:1.1.2" checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5": - version: 1.1.5 - resolution: "function.prototype.name@npm:1.1.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.0 - functions-have-names: ^1.2.2 - checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 - languageName: node - linkType: hard - -"functions-have-names@npm:^1.2.2": - version: 1.2.3 - resolution: "functions-have-names@npm:1.2.3" - checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 - languageName: node - linkType: hard - "gauge@npm:^4.0.3": version: 4.0.4 resolution: "gauge@npm:4.0.4" @@ -5877,17 +6132,6 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1": - version: 1.1.2 - resolution: "get-intrinsic@npm:1.1.2" - dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 - has-symbols: ^1.0.3 - checksum: 252f45491f2ba88ebf5b38018020c7cc3279de54b1d67ffb70c0cdf1dfa8ab31cd56467b5d117a8b4275b7a4dde91f86766b163a17a850f036528a7b2faafb2b - languageName: node - linkType: hard - "get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6": version: 1.2.7 resolution: "get-intrinsic@npm:1.2.7" @@ -5944,13 +6188,12 @@ __metadata: languageName: node linkType: hard -"get-symbol-description@npm:^1.0.0": - version: 1.0.0 - resolution: "get-symbol-description@npm:1.0.0" +"get-tsconfig@npm:^4.10.0, get-tsconfig@npm:^4.10.1, get-tsconfig@npm:^4.8.1": + version: 4.13.0 + resolution: "get-tsconfig@npm:4.13.0" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + resolve-pkg-maps: ^1.0.0 + checksum: b3cfa1316dd8842e038f6a3dc02ae87d9f3a227f14b79ac4b1c81bf6fc75de4dfc3355c4117612e183f5147dad49c8132841c7fdd7a4508531d820a9b90acc51 languageName: node linkType: hard @@ -6050,26 +6293,17 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.19.0": - version: 13.20.0 - resolution: "globals@npm:13.20.0" - dependencies: - type-fest: ^0.20.2 - checksum: ad1ecf914bd051325faad281d02ea2c0b1df5d01bd94d368dcc5513340eac41d14b3c61af325768e3c7f8d44576e72780ec0b6f2d366121f8eec6e03c3a3b97a +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 534b8216736a5425737f59f6e6a5c7f386254560c9f41d24a9227d60ee3ad4a9e82c5b85def0e212e9d92162f83a92544be4c7fd4c902cb913736c10e08237ac languageName: node linkType: hard -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - dependencies: - array-union: ^2.1.0 - dir-glob: ^3.0.1 - fast-glob: ^3.2.9 - ignore: ^5.2.0 - merge2: ^1.4.1 - slash: ^3.0.0 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 +"globals@npm:^15.11.0, globals@npm:^15.9.0": + version: 15.15.0 + resolution: "globals@npm:15.15.0" + checksum: a2a92199a112db00562a2f85eeef2a7e3943e171f7f7d9b17dfa9231e35fd612588f3c199d1509ab1757273467e413b08c80424cf6e399e96acdaf93deb3ee88 languageName: node linkType: hard @@ -6086,6 +6320,13 @@ __metadata: languageName: node linkType: hard +"globrex@npm:^0.1.2": + version: 0.1.2 + resolution: "globrex@npm:0.1.2" + checksum: adca162494a176ce9ecf4dd232f7b802956bb1966b37f60c15e49d2e7d961b66c60826366dc2649093cad5a0d69970cfa8875bd1695b5a1a2f33dcd2aa88da3c + languageName: node + linkType: hard + "gopd@npm:^1.2.0": version: 1.2.0 resolution: "gopd@npm:1.2.0" @@ -6107,27 +6348,6 @@ __metadata: languageName: node linkType: hard -"grapheme-splitter@npm:^1.0.4": - version: 1.0.4 - resolution: "grapheme-splitter@npm:1.0.4" - checksum: 0c22ec54dee1b05cd480f78cf14f732cb5b108edc073572c4ec205df4cd63f30f8db8025afc5debc8835a8ddeacf648a1c7992fe3dcd6ad38f9a476d84906620 - languageName: node - linkType: hard - -"graphemer@npm:^1.4.0": - version: 1.4.0 - resolution: "graphemer@npm:1.4.0" - checksum: bab8f0be9b568857c7bec9fda95a89f87b783546d02951c40c33f84d05bb7da3fd10f863a9beb901463669b6583173a8c8cc6d6b306ea2b9b9d5d3d943c3a673 - languageName: node - linkType: hard - -"has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": - version: 1.0.2 - resolution: "has-bigints@npm:1.0.2" - checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b - languageName: node - linkType: hard - "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -6142,35 +6362,10 @@ __metadata: languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" - dependencies: - get-intrinsic: ^1.1.1 - checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb - languageName: node - linkType: hard - -"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 - languageName: node - linkType: hard - "has-symbols@npm:^1.1.0": version: 1.1.0 - resolution: "has-symbols@npm:1.1.0" - checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b - languageName: node - linkType: hard - -"has-tostringtag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-tostringtag@npm:1.0.0" - dependencies: - has-symbols: ^1.0.2 - checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c + resolution: "has-symbols@npm:1.1.0" + checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b languageName: node linkType: hard @@ -6181,15 +6376,6 @@ __metadata: languageName: node linkType: hard -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" - dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 - languageName: node - linkType: hard - "hasown@npm:^2.0.0": version: 2.0.0 resolution: "hasown@npm:2.0.0" @@ -6365,14 +6551,21 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.1.1, ignore@npm:^5.2.0, ignore@npm:^5.2.4": +"ignore@npm:^5.1.1, ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.2": version: 5.3.2 resolution: "ignore@npm:5.3.2" checksum: 2acfd32a573260ea522ea0bfeff880af426d68f6831f973129e2ba7363f422923cf53aab62f8369cbf4667c7b25b6f8a3761b34ecdb284ea18e87a5262a865be languageName: node linkType: hard -"import-fresh@npm:^3.0.0, import-fresh@npm:^3.2.1": +"ignore@npm:^7.0.0": + version: 7.0.5 + resolution: "ignore@npm:7.0.5" + checksum: d0862bf64d3d58bf34d5fb0a9f725bec9ca5ce8cd1aecc8f28034269e8f69b8009ffd79ca3eda96962a6a444687781cd5efdb8c7c8ddc0a6996e36d31c217f14 + languageName: node + linkType: hard + +"import-fresh@npm:^3.2.1": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: @@ -6446,17 +6639,6 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.3": - version: 1.0.3 - resolution: "internal-slot@npm:1.0.3" - dependencies: - get-intrinsic: ^1.1.0 - has: ^1.0.3 - side-channel: ^1.0.4 - checksum: 1944f92e981e47aebc98a88ff0db579fd90543d937806104d0b96557b10c1f170c51fb777b97740a8b6ddeec585fca8c39ae99fd08a8e058dfc8ab70937238bf - languageName: node - linkType: hard - "ip-address@npm:^9.0.5": version: 9.0.5 resolution: "ip-address@npm:9.0.5" @@ -6498,33 +6680,16 @@ __metadata: languageName: node linkType: hard -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" - dependencies: - has-bigints: ^1.0.1 - checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 - languageName: node - linkType: hard - -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" +"is-bun-module@npm:^2.0.0": + version: 2.0.0 + resolution: "is-bun-module@npm:2.0.0" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 - languageName: node - linkType: hard - -"is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": - version: 1.2.4 - resolution: "is-callable@npm:1.2.4" - checksum: 1a28d57dc435797dae04b173b65d6d1e77d4f16276e9eff973f994eadcfdc30a017e6a597f092752a083c1103cceb56c91e3dadc6692fedb9898dfaba701575f + semver: ^7.7.1 + checksum: e75bd87cb1aaff7c97cf085509669559a713f741a43b4fd5979cb44c5c0c16c05670ce5f23fc22337d1379211fac118c525c5ed73544076ddaf181c1c21ace35 languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.8.1": +"is-core-module@npm:^2.13.0": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" dependencies: @@ -6533,15 +6698,6 @@ __metadata: languageName: node linkType: hard -"is-date-object@npm:^1.0.1": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" - dependencies: - has-tostringtag: ^1.0.0 - checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc - languageName: node - linkType: hard - "is-decimal@npm:^2.0.0": version: 2.0.1 resolution: "is-decimal@npm:2.0.1" @@ -6613,22 +6769,6 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.2": - version: 2.0.2 - resolution: "is-negative-zero@npm:2.0.2" - checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a - languageName: node - linkType: hard - -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" - dependencies: - has-tostringtag: ^1.0.0 - checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 - languageName: node - linkType: hard - "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" @@ -6636,13 +6776,6 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - "is-plain-obj@npm:^4.0.0, is-plain-obj@npm:^4.1.0": version: 4.1.0 resolution: "is-plain-obj@npm:4.1.0" @@ -6650,25 +6783,6 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" - dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 - languageName: node - linkType: hard - -"is-shared-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "is-shared-array-buffer@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a - languageName: node - linkType: hard - "is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" @@ -6683,33 +6797,6 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" - dependencies: - has-tostringtag: ^1.0.0 - checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 - languageName: node - linkType: hard - -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" - dependencies: - has-symbols: ^1.0.2 - checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 - languageName: node - linkType: hard - -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de - languageName: node - linkType: hard - "is-wsl@npm:^3.1.0": version: 3.1.0 resolution: "is-wsl@npm:3.1.0" @@ -7281,13 +7368,6 @@ __metadata: languageName: node linkType: hard -"js-sdsl@npm:^4.1.4": - version: 4.1.5 - resolution: "js-sdsl@npm:4.1.5" - checksum: 695f657ddc5be462b97cac4e8e60f37de28d628ee0e23016baecff0bb584a18dddb5caeac537a775030f180b5afd62133ac4481e7024c8d03a62d73e4da0713e - languageName: node - linkType: hard - "js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -7307,14 +7387,14 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^4.1.0": - version: 4.1.0 - resolution: "js-yaml@npm:4.1.0" +"js-yaml@npm:^4.1.1": + version: 4.1.1 + resolution: "js-yaml@npm:4.1.1" dependencies: argparse: ^2.0.1 bin: js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a + checksum: ea2339c6930fe048ec31b007b3c90be2714ab3e7defcc2c27ebf30c74fd940358f29070b4345af0019ef151875bf3bc3f8644bea1bab0372652b5044813ac02d languageName: node linkType: hard @@ -7325,10 +7405,10 @@ __metadata: languageName: node linkType: hard -"jsdoc-type-pratt-parser@npm:~3.1.0": - version: 3.1.0 - resolution: "jsdoc-type-pratt-parser@npm:3.1.0" - checksum: 2f437b57621f1e481918165f6cf0e48256628a9e510d8b3f88a2ab667bf2128bf8b94c628b57c43e78f555ca61983e9c282814703840dc091d2623992214a061 +"jsdoc-type-pratt-parser@npm:~4.1.0": + version: 4.1.0 + resolution: "jsdoc-type-pratt-parser@npm:4.1.0" + checksum: e7642a508b090b1bdf17775383000ed71013c38e1231c1e576e5374636e8baf7c3fae8bf0252f5e1d3397d95efd56e8c8a5dd1a0de76d05d1499cbcb3c325bc3 languageName: node linkType: hard @@ -7359,6 +7439,13 @@ __metadata: languageName: node linkType: hard +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 9026b03edc2847eefa2e37646c579300a1f3a4586cfb62bf857832b60c852042d0d6ae55d1afb8926163fa54c2b01d83ae24705f34990348bdac6273a29d4581 + languageName: node + linkType: hard + "json-parse-even-better-errors@npm:^2.3.0": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" @@ -7387,17 +7474,6 @@ __metadata: languageName: node linkType: hard -"json5@npm:^1.0.1": - version: 1.0.2 - resolution: "json5@npm:1.0.2" - dependencies: - minimist: ^1.2.0 - bin: - json5: lib/cli.js - checksum: 866458a8c58a95a49bef3adba929c625e82532bcff1fe93f01d29cb02cac7c3fe1f4b79951b7792c2da9de0b32871a8401a6e3c5b36778ad852bf5b8a61165d7 - languageName: node - linkType: hard - "json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" @@ -7407,6 +7483,15 @@ __metadata: languageName: node linkType: hard +"keyv@npm:^4.5.4": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: 3.0.1 + checksum: 74a24395b1c34bd44ad5cb2b49140d087553e170625240b86755a6604cd65aa16efdbdeae5cdb17ba1284a0fbb25ad06263755dbc71b8d8b06f74232ce3cdd72 + languageName: node + linkType: hard + "kleur@npm:^3.0.3": version: 3.0.3 resolution: "kleur@npm:3.0.3" @@ -7548,16 +7633,6 @@ __metadata: languageName: node linkType: hard -"locate-path@npm:^2.0.0": - version: 2.0.0 - resolution: "locate-path@npm:2.0.0" - dependencies: - p-locate: ^2.0.0 - path-exists: ^3.0.0 - checksum: 02d581edbbbb0fa292e28d96b7de36b5b62c2fa8b5a7e82638ebb33afa74284acf022d3b1e9ae10e3ffb7658fbc49163fcd5e76e7d1baaa7801c3e05a81da755 - languageName: node - linkType: hard - "locate-path@npm:^5.0.0": version: 5.0.0 resolution: "locate-path@npm:5.0.0" @@ -8137,7 +8212,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -8164,6 +8239,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^9.0.3 || ^10.0.1": + version: 10.1.1 + resolution: "minimatch@npm:10.1.1" + dependencies: + "@isaacs/brace-expansion": ^5.0.0 + checksum: 8820c0be92994f57281f0a7a2cc4268dcc4b610f9a1ab666685716b4efe4b5898b43c835a8f22298875b31c7a278a5e3b7e253eee7c886546bb0b61fb94bca6b + languageName: node + linkType: hard + "minimatch@npm:^9.0.4": version: 9.0.5 resolution: "minimatch@npm:9.0.5" @@ -8173,13 +8257,6 @@ __metadata: languageName: node linkType: hard -"minimist@npm:^1.2.0, minimist@npm:^1.2.6": - version: 1.2.6 - resolution: "minimist@npm:1.2.6" - checksum: d15428cd1e11eb14e1233bcfb88ae07ed7a147de251441d61158619dfb32c4d7e9061d09cab4825fdee18ecd6fce323228c8c47b5ba7cd20af378ca4048fb3fb - languageName: node - linkType: hard - "minipass-collect@npm:^1.0.2": version: 1.0.2 resolution: "minipass-collect@npm:1.0.2" @@ -8318,7 +8395,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -8350,10 +8427,12 @@ __metadata: languageName: node linkType: hard -"natural-compare-lite@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare-lite@npm:1.4.0" - checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 +"napi-postinstall@npm:^0.3.0": + version: 0.3.4 + resolution: "napi-postinstall@npm:0.3.4" + bin: + napi-postinstall: lib/cli.js + checksum: 01672ae6568e2b3a6d985371f1504a6e1c791aa308b94c9f89736fde8251b7b8ab3227d1a5ede8d0eb0552099e069970b038c6958052c01b2bdc5aae31f0a88c languageName: node linkType: hard @@ -8542,13 +8621,6 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.0, object-inspect@npm:^1.9.0": - version: 1.12.2 - resolution: "object-inspect@npm:1.12.2" - checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 - languageName: node - linkType: hard - "object-inspect@npm:^1.13.3": version: 1.13.4 resolution: "object-inspect@npm:1.13.4" @@ -8556,36 +8628,6 @@ __metadata: languageName: node linkType: hard -"object-keys@npm:^1.1.1": - version: 1.1.1 - resolution: "object-keys@npm:1.1.1" - checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a - languageName: node - linkType: hard - -"object.assign@npm:^4.1.2": - version: 4.1.2 - resolution: "object.assign@npm:4.1.2" - dependencies: - call-bind: ^1.0.0 - define-properties: ^1.1.3 - has-symbols: ^1.0.1 - object-keys: ^1.1.1 - checksum: d621d832ed7b16ac74027adb87196804a500d80d9aca536fccb7ba48d33a7e9306a75f94c1d29cbfa324bc091bfc530bc24789568efdaee6a47fcfa298993814 - languageName: node - linkType: hard - -"object.values@npm:^1.1.5": - version: 1.1.5 - resolution: "object.values@npm:1.1.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.1 - checksum: 0f17e99741ebfbd0fa55ce942f6184743d3070c61bd39221afc929c8422c4907618c8da694c6915bc04a83ab3224260c779ba37fc07bb668bdc5f33b66a902a4 - languageName: node - linkType: hard - "on-finished@npm:2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" @@ -8634,26 +8676,17 @@ __metadata: languageName: node linkType: hard -"optionator@npm:^0.9.1": - version: 0.9.1 - resolution: "optionator@npm:0.9.1" +"optionator@npm:^0.9.3": + version: 0.9.4 + resolution: "optionator@npm:0.9.4" dependencies: deep-is: ^0.1.3 fast-levenshtein: ^2.0.6 levn: ^0.4.1 prelude-ls: ^1.2.1 type-check: ^0.4.0 - word-wrap: ^1.2.3 - checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0 - languageName: node - linkType: hard - -"p-limit@npm:^1.1.0": - version: 1.3.0 - resolution: "p-limit@npm:1.3.0" - dependencies: - p-try: ^1.0.0 - checksum: 281c1c0b8c82e1ac9f81acd72a2e35d402bf572e09721ce5520164e9de07d8274451378a3470707179ad13240535558f4b277f02405ad752e08c7d5b0d54fbfd + word-wrap: ^1.2.5 + checksum: ecbd010e3dc73e05d239976422d9ef54a82a13f37c11ca5911dff41c98a6c7f0f163b27f922c37e7f8340af9d36febd3b6e9cef508f3339d4c393d7276d716bb languageName: node linkType: hard @@ -8675,15 +8708,6 @@ __metadata: languageName: node linkType: hard -"p-locate@npm:^2.0.0": - version: 2.0.0 - resolution: "p-locate@npm:2.0.0" - dependencies: - p-limit: ^1.1.0 - checksum: e2dceb9b49b96d5513d90f715780f6f4972f46987dc32a0e18bc6c3fc74a1a5d73ec5f81b1398af5e58b99ea1ad03fd41e9181c01fa81b4af2833958696e3081 - languageName: node - linkType: hard - "p-locate@npm:^4.1.0": version: 4.1.0 resolution: "p-locate@npm:4.1.0" @@ -8711,13 +8735,6 @@ __metadata: languageName: node linkType: hard -"p-try@npm:^1.0.0": - version: 1.0.0 - resolution: "p-try@npm:1.0.0" - checksum: 3b5303f77eb7722144154288bfd96f799f8ff3e2b2b39330efe38db5dd359e4fb27012464cd85cb0a76e9b7edd1b443568cb3192c22e7cffc34989df0bafd605 - languageName: node - linkType: hard - "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" @@ -8756,6 +8773,15 @@ __metadata: languageName: node linkType: hard +"parse-imports-exports@npm:^0.2.4": + version: 0.2.4 + resolution: "parse-imports-exports@npm:0.2.4" + dependencies: + parse-statements: 1.0.11 + checksum: c0028aef0ac33c3905928973a0222be027e148ffb8950faaae1d2849526dc5c95aa44a4a619dea0e540529ae74e78414c2e2b6b037520e499e970c1059f0c12d + languageName: node + linkType: hard + "parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -8768,6 +8794,13 @@ __metadata: languageName: node linkType: hard +"parse-statements@npm:1.0.11": + version: 1.0.11 + resolution: "parse-statements@npm:1.0.11" + checksum: b7281e5b9e949cbed4cebaf56fb2d30495e5caf0e0ef9b8227e4b4010664db693d4bc694d54d04997f65034ebd569246b6ad454d2cdc3ecbaff69b7bc7b9b068 + languageName: node + linkType: hard + "parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -8775,13 +8808,6 @@ __metadata: languageName: node linkType: hard -"path-exists@npm:^3.0.0": - version: 3.0.0 - resolution: "path-exists@npm:3.0.0" - checksum: 96e92643aa34b4b28d0de1cd2eba52a1c5313a90c6542d03f62750d82480e20bfa62bc865d5cfc6165f5fcd5aeb0851043c40a39be5989646f223300021bae0a - languageName: node - linkType: hard - "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -8862,6 +8888,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.2, picomatch@npm:^4.0.3": + version: 4.0.3 + resolution: "picomatch@npm:4.0.3" + checksum: 6817fb74eb745a71445debe1029768de55fd59a42b75606f478ee1d0dc1aa6e78b711d041a7c9d5550e042642029b7f373dc1a43b224c4b7f12d23436735dba0 + languageName: node + linkType: hard + "pirates@npm:^4.0.4": version: 4.0.5 resolution: "pirates@npm:4.0.5" @@ -9150,17 +9183,6 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.4.3": - version: 1.4.3 - resolution: "regexp.prototype.flags@npm:1.4.3" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - functions-have-names: ^1.2.2 - checksum: 51228bae732592adb3ededd5e15426be25f289e9c4ef15212f4da73f4ec3919b6140806374b8894036a86020d054a8d2657d3fee6bb9b4d35d8939c20030b7a6 - languageName: node - linkType: hard - "regexpp@npm:^3.0.0": version: 3.2.0 resolution: "regexpp@npm:3.2.0" @@ -9262,7 +9284,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:1.22.8, resolve@npm:^1.10.1, resolve@npm:^1.14.2, resolve@npm:^1.20.0, resolve@npm:^1.22.0": +"resolve@npm:1.22.8, resolve@npm:^1.10.1, resolve@npm:^1.14.2, resolve@npm:^1.20.0": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -9275,7 +9297,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@1.22.8#~builtin, resolve@patch:resolve@^1.10.1#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin": +"resolve@patch:resolve@1.22.8#~builtin, resolve@patch:resolve@^1.10.1#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.20.0#~builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=07638b" dependencies: @@ -9467,7 +9489,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.1, 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.1.1, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -9476,6 +9498,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.6.3, semver@npm:^7.7.1, semver@npm:^7.7.2": + version: 7.7.3 + resolution: "semver@npm:7.7.3" + bin: + semver: bin/semver.js + checksum: f013a3ee4607857bcd3503b6ac1d80165f7f8ea94f5d55e2d3e33df82fce487aa3313b987abf9b39e0793c83c9fc67b76c36c067625141a9f6f704ae0ea18db2 + languageName: node + linkType: hard + "send@npm:0.19.0": version: 0.19.0 resolution: "send@npm:0.19.0" @@ -9574,17 +9605,6 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" - dependencies: - call-bind: ^1.0.0 - get-intrinsic: ^1.0.2 - object-inspect: ^1.9.0 - checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 - languageName: node - linkType: hard - "side-channel@npm:^1.0.6": version: 1.1.0 resolution: "side-channel@npm:1.1.0" @@ -9745,7 +9765,7 @@ __metadata: languageName: node linkType: hard -"spdx-expression-parse@npm:^3.0.0, spdx-expression-parse@npm:^3.0.1": +"spdx-expression-parse@npm:^3.0.0": version: 3.0.1 resolution: "spdx-expression-parse@npm:3.0.1" dependencies: @@ -9755,6 +9775,16 @@ __metadata: languageName: node linkType: hard +"spdx-expression-parse@npm:^4.0.0": + version: 4.0.0 + resolution: "spdx-expression-parse@npm:4.0.0" + dependencies: + spdx-exceptions: ^2.1.0 + spdx-license-ids: ^3.0.0 + checksum: 936be681fbf5edeec3a79c023136479f70d6edb3fd3875089ac86cd324c6c8c81add47399edead296d1d0af17ae5ce88c7f88885eb150b62c2ff6e535841ca6a + languageName: node + linkType: hard + "spdx-license-ids@npm:^3.0.0": version: 3.0.11 resolution: "spdx-license-ids@npm:3.0.11" @@ -9794,6 +9824,20 @@ __metadata: languageName: node linkType: hard +"stable-hash-x@npm:^0.2.0": + version: 0.2.0 + resolution: "stable-hash-x@npm:0.2.0" + checksum: ed5d814ff4d74e7873d4672584a8c136cc452995459fede2ee897784b658ba4bc338c9b7cf7cca4c5cc43a84dcf1ebac60c4aa01345e9b8609d0265e95837a6c + languageName: node + linkType: hard + +"stable-hash@npm:^0.0.5": + version: 0.0.5 + resolution: "stable-hash@npm:0.0.5" + checksum: 9222ea2c558e37c4a576cb4e406966b9e6aa05b93f5c4f09ef4aaabe3577439b9b8fbff407b16840b63e2ae83de74290c7b1c2da7360d571e480e46a4aec0a56 + languageName: node + linkType: hard + "stack-utils@npm:^2.0.3": version: 2.0.5 resolution: "stack-utils@npm:2.0.5" @@ -9849,28 +9893,6 @@ __metadata: languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.5": - version: 1.0.5 - resolution: "string.prototype.trimend@npm:1.0.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.19.5 - checksum: d44f543833112f57224e79182debadc9f4f3bf9d48a0414d6f0cbd2a86f2b3e8c0ca1f95c3f8e5b32ae83e91554d79d932fc746b411895f03f93d89ed3dfb6bc - languageName: node - linkType: hard - -"string.prototype.trimstart@npm:^1.0.5": - version: 1.0.5 - resolution: "string.prototype.trimstart@npm:1.0.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.19.5 - checksum: a4857c5399ad709d159a77371eeaa8f9cc284469a0b5e1bfe405de16f1fd4166a8ea6f4180e55032f348d1b679b1599fd4301fbc7a8b72bdb3e795e43f7b1048 - languageName: node - linkType: hard - "string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -9908,13 +9930,6 @@ __metadata: languageName: node linkType: hard -"strip-bom@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-bom@npm:3.0.0" - checksum: 8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b - languageName: node - linkType: hard - "strip-bom@npm:^4.0.0": version: 4.0.0 resolution: "strip-bom@npm:4.0.0" @@ -9936,7 +9951,7 @@ __metadata: languageName: node linkType: hard -"strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1": +"strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 @@ -10035,10 +10050,13 @@ __metadata: languageName: node linkType: hard -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a +"tinyglobby@npm:^0.2.13, tinyglobby@npm:^0.2.15": + version: 0.2.15 + resolution: "tinyglobby@npm:0.2.15" + dependencies: + fdir: ^6.5.0 + picomatch: ^4.0.3 + checksum: 0e33b8babff966c6ab86e9b825a350a6a98a63700fa0bb7ae6cf36a7770a508892383adc272f7f9d17aaf46a9d622b455e775b9949a3f951eaaf5dfb26331d44 languageName: node linkType: hard @@ -10086,22 +10104,30 @@ __metadata: languageName: node linkType: hard -"tsconfig-paths@npm:^3.14.1": - version: 3.14.1 - resolution: "tsconfig-paths@npm:3.14.1" +"ts-api-utils@npm:^2.1.0": + version: 2.1.0 + resolution: "ts-api-utils@npm:2.1.0" + peerDependencies: + typescript: ">=4.8.4" + checksum: 5b1ef89105654d93d67582308bd8dfe4bbf6874fccbcaa729b08fbb00a940fd4c691ca6d0d2b18c3c70878d9a7e503421b7cc473dbc3d0d54258b86401d4b15d + languageName: node + linkType: hard + +"ts-declaration-location@npm:^1.0.6": + version: 1.0.7 + resolution: "ts-declaration-location@npm:1.0.7" dependencies: - "@types/json5": ^0.0.29 - json5: ^1.0.1 - minimist: ^1.2.6 - strip-bom: ^3.0.0 - checksum: 8afa01c673ebb4782ba53d3a12df97fa837ce524f8ad38ee4e2b2fd57f5ac79abc21c574e9e9eb014d93efe7fe8214001b96233b5c6ea75bd1ea82afe17a4c6d + picomatch: ^4.0.2 + peerDependencies: + typescript: ">=4.0.0" + checksum: d1bfa610fae8175389af580f25e8aab5dd5c7fb8daf83560fa8d555da8ef03542dde8552a9c3d1fb4beaed8670db863083c61413846d91cb3e5caea6636e45f7 languageName: node linkType: hard -"tslib@npm:^1.8.1": - version: 1.14.1 - resolution: "tslib@npm:1.14.1" - checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd +"tslib@npm:^2.4.0": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a languageName: node linkType: hard @@ -10112,17 +10138,6 @@ __metadata: languageName: node linkType: hard -"tsutils@npm:^3.21.0": - version: 3.21.0 - resolution: "tsutils@npm:3.21.0" - dependencies: - tslib: ^1.8.1 - peerDependencies: - typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 - languageName: node - linkType: hard - "tsx@npm:^4.6.1": version: 4.6.1 resolution: "tsx@npm:4.6.1" @@ -10155,13 +10170,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 - languageName: node - linkType: hard - "type-fest@npm:^0.21.3": version: 0.21.3 resolution: "type-fest@npm:0.21.3" @@ -10179,6 +10187,21 @@ __metadata: languageName: node linkType: hard +"typescript-eslint@npm:^8.49.0": + version: 8.49.0 + resolution: "typescript-eslint@npm:8.49.0" + dependencies: + "@typescript-eslint/eslint-plugin": 8.49.0 + "@typescript-eslint/parser": 8.49.0 + "@typescript-eslint/typescript-estree": 8.49.0 + "@typescript-eslint/utils": 8.49.0 + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + checksum: fd91cffcf3c5de73a9ead2253dcb8516ed664fc9179d26c019e6be53f4d4429e280dd5c783c68789a4a2db34712e569468a6c9c7613fc918a310687ca53b91b1 + languageName: node + linkType: hard + "typescript@npm:~5.1.6": version: 5.1.6 resolution: "typescript@npm:5.1.6" @@ -10199,18 +10222,6 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - has-bigints: ^1.0.2 - has-symbols: ^1.0.3 - which-boxed-primitive: ^1.0.2 - checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 - languageName: node - linkType: hard - "undici-types@npm:~5.26.4": version: 5.26.5 resolution: "undici-types@npm:5.26.5" @@ -10355,6 +10366,73 @@ __metadata: languageName: node linkType: hard +"unrs-resolver@npm:^1.6.2, unrs-resolver@npm:^1.9.2": + version: 1.11.1 + resolution: "unrs-resolver@npm:1.11.1" + dependencies: + "@unrs/resolver-binding-android-arm-eabi": 1.11.1 + "@unrs/resolver-binding-android-arm64": 1.11.1 + "@unrs/resolver-binding-darwin-arm64": 1.11.1 + "@unrs/resolver-binding-darwin-x64": 1.11.1 + "@unrs/resolver-binding-freebsd-x64": 1.11.1 + "@unrs/resolver-binding-linux-arm-gnueabihf": 1.11.1 + "@unrs/resolver-binding-linux-arm-musleabihf": 1.11.1 + "@unrs/resolver-binding-linux-arm64-gnu": 1.11.1 + "@unrs/resolver-binding-linux-arm64-musl": 1.11.1 + "@unrs/resolver-binding-linux-ppc64-gnu": 1.11.1 + "@unrs/resolver-binding-linux-riscv64-gnu": 1.11.1 + "@unrs/resolver-binding-linux-riscv64-musl": 1.11.1 + "@unrs/resolver-binding-linux-s390x-gnu": 1.11.1 + "@unrs/resolver-binding-linux-x64-gnu": 1.11.1 + "@unrs/resolver-binding-linux-x64-musl": 1.11.1 + "@unrs/resolver-binding-wasm32-wasi": 1.11.1 + "@unrs/resolver-binding-win32-arm64-msvc": 1.11.1 + "@unrs/resolver-binding-win32-ia32-msvc": 1.11.1 + "@unrs/resolver-binding-win32-x64-msvc": 1.11.1 + napi-postinstall: ^0.3.0 + dependenciesMeta: + "@unrs/resolver-binding-android-arm-eabi": + optional: true + "@unrs/resolver-binding-android-arm64": + optional: true + "@unrs/resolver-binding-darwin-arm64": + optional: true + "@unrs/resolver-binding-darwin-x64": + optional: true + "@unrs/resolver-binding-freebsd-x64": + optional: true + "@unrs/resolver-binding-linux-arm-gnueabihf": + optional: true + "@unrs/resolver-binding-linux-arm-musleabihf": + optional: true + "@unrs/resolver-binding-linux-arm64-gnu": + optional: true + "@unrs/resolver-binding-linux-arm64-musl": + optional: true + "@unrs/resolver-binding-linux-ppc64-gnu": + optional: true + "@unrs/resolver-binding-linux-riscv64-gnu": + optional: true + "@unrs/resolver-binding-linux-riscv64-musl": + optional: true + "@unrs/resolver-binding-linux-s390x-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-musl": + optional: true + "@unrs/resolver-binding-wasm32-wasi": + optional: true + "@unrs/resolver-binding-win32-arm64-msvc": + optional: true + "@unrs/resolver-binding-win32-ia32-msvc": + optional: true + "@unrs/resolver-binding-win32-x64-msvc": + optional: true + checksum: 10f829c06c30d041eaf6a8a7fd59268f1cad5b723f1399f1ec64f0d79be2809f6218209d06eab32a3d0fcd7d56034874f3a3f95292fdb53fa1f8279de8fcb0c5 + languageName: node + linkType: hard + "update-browserslist-db@npm:^1.0.13": version: 1.0.13 resolution: "update-browserslist-db@npm:1.0.13" @@ -10531,19 +10609,6 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" - dependencies: - is-bigint: ^1.0.1 - is-boolean-object: ^1.1.0 - is-number-object: ^1.0.4 - is-string: ^1.0.5 - is-symbol: ^1.0.3 - checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e - languageName: node - linkType: hard - "which@npm:^2.0.1, which@npm:^2.0.2": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -10586,10 +10651,10 @@ __metadata: languageName: node linkType: hard -"word-wrap@npm:^1.2.3": - version: 1.2.4 - resolution: "word-wrap@npm:1.2.4" - checksum: 8f1f2e0a397c0e074ca225ba9f67baa23f99293bc064e31355d426ae91b8b3f6b5f6c1fc9ae5e9141178bb362d563f55e62fd8d5c31f2a77e3ade56cb3e35bd1 +"word-wrap@npm:^1.2.5": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: f93ba3586fc181f94afdaff3a6fef27920b4b6d9eaefed0f428f8e07adea2a7f54a5f2830ce59406c8416f033f86902b91eb824072354645eea687dff3691ccb languageName: node linkType: hard From 725a34a5d3110675d90a0d5159a641368866ce89 Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Thu, 11 Dec 2025 12:56:49 -0700 Subject: [PATCH 02/12] Correct JSDoc for more object types --- tests/functional/helpers/environment.ts | 22 +++++++++---------- tests/functional/helpers/local-monorepo.ts | 6 ++--- .../helpers/monorepo-environment.ts | 16 +++++++++----- tests/functional/helpers/repo.ts | 6 +++-- 4 files changed, 29 insertions(+), 21 deletions(-) diff --git a/tests/functional/helpers/environment.ts b/tests/functional/helpers/environment.ts index 3599232b..f5a92005 100644 --- a/tests/functional/helpers/environment.ts +++ b/tests/functional/helpers/environment.ts @@ -8,12 +8,12 @@ import Repo from './repo.js'; * Describes the package that is used to initialize a polyrepo, or one of the * packages that is used to initialize a monorepo. * - * name - The desired name of the package. + * Properties: * - * version - The desired version of the package. - * - * directory - The path relative to the repo's root directory that - * holds this package. + * - `name` - The desired name of the package. + * - `version` - The desired version of the package. + * - `directory` - The path relative to the repo's root directory that holds + * this package. */ export type PackageSpecification = { name: string; @@ -24,13 +24,13 @@ export type PackageSpecification = { /** * A set of configuration options for an {@link Environment}. * - * directoryPath - The directory out of which this environment will - * operate. + * Properties: * - * createInitialCommit - Usually when a repo is initialized, a commit - * is created (which will contain starting `package.json` files). You can use - * this option to disable that if you need to create your own commits for - * clarity. + * - `directoryPath` - The directory out of which this environment will operate. + * - `createInitialCommit` - Usually when a repo is initialized, a commit is + * created (which will contain starting `package.json` files). You can use + * this option to disable that if you need to create your own commits for + * clarity. */ export type EnvironmentOptions = { directoryPath: string; diff --git a/tests/functional/helpers/local-monorepo.ts b/tests/functional/helpers/local-monorepo.ts index 1ac670e9..9234132c 100644 --- a/tests/functional/helpers/local-monorepo.ts +++ b/tests/functional/helpers/local-monorepo.ts @@ -8,10 +8,10 @@ import { knownKeysOf } from './utils.js'; * A set of configuration options for a {@link LocalMonorepo}. In addition * to the options listed in {@link LocalRepoOptions}, these include: * - * packages - The known packages within this repo (including the - * root). + * Properties * - * workspaces - The known workspaces within this repo. + * - `packages` - The known packages within this repo (including the root). + * - `workspaces` - The known workspaces within this repo. */ export type LocalMonorepoOptions = { packages: Record; diff --git a/tests/functional/helpers/monorepo-environment.ts b/tests/functional/helpers/monorepo-environment.ts index 1c45c2f9..54a4716c 100644 --- a/tests/functional/helpers/monorepo-environment.ts +++ b/tests/functional/helpers/monorepo-environment.ts @@ -15,10 +15,15 @@ import { debug, knownKeysOf } from './utils.js'; * A set of configuration options for a {@link MonorepoEnvironment}. In addition * to the options listed in {@link EnvironmentOptions}, these include: * - * packages - The known packages within this repo (including the - * root). + * Properties: * - * workspaces - The known workspaces within this repo. + * - `packages` - The known packages within this repo (including the root). + * - `workspaces` - The known workspaces within this repo. + * - `directoryPath` - The directory out of which this environment will operate. + * - `createInitialCommit` - Usually when a repo is initialized, a commit is + * created (which will contain starting `package.json` files). You can use + * this option to disable that if you need to create your own commits for + * clarity. */ export type MonorepoEnvironmentOptions< WorkspacePackageNickname extends string, @@ -30,8 +35,9 @@ export type MonorepoEnvironmentOptions< /** * The release specification data. * - * packages - The workspace packages within this repo that will be - * released. + * Properties: + * + * - `packages` - The workspace packages within this repo that will be released. */ type ReleaseSpecification = { packages: Partial>; diff --git a/tests/functional/helpers/repo.ts b/tests/functional/helpers/repo.ts index 78a7cf4b..ccf89a9c 100644 --- a/tests/functional/helpers/repo.ts +++ b/tests/functional/helpers/repo.ts @@ -9,8 +9,10 @@ import { isErrorWithCode } from '../../helpers.js'; /** * A set of configuration options for a {@link Repo}. * - * environmentDirectoryPath - The directory that holds the environment - * that created this repo. + * Properties: + * + * - `environmentDirectoryPath` - The directory that holds the environment that + * created this repo. */ export type RepoOptions = { environmentDirectoryPath: string; From b62321e5d523914c30ffc240c17d9e2547c9e541 Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Thu, 11 Dec 2025 16:11:07 -0700 Subject: [PATCH 03/12] Fix ensureFileEntryDoesNotExist --- tests/helpers.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/tests/helpers.ts b/tests/helpers.ts index b5a84194..4d82dc11 100644 --- a/tests/helpers.ts +++ b/tests/helpers.ts @@ -41,10 +41,12 @@ async function ensureFileEntryDoesNotExist(entryPath: string): Promise { typeof error === 'object' && error !== null && hasProperty(error, 'code') && - error.code !== 'ENOENT' + error.code === 'ENOENT' ) { - throw error; + return; } + + throw error; } } From 4331589a85861b474814b0451f5c7b0485d932fb Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Fri, 19 Dec 2025 10:27:56 -0700 Subject: [PATCH 04/12] Replace explicit property documentation with `@property` --- eslint.config.mjs | 84 ++++++++++++++++++- src/editor.ts | 7 +- src/package-manifest.ts | 14 ++-- src/package.ts | 17 ++-- src/project.ts | 36 ++++---- src/release-plan.ts | 26 +++--- tests/functional/helpers/environment.ts | 23 +++-- .../helpers/monorepo-environment.ts | 22 ++--- tests/functional/helpers/repo.ts | 6 +- 9 files changed, 153 insertions(+), 82 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 1fe55bc8..38f5035b 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -3,6 +3,58 @@ import jest from '@metamask/eslint-config-jest'; import nodejs from '@metamask/eslint-config-nodejs'; import typescript from '@metamask/eslint-config-typescript'; +// Copied from `jsdoc/check-tag-names`, except `@property` is omitted +// +const typedTagsAlwaysUnnecessary = new Set([ + 'augments', + 'callback', + 'class', + 'enum', + 'implements', + 'private', + 'protected', + 'public', + 'readonly', + 'this', + 'type', + 'typedef', +]); + +// Copied from `jsdoc/check-tag-names` +// +const typedTagsNeedingName = new Set(['template']); + +// Copied from `jsdoc/check-tag-names`, except `@property` is omitted +// +const typedTagsUnnecessaryOutsideDeclare = new Set([ + 'abstract', + 'access', + 'class', + 'constant', + 'constructs', + 'enum', + 'export', + 'exports', + 'function', + 'global', + 'inherits', + 'instance', + 'interface', + 'member', + 'memberof', + 'memberOf', + 'method', + 'mixes', + 'mixin', + 'module', + 'name', + 'namespace', + 'override', + 'requires', + 'static', + 'this', +]); + const config = createConfig([ { ignores: ['dist/', 'docs/', '.yarn/'], @@ -70,6 +122,8 @@ const config = createConfig([ }, ], // Consider copying this to @metamask/eslint-config + 'jsdoc/no-blank-blocks': 'error', + // Consider copying this to @metamask/eslint-config 'jsdoc/require-jsdoc': [ 'error', { @@ -99,8 +153,34 @@ const config = createConfig([ ], }, ], - // Consider copying this to @metamask/eslint-config - 'jsdoc/no-blank-blocks': 'error', + // Override this rule so that the JSDoc tags that were checked with `typed: + // true` still apply, but `@property` is excluded + 'jsdoc/check-tag-names': ['error', { typed: false }], + 'jsdoc/no-restricted-syntax': [ + 'error', + { + contexts: [ + ...Array.from(typedTagsAlwaysUnnecessary).map((tag) => ({ + comment: `JsdocBlock:has(JsdocTag[tag='${tag}'])`, + message: `'@${tag}' is redundant when using a type system.`, + })), + ...Array.from(typedTagsNeedingName).map((tag) => ({ + comment: `JsdocBlock:has(JsdocTag[tag='${tag}']:not([name]))`, + message: `'@${tag}' is redundant without a name when using a type system.`, + })), + ...Array.from(typedTagsUnnecessaryOutsideDeclare).map((tag) => ({ + // We want to allow the use of these tags inside of `declare` + // blocks. The only way to do this seems to be to name all common + // node types, but exclude `TSModuleBlock` and + // `TSModuleDeclaration`. + context: + 'TSTypeAliasDeclaration, TSInterfaceDeclaration, ClassDeclaration, FunctionDeclaration, MethodDefinition, VariableDeclaration, TSEnumDeclaration, PropertyDefinition, TSPropertySignature, TSMethodSignature', + comment: `JsdocBlock:has(JsdocTag[tag='${tag}'])`, + message: `'@${tag}' is redundant when using a type system outside of ambient declarations.`, + })), + ], + }, + ], }, }, diff --git a/src/editor.ts b/src/editor.ts index 37d3b4d5..b298f8c7 100644 --- a/src/editor.ts +++ b/src/editor.ts @@ -6,10 +6,9 @@ import { debug, resolveExecutable } from './misc-utils.js'; /** * Information about the editor present on the user's computer. * - * Properties: - * - * - `path` - The path to the executable representing the editor. - * - `args` - Command-line arguments to pass to the executable when calling it. + * @property path - The path to the executable representing the editor. + * @property args - Command-line arguments to pass to the executable when + * calling it. */ export type Editor = { path: string; diff --git a/src/package-manifest.ts b/src/package-manifest.ts index 89bea2b8..904750b7 100644 --- a/src/package-manifest.ts +++ b/src/package-manifest.ts @@ -20,14 +20,12 @@ export type UnvalidatedPackageManifest = Readonly>; /** * A type-checked representation of the data in a package's `package.json`. * - * Properties: - * - * - `name` - The name of the package. - * - `version` - The version of the package. - * - `private` - Whether the package is private. - * - `workspaces` - Paths to subpackages within the package. - * - `bundledDependencies` - The set of packages that are expected to be bundled - * when publishing the package. + * @property name - The name of the package. + * @property version - The version of the package. + * @property private - Whether the package is private. + * @property workspaces - Paths to subpackages within the package. + * @property dependencies - The declared dependencies. + * @property peerDependencies - The declared peer dependencies. */ export type ValidatedPackageManifest = { readonly [PackageManifestFieldNames.Name]: string; diff --git a/src/package.ts b/src/package.ts index aacfae00..36e44455 100644 --- a/src/package.ts +++ b/src/package.ts @@ -23,13 +23,16 @@ const CHANGELOG_FILE_NAME = 'CHANGELOG.md'; /** * Information about a package within a project. * - * Properties: - * - * - `directoryPath` - The path to the directory where the package is located. - * - `manifestPath` - The path to the manifest file. - * - `manifest` - The data extracted from the manifest. - * - `changelogPath` - The path to the changelog file (which may or may not - * exist). + * @property directoryPath - The path to the directory where the package is + * located. + * @property manifestPath - The path to the manifest file. + * @property unvalidatedManifest - The data extracted from the manifest. + * @property validatedManifest - The data extracted from the manifest, in a + * typed version. + * @property changelogPath - The path to the changelog file (which may or may + * not exist). + * @property hasChangesSinceLatestRelease - Whether there have been changes to + * the package since its latest release. */ export type Package = { directoryPath: string; diff --git a/src/project.ts b/src/project.ts index c07eeec2..e3494b39 100644 --- a/src/project.ts +++ b/src/project.ts @@ -26,16 +26,14 @@ import { SemVer } from './semver.js'; * The release version of the root package of a monorepo extracted from its * version string. * - * Properties: - * - * - `ordinaryNumber` - The number assigned to the release if it introduces new - * changes that haven't appeared in any previous release; it will be 0 if - * there haven't been any releases yet. - * - `backportNumber` - A backport release is a change ported from one ordinary - * release to a previous ordinary release. This, then, is the number which - * identifies this release relative to other backport releases under the same - * ordinary release, starting from 1; it will be 0 if there aren't any - * backport releases for the ordinary release yet. + * @property ordinaryNumber - The number assigned to the release if it + * introduces new changes that haven't appeared in any previous release; it will + * be 0 if there haven't been any releases yet. + * @property backportNumber - A backport release is a change ported from one + * ordinary release to a previous ordinary release. This, then, is the number + * which identifies this release relative to other backport releases under the + * same ordinary release, starting from 1; it will be 0 if there aren't any + * backport releases for the ordinary release yet. */ type ReleaseVersion = { ordinaryNumber: number; @@ -45,15 +43,15 @@ type ReleaseVersion = { /** * Represents the entire codebase on which this tool is operating. * - * Properties: - * - * - `directoryPath` - The directory in which the project lives. - * - `repositoryUrl` - The public URL of the Git repository where the codebase - * for the project lives. - * - `rootPackage` - Information about the root package (assuming that the - * project is a monorepo). - * - `workspacePackages` - Information about packages that are referenced via - * workspaces (assuming that the project is a monorepo). + * @property directoryPath - The directory in which the project lives. + * @property repositoryUrl - The public URL of the Git repository where the + * codebase for the project lives. + * @property rootPackage - Information about the root package (assuming that the + * project is a monorepo). + * @property workspacePackages - Information about packages that are referenced + * via workspaces (assuming that the project is a monorepo). + * @property isMonorepo - Whether the project is a monorepo. + * @property releaseVersion - The new version that is being released. */ export type Project = { directoryPath: string; diff --git a/src/release-plan.ts b/src/release-plan.ts index 444ca7f3..b61356ec 100644 --- a/src/release-plan.ts +++ b/src/release-plan.ts @@ -10,20 +10,18 @@ import { ReleaseSpecification } from './release-specification.js'; * Instructions for how to update the project in order to prepare it for a new * release. * - * Properties: - * - * - `newVersion` - The new version that should be released, encompassing one or - * more updates to packages within the project. This is always a - * SemVer-compatible string, though the meaning of each number depends on the - * type of project. For a polyrepo package or a monorepo with fixed versions, - * the format of the version string is "MAJOR.MINOR.PATCH"; for a monorepo - * with independent versions, it is "ORDINARY.BACKPORT.0", where `BACKPORT` is - * used to name a release that sits between two ordinary releases, and - * `ORDINARY` is used to name any other (non-backport) release. - * - `packages` - Describes how the packages in the project should be updated. - * For a polyrepo package, this list will only contain the package itself; for - * a monorepo package it will consist of the root package and any workspace - * packages that will be included in the release. + * @property newVersion - The new version that should be released, encompassing + * one or more updates to packages within the project. This is always a + * SemVer-compatible string, though the meaning of each number depends on the + * type of project. For a polyrepo package or a monorepo with fixed versions, + * the format of the version string is "MAJOR.MINOR.PATCH"; for a monorepo with + * independent versions, it is "ORDINARY.BACKPORT.0", where `BACKPORT` is used + * to name a release that sits between two ordinary releases, and `ORDINARY` is + * used to name any other (non-backport) release. + * @property packages - Describes how the packages in the project should be + * updated. For a polyrepo package, this list will only contain the package + * itself; for a monorepo package it will consist of the root package and any + * workspace packages that will be included in the release. */ export type ReleasePlan = { newVersion: string; diff --git a/tests/functional/helpers/environment.ts b/tests/functional/helpers/environment.ts index f5a92005..3ca85b67 100644 --- a/tests/functional/helpers/environment.ts +++ b/tests/functional/helpers/environment.ts @@ -8,12 +8,10 @@ import Repo from './repo.js'; * Describes the package that is used to initialize a polyrepo, or one of the * packages that is used to initialize a monorepo. * - * Properties: - * - * - `name` - The desired name of the package. - * - `version` - The desired version of the package. - * - `directory` - The path relative to the repo's root directory that holds - * this package. + * @property name - The desired name of the package. + * @property version - The desired version of the package. + * @property directory - The path relative to the repo's root directory that + * holds this package. */ export type PackageSpecification = { name: string; @@ -24,13 +22,12 @@ export type PackageSpecification = { /** * A set of configuration options for an {@link Environment}. * - * Properties: - * - * - `directoryPath` - The directory out of which this environment will operate. - * - `createInitialCommit` - Usually when a repo is initialized, a commit is - * created (which will contain starting `package.json` files). You can use - * this option to disable that if you need to create your own commits for - * clarity. + * @property directoryPath - The directory out of which this environment will + * operate. + * @property createInitialCommit - Usually when a repo is initialized, a commit + * is created (which will contain starting `package.json` files). You can use + * this option to disable that if you need to create your own commits for + * clarity. */ export type EnvironmentOptions = { directoryPath: string; diff --git a/tests/functional/helpers/monorepo-environment.ts b/tests/functional/helpers/monorepo-environment.ts index 54a4716c..38fecf9b 100644 --- a/tests/functional/helpers/monorepo-environment.ts +++ b/tests/functional/helpers/monorepo-environment.ts @@ -15,22 +15,22 @@ import { debug, knownKeysOf } from './utils.js'; * A set of configuration options for a {@link MonorepoEnvironment}. In addition * to the options listed in {@link EnvironmentOptions}, these include: * - * Properties: - * - * - `packages` - The known packages within this repo (including the root). - * - `workspaces` - The known workspaces within this repo. - * - `directoryPath` - The directory out of which this environment will operate. - * - `createInitialCommit` - Usually when a repo is initialized, a commit is - * created (which will contain starting `package.json` files). You can use - * this option to disable that if you need to create your own commits for - * clarity. + * @property directoryPath - The directory out of which this environment will + * operate. + * @property createInitialCommit - Usually when a repo is initialized, a commit + * is created (which will contain starting `package.json` files). You can use + * this option to disable that if you need to create your own commits for + * clarity. + * @property packages - The known packages within this repo (including the + * root). + * @property workspaces - The known workspaces within this repo. */ export type MonorepoEnvironmentOptions< WorkspacePackageNickname extends string, -> = { +> = EnvironmentOptions & { packages: Record; workspaces: Record; -} & EnvironmentOptions; +}; /** * The release specification data. diff --git a/tests/functional/helpers/repo.ts b/tests/functional/helpers/repo.ts index ccf89a9c..61a08276 100644 --- a/tests/functional/helpers/repo.ts +++ b/tests/functional/helpers/repo.ts @@ -9,10 +9,8 @@ import { isErrorWithCode } from '../../helpers.js'; /** * A set of configuration options for a {@link Repo}. * - * Properties: - * - * - `environmentDirectoryPath` - The directory that holds the environment that - * created this repo. + * @property environmentDirectoryPath - The directory that holds the environment + * that created this repo. */ export type RepoOptions = { environmentDirectoryPath: string; From c525eeacbaf592eec8b23e96ddc82caa4fe13e2c Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Fri, 19 Dec 2025 15:42:54 -0700 Subject: [PATCH 05/12] Clean up eslint.config.mjs --- eslint.config.mjs | 99 ++++++++++++++++++----------------------------- 1 file changed, 37 insertions(+), 62 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 38f5035b..a01cc9af 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -55,6 +55,39 @@ const typedTagsUnnecessaryOutsideDeclare = new Set([ 'this', ]); +// Consider copying this to @metamask/eslint-config +const requireJsdocOverride = { + 'jsdoc/require-jsdoc': [ + 'error', + { + require: { + // Classes + ClassDeclaration: true, + // Function declarations + FunctionDeclaration: true, + // Methods + MethodDefinition: true, + }, + contexts: [ + // Type interfaces that are not defined within `declare` blocks + ':not(TSModuleBlock) > TSInterfaceDeclaration', + // Type aliases + 'TSTypeAliasDeclaration', + // Enums + 'TSEnumDeclaration', + // Arrow functions that are not contained within plain objects or + // are not arguments to functions or methods + ':not(Property, NewExpression, CallExpression) > ArrowFunctionExpression', + // Function expressions that are not contained within plain objects + // or are not arguments to functions or methods + ':not(Property, NewExpression, CallExpression) > FunctionExpression', + // Exported variables at the root + 'ExportNamedDeclaration:has(> VariableDeclaration)', + ], + }, + ], +}; + const config = createConfig([ { ignores: ['dist/', 'docs/', '.yarn/'], @@ -71,38 +104,9 @@ const config = createConfig([ }, rules: { - // Consider copying this to @metamask/eslint-config - 'jsdoc/require-jsdoc': [ - 'error', - { - require: { - // Classes - ClassDeclaration: true, - // Function declarations - FunctionDeclaration: true, - // Methods - MethodDefinition: true, - }, - contexts: [ - // Type interfaces that are not defined within `declare` blocks - ':not(TSModuleBlock) > TSInterfaceDeclaration', - // Type aliases - 'TSTypeAliasDeclaration', - // Enums - 'TSEnumDeclaration', - // Arrow functions that are not contained within plain objects or - // are not arguments to functions or methods - ':not(Property, NewExpression, CallExpression) > ArrowFunctionExpression', - // Function expressions that are not contained within plain objects - // or are not arguments to functions or methods - ':not(Property, NewExpression, CallExpression) > FunctionExpression', - // Exported variables at the root - 'ExportNamedDeclaration:has(> VariableDeclaration)', - ], - }, - ], // Consider copying this to @metamask/eslint-config 'jsdoc/no-blank-blocks': 'error', + requireJsdocOverride, }, settings: { @@ -123,38 +127,9 @@ const config = createConfig([ ], // Consider copying this to @metamask/eslint-config 'jsdoc/no-blank-blocks': 'error', - // Consider copying this to @metamask/eslint-config - 'jsdoc/require-jsdoc': [ - 'error', - { - require: { - // Classes - ClassDeclaration: true, - // Function declarations - FunctionDeclaration: true, - // Methods - MethodDefinition: true, - }, - contexts: [ - // Type interfaces that are not defined within `declare` blocks - ':not(TSModuleBlock) > TSInterfaceDeclaration', - // Type aliases - 'TSTypeAliasDeclaration', - // Enums - 'TSEnumDeclaration', - // Arrow functions that are not contained within plain objects or - // are not arguments to functions or methods - ':not(Property, NewExpression, CallExpression) > ArrowFunctionExpression', - // Function expressions that are not contained within plain objects - // or are not arguments to functions or methods - ':not(Property, NewExpression, CallExpression) > FunctionExpression', - // Exported variables at the root - 'ExportNamedDeclaration:has(> VariableDeclaration)', - ], - }, - ], - // Override this rule so that the JSDoc tags that were checked with `typed: - // true` still apply, but `@property` is excluded + requireJsdocOverride, + // Override this rule so that the JSDoc tags that were checked with + // `typed: true` still apply, but `@property` is excluded 'jsdoc/check-tag-names': ['error', { typed: false }], 'jsdoc/no-restricted-syntax': [ 'error', From d202c60e17f72e6a81a1046b23ac8c02b57473ed Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Fri, 19 Dec 2025 15:47:43 -0700 Subject: [PATCH 06/12] Fix lint --- eslint.config.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index a01cc9af..9469c890 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -106,7 +106,7 @@ const config = createConfig([ rules: { // Consider copying this to @metamask/eslint-config 'jsdoc/no-blank-blocks': 'error', - requireJsdocOverride, + ...requireJsdocOverride, }, settings: { @@ -127,7 +127,7 @@ const config = createConfig([ ], // Consider copying this to @metamask/eslint-config 'jsdoc/no-blank-blocks': 'error', - requireJsdocOverride, + ...requireJsdocOverride, // Override this rule so that the JSDoc tags that were checked with // `typed: true` still apply, but `@property` is excluded 'jsdoc/check-tag-names': ['error', { typed: false }], From e7f18c326f5ccbd3836a245e2d74cc16f2a6f629 Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Fri, 9 Jan 2026 11:53:01 -0700 Subject: [PATCH 07/12] Update yarn.lock --- yarn.lock | 1345 ++++++++--------------------------------------------- 1 file changed, 183 insertions(+), 1162 deletions(-) diff --git a/yarn.lock b/yarn.lock index cb9c204b..93abfc74 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1,3 +1,6 @@ +# This file is generated by running "yarn install" inside your project. +# Manual changes might be lost - proceed with caution! + __metadata: version: 6 cacheKey: 8 @@ -12,17 +15,7 @@ __metadata: languageName: node linkType: hard -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.22.13, @babel/code-frame@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/code-frame@npm:7.23.5" - dependencies: - "@babel/highlight": ^7.23.4 - chalk: ^2.4.2 - checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a - languageName: node - linkType: hard - -"@babel/code-frame@npm:^7.26.2": +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.26.2": version: 7.26.2 resolution: "@babel/code-frame@npm:7.26.2" dependencies: @@ -33,44 +26,14 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.22.9, @babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/compat-data@npm:7.23.5" - checksum: 06ce244cda5763295a0ea924728c09bae57d35713b675175227278896946f922a63edf803c322f855a3878323d48d0255a2a3023409d2a123483c8a69ebb4744 - languageName: node - linkType: hard - -"@babel/compat-data@npm:^7.26.5": +"@babel/compat-data@npm:^7.22.6, @babel/compat-data@npm:^7.23.3, @babel/compat-data@npm:^7.23.5, @babel/compat-data@npm:^7.26.5": version: 7.26.8 resolution: "@babel/compat-data@npm:7.26.8" checksum: 1bb04c6860c8c9555b933cb9c3caf5ef1dac331a37a351efb67956fc679f695d487aea76e792dd43823702c1300f7906f2a298e50b4a8d7ec199ada9c340c365 languageName: node linkType: hard -"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/core@npm:7.23.5" - dependencies: - "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.23.5 - "@babel/generator": ^7.23.5 - "@babel/helper-compilation-targets": ^7.22.15 - "@babel/helper-module-transforms": ^7.23.3 - "@babel/helpers": ^7.23.5 - "@babel/parser": ^7.23.5 - "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.5 - "@babel/types": ^7.23.5 - convert-source-map: ^2.0.0 - debug: ^4.1.0 - gensync: ^1.0.0-beta.2 - json5: ^2.2.3 - semver: ^6.3.1 - checksum: 5e5dfb1e61f298676f1fca18c646dbf6fb164ca1056b0169b8d42b7f5c35e026d81823582ccb2358e93a61b035e22b3ad37e2abaae4bf43f1ffb93b6ce19466e - languageName: node - linkType: hard - -"@babel/core@npm:^7.26.0": +"@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.5, @babel/core@npm:^7.26.0": version: 7.26.9 resolution: "@babel/core@npm:7.26.9" dependencies: @@ -93,19 +56,7 @@ __metadata: languageName: node linkType: hard -"@babel/generator@npm:^7.23.5, @babel/generator@npm:^7.7.2": - version: 7.23.5 - resolution: "@babel/generator@npm:7.23.5" - dependencies: - "@babel/types": ^7.23.5 - "@jridgewell/gen-mapping": ^0.3.2 - "@jridgewell/trace-mapping": ^0.3.17 - jsesc: ^2.5.1 - checksum: 845ddda7cf38a3edf4be221cc8a439dee9ea6031355146a1a74047aa8007bc030305b27d8c68ec9e311722c910610bde38c0e13a9ce55225251e7cb7e7f3edc8 - languageName: node - linkType: hard - -"@babel/generator@npm:^7.26.9": +"@babel/generator@npm:^7.26.9, @babel/generator@npm:^7.7.2": version: 7.26.9 resolution: "@babel/generator@npm:7.26.9" dependencies: @@ -136,20 +87,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6": - version: 7.22.15 - resolution: "@babel/helper-compilation-targets@npm:7.22.15" - dependencies: - "@babel/compat-data": ^7.22.9 - "@babel/helper-validator-option": ^7.22.15 - browserslist: ^4.21.9 - lru-cache: ^5.1.1 - semver: ^6.3.1 - checksum: ce85196769e091ae54dd39e4a80c2a9df1793da8588e335c383d536d54f06baf648d0a08fc873044f226398c4ded15c4ae9120ee18e7dfd7c639a68e3cdc9980 - languageName: node - linkType: hard - -"@babel/helper-compilation-targets@npm:^7.26.5": +"@babel/helper-compilation-targets@npm:^7.22.15, @babel/helper-compilation-targets@npm:^7.22.6, @babel/helper-compilation-targets@npm:^7.26.5": version: 7.26.5 resolution: "@babel/helper-compilation-targets@npm:7.26.5" dependencies: @@ -244,16 +182,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-module-imports@npm:7.22.15" - dependencies: - "@babel/types": ^7.22.15 - checksum: ecd7e457df0a46f889228f943ef9b4a47d485d82e030676767e6a2fdcbdaa63594d8124d4b55fd160b41c201025aec01fc27580352b1c87a37c9c6f33d116702 - languageName: node - linkType: hard - -"@babel/helper-module-imports@npm:^7.25.9": +"@babel/helper-module-imports@npm:^7.22.15, @babel/helper-module-imports@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-module-imports@npm:7.25.9" dependencies: @@ -263,22 +192,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.3": - version: 7.23.3 - resolution: "@babel/helper-module-transforms@npm:7.23.3" - dependencies: - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-module-imports": ^7.22.15 - "@babel/helper-simple-access": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/helper-validator-identifier": ^7.22.20 - peerDependencies: - "@babel/core": ^7.0.0 - checksum: 5d0895cfba0e16ae16f3aa92fee108517023ad89a855289c4eb1d46f7aef4519adf8e6f971e1d55ac20c5461610e17213f1144097a8f932e768a9132e2278d71 - languageName: node - linkType: hard - -"@babel/helper-module-transforms@npm:^7.26.0": +"@babel/helper-module-transforms@npm:^7.23.3, @babel/helper-module-transforms@npm:^7.26.0": version: 7.26.0 resolution: "@babel/helper-module-transforms@npm:7.26.0" dependencies: @@ -300,14 +214,7 @@ __metadata: languageName: node linkType: hard -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": - version: 7.22.5 - resolution: "@babel/helper-plugin-utils@npm:7.22.5" - checksum: c0fc7227076b6041acd2f0e818145d2e8c41968cc52fb5ca70eed48e21b8fe6dd88a0a91cbddf4951e33647336eb5ae184747ca706817ca3bef5e9e905151ff5 - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.25.9": +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.18.6, @babel/helper-plugin-utils@npm:^7.22.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3": version: 7.26.5 resolution: "@babel/helper-plugin-utils@npm:7.26.5" checksum: 4771fbb1711c624c62d12deabc2ed7435a6e6994b6ce09d5ede1bc1bf19be59c3775461a1e693bdd596af865685e87bb2abc778f62ceadc1b2095a8e2aa74180 @@ -367,13 +274,6 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/helper-string-parser@npm:7.23.4" - checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90 - languageName: node - linkType: hard - "@babel/helper-string-parser@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-string-parser@npm:7.25.9" @@ -381,28 +281,14 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20": - version: 7.22.20 - resolution: "@babel/helper-validator-identifier@npm:7.22.20" - checksum: 136412784d9428266bcdd4d91c32bcf9ff0e8d25534a9d94b044f77fe76bc50f941a90319b05aafd1ec04f7d127cd57a179a3716009ff7f3412ef835ada95bdc - languageName: node - linkType: hard - -"@babel/helper-validator-identifier@npm:^7.25.9": +"@babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-validator-identifier@npm:7.25.9" checksum: 5b85918cb1a92a7f3f508ea02699e8d2422fe17ea8e82acd445006c0ef7520fbf48e3dbcdaf7b0a1d571fc3a2715a29719e5226636cb6042e15fe6ed2a590944 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helper-validator-option@npm:7.23.5" - checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e - languageName: node - linkType: hard - -"@babel/helper-validator-option@npm:^7.25.9": +"@babel/helper-validator-option@npm:^7.22.15, @babel/helper-validator-option@npm:^7.23.5, @babel/helper-validator-option@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-validator-option@npm:7.25.9" checksum: 9491b2755948ebbdd68f87da907283698e663b5af2d2b1b02a2765761974b1120d5d8d49e9175b167f16f72748ffceec8c9cf62acfbee73f4904507b246e2b3d @@ -420,17 +306,6 @@ __metadata: languageName: node linkType: hard -"@babel/helpers@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/helpers@npm:7.23.5" - dependencies: - "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.5 - "@babel/types": ^7.23.5 - checksum: c16dc8a3bb3d0e02c7ee1222d9d0865ed4b92de44fb8db43ff5afd37a0fc9ea5e2906efa31542c95b30c1a3a9540d66314663c9a23b5bb9b5ec76e8ebc896064 - languageName: node - linkType: hard - "@babel/helpers@npm:^7.26.9": version: 7.26.9 resolution: "@babel/helpers@npm:7.26.9" @@ -441,27 +316,7 @@ __metadata: languageName: node linkType: hard -"@babel/highlight@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/highlight@npm:7.23.4" - dependencies: - "@babel/helper-validator-identifier": ^7.22.20 - chalk: ^2.4.2 - js-tokens: ^4.0.0 - checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/parser@npm:7.23.5" - bin: - parser: ./bin/babel-parser.js - checksum: ea763629310f71580c4a3ea9d3705195b7ba994ada2cc98f9a584ebfdacf54e92b2735d351672824c2c2b03c7f19206899f4d95650d85ce514a822b19a8734c7 - languageName: node - linkType: hard - -"@babel/parser@npm:^7.20.7, @babel/parser@npm:^7.26.9": +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.26.9": version: 7.26.9 resolution: "@babel/parser@npm:7.26.9" dependencies: @@ -1499,18 +1354,7 @@ __metadata: languageName: node linkType: hard -"@babel/template@npm:^7.22.15, @babel/template@npm:^7.3.3": - version: 7.22.15 - resolution: "@babel/template@npm:7.22.15" - dependencies: - "@babel/code-frame": ^7.22.13 - "@babel/parser": ^7.22.15 - "@babel/types": ^7.22.15 - checksum: 1f3e7dcd6c44f5904c184b3f7fe280394b191f2fed819919ffa1e529c259d5b197da8981b6ca491c235aee8dbad4a50b7e31304aa531271cb823a4a24a0dd8fd - languageName: node - linkType: hard - -"@babel/template@npm:^7.26.9": +"@babel/template@npm:^7.22.15, @babel/template@npm:^7.26.9, @babel/template@npm:^7.3.3": version: 7.26.9 resolution: "@babel/template@npm:7.26.9" dependencies: @@ -1521,24 +1365,6 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.23.5": - version: 7.23.5 - resolution: "@babel/traverse@npm:7.23.5" - dependencies: - "@babel/code-frame": ^7.23.5 - "@babel/generator": ^7.23.5 - "@babel/helper-environment-visitor": ^7.22.20 - "@babel/helper-function-name": ^7.23.0 - "@babel/helper-hoist-variables": ^7.22.5 - "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/parser": ^7.23.5 - "@babel/types": ^7.23.5 - debug: ^4.1.0 - globals: ^11.1.0 - checksum: 0558b05360850c3ad6384e85bd55092126a8d5f93e29a8e227dd58fa1f9e1a4c25fd337c07c7ae509f0983e7a2b1e761ffdcfaa77a1e1bedbc867058e1de5a7d - languageName: node - linkType: hard - "@babel/traverse@npm:^7.25.9, @babel/traverse@npm:^7.26.9": version: 7.26.9 resolution: "@babel/traverse@npm:7.26.9" @@ -1554,18 +1380,7 @@ __metadata: languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.23.5, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4, @babel/types@npm:^7.8.3": - version: 7.23.5 - resolution: "@babel/types@npm:7.23.5" - dependencies: - "@babel/helper-string-parser": ^7.23.4 - "@babel/helper-validator-identifier": ^7.22.20 - to-fast-properties: ^2.0.0 - checksum: 3d21774480a459ef13b41c2e32700d927af649e04b70c5d164814d8e04ab584af66a93330602c2925e1a6925c2b829cc153418a613a4e7d79d011be1f29ad4b2 - languageName: node - linkType: hard - -"@babel/types@npm:^7.20.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.9": +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.22.15, @babel/types@npm:^7.22.19, @babel/types@npm:^7.22.5, @babel/types@npm:^7.23.0, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.9, @babel/types@npm:^7.3.0, @babel/types@npm:^7.3.3, @babel/types@npm:^7.4.4": version: 7.26.9 resolution: "@babel/types@npm:7.26.9" dependencies: @@ -1583,21 +1398,21 @@ __metadata: linkType: hard "@emnapi/core@npm:^1.4.3": - version: 1.7.1 - resolution: "@emnapi/core@npm:1.7.1" + version: 1.8.1 + resolution: "@emnapi/core@npm:1.8.1" dependencies: "@emnapi/wasi-threads": 1.1.0 tslib: ^2.4.0 - checksum: 45274d4916c29ca39bb1833269524b8ccccc4295902193e640843df37ae4c35cf65a9d557d34d2eff770745116542af75feeb60d73088086fee791192cbee292 + checksum: 2a2fb36f4e2f90e25f419f8979435160313664bbb833d852d9de4487ff47f05fd36bf2cd77c3555f704ec2b67ce3a949ed5542598664c775cdd5ef35ae1c85a4 languageName: node linkType: hard "@emnapi/runtime@npm:^1.4.3": - version: 1.7.1 - resolution: "@emnapi/runtime@npm:1.7.1" + version: 1.8.1 + resolution: "@emnapi/runtime@npm:1.8.1" dependencies: tslib: ^2.4.0 - checksum: a7429af887703bae05c360bc089d1ffbb99a8b5fd2645d8e1034737523f0323e9d29510c3569c3b8f5a516e86975aa9fcdb3601d1907c216f972e1b8d3ce82e1 + checksum: 0000a91d2d0ec3aaa37cbab9c360de3ff8250592f3ce4706b8c9c6d93e54151e623a8983c85543f33cb6f66cf30bb24bf0ddde466de484d6a6bf1fb2650382de languageName: node linkType: hard @@ -1952,18 +1767,18 @@ __metadata: languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.1.2, @eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.5.0, @eslint-community/eslint-utils@npm:^4.7.0, @eslint-community/eslint-utils@npm:^4.8.0": - version: 4.9.0 - resolution: "@eslint-community/eslint-utils@npm:4.9.0" +"@eslint-community/eslint-utils@npm:^4.1.2, @eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.5.0, @eslint-community/eslint-utils@npm:^4.8.0, @eslint-community/eslint-utils@npm:^4.9.1": + version: 4.9.1 + resolution: "@eslint-community/eslint-utils@npm:4.9.1" dependencies: eslint-visitor-keys: ^3.4.3 peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: ae9b98eea006d1354368804b0116b8b45017a4e47b486d1b9cfa048a8ed3dc69b9b074eb2b2acb14034e6897c24048fd42b6a6816d9dc8bb9daad79db7d478d2 + checksum: 0a27c2d676c4be6b329ebb5dd8f6c5ef5fae9a019ff575655306d72874bb26f3ab20e0b241a5f086464bb1f2511ca26a29ff6f80c1e2b0b02eca4686b4dfe1b5 languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.11.0, @eslint-community/regexpp@npm:^4.12.1": +"@eslint-community/regexpp@npm:^4.11.0, @eslint-community/regexpp@npm:^4.12.1, @eslint-community/regexpp@npm:^4.12.2": version: 4.12.2 resolution: "@eslint-community/regexpp@npm:4.12.2" checksum: 1770bc81f676a72f65c7200b5675ff7a349786521f30e66125faaf767fde1ba1c19c3790e16ba8508a62a3933afcfc806a893858b3b5906faf693d862b9e4120 @@ -2016,10 +1831,10 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:9.39.1, @eslint/js@npm:^9.11.0": - version: 9.39.1 - resolution: "@eslint/js@npm:9.39.1" - checksum: b651930aec03a5aef97bc144627aebb05070afec5364cd3c5fd7c5dbb97f4fd82faf1b200b3be17572d5ebb7f8805211b655f463be96f2b02202ec7250868048 +"@eslint/js@npm:9.39.2, @eslint/js@npm:^9.11.0": + version: 9.39.2 + resolution: "@eslint/js@npm:9.39.2" + checksum: 362aa447266fa5717e762b2b252f177345cb0d7b2954113db9773b3a28898f7cbbc807e07f8078995e6da3f62791f7c5fa2c03517b7170a8e76613cf7fd83c92 languageName: node linkType: hard @@ -2440,18 +2255,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.2": - version: 0.3.3 - resolution: "@jridgewell/gen-mapping@npm:0.3.3" - dependencies: - "@jridgewell/set-array": ^1.0.1 - "@jridgewell/sourcemap-codec": ^1.4.10 - "@jridgewell/trace-mapping": ^0.3.9 - checksum: 4a74944bd31f22354fc01c3da32e83c19e519e3bbadafa114f6da4522ea77dd0c2842607e923a591d60a76699d819a2fbb6f3552e277efdb9b58b081390b60ab - languageName: node - linkType: hard - -"@jridgewell/gen-mapping@npm:^0.3.5": +"@jridgewell/gen-mapping@npm:^0.3.0, @jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.8 resolution: "@jridgewell/gen-mapping@npm:0.3.8" dependencies: @@ -2469,13 +2273,6 @@ __metadata: languageName: node linkType: hard -"@jridgewell/set-array@npm:^1.0.1": - version: 1.1.2 - resolution: "@jridgewell/set-array@npm:1.1.2" - checksum: 69a84d5980385f396ff60a175f7177af0b8da4ddb81824cb7016a9ef914eee9806c72b6b65942003c63f7983d4f39a5c6c27185bbca88eb4690b62075602e28e - languageName: node - linkType: hard - "@jridgewell/set-array@npm:^1.2.1": version: 1.2.1 resolution: "@jridgewell/set-array@npm:1.2.1" @@ -2490,17 +2287,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.17, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.9": - version: 0.3.20 - resolution: "@jridgewell/trace-mapping@npm:0.3.20" - dependencies: - "@jridgewell/resolve-uri": ^3.1.0 - "@jridgewell/sourcemap-codec": ^1.4.14 - checksum: cd1a7353135f385909468ff0cf20bdd37e59f2ee49a13a966dedf921943e222082c583ade2b579ff6cd0d8faafcb5461f253e1bf2a9f48fec439211fdbe788f5 - languageName: node - linkType: hard - -"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25": +"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.18, @jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25, @jridgewell/trace-mapping@npm:^0.3.9": version: 0.3.25 resolution: "@jridgewell/trace-mapping@npm:0.3.25" dependencies: @@ -2575,6 +2362,7 @@ __metadata: "@metamask/action-utils": ^1.0.0 "@metamask/auto-changelog": ^4.0.0 "@metamask/eslint-config": ^15.0.0 + "@metamask/eslint-config-browser": ^15.0.0 "@metamask/eslint-config-jest": ^15.0.0 "@metamask/eslint-config-nodejs": ^15.0.0 "@metamask/eslint-config-typescript": ^15.0.0 @@ -2607,6 +2395,7 @@ __metadata: eslint-plugin-n: ^17.15.1 eslint-plugin-node: ^11.1.0 eslint-plugin-prettier: ^5.2.1 + eslint-plugin-promise: ^7.2.1 eslint-plugin-react: ^7.37.5 execa: ^8.0.1 express: ^4.21.2 @@ -2640,6 +2429,19 @@ __metadata: languageName: unknown linkType: soft +"@metamask/eslint-config-browser@npm:^15.0.0": + version: 15.0.0 + resolution: "@metamask/eslint-config-browser@npm:15.0.0" + dependencies: + "@eslint/js": ^9.11.0 + globals: ^15.9.0 + peerDependencies: + "@metamask/eslint-config": ^15.0.0 + eslint: ^9.11.0 + checksum: 6482bb91e10b2becd8b592053f9eddc62253c2126f2f7259fabad8f36268fd6bcc1d637535cc8562d89d579150380b3968614056c40900930bf2956008a10982 + languageName: node + linkType: hard + "@metamask/eslint-config-jest@npm:^15.0.0": version: 15.0.0 resolution: "@metamask/eslint-config-jest@npm:15.0.0" @@ -3258,20 +3060,7 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.1.14": - version: 7.1.19 - resolution: "@types/babel__core@npm:7.1.19" - dependencies: - "@babel/parser": ^7.1.0 - "@babel/types": ^7.0.0 - "@types/babel__generator": "*" - "@types/babel__template": "*" - "@types/babel__traverse": "*" - checksum: 8c9fa87a1c2224cbec251683a58bebb0d74c497118034166aaa0491a4e2627998a6621fc71f8a60ffd27d9c0c52097defedf7637adc6618d0331c15adb302338 - languageName: node - linkType: hard - -"@types/babel__core@npm:^7.20.5": +"@types/babel__core@npm:^7.1.14, @types/babel__core@npm:^7.20.5": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" dependencies: @@ -3331,7 +3120,7 @@ __metadata: languageName: node linkType: hard -"@types/debug@npm:^4.0.0": +"@types/debug@npm:^4.0.0, @types/debug@npm:^4.1.7": version: 4.1.12 resolution: "@types/debug@npm:4.1.12" dependencies: @@ -3340,15 +3129,6 @@ __metadata: languageName: node linkType: hard -"@types/debug@npm:^4.1.7": - version: 4.1.7 - resolution: "@types/debug@npm:4.1.7" - dependencies: - "@types/ms": "*" - checksum: 0a7b89d8ed72526858f0b61c6fd81f477853e8c4415bb97f48b1b5545248d2ae389931680b94b393b993a7cfe893537a200647d93defe6d87159b96812305adc - languageName: node - linkType: hard - "@types/estree-jsx@npm:^1.0.0": version: 1.0.5 resolution: "@types/estree-jsx@npm:1.0.5" @@ -3358,20 +3138,20 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.0": - version: 1.0.6 - resolution: "@types/estree@npm:1.0.6" - checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 - languageName: node - linkType: hard - -"@types/estree@npm:^1.0.6": +"@types/estree@npm:*, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" checksum: bd93e2e415b6f182ec4da1074e1f36c480f1d26add3e696d54fb30c09bc470897e41361c8fd957bf0985024f8fbf1e6e2aff977d79352ef7eb93a5c6dcff6c11 languageName: node linkType: hard +"@types/estree@npm:1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:^5.0.0": version: 5.0.6 resolution: "@types/express-serve-static-core@npm:5.0.6" @@ -3654,138 +3434,138 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.49.0, @typescript-eslint/eslint-plugin@npm:^8.25.0": - version: 8.49.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.49.0" +"@typescript-eslint/eslint-plugin@npm:8.52.0, @typescript-eslint/eslint-plugin@npm:^8.25.0": + version: 8.52.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.52.0" dependencies: - "@eslint-community/regexpp": ^4.10.0 - "@typescript-eslint/scope-manager": 8.49.0 - "@typescript-eslint/type-utils": 8.49.0 - "@typescript-eslint/utils": 8.49.0 - "@typescript-eslint/visitor-keys": 8.49.0 - ignore: ^7.0.0 + "@eslint-community/regexpp": ^4.12.2 + "@typescript-eslint/scope-manager": 8.52.0 + "@typescript-eslint/type-utils": 8.52.0 + "@typescript-eslint/utils": 8.52.0 + "@typescript-eslint/visitor-keys": 8.52.0 + ignore: ^7.0.5 natural-compare: ^1.4.0 - ts-api-utils: ^2.1.0 + ts-api-utils: ^2.4.0 peerDependencies: - "@typescript-eslint/parser": ^8.49.0 + "@typescript-eslint/parser": ^8.52.0 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 0bae18dda8e8c86d8da311c382642e4e321e708ca7bad1ae86e43981b1679e99e7d9bd4e32d4874e8016cbe2e39f5a255a71f16cc2c64ec3471b23161e51afec + checksum: 5ddeb82d9ef17b19a108e14c16ebd82fcc3517ee48adc76bab621188a335b750d7f7286d135c3ff7dcf3cad7c357e2769d0fb11134fb06a1ce999d214e32b3d8 languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.49.0, @typescript-eslint/parser@npm:^8.25.0": - version: 8.49.0 - resolution: "@typescript-eslint/parser@npm:8.49.0" +"@typescript-eslint/parser@npm:8.52.0, @typescript-eslint/parser@npm:^8.25.0": + version: 8.52.0 + resolution: "@typescript-eslint/parser@npm:8.52.0" dependencies: - "@typescript-eslint/scope-manager": 8.49.0 - "@typescript-eslint/types": 8.49.0 - "@typescript-eslint/typescript-estree": 8.49.0 - "@typescript-eslint/visitor-keys": 8.49.0 - debug: ^4.3.4 + "@typescript-eslint/scope-manager": 8.52.0 + "@typescript-eslint/types": 8.52.0 + "@typescript-eslint/typescript-estree": 8.52.0 + "@typescript-eslint/visitor-keys": 8.52.0 + debug: ^4.4.3 peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: 27a157372fec09d72b9d3b266ca18cc6d4db040df6d507c5c9d30f97375e0be373d5fde9d02bcd997e40f21738edcc7a2e51d5a56e3cdd600147637bc96d920b + checksum: ec421ea73847fdc6da54346cc01db9f460bcb6329e36d7f5fda7567e1f3dc510a64233e614350cdfec876ab2cee1bc38f00caa3157c5f047eea2395d45c07d87 languageName: node linkType: hard -"@typescript-eslint/project-service@npm:8.49.0": - version: 8.49.0 - resolution: "@typescript-eslint/project-service@npm:8.49.0" +"@typescript-eslint/project-service@npm:8.52.0": + version: 8.52.0 + resolution: "@typescript-eslint/project-service@npm:8.52.0" dependencies: - "@typescript-eslint/tsconfig-utils": ^8.49.0 - "@typescript-eslint/types": ^8.49.0 - debug: ^4.3.4 + "@typescript-eslint/tsconfig-utils": ^8.52.0 + "@typescript-eslint/types": ^8.52.0 + debug: ^4.4.3 peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: 378cd7e6982820aa0bb1dfe78a8cf133dc8192ad68b4e2a3ed1615a1a1b4542a1a20da08de6f5dee2a5804192aeceabe06e6c16a0453a8aaa43e495527e6af6a + checksum: f27900d176aeb9a9c6c0f241011b9f55971015f62bc123d271f1046071834702e0caa7bd82ade4e24e5e48af1696fced0c53444d8f763e66fae7ead78dfd0a5d languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.49.0": - version: 8.49.0 - resolution: "@typescript-eslint/scope-manager@npm:8.49.0" +"@typescript-eslint/scope-manager@npm:8.52.0": + version: 8.52.0 + resolution: "@typescript-eslint/scope-manager@npm:8.52.0" dependencies: - "@typescript-eslint/types": 8.49.0 - "@typescript-eslint/visitor-keys": 8.49.0 - checksum: 85aae146729547df03a2ffdb4e447a10023e7c71b426a2a5d7eb3b2a82ec1bbd8ba214d619363994c500a4cf742fbb3f3743723aa13784649e0b9e909ab4529f + "@typescript-eslint/types": 8.52.0 + "@typescript-eslint/visitor-keys": 8.52.0 + checksum: e28a58da6a4ff32436f823e48674a16f26dfbd81126f4c5c785d66958c2a65409dce3998a7f3e4ca366c1cda6fed7e9cace6a37ab0e7848e30ff0d550fad1c64 languageName: node linkType: hard -"@typescript-eslint/tsconfig-utils@npm:8.49.0, @typescript-eslint/tsconfig-utils@npm:^8.49.0": - version: 8.49.0 - resolution: "@typescript-eslint/tsconfig-utils@npm:8.49.0" +"@typescript-eslint/tsconfig-utils@npm:8.52.0, @typescript-eslint/tsconfig-utils@npm:^8.52.0": + version: 8.52.0 + resolution: "@typescript-eslint/tsconfig-utils@npm:8.52.0" peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: be26283df8cf05a3a8d17596ac52e51ec27017f27ec5588e2fa3b804c31758864732a24e1ab777ac3e3567dda9b55de5b18d318b6a6e56025baa4f117f371804 + checksum: 0538a4092ece026a1567100f5cb019bb947268a246eb5a222abfcc73e91c3c1ee734d21c411f200a52fed5aa050067cee76bd469d04954664374b1f752ab6aea languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.49.0": - version: 8.49.0 - resolution: "@typescript-eslint/type-utils@npm:8.49.0" +"@typescript-eslint/type-utils@npm:8.52.0": + version: 8.52.0 + resolution: "@typescript-eslint/type-utils@npm:8.52.0" dependencies: - "@typescript-eslint/types": 8.49.0 - "@typescript-eslint/typescript-estree": 8.49.0 - "@typescript-eslint/utils": 8.49.0 - debug: ^4.3.4 - ts-api-utils: ^2.1.0 + "@typescript-eslint/types": 8.52.0 + "@typescript-eslint/typescript-estree": 8.52.0 + "@typescript-eslint/utils": 8.52.0 + debug: ^4.4.3 + ts-api-utils: ^2.4.0 peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: ce5795464be57b0a1cf5970103547a148e8971fe7cf1aafb9a62b40251c670fd1b03535edfc4622c520112705cd6ee5efd88124a7432d2fbbcfc5be54fbf131f + checksum: 172d22b4b740a9b367b0b079c8f1e61cb6610db6b31e84f37e021430941f1104fcea68391bc65a84e469386aa46d80e17a14f67bc082d15358b928d9c9161144 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.49.0, @typescript-eslint/types@npm:^8.11.0, @typescript-eslint/types@npm:^8.35.0, @typescript-eslint/types@npm:^8.49.0": - version: 8.49.0 - resolution: "@typescript-eslint/types@npm:8.49.0" - checksum: e604e27f9ff7dd4c7ae0060db5f506338b64cc302563841e729f4da7730a1e94176db8ae1f1c4c0c0c8df5086f127408dc050f27595a36d412f60ed0e09f5a64 +"@typescript-eslint/types@npm:8.52.0, @typescript-eslint/types@npm:^8.11.0, @typescript-eslint/types@npm:^8.35.0, @typescript-eslint/types@npm:^8.52.0": + version: 8.52.0 + resolution: "@typescript-eslint/types@npm:8.52.0" + checksum: 3bf4058a46ea2bb31dc8a828916cac63719f0dab33d5351e43012e6ad9c47c815856a3b4858d9fb0403d1baac6409cead73f64b7391521f11f20e52444af2961 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.49.0": - version: 8.49.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.49.0" +"@typescript-eslint/typescript-estree@npm:8.52.0": + version: 8.52.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.52.0" dependencies: - "@typescript-eslint/project-service": 8.49.0 - "@typescript-eslint/tsconfig-utils": 8.49.0 - "@typescript-eslint/types": 8.49.0 - "@typescript-eslint/visitor-keys": 8.49.0 - debug: ^4.3.4 - minimatch: ^9.0.4 - semver: ^7.6.0 + "@typescript-eslint/project-service": 8.52.0 + "@typescript-eslint/tsconfig-utils": 8.52.0 + "@typescript-eslint/types": 8.52.0 + "@typescript-eslint/visitor-keys": 8.52.0 + debug: ^4.4.3 + minimatch: ^9.0.5 + semver: ^7.7.3 tinyglobby: ^0.2.15 - ts-api-utils: ^2.1.0 + ts-api-utils: ^2.4.0 peerDependencies: typescript: ">=4.8.4 <6.0.0" - checksum: a03545eefdf2487172602930fdd27c8810dc775bdfa4d9c3a45651c5f5465c5e1fc652f318c61ece7f4f35425231961434e96d4ffca84f10149fca111e1fc520 + checksum: 16fbe17f4ff8cfcf5f58ce09c44ef1c487244a3303b9b3dfd25cba9664a630b482cd6d2f276560f96a481f55932c8d3f9dcda38fded9d387c05cfc60a6288b83 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.49.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0": - version: 8.49.0 - resolution: "@typescript-eslint/utils@npm:8.49.0" +"@typescript-eslint/utils@npm:8.52.0, @typescript-eslint/utils@npm:^6.0.0 || ^7.0.0 || ^8.0.0": + version: 8.52.0 + resolution: "@typescript-eslint/utils@npm:8.52.0" dependencies: - "@eslint-community/eslint-utils": ^4.7.0 - "@typescript-eslint/scope-manager": 8.49.0 - "@typescript-eslint/types": 8.49.0 - "@typescript-eslint/typescript-estree": 8.49.0 + "@eslint-community/eslint-utils": ^4.9.1 + "@typescript-eslint/scope-manager": 8.52.0 + "@typescript-eslint/types": 8.52.0 + "@typescript-eslint/typescript-estree": 8.52.0 peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: be1bdf2e4a8bb56bb0c39ba8b8a5f1fc187fb17a53af0ef4d50be95914027076dfac385b54d969fdaa2a42fa8a95f31d105457a3768875054a5507ebe6f6257a + checksum: 08392eb917b5ab32eb812f96135e674af233e943cd150e3073d67b3df3abd958ec9959e3efb230978a5b150f9ea8fb05706323c675ff182976d9a307eb2503bf languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.49.0": - version: 8.49.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.49.0" +"@typescript-eslint/visitor-keys@npm:8.52.0": + version: 8.52.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.52.0" dependencies: - "@typescript-eslint/types": 8.49.0 + "@typescript-eslint/types": 8.52.0 eslint-visitor-keys: ^4.2.1 - checksum: 446d6345d9702bcdf8713a47561ea52657bbec1c8170b1559d9462e1d815b122adff35f1cc778ecb94f4459d51ac7aac7cafe9ec8d8319b2c7d7984a0edee6ba + checksum: 8b071589a5480f8408aa1564648747e3aa31f4c39ddea1f0a43b06faf40b2aba04696b5c64b4f432f58b55af1241cdba23718af1a0f0b81f70609ca0b9716ae2 languageName: node linkType: hard @@ -4069,15 +3849,6 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: ^1.9.0 - checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 - languageName: node - linkType: hard - "ansi-styles@npm:^4.0.0, ansi-styles@npm:^4.1.0": version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" @@ -4168,19 +3939,6 @@ __metadata: languageName: node linkType: hard -"array-includes@npm:^3.1.4": - version: 3.1.5 - resolution: "array-includes@npm:3.1.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.19.5 - get-intrinsic: ^1.1.1 - is-string: ^1.0.7 - checksum: f6f24d834179604656b7bec3e047251d5cc87e9e87fab7c175c61af48e80e75acd296017abcde21fb52292ab6a2a449ab2ee37213ee48c8709f004d75983f9c5 - languageName: node - linkType: hard - "array-includes@npm:^3.1.6, array-includes@npm:^3.1.8": version: 3.1.9 resolution: "array-includes@npm:3.1.9" @@ -4197,13 +3955,6 @@ __metadata: languageName: node linkType: hard -"array-union@npm:^2.1.0": - version: 2.1.0 - resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d - languageName: node - linkType: hard - "array.prototype.findlast@npm:^1.2.5": version: 1.2.5 resolution: "array.prototype.findlast@npm:1.2.5" @@ -4218,18 +3969,6 @@ __metadata: languageName: node linkType: hard -"array.prototype.flat@npm:^1.2.5": - version: 1.3.0 - resolution: "array.prototype.flat@npm:1.3.0" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.2 - es-shim-unscopables: ^1.0.0 - checksum: 2a652b3e8dc0bebb6117e42a5ab5738af0203a14c27341d7bb2431467bdb4b348e2c5dc555dfcda8af0a5e4075c400b85311ded73861c87290a71a17c3e0a257 - languageName: node - linkType: hard - "array.prototype.flat@npm:^1.3.1": version: 1.3.3 resolution: "array.prototype.flat@npm:1.3.3" @@ -4491,21 +4230,7 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.9, browserslist@npm:^4.22.2": - version: 4.22.2 - resolution: "browserslist@npm:4.22.2" - dependencies: - caniuse-lite: ^1.0.30001565 - electron-to-chromium: ^1.4.601 - node-releases: ^2.0.14 - update-browserslist-db: ^1.0.13 - bin: - browserslist: cli.js - checksum: 33ddfcd9145220099a7a1ac533cecfe5b7548ffeb29b313e1b57be6459000a1f8fa67e781cf4abee97268ac594d44134fcc4a6b2b4750ceddc9796e3a22076d9 - languageName: node - linkType: hard - -"browserslist@npm:^4.24.0": +"browserslist@npm:^4.22.2, browserslist@npm:^4.24.0": version: 4.24.4 resolution: "browserslist@npm:4.24.4" dependencies: @@ -4607,16 +4332,6 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" - dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 - languageName: node - linkType: hard - "call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": version: 1.0.8 resolution: "call-bind@npm:1.0.8" @@ -4629,17 +4344,7 @@ __metadata: languageName: node linkType: hard -"call-bound@npm:^1.0.2": - version: 1.0.3 - resolution: "call-bound@npm:1.0.3" - dependencies: - call-bind-apply-helpers: ^1.0.1 - get-intrinsic: ^1.2.6 - checksum: a93bbe0f2d0a2d6c144a4349ccd0593d5d0d5d9309b69101710644af8964286420062f2cc3114dca120b9bc8cc07507952d4b1b3ea7672e0d7f6f1675efedb32 - languageName: node - linkType: hard - -"call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": +"call-bound@npm:^1.0.2, call-bound@npm:^1.0.3, call-bound@npm:^1.0.4": version: 1.0.4 resolution: "call-bound@npm:1.0.4" dependencies: @@ -4670,13 +4375,6 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001565": - version: 1.0.30001566 - resolution: "caniuse-lite@npm:1.0.30001566" - checksum: 0f9084bf9f7d5c0a9ddb200c2baddb25dd2ad5a2f205f01e7b971f3e98e9a7bb23c2d86bae48237e9bc9782b682cffaaf3406d936937ab9844987dbe2a6401f2 - languageName: node - linkType: hard - "caniuse-lite@npm:^1.0.30001688": version: 1.0.30001700 resolution: "caniuse-lite@npm:1.0.30001700" @@ -4691,17 +4389,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 - languageName: node - linkType: hard - "chalk@npm:^4.0.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -4821,15 +4508,6 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 - languageName: node - linkType: hard - "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -4839,13 +4517,6 @@ __metadata: languageName: node linkType: hard -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d - languageName: node - linkType: hard - "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" @@ -4978,18 +4649,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" - dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"cross-spawn@npm:^7.0.6": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -5049,40 +4709,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.6.9": - version: 2.6.9 - resolution: "debug@npm:2.6.9" - dependencies: - ms: 2.0.0 - checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 - languageName: node - linkType: hard - -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": - version: 4.3.4 - resolution: "debug@npm:4.3.4" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 - languageName: node - linkType: hard - -"debug@npm:^4.0.0, debug@npm:^4.3.1": - version: 4.4.0 - resolution: "debug@npm:4.4.0" - dependencies: - ms: ^2.1.3 - peerDependenciesMeta: - supports-color: - optional: true - checksum: fb42df878dd0e22816fc56e1fdca9da73caa85212fbe40c868b1295a6878f9101ae684f4eeef516c13acfc700f5ea07f1136954f43d4cd2d477a811144136479 - languageName: node - linkType: hard - -"debug@npm:^4.4.0, debug@npm:^4.4.1": +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.4.0, debug@npm:^4.4.1, debug@npm:^4.4.3": version: 4.4.3 resolution: "debug@npm:4.4.3" dependencies: @@ -5164,17 +4791,7 @@ __metadata: languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": - version: 1.1.4 - resolution: "define-properties@npm:1.1.4" - dependencies: - has-property-descriptors: ^1.0.0 - object-keys: ^1.1.1 - checksum: ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b - languageName: node - linkType: hard - -"define-properties@npm:^1.2.1": +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.1": version: 1.2.1 resolution: "define-properties@npm:1.2.1" dependencies: @@ -5291,15 +4908,6 @@ __metadata: languageName: node linkType: hard -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce - languageName: node - linkType: hard - "dunder-proto@npm:^1.0.0, dunder-proto@npm:^1.0.1": version: 1.0.1 resolution: "dunder-proto@npm:1.0.1" @@ -5311,17 +4919,6 @@ __metadata: languageName: node linkType: hard -"dunder-proto@npm:^1.0.1": - version: 1.0.1 - resolution: "dunder-proto@npm:1.0.1" - dependencies: - call-bind-apply-helpers: ^1.0.1 - es-errors: ^1.3.0 - gopd: ^1.2.0 - checksum: 149207e36f07bd4941921b0ca929e3a28f1da7bd6b6ff8ff7f4e2f2e460675af4576eeba359c635723dc189b64cdd4787e0255897d5b135ccc5d15cb8685fc90 - languageName: node - linkType: hard - "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" @@ -5336,13 +4933,6 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.601": - version: 1.4.605 - resolution: "electron-to-chromium@npm:1.4.605" - checksum: 2d42afd5d8cfc053d68944891f02fb007931fae85c0a19bc4f458bb3430e793b8a76664b058e1b06ab99e784f73e4c6b56493eaede2ff6012dbcaf8781fec4a7 - languageName: node - linkType: hard - "electron-to-chromium@npm:^1.5.73": version: 1.5.104 resolution: "electron-to-chromium@npm:1.5.104" @@ -5394,23 +4984,13 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.17.1": - version: 5.18.3 - resolution: "enhanced-resolve@npm:5.18.3" +"enhanced-resolve@npm:^5.17.1, enhanced-resolve@npm:^5.18.1": + version: 5.18.4 + resolution: "enhanced-resolve@npm:5.18.4" dependencies: graceful-fs: ^4.2.4 tapable: ^2.2.0 - checksum: e2b2188a7f9b68616984b5ce1f43b97bef3c5fde4d193c24ea4cfdb4eb784a700093f049f14155733a3cb3ae1204550590aa37dda7e742022c8f447f618a4816 - languageName: node - linkType: hard - -"enhanced-resolve@npm:^5.18.1": - version: 5.18.1 - resolution: "enhanced-resolve@npm:5.18.1" - dependencies: - graceful-fs: ^4.2.4 - tapable: ^2.2.0 - checksum: de5bea7debe3576e78173bcc409c4aee7fcb56580c602d5c47c533b92952e55d7da3d9f53b864846ba62c8bd3efb0f9ecfe5f865e57de2f3e9b6e5cda03b4e7e + checksum: 8e8a1e8efd2361d32c8a4ea00523b52311ea47e66abebda159f1e60d8849161550821f44fde51fca20261b70a0b3f61dec6d4425816934a2adb65a9ea0574ec8 languageName: node linkType: hard @@ -5499,37 +5079,6 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.19.0, es-abstract@npm:^1.19.1, es-abstract@npm:^1.19.2, es-abstract@npm:^1.19.5": - version: 1.20.1 - resolution: "es-abstract@npm:1.20.1" - dependencies: - call-bind: ^1.0.2 - es-to-primitive: ^1.2.1 - function-bind: ^1.1.1 - function.prototype.name: ^1.1.5 - get-intrinsic: ^1.1.1 - get-symbol-description: ^1.0.0 - has: ^1.0.3 - has-property-descriptors: ^1.0.0 - has-symbols: ^1.0.3 - internal-slot: ^1.0.3 - is-callable: ^1.2.4 - is-negative-zero: ^2.0.2 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.2 - is-string: ^1.0.7 - is-weakref: ^1.0.2 - object-inspect: ^1.12.0 - object-keys: ^1.1.1 - object.assign: ^4.1.2 - regexp.prototype.flags: ^1.4.3 - string.prototype.trimend: ^1.0.5 - string.prototype.trimstart: ^1.0.5 - unbox-primitive: ^1.0.2 - checksum: 28da27ae0ed9c76df7ee8ef5c278df79dcfdb554415faf7068bb7c58f8ba8e2a16bfb59e586844be6429ab4c302ca7748979d48442224cb1140b051866d74b7f - languageName: node - linkType: hard - "es-define-property@npm:^1.0.0, es-define-property@npm:^1.0.1": version: 1.0.1 resolution: "es-define-property@npm:1.0.1" @@ -5537,13 +5086,6 @@ __metadata: languageName: node linkType: hard -"es-define-property@npm:^1.0.1": - version: 1.0.1 - resolution: "es-define-property@npm:1.0.1" - checksum: 0512f4e5d564021c9e3a644437b0155af2679d10d80f21adaf868e64d30efdfbd321631956f20f42d655fedb2e3a027da479fad3fa6048f768eb453a80a5f80a - languageName: node - linkType: hard - "es-errors@npm:^1.3.0": version: 1.3.0 resolution: "es-errors@npm:1.3.0" @@ -5596,15 +5138,6 @@ __metadata: languageName: node linkType: hard -"es-shim-unscopables@npm:^1.0.0": - version: 1.0.0 - resolution: "es-shim-unscopables@npm:1.0.0" - dependencies: - has: ^1.0.3 - checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1 - languageName: node - linkType: hard - "es-shim-unscopables@npm:^1.0.2": version: 1.1.0 resolution: "es-shim-unscopables@npm:1.1.0" @@ -5614,17 +5147,6 @@ __metadata: languageName: node linkType: hard -"es-to-primitive@npm:^1.2.1": - version: 1.2.1 - resolution: "es-to-primitive@npm:1.2.1" - dependencies: - is-callable: ^1.1.4 - is-date-object: ^1.0.1 - is-symbol: ^1.0.2 - checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed - languageName: node - linkType: hard - "es-to-primitive@npm:^1.3.0": version: 1.3.0 resolution: "es-to-primitive@npm:1.3.0" @@ -5799,14 +5321,7 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 - languageName: node - linkType: hard - -"escalade@npm:^3.2.0": +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" checksum: 47b029c83de01b0d17ad99ed766347b974b0d628e848de404018f3abee728e987da0d2d370ad4574aa3d5b5bfc368754fd085d69a30f8e75903486ec4b5b709e @@ -6085,17 +5600,6 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - "@eslint-community/eslint-utils": ^4.4.0 - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 9101a93efd79f5202d0239d7666935c1d5655f64f4527cea6e82e1438b4de4304351de60f2c26201289a22eed1da4b3a21e7996fa3268b9943b98d12c80b2030 - languageName: node - linkType: hard - "eslint-scope@npm:^8.4.0": version: 8.4.0 resolution: "eslint-scope@npm:8.4.0" @@ -6137,8 +5641,8 @@ __metadata: linkType: hard "eslint@npm:^9.21.0": - version: 9.39.1 - resolution: "eslint@npm:9.39.1" + version: 9.39.2 + resolution: "eslint@npm:9.39.2" dependencies: "@eslint-community/eslint-utils": ^4.8.0 "@eslint-community/regexpp": ^4.12.1 @@ -6146,7 +5650,7 @@ __metadata: "@eslint/config-helpers": ^0.4.2 "@eslint/core": ^0.17.0 "@eslint/eslintrc": ^3.3.1 - "@eslint/js": 9.39.1 + "@eslint/js": 9.39.2 "@eslint/plugin-kit": ^0.4.1 "@humanfs/node": ^0.16.6 "@humanwhocodes/module-importer": ^1.0.1 @@ -6181,7 +5685,7 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 35583d4d93f431ea2716e18c912e0b10980e27377a89d2c644a3a755921e42a2665dfd7367b8e9b54c7e4e9f193dea4126ce503c866f5795b170934ffd3f1dd9 + checksum: bfa288fe6b19b6e7f8868e1434d8e469603203d6259e4451b8be4e2172de3172f3b07ed8943ba3904f3545c7c546062c0d656774baa0a10a54483f3907c525e3 languageName: node linkType: hard @@ -6207,11 +5711,11 @@ __metadata: linkType: hard "esquery@npm:^1.5.0, esquery@npm:^1.6.0": - version: 1.6.0 - resolution: "esquery@npm:1.6.0" + version: 1.7.0 + resolution: "esquery@npm:1.7.0" dependencies: estraverse: ^5.1.0 - checksum: 08ec4fe446d9ab27186da274d979558557fbdbbd10968fa9758552482720c54152a5640e08b9009e5a30706b66aba510692054d4129d32d0e12e05bbc0b96fb2 + checksum: 3239792b68cf39fe18966d0ca01549bb15556734f0144308fd213739b0f153671ae916013fce0bca032044a4dbcda98b43c1c667f20c20a54dec3597ac0d7c27 languageName: node linkType: hard @@ -6224,20 +5728,6 @@ __metadata: languageName: node linkType: hard -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 - languageName: node - linkType: hard - -"estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": - version: 5.3.0 - resolution: "estraverse@npm:5.3.0" - checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b - languageName: node - linkType: hard - "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0, estraverse@npm:^5.3.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" @@ -6619,18 +6109,6 @@ __metadata: languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5": - version: 1.1.5 - resolution: "function.prototype.name@npm:1.1.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.0 - functions-have-names: ^1.2.2 - checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 - languageName: node - linkType: hard - "function.prototype.name@npm:^1.1.6, function.prototype.name@npm:^1.1.8": version: 1.1.8 resolution: "function.prototype.name@npm:1.1.8" @@ -6645,7 +6123,7 @@ __metadata: languageName: node linkType: hard -"functions-have-names@npm:^1.2.2, functions-have-names@npm:^1.2.3": +"functions-have-names@npm:^1.2.3": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 @@ -6689,18 +6167,7 @@ __metadata: languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.0, get-intrinsic@npm:^1.1.1": - version: 1.1.2 - resolution: "get-intrinsic@npm:1.1.2" - dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 - has-symbols: ^1.0.3 - checksum: 252f45491f2ba88ebf5b38018020c7cc3279de54b1d67ffb70c0cdf1dfa8ab31cd56467b5d117a8b4275b7a4dde91f86766b163a17a850f036528a7b2faafb2b - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": +"get-intrinsic@npm:^1.2.4, get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6, get-intrinsic@npm:^1.2.7, get-intrinsic@npm:^1.3.0": version: 1.3.1 resolution: "get-intrinsic@npm:1.3.1" dependencies: @@ -6717,25 +6184,7 @@ __metadata: has-symbols: ^1.1.0 hasown: ^2.0.2 math-intrinsics: ^1.1.0 - checksum: c02b3b6a445f9cd53e14896303794ac60f9751f58a69099127248abdb0251957174c6524245fc68579dc8e6a35161d3d94c93e665f808274716f4248b269436a - languageName: node - linkType: hard - -"get-intrinsic@npm:^1.2.5, get-intrinsic@npm:^1.2.6": - version: 1.2.7 - resolution: "get-intrinsic@npm:1.2.7" - dependencies: - call-bind-apply-helpers: ^1.0.1 - es-define-property: ^1.0.1 - es-errors: ^1.3.0 - es-object-atoms: ^1.0.0 - function-bind: ^1.1.2 - get-proto: ^1.0.0 - gopd: ^1.2.0 - has-symbols: ^1.1.0 - hasown: ^2.0.2 - math-intrinsics: ^1.1.0 - checksum: a1597b3b432074f805b6a0ba1182130dd6517c0ea0c4eecc4b8834c803913e1ea62dfc412865be795b3dacb1555a21775b70cf9af7a18b1454ff3414e5442d4a + checksum: c02b3b6a445f9cd53e14896303794ac60f9751f58a69099127248abdb0251957174c6524245fc68579dc8e6a35161d3d94c93e665f808274716f4248b269436a languageName: node linkType: hard @@ -6788,7 +6237,7 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.10.0, get-tsconfig@npm:^4.10.1, get-tsconfig@npm:^4.8.1": +"get-tsconfig@npm:^4.10.0, get-tsconfig@npm:^4.10.1, get-tsconfig@npm:^4.7.2, get-tsconfig@npm:^4.8.1": version: 4.13.0 resolution: "get-tsconfig@npm:4.13.0" dependencies: @@ -6797,15 +6246,6 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.7.2": - version: 4.7.2 - resolution: "get-tsconfig@npm:4.7.2" - dependencies: - resolve-pkg-maps: ^1.0.0 - checksum: 172358903250eff0103943f816e8a4e51d29b8e5449058bdf7266714a908a48239f6884308bd3a6ff28b09f692b9533dbebfd183ab63e4e14f073cda91f1bca9 - languageName: node - linkType: hard - "git-hooks-list@npm:^3.0.0": version: 3.1.0 resolution: "git-hooks-list@npm:3.1.0" @@ -6917,20 +6357,6 @@ __metadata: languageName: node linkType: hard -"globby@npm:^11.1.0": - version: 11.1.0 - resolution: "globby@npm:11.1.0" - dependencies: - array-union: ^2.1.0 - dir-glob: ^3.0.1 - fast-glob: ^3.2.9 - ignore: ^5.2.0 - merge2: ^1.4.1 - slash: ^3.0.0 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 - languageName: node - linkType: hard - "globby@npm:^13.1.2": version: 13.2.2 resolution: "globby@npm:13.2.2" @@ -6958,31 +6384,17 @@ __metadata: languageName: node linkType: hard -"gopd@npm:^1.2.0": - version: 1.2.0 - resolution: "gopd@npm:1.2.0" - checksum: cc6d8e655e360955bdccaca51a12a474268f95bb793fc3e1f2bdadb075f28bfd1fd988dab872daf77a61d78cbaf13744bc8727a17cfb1d150d76047d805375f3 - languageName: node - linkType: hard - -"graceful-fs@npm:^4.2.4": +"graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: ac85f94da92d8eb6b7f5a8b20ce65e43d66761c55ce85ac96df6865308390da45a8d3f0296dd3a663de65d30ba497bd46c696cc1e248c72b13d6d567138a4fc7 languageName: node linkType: hard -"graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da - languageName: node - linkType: hard - -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b +"has-bigints@npm:^1.0.2": + version: 1.0.2 + resolution: "has-bigints@npm:1.0.2" + checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b languageName: node linkType: hard @@ -6993,16 +6405,7 @@ __metadata: languageName: node linkType: hard -"has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" - dependencies: - get-intrinsic: ^1.1.1 - checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb - languageName: node - linkType: hard - -"has-property-descriptors@npm:^1.0.2": +"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" dependencies: @@ -7020,29 +6423,13 @@ __metadata: languageName: node linkType: hard -"has-symbols@npm:^1.0.1, has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": - version: 1.0.3 - resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 - languageName: node - linkType: hard - -"has-symbols@npm:^1.1.0": +"has-symbols@npm:^1.0.3, has-symbols@npm:^1.1.0": version: 1.1.0 resolution: "has-symbols@npm:1.1.0" checksum: b2316c7302a0e8ba3aaba215f834e96c22c86f192e7310bdf689dd0e6999510c89b00fbc5742571507cebf25764d68c988b3a0da217369a73596191ac0ce694b languageName: node linkType: hard -"has-tostringtag@npm:^1.0.0": - version: 1.0.0 - resolution: "has-tostringtag@npm:1.0.0" - dependencies: - has-symbols: ^1.0.2 - checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c - languageName: node - linkType: hard - "has-tostringtag@npm:^1.0.2": version: 1.0.2 resolution: "has-tostringtag@npm:1.0.2" @@ -7059,16 +6446,7 @@ __metadata: languageName: node linkType: hard -"hasown@npm:^2.0.0": - version: 2.0.0 - resolution: "hasown@npm:2.0.0" - dependencies: - function-bind: ^1.1.2 - checksum: 6151c75ca12554565098641c98a40f4cc86b85b0fd5b6fe92360967e4605a4f9610f7757260b4e8098dd1c2ce7f4b095f2006fe72a570e3b6d2d28de0298c176 - languageName: node - linkType: hard - -"hasown@npm:^2.0.2": +"hasown@npm:^2.0.0, hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" dependencies: @@ -7241,7 +6619,7 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^7.0.0": +"ignore@npm:^7.0.5": version: 7.0.5 resolution: "ignore@npm:7.0.5" checksum: d0862bf64d3d58bf34d5fb0a9f725bec9ca5ce8cd1aecc8f28034269e8f69b8009ffd79ca3eda96962a6a444687781cd5efdb8c7c8ddc0a6996e36d31c217f14 @@ -7322,17 +6700,6 @@ __metadata: languageName: node linkType: hard -"internal-slot@npm:^1.0.3": - version: 1.0.3 - resolution: "internal-slot@npm:1.0.3" - dependencies: - get-intrinsic: ^1.1.0 - has: ^1.0.3 - side-channel: ^1.0.4 - checksum: 1944f92e981e47aebc98a88ff0db579fd90543d937806104d0b96557b10c1f170c51fb777b97740a8b6ddeec585fca8c39ae99fd08a8e058dfc8ab70937238bf - languageName: node - linkType: hard - "internal-slot@npm:^1.1.0": version: 1.1.0 resolution: "internal-slot@npm:1.1.0" @@ -7409,15 +6776,6 @@ __metadata: languageName: node linkType: hard -"is-bigint@npm:^1.0.1": - version: 1.0.4 - resolution: "is-bigint@npm:1.0.4" - dependencies: - semver: ^7.7.1 - checksum: e75bd87cb1aaff7c97cf085509669559a713f741a43b4fd5979cb44c5c0c16c05670ce5f23fc22337d1379211fac118c525c5ed73544076ddaf181c1c21ace35 - languageName: node - linkType: hard - "is-bigint@npm:^1.1.0": version: 1.1.0 resolution: "is-bigint@npm:1.1.0" @@ -7427,16 +6785,6 @@ __metadata: languageName: node linkType: hard -"is-boolean-object@npm:^1.1.0": - version: 1.1.2 - resolution: "is-boolean-object@npm:1.1.2" - dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 - languageName: node - linkType: hard - "is-boolean-object@npm:^1.2.1": version: 1.2.2 resolution: "is-boolean-object@npm:1.2.2" @@ -7456,13 +6804,6 @@ __metadata: languageName: node linkType: hard -"is-callable@npm:^1.1.4, is-callable@npm:^1.2.4": - version: 1.2.4 - resolution: "is-callable@npm:1.2.4" - checksum: 1a28d57dc435797dae04b173b65d6d1e77d4f16276e9eff973f994eadcfdc30a017e6a597f092752a083c1103cceb56c91e3dadc6692fedb9898dfaba701575f - languageName: node - linkType: hard - "is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" @@ -7479,15 +6820,6 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.8.1": - version: 2.13.1 - resolution: "is-core-module@npm:2.13.1" - dependencies: - hasown: ^2.0.0 - checksum: 256559ee8a9488af90e4bad16f5583c6d59e92f0742e9e8bb4331e758521ee86b810b93bae44f390766ffbc518a0488b18d9dab7da9a5ff997d499efc9403f7c - languageName: node - linkType: hard - "is-data-view@npm:^1.0.1, is-data-view@npm:^1.0.2": version: 1.0.2 resolution: "is-data-view@npm:1.0.2" @@ -7499,15 +6831,6 @@ __metadata: languageName: node linkType: hard -"is-date-object@npm:^1.0.1": - version: 1.0.5 - resolution: "is-date-object@npm:1.0.5" - dependencies: - has-tostringtag: ^1.0.0 - checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc - languageName: node - linkType: hard - "is-date-object@npm:^1.0.5, is-date-object@npm:^1.1.0": version: 1.1.0 resolution: "is-date-object@npm:1.1.0" @@ -7618,13 +6941,6 @@ __metadata: languageName: node linkType: hard -"is-negative-zero@npm:^2.0.2": - version: 2.0.2 - resolution: "is-negative-zero@npm:2.0.2" - checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a - languageName: node - linkType: hard - "is-negative-zero@npm:^2.0.3": version: 2.0.3 resolution: "is-negative-zero@npm:2.0.3" @@ -7632,15 +6948,6 @@ __metadata: languageName: node linkType: hard -"is-number-object@npm:^1.0.4": - version: 1.0.7 - resolution: "is-number-object@npm:1.0.7" - dependencies: - has-tostringtag: ^1.0.0 - checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 - languageName: node - linkType: hard - "is-number-object@npm:^1.1.1": version: 1.1.1 resolution: "is-number-object@npm:1.1.1" @@ -7665,16 +6972,6 @@ __metadata: languageName: node linkType: hard -"is-regex@npm:^1.1.4": - version: 1.1.4 - resolution: "is-regex@npm:1.1.4" - dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 - languageName: node - linkType: hard - "is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" @@ -7694,15 +6991,6 @@ __metadata: languageName: node linkType: hard -"is-shared-array-buffer@npm:^1.0.2": - version: 1.0.2 - resolution: "is-shared-array-buffer@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a - languageName: node - linkType: hard - "is-shared-array-buffer@npm:^1.0.4": version: 1.0.4 resolution: "is-shared-array-buffer@npm:1.0.4" @@ -7726,15 +7014,6 @@ __metadata: languageName: node linkType: hard -"is-string@npm:^1.0.5, is-string@npm:^1.0.7": - version: 1.0.7 - resolution: "is-string@npm:1.0.7" - dependencies: - has-tostringtag: ^1.0.0 - checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 - languageName: node - linkType: hard - "is-string@npm:^1.1.1": version: 1.1.1 resolution: "is-string@npm:1.1.1" @@ -7745,15 +7024,6 @@ __metadata: languageName: node linkType: hard -"is-symbol@npm:^1.0.2, is-symbol@npm:^1.0.3": - version: 1.0.4 - resolution: "is-symbol@npm:1.0.4" - dependencies: - has-symbols: ^1.0.2 - checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 - languageName: node - linkType: hard - "is-symbol@npm:^1.0.4, is-symbol@npm:^1.1.1": version: 1.1.1 resolution: "is-symbol@npm:1.1.1" @@ -7781,16 +7051,7 @@ __metadata: languageName: node linkType: hard -"is-weakref@npm:^1.0.2": - version: 1.0.2 - resolution: "is-weakref@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de - languageName: node - linkType: hard - -"is-weakref@npm:^1.1.1": +"is-weakref@npm:^1.0.2, is-weakref@npm:^1.1.1": version: 1.1.1 resolution: "is-weakref@npm:1.1.1" dependencies: @@ -8401,13 +7662,6 @@ __metadata: languageName: node linkType: hard -"js-sdsl@npm:^4.1.4": - version: 4.1.5 - resolution: "js-sdsl@npm:4.1.5" - checksum: 695f657ddc5be462b97cac4e8e60f37de28d628ee0e23016baecff0bb584a18dddb5caeac537a775030f180b5afd62133ac4481e7024c8d03a62d73e4da0713e - languageName: node - linkType: hard - "js-tokens@npm:^3.0.0 || ^4.0.0, js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" @@ -8415,13 +7669,6 @@ __metadata: languageName: node linkType: hard -"js-tokens@npm:^4.0.0": - version: 4.0.0 - resolution: "js-tokens@npm:4.0.0" - checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 - languageName: node - linkType: hard - "js-yaml@npm:^3.13.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" @@ -8459,15 +7706,6 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" - bin: - jsesc: bin/jsesc - checksum: 4dc190771129e12023f729ce20e1e0bfceac84d73a85bc3119f7f938843fe25a4aeccb54b6494dce26fcf263d815f5f31acdefac7cc9329efb8422a4f4d9fa9d - languageName: node - linkType: hard - "jsesc@npm:^3.0.2": version: 3.1.0 resolution: "jsesc@npm:3.1.0" @@ -9318,7 +8556,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.4": +"minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -9458,13 +8696,6 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - "ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" @@ -9479,16 +8710,7 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.4": - version: 3.3.4 - resolution: "nanoid@npm:3.3.4" - bin: - nanoid: bin/nanoid.cjs - checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c - languageName: node - linkType: hard - -"nanoid@npm:^3.3.8": +"nanoid@npm:^3.3.4, nanoid@npm:^3.3.8": version: 3.3.8 resolution: "nanoid@npm:3.3.8" bin: @@ -9567,13 +8789,6 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 59443a2f77acac854c42d321bf1b43dea0aef55cd544c6a686e9816a697300458d4e82239e2d794ea05f7bbbc8a94500332e2d3ac3f11f52e4b16cbe638b3c41 - languageName: node - linkType: hard - "node-releases@npm:^2.0.19": version: 2.0.19 resolution: "node-releases@npm:2.0.19" @@ -9698,20 +8913,6 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.12.0, object-inspect@npm:^1.9.0": - version: 1.12.2 - resolution: "object-inspect@npm:1.12.2" - checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 - languageName: node - linkType: hard - -"object-inspect@npm:^1.13.3": - version: 1.13.4 - resolution: "object-inspect@npm:1.13.4" - checksum: 582810c6a8d2ef988ea0a39e69e115a138dad8f42dd445383b394877e5816eb4268489f316a6f74ee9c4e0a984b3eab1028e3e79d62b1ed67c726661d55c7a8b - languageName: node - linkType: hard - "object-inspect@npm:^1.13.3, object-inspect@npm:^1.13.4": version: 1.13.4 resolution: "object-inspect@npm:1.13.4" @@ -9726,18 +8927,6 @@ __metadata: languageName: node linkType: hard -"object.assign@npm:^4.1.2": - version: 4.1.2 - resolution: "object.assign@npm:4.1.2" - dependencies: - call-bind: ^1.0.0 - define-properties: ^1.1.3 - has-symbols: ^1.0.1 - object-keys: ^1.1.1 - checksum: d621d832ed7b16ac74027adb87196804a500d80d9aca536fccb7ba48d33a7e9306a75f94c1d29cbfa324bc091bfc530bc24789568efdaee6a47fcfa298993814 - languageName: node - linkType: hard - "object.assign@npm:^4.1.4, object.assign@npm:^4.1.7": version: 4.1.7 resolution: "object.assign@npm:4.1.7" @@ -9776,17 +8965,6 @@ __metadata: languageName: node linkType: hard -"object.values@npm:^1.1.5": - version: 1.1.5 - resolution: "object.values@npm:1.1.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.1 - checksum: 0f17e99741ebfbd0fa55ce942f6184743d3070c61bd39221afc929c8422c4907618c8da694c6915bc04a83ab3224260c779ba37fc07bb668bdc5f33b66a902a4 - languageName: node - linkType: hard - "object.values@npm:^1.1.6, object.values@npm:^1.2.1": version: 1.2.1 resolution: "object.values@npm:1.2.1" @@ -9856,8 +9034,8 @@ __metadata: levn: ^0.4.1 prelude-ls: ^1.2.1 type-check: ^0.4.0 - word-wrap: ^1.2.3 - checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0 + word-wrap: ^1.2.5 + checksum: ecbd010e3dc73e05d239976422d9ef54a82a13f37c11ca5911dff41c98a6c7f0f163b27f922c37e7f8340af9d36febd3b6e9cef508f3339d4c393d7276d716bb languageName: node linkType: hard @@ -9872,15 +9050,6 @@ __metadata: languageName: node linkType: hard -"p-limit@npm:^1.1.0": - version: 1.3.0 - resolution: "p-limit@npm:1.3.0" - dependencies: - p-try: ^1.0.0 - checksum: 281c1c0b8c82e1ac9f81acd72a2e35d402bf572e09721ce5520164e9de07d8274451378a3470707179ad13240535558f4b277f02405ad752e08c7d5b0d54fbfd - languageName: node - linkType: hard - "p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -10058,14 +9227,7 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 - languageName: node - linkType: hard - -"picocolors@npm:^1.1.1": +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": version: 1.1.1 resolution: "picocolors@npm:1.1.1" checksum: e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 @@ -10415,17 +9577,6 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.4.3": - version: 1.4.3 - resolution: "regexp.prototype.flags@npm:1.4.3" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - functions-have-names: ^1.2.2 - checksum: 51228bae732592adb3ededd5e15426be25f289e9c4ef15212f4da73f4ec3919b6140806374b8894036a86020d054a8d2657d3fee6bb9b4d35d8939c20030b7a6 - languageName: node - linkType: hard - "regexp.prototype.flags@npm:^1.5.3, regexp.prototype.flags@npm:^1.5.4": version: 1.5.4 resolution: "regexp.prototype.flags@npm:1.5.4" @@ -10580,19 +9731,6 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@1.22.8#~builtin, resolve@patch:resolve@^1.10.1#~builtin, resolve@patch:resolve@^1.14.2#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin": - version: 1.22.8 - resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=07638b" - dependencies: - is-core-module: ^2.13.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 - bin: - resolve: bin/resolve - checksum: 5479b7d431cacd5185f8db64bfcb7286ae5e31eb299f4c4f404ad8aa6098b77599563ac4257cb2c37a42f59dfc06a1bec2bcf283bb448f319e37f0feb9a09847 - languageName: node - linkType: hard - "resolve@patch:resolve@^2.0.0-next.5#~builtin": version: 2.0.0-next.5 resolution: "resolve@patch:resolve@npm%3A2.0.0-next.5#~builtin::version=2.0.0-next.5&hash=07638b" @@ -10819,16 +9957,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0": - version: 7.6.3 - resolution: "semver@npm:7.6.3" - bin: - semver: bin/semver.js - checksum: 4110ec5d015c9438f322257b1c51fe30276e5f766a3f64c09edd1d7ea7118ecbc3f379f3b69032bacf13116dc7abc4ad8ce0d7e2bd642e26b0d271b56b61a7d8 - languageName: node - linkType: hard - -"semver@npm:^7.6.3, semver@npm:^7.7.1, semver@npm:^7.7.2": +"semver@npm:^7.1.1, semver@npm:^7.3.5, 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: @@ -10972,30 +10101,6 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4": - version: 1.0.4 - resolution: "side-channel@npm:1.0.4" - dependencies: - call-bind: ^1.0.0 - get-intrinsic: ^1.0.2 - object-inspect: ^1.9.0 - checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 - languageName: node - linkType: hard - -"side-channel@npm:^1.0.6": - version: 1.1.0 - resolution: "side-channel@npm:1.1.0" - dependencies: - es-errors: ^1.3.0 - object-inspect: ^1.13.3 - side-channel-list: ^1.0.0 - side-channel-map: ^1.0.1 - side-channel-weakmap: ^1.0.2 - checksum: bf73d6d6682034603eb8e99c63b50155017ed78a522d27c2acec0388a792c3ede3238b878b953a08157093b85d05797217d270b7666ba1f111345fbe933380ff - languageName: node - linkType: hard - "side-channel@npm:^1.0.6, side-channel@npm:^1.1.0": version: 1.1.0 resolution: "side-channel@npm:1.1.0" @@ -11340,17 +10445,6 @@ __metadata: languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.5": - version: 1.0.5 - resolution: "string.prototype.trimend@npm:1.0.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.19.5 - checksum: d44f543833112f57224e79182debadc9f4f3bf9d48a0414d6f0cbd2a86f2b3e8c0ca1f95c3f8e5b32ae83e91554d79d932fc746b411895f03f93d89ed3dfb6bc - languageName: node - linkType: hard - "string.prototype.trimend@npm:^1.0.9": version: 1.0.9 resolution: "string.prototype.trimend@npm:1.0.9" @@ -11363,17 +10457,6 @@ __metadata: languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.5": - version: 1.0.5 - resolution: "string.prototype.trimstart@npm:1.0.5" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.19.5 - checksum: a4857c5399ad709d159a77371eeaa8f9cc284469a0b5e1bfe405de16f1fd4166a8ea6f4180e55032f348d1b679b1599fd4301fbc7a8b72bdb3e795e43f7b1048 - languageName: node - linkType: hard - "string.prototype.trimstart@npm:^1.0.8": version: 1.0.8 resolution: "string.prototype.trimstart@npm:1.0.8" @@ -11459,15 +10542,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac - languageName: node - linkType: hard - "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -11559,13 +10633,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -11596,12 +10663,12 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^2.1.0": - version: 2.1.0 - resolution: "ts-api-utils@npm:2.1.0" +"ts-api-utils@npm:^2.4.0": + version: 2.4.0 + resolution: "ts-api-utils@npm:2.4.0" peerDependencies: typescript: ">=4.8.4" - checksum: 5b1ef89105654d93d67582308bd8dfe4bbf6874fccbcaa729b08fbb00a940fd4c691ca6d0d2b18c3c70878d9a7e503421b7cc473dbc3d0d54258b86401d4b15d + checksum: beae72a4fa22a7cc91a8a0f3dfb487d72e30f06ac50ff72f327d061dea2d4940c6451d36578d949caad3893d4d2c7d42d53b7663597ccda54ad32cdb842c3e34 languageName: node linkType: hard @@ -11616,20 +10683,13 @@ __metadata: languageName: node linkType: hard -"tslib@npm:^2.4.0": +"tslib@npm:^2.4.0, tslib@npm:^2.6.2": version: 2.8.1 resolution: "tslib@npm:2.8.1" checksum: e4aba30e632b8c8902b47587fd13345e2827fa639e7c3121074d5ee0880723282411a8838f830b55100cbe4517672f84a2472667d355b81e8af165a55dc6203a languageName: node linkType: hard -"tslib@npm:^2.6.2": - version: 2.7.0 - resolution: "tslib@npm:2.7.0" - checksum: 1606d5c89f88d466889def78653f3aab0f88692e80bb2066d090ca6112ae250ec1cfa9dbfaab0d17b60da15a4186e8ec4d893801c67896b277c17374e36e1d28 - languageName: node - linkType: hard - "tsx@npm:^4.6.1": version: 4.6.1 resolution: "tsx@npm:4.6.1" @@ -11733,17 +10793,17 @@ __metadata: linkType: hard "typescript-eslint@npm:^8.49.0": - version: 8.49.0 - resolution: "typescript-eslint@npm:8.49.0" + version: 8.52.0 + resolution: "typescript-eslint@npm:8.52.0" dependencies: - "@typescript-eslint/eslint-plugin": 8.49.0 - "@typescript-eslint/parser": 8.49.0 - "@typescript-eslint/typescript-estree": 8.49.0 - "@typescript-eslint/utils": 8.49.0 + "@typescript-eslint/eslint-plugin": 8.52.0 + "@typescript-eslint/parser": 8.52.0 + "@typescript-eslint/typescript-estree": 8.52.0 + "@typescript-eslint/utils": 8.52.0 peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <6.0.0" - checksum: fd91cffcf3c5de73a9ead2253dcb8516ed664fc9179d26c019e6be53f4d4429e280dd5c783c68789a4a2db34712e569468a6c9c7613fc918a310687ca53b91b1 + checksum: 99ec3fe10eb33594290be6476b60d2627aa1534c54ed71d6233df942f8b81de7a6dc2d954460a33ba8d43a177aff2acb69d9665227800fc1343d129b4e697d00 languageName: node linkType: hard @@ -11767,18 +10827,6 @@ __metadata: languageName: node linkType: hard -"unbox-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "unbox-primitive@npm:1.0.2" - dependencies: - call-bind: ^1.0.2 - has-bigints: ^1.0.2 - has-symbols: ^1.0.3 - which-boxed-primitive: ^1.0.2 - checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 - languageName: node - linkType: hard - "unbox-primitive@npm:^1.1.0": version: 1.1.0 resolution: "unbox-primitive@npm:1.1.0" @@ -12002,20 +11050,6 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" - dependencies: - escalade: ^3.1.1 - picocolors: ^1.0.0 - peerDependencies: - browserslist: ">= 4.21.0" - bin: - update-browserslist-db: cli.js - checksum: 1e47d80182ab6e4ad35396ad8b61008ae2a1330221175d0abd37689658bdb61af9b705bfc41057fd16682474d79944fb2d86767c5ed5ae34b6276b9bed353322 - languageName: node - linkType: hard - "update-browserslist-db@npm:^1.1.1": version: 1.1.2 resolution: "update-browserslist-db@npm:1.1.2" @@ -12178,19 +11212,6 @@ __metadata: languageName: node linkType: hard -"which-boxed-primitive@npm:^1.0.2": - version: 1.0.2 - resolution: "which-boxed-primitive@npm:1.0.2" - dependencies: - is-bigint: ^1.0.1 - is-boolean-object: ^1.1.0 - is-number-object: ^1.0.4 - is-string: ^1.0.5 - is-symbol: ^1.0.3 - checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e - languageName: node - linkType: hard - "which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": version: 1.1.1 resolution: "which-boxed-primitive@npm:1.1.1" From c99a76787b3db1d4fe1cb47a052472b8a5d6d72c Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Fri, 9 Jan 2026 12:32:03 -0700 Subject: [PATCH 08/12] Add React to ESLint config; tweak jsdoc rule further --- eslint.config.mjs | 129 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 100 insertions(+), 29 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index 15d451cd..6808c9e4 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,4 +1,3 @@ -import globals from 'globals'; import base, { createConfig } from '@metamask/eslint-config'; import browser from '@metamask/eslint-config-browser'; import jest from '@metamask/eslint-config-jest'; @@ -64,27 +63,25 @@ const requireJsdocOverride = { 'error', { require: { - // Classes - ClassDeclaration: true, - // Function declarations - FunctionDeclaration: true, // Methods MethodDefinition: true, }, contexts: [ - // Type interfaces that are not defined within `declare` blocks - ':not(TSModuleBlock) > TSInterfaceDeclaration', - // Type aliases - 'TSTypeAliasDeclaration', - // Enums - 'TSEnumDeclaration', - // Arrow functions that are not contained within plain objects or - // are not arguments to functions or methods - ':not(Property, NewExpression, CallExpression) > ArrowFunctionExpression', - // Function expressions that are not contained within plain objects - // or are not arguments to functions or methods - ':not(Property, NewExpression, CallExpression) > FunctionExpression', - // Exported variables at the root + // Type interfaces defined at the topmost scope of a file + 'Program > TSInterfaceDeclaration', + // Type aliases defined at the topmost scope of a file + 'Program > TSTypeAliasDeclaration', + // Enums defined at the topmost scope of a file + 'Program > TSEnumDeclaration', + // Class declarations defined at the topmost scope of a file + 'Program > ClassDeclaration', + // Function declarations defined at the topmost scope of a file + 'Program > FunctionDeclaration', + // Arrow functions defined at the topmost scope of a file + 'Program > VariableDeclaration > VariableDeclarator > ArrowFunctionExpression', + // Function expressions defined at the topmost scope of a file + 'Program > VariableDeclaration > VariableDeclarator > FunctionExpression', + // Exported variables defined at the topmost scope of a file 'ExportNamedDeclaration:has(> VariableDeclaration)', ], }, @@ -118,7 +115,7 @@ const config = createConfig([ }, { - files: ['**/*.ts'], + files: ['**/*.ts', '**/*.tsx', '**/*.mts'], extends: typescript, rules: { // Consider copying this to @metamask/eslint-config @@ -169,25 +166,99 @@ const config = createConfig([ }, { - files: ['**/*.test.ts'], + files: ['**/*.test.ts', '**/*.test.tsx'], extends: jest, }, { files: ['src/ui/**.tsx'], - extends: [browser], - plugins: { react }, + extends: [ + browser, + react.configs.flat.recommended, + react.configs.flat['jsx-runtime'], + ], rules: { // This rule isn't useful for us 'react/no-unescaped-entities': 'off', - }, - // TODO: Is this necessary? - languageOptions: { - parserOptions: { - ecmaFeatures: { - jsx: true, + // Copied from `@metamask/eslint-config`, but tweaked to allow functions + // to be formatted as PascalCase + '@typescript-eslint/naming-convention': [ + 'error', + { + selector: 'default', + format: ['camelCase'], + leadingUnderscore: 'allow', + trailingUnderscore: 'forbid', }, - }, + { + selector: 'function', + format: ['camelCase', 'PascalCase'], + leadingUnderscore: 'allow', + trailingUnderscore: 'forbid', + }, + { + selector: 'enumMember', + format: ['PascalCase'], + }, + { + selector: 'import', + format: ['camelCase', 'PascalCase', 'snake_case', 'UPPER_CASE'], + }, + { + selector: 'interface', + format: ['PascalCase'], + custom: { + regex: '^I[A-Z]', + match: false, + }, + }, + { + selector: 'objectLiteralMethod', + format: ['camelCase', 'PascalCase', 'UPPER_CASE'], + }, + { + selector: 'objectLiteralProperty', + // Disabled because object literals are often parameters to 3rd party libraries/services, + // which we don't set the naming conventions for + format: null, + }, + { + selector: 'typeLike', + format: ['PascalCase'], + }, + { + selector: 'typeParameter', + format: ['PascalCase'], + custom: { + regex: '^.{3,}', + match: true, + }, + }, + { + selector: 'variable', + format: ['camelCase', 'UPPER_CASE', 'PascalCase'], + leadingUnderscore: 'allow', + }, + { + selector: 'parameter', + format: ['camelCase', 'PascalCase'], + leadingUnderscore: 'allow', + }, + { + selector: [ + 'classProperty', + 'objectLiteralProperty', + 'typeProperty', + 'classMethod', + 'objectLiteralMethod', + 'typeMethod', + 'accessor', + 'enumMember', + ], + format: null, + modifiers: ['requiresQuotes'], + }, + ], }, settings: { react: { From 5339c46a416d7704da908d4bbe3d57a946cde11a Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Fri, 9 Jan 2026 12:32:13 -0700 Subject: [PATCH 09/12] Address lint violations --- src/ui/App.tsx | 119 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 78 insertions(+), 41 deletions(-) diff --git a/src/ui/App.tsx b/src/ui/App.tsx index 303f2203..657ca5b7 100644 --- a/src/ui/App.tsx +++ b/src/ui/App.tsx @@ -1,16 +1,25 @@ -import React, { useState, useEffect, useRef } from 'react'; +import { getErrorMessage } from '@metamask/utils'; +import React, { useState, useEffect, useRef, JSX } from 'react'; import { createRoot } from 'react-dom/client'; import { SemVer } from 'semver'; + import { ErrorMessage } from './ErrorMessage.js'; import { PackageItem } from './PackageItem.js'; import { Package, RELEASE_TYPE_OPTIONS, ReleaseType } from './types.js'; // This file doesn't export anything, it is used to load Tailwind. -// eslint-disable-next-line import/no-unassigned-import +// eslint-disable-next-line import-x/no-unassigned-import import './style.css'; -// Helper function to compare sets -const setsAreEqual = (a: Set, b: Set) => { +/** + * Determine whether two sets are equal (i.e., they have the same exact + * contents). + * + * @param a - The first set. + * @param b - The second set. + * @returns True if the two sets are equal, false otherwise. + */ +const setsAreEqual = (a: Set, b: Set): boolean => { if (a.size !== b.size) { return false; } @@ -18,6 +27,9 @@ const setsAreEqual = (a: Set, b: Set) => { return [...a].every((value) => b.has(value)); }; +/** + * Props for the `SubmitButton` component. + */ type SubmitButtonProps = { selections: Record; packageDependencyErrors: Record< @@ -28,7 +40,7 @@ type SubmitButtonProps = { missingDependencies: string[]; } >; - onSubmit: () => Promise; + onSubmit: () => void; }; /** @@ -45,7 +57,7 @@ function SubmitButton({ selections, packageDependencyErrors, onSubmit, -}: SubmitButtonProps) { +}: SubmitButtonProps): JSX.Element { const isDisabled = Object.keys(selections).length === 0 || Object.keys(packageDependencyErrors).length > 0 || @@ -71,7 +83,7 @@ function SubmitButton({ * * @returns The app component. */ -function App() { +function App(): JSX.Element { const [packages, setPackages] = useState([]); const [selections, setSelections] = useState>({}); const [isSubmitting, setIsSubmitting] = useState(false); @@ -102,19 +114,22 @@ function App() { const previousPackages = useRef>(new Set()); useEffect(() => { - const majorBumps = Object.entries(selections) - .filter(([_, type]) => type === 'major') - .map(([pkgName]) => pkgName); - - fetch(`/api/packages?majorBumps=${majorBumps.join(',')}`) - .then((res) => { - if (!res.ok) { - throw new Error(`Received ${res.status}`); - } + const fetchPackages = async (): Promise => { + const majorBumps = Object.entries(selections) + .filter(([_, type]) => type === 'major') + .map(([pkgName]) => pkgName); + + const response = await fetch( + `/api/packages?majorBumps=${majorBumps.join(',')}`, + ); - return res.json(); - }) - .then((data: Package[]) => { + if (!response.ok) { + throw new Error(`Received ${response.status}`); + } + + const data: Package[] = await response.json(); + + try { const newPackageNames = new Set(data.map((pkg) => pkg.name)); // Only clean up selections if the package list actually changed @@ -133,14 +148,20 @@ function App() { setLoadingChangelogs( data.reduce((acc, pkg) => ({ ...acc, [pkg.name]: false }), {}), ); - }) - .catch((err) => { - setError(err.message); - console.error('Error fetching packages:', err); - }); + } catch (fetchingPackagesError) { + setError(getErrorMessage(fetchingPackagesError)); + console.error('Error fetching packages:', error); + } + }; + + // We already handle errors. + // eslint-disable-next-line @typescript-eslint/no-floating-promises + fetchPackages(); }, [selections]); - const checkDependencies = async (selectionData: Record) => { + const checkDependencies = async ( + selectionData: Record, + ): Promise => { if (Object.keys(selectionData).length === 0) { return false; } @@ -162,24 +183,31 @@ function App() { setSubmitErrors([]); setPackageDependencyErrors({}); return true; - } catch (err) { + } catch (checkDependenciesError) { const errorMessage = - err instanceof Error ? err.message : 'An error occurred'; + checkDependenciesError instanceof Error + ? checkDependenciesError.message + : 'An error occurred'; setError(errorMessage); - console.error('Error checking dependencies:', err); + console.error('Error checking dependencies:', checkDependenciesError); return false; } }; useEffect(() => { const timeoutId = setTimeout(() => { + // We already handle errors. + // eslint-disable-next-line @typescript-eslint/no-floating-promises checkDependencies(selections); }, 500); return () => clearTimeout(timeoutId); }, [selections]); - const handleCustomVersionChange = (packageName: string, version: string) => { + const handleCustomVersionChange = ( + packageName: string, + version: string, + ): void => { try { if (!version) { setVersionErrors((prev) => ({ @@ -191,7 +219,7 @@ function App() { const newVersion = new SemVer(version); const currentVersion = new SemVer( - packages.find((p) => p.name === packageName)?.version || '0.0.0', + packages.find((pkg) => pkg.name === packageName)?.version ?? '0.0.0', ); if (newVersion.compare(currentVersion) <= 0) { @@ -211,7 +239,7 @@ function App() { ...prev, [packageName]: version, })); - } catch (err) { + } catch { setVersionErrors((prev) => ({ ...prev, [packageName]: 'Invalid semver version', @@ -224,10 +252,11 @@ function App() { value: ReleaseType | '', ): void => { if (value === '') { - const { [packageName]: _, ...rest } = selections; + const { [packageName]: _unusedPackageName1, ...rest } = selections; setSelections(rest); - const { [packageName]: __, ...remainingErrors } = packageDependencyErrors; + const { [packageName]: _unusedPackageName2, ...remainingErrors } = + packageDependencyErrors; setPackageDependencyErrors(remainingErrors); } else { setSelections({ @@ -278,11 +307,13 @@ function App() { if (data.status === 'success') { setIsSuccess(true); } - } catch (err) { + } catch (handleSubmitError) { const errorMessage = - err instanceof Error ? err.message : 'An error occurred'; + handleSubmitError instanceof Error + ? handleSubmitError.message + : 'An error occurred'; setError(errorMessage); - console.error('Error submitting selections:', err); + console.error('Error submitting selections:', handleSubmitError); // TODO: Show an error message instead of an alert // eslint-disable-next-line no-alert alert('Failed to submit selections. Please try again.'); @@ -303,16 +334,18 @@ function App() { const changelog = await response.text(); setChangelogs((prev) => ({ ...prev, [packageName]: changelog })); - } catch (err) { + } catch (fetchChangelogError) { const errorMessage = - err instanceof Error ? err.message : 'Failed to fetch changelog'; + fetchChangelogError instanceof Error + ? fetchChangelogError.message + : 'Failed to fetch changelog'; setError(errorMessage); } finally { setLoadingChangelogs((prev) => ({ ...prev, [packageName]: false })); } }; - const handleBulkAction = (action: ReleaseType) => { + const handleBulkAction = (action: ReleaseType): void => { const newSelections = { ...selections }; selectedPackages.forEach((packageName) => { newSelections[packageName] = action; @@ -322,7 +355,7 @@ function App() { setShowCheckboxes(true); }; - const togglePackageSelection = (packageName: string) => { + const togglePackageSelection = (packageName: string): void => { setSelectedPackages((prev) => { const newSet = new Set(prev); @@ -449,7 +482,11 @@ function App() { { + // We already handle errors. + // eslint-disable-next-line @typescript-eslint/no-floating-promises + handleSubmit(); + }} /> )} From fe4a9e2870ada3e16f7267c39bb966154cfcb302 Mon Sep 17 00:00:00 2001 From: Elliot Winkler Date: Fri, 9 Jan 2026 12:42:02 -0700 Subject: [PATCH 10/12] Fix more lint violations --- bin/create-release-branch.js | 2 +- eslint.config.mjs | 11 +++++++++-- src/ui/App.tsx | 6 +++--- src/ui/DependencyErrorSection.tsx | 9 +++++++-- src/ui/ErrorMessage.tsx | 7 ++++++- src/ui/Markdown.tsx | 3 ++- src/ui/PackageItem.tsx | 27 +++++++++++++++------------ src/ui/VersionSelector.tsx | 19 +++++++++++++------ 8 files changed, 56 insertions(+), 28 deletions(-) diff --git a/bin/create-release-branch.js b/bin/create-release-branch.js index 0e568f87..b27a3edc 100755 --- a/bin/create-release-branch.js +++ b/bin/create-release-branch.js @@ -6,5 +6,5 @@ // - This file will only exist after running `yarn build`. We don't want // developers or CI to receive a lint error if the script has not been run. // (A warning will appear if the script *has* been run, but that is okay.) -// eslint-disable-next-line import-x/no-unassigned-import, import-x/extensions, import-x/no-unresolved +// eslint-disable-next-line import-x/no-unassigned-import, import-x/extensions import '../dist/cli.js'; diff --git a/eslint.config.mjs b/eslint.config.mjs index 6808c9e4..3ba8f715 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -178,8 +178,6 @@ const config = createConfig([ react.configs.flat['jsx-runtime'], ], rules: { - // This rule isn't useful for us - 'react/no-unescaped-entities': 'off', // Copied from `@metamask/eslint-config`, but tweaked to allow functions // to be formatted as PascalCase '@typescript-eslint/naming-convention': [ @@ -259,6 +257,15 @@ const config = createConfig([ modifiers: ['requiresQuotes'], }, ], + // `event` is a common argument of event listeners. + '@typescript-eslint/no-shadow': [ + 'error', + { + allow: ['event'], + }, + ], + // This rule isn't useful for us + 'react/no-unescaped-entities': 'off', }, settings: { react: { diff --git a/src/ui/App.tsx b/src/ui/App.tsx index 657ca5b7..dde7d911 100644 --- a/src/ui/App.tsx +++ b/src/ui/App.tsx @@ -1,5 +1,5 @@ import { getErrorMessage } from '@metamask/utils'; -import React, { useState, useEffect, useRef, JSX } from 'react'; +import React, { useState, useEffect, useRef, ReactNode } from 'react'; import { createRoot } from 'react-dom/client'; import { SemVer } from 'semver'; @@ -57,7 +57,7 @@ function SubmitButton({ selections, packageDependencyErrors, onSubmit, -}: SubmitButtonProps): JSX.Element { +}: SubmitButtonProps): ReactNode { const isDisabled = Object.keys(selections).length === 0 || Object.keys(packageDependencyErrors).length > 0 || @@ -83,7 +83,7 @@ function SubmitButton({ * * @returns The app component. */ -function App(): JSX.Element { +function App(): React.ReactNode { const [packages, setPackages] = useState([]); const [selections, setSelections] = useState>({}); const [isSubmitting, setIsSubmitting] = useState(false); diff --git a/src/ui/DependencyErrorSection.tsx b/src/ui/DependencyErrorSection.tsx index eda40891..1cffe093 100644 --- a/src/ui/DependencyErrorSection.tsx +++ b/src/ui/DependencyErrorSection.tsx @@ -1,9 +1,14 @@ +import { ReactNode } from 'react'; + +/** + * Props for the `DependencyErrorSection` component. + */ type DependencyErrorSectionProps = { title: string; items: string[]; setSelections: React.Dispatch>>; errorSubject: string; - errorDetails: React.ReactNode; + errorDetails: ReactNode; }; /** @@ -24,7 +29,7 @@ export function DependencyErrorSection({ setSelections, errorSubject, errorDetails, -}: DependencyErrorSectionProps) { +}: DependencyErrorSectionProps): ReactNode { return (
diff --git a/src/ui/ErrorMessage.tsx b/src/ui/ErrorMessage.tsx index a2788f72..3661b55c 100644 --- a/src/ui/ErrorMessage.tsx +++ b/src/ui/ErrorMessage.tsx @@ -1,3 +1,8 @@ +import { ReactNode } from 'react'; + +/** + * Props for the `ErrorMessage` component. + */ type ErrorMessageProps = { errors: string[]; }; @@ -9,7 +14,7 @@ type ErrorMessageProps = { * @param props.errors - The list of errors. * @returns The error message component. */ -export function ErrorMessage({ errors }: ErrorMessageProps) { +export function ErrorMessage({ errors }: ErrorMessageProps): ReactNode { if (errors.length === 0) { return null; } diff --git a/src/ui/Markdown.tsx b/src/ui/Markdown.tsx index c64d9d0d..8f48d951 100644 --- a/src/ui/Markdown.tsx +++ b/src/ui/Markdown.tsx @@ -1,3 +1,4 @@ +import { ReactNode } from 'react'; import ReactMarkdown from 'react-markdown'; /** @@ -7,7 +8,7 @@ import ReactMarkdown from 'react-markdown'; * @param props.content - The text to render. * @returns The rendered Markdown. */ -export function Markdown({ content }: { content: string }) { +export function Markdown({ content }: { content: string }): ReactNode { return ( ; @@ -75,7 +80,7 @@ export function PackageItem({ setSelections, setChangelogs, onToggleSelect, -}: PackageItemProps) { +}: PackageItemProps): ReactNode { return (
New version:{' '} {['patch', 'minor', 'major'].includes(selections[pkg.name]) - ? new SemVer(pkg.version) - .inc( - selections[pkg.name] as Exclude< - ReleaseType, - 'intentionally-skip' | 'custom' | string - >, - ) - .toString() + ? new SemVer(pkg.version).inc( + selections[pkg.name] as Exclude< + ReleaseType, + 'intentionally-skip' | 'custom' | string + >, + ).version : selections[pkg.name]}

)} @@ -139,7 +142,7 @@ export function PackageItem({ onSelectionChange={onSelectionChange} onCustomVersionChange={onCustomVersionChange} onFetchChangelog={onFetchChangelog} - isLoadingChangelog={loadingChangelogs[pkg.name] === true} + isLoadingChangelog={loadingChangelogs[pkg.name]} />
diff --git a/src/ui/VersionSelector.tsx b/src/ui/VersionSelector.tsx index 320c2a3e..9758d7a5 100644 --- a/src/ui/VersionSelector.tsx +++ b/src/ui/VersionSelector.tsx @@ -1,5 +1,10 @@ +import { ReactNode } from 'react'; + import { RELEASE_TYPE_OPTIONS, ReleaseType } from './types.js'; +/** + * Props for the `VersionSelector` component. + */ type VersionSelectorProps = { packageName: string; selection: string; @@ -32,14 +37,12 @@ export function VersionSelector({ onCustomVersionChange, onFetchChangelog, isLoadingChangelog, -}: VersionSelectorProps) { +}: VersionSelectorProps): ReactNode { return (
onCustomVersionChange(packageName, e.target.value)} + onChange={(event) => + onCustomVersionChange(packageName, event.target.value) + } className="border rounded px-2 py-1" /> )}