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..f5a92005 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,10 +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. * - * @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. + * 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. */ export type PackageSpecification = { name: string; @@ -21,12 +24,13 @@ export type PackageSpecification = { /** * A set of configuration options for an {@link Environment}. * - * @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. + * 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. */ export type EnvironmentOptions = { directoryPath: string; @@ -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..9234132c 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 - * root). - * @property workspaces - The known workspaces within this repo. + * Properties + * + * - `packages` - The known packages within this repo (including the root). + * - `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..54a4716c 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,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: * - * @property packages - The known packages within this repo (including the - * root). - * @property workspaces - The known workspaces within this repo. + * 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. */ export type MonorepoEnvironmentOptions< WorkspacePackageNickname extends string, @@ -28,8 +35,9 @@ export type MonorepoEnvironmentOptions< /** * The release specification data. * - * @property 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>; @@ -50,8 +58,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 +160,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..ccf89a9c 100644 --- a/tests/functional/helpers/repo.ts +++ b/tests/functional/helpers/repo.ts @@ -1,15 +1,18 @@ +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 - * that created this repo. + * Properties: + * + * - `environmentDirectoryPath` - The directory that holds the environment that + * created this repo. */ export type RepoOptions = { environmentDirectoryPath: string; @@ -37,6 +40,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 +54,7 @@ export default abstract class Repo { /** * Sets up the repo. */ - async initialize() { + async initialize(): Promise { await this.create(); await this.afterCreate(); } @@ -180,8 +189,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..4d82dc11 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,10 +36,17 @@ 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') { - throw error; + } catch (error) { + if ( + typeof error === 'object' && + error !== null && + hasProperty(error, 'code') && + error.code === 'ENOENT' + ) { + return; } + + throw error; } } @@ -51,7 +58,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 +145,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 +155,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 +177,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