diff --git a/packages/cli/package.json b/packages/cli/package.json index 101389fe..edb58c07 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -78,19 +78,20 @@ }, "types": "./index.d.ts", "dependencies": { + "@inquirer/prompts": "^7.1.0", "@types/jscodeshift": "0.12.0", - "jscodeshift": "17.1.1", "@typescript-eslint/parser": "7.18.0", "eslint": "8.57.0", + "jscodeshift": "17.1.1", "tsx": "4.19.1" }, "devDependencies": { "@ag-grid-devtools/ast": "workspace:*", + "@ag-grid-devtools/build-config": "workspace:*", "@ag-grid-devtools/build-tools": "workspace:*", + "@ag-grid-devtools/codemod-task-utils": "workspace:*", "@ag-grid-devtools/codemod-utils": "workspace:*", "@ag-grid-devtools/test-utils": "workspace:*", - "@ag-grid-devtools/build-config": "workspace:*", - "@ag-grid-devtools/codemod-task-utils": "workspace:*", "@ag-grid-devtools/types": "workspace:*", "@ag-grid-devtools/utils": "workspace:*", "@ag-grid-devtools/worker-utils": "workspace:*", diff --git a/packages/cli/src/codemods/lib.test.ts b/packages/cli/src/codemods/lib.test.ts deleted file mode 100644 index d15970dd..00000000 --- a/packages/cli/src/codemods/lib.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { expect, test } from 'vitest'; - -import * as lib from './lib'; - -const versions: Array = [ - '31.0.0', - '31.1.0', - '31.2.0', - '31.3.0', - '32.0.0', - '32.2.0', - '33.0.0', -]; - -test('module exports', () => { - expect({ ...lib }).toEqual({ - default: { - name: expect.any(String), - versions: versions.map((version) => versionManifest(version)), - }, - }); -}); - -function versionManifest(version: string): object { - return { - version, - codemodPath: `versions/${version}`, - transforms: expect.arrayContaining([ - { - description: expect.any(String), - name: expect.any(String), - }, - ]), - }; -} diff --git a/packages/cli/src/codemods/versions/33.0.0/manifest.ts b/packages/cli/src/codemods/versions/33.0.0/manifest.ts index d9e78e34..69bec9da 100644 --- a/packages/cli/src/codemods/versions/33.0.0/manifest.ts +++ b/packages/cli/src/codemods/versions/33.0.0/manifest.ts @@ -5,6 +5,7 @@ import transformGridApiMethodsV33_0 from '../../transforms/transform-grid-api-me import transformSparklinesOptionsV33_0 from '../../transforms/transform-sparklines-options-v33-0/manifest.ts'; import transformModulesToPackagesV33 from '../../transforms/transform-modules-to-packages-v33/manifest.ts'; +import { select } from '@inquirer/prompts'; const transforms: Array = [ transformGridApiMethodsV33_0, @@ -12,10 +13,69 @@ const transforms: Array = [ transformModulesToPackagesV33, ]; -const manifest: VersionManifest = { +type Choices33 = { + usingCharts: boolean; + chartType: string; +}; + +const manifest: VersionManifest = { version: '33.0.0', codemodPath: 'versions/33.0.0', transforms, + choices: { + usingCharts: () => { + return select({ + message: + 'Are you using chart based features in any of your grids, i.e Sparklines / Integrated Charts?', + default: false, + choices: [ + { + value: true, + name: 'Yes', + description: 'Some grid has Sparklines in cells or is using Integrated Charts.', + }, + { + value: false, + name: 'No', + description: 'No charting based features used in any of the grids.', + }, + ], + }); + }, + chartType: () => { + if (process.env.AG_IS_USING_CHARTS == 'false') { + // If they are using community packages, they are not using AG Charts + return Promise.resolve('none'); + } + + return select({ + message: 'Are you using AG Charts Community or Enterprise?', + default: 'community', + choices: [ + { + value: 'community', + name: 'Community', + description: + 'Using the Community version of AG Charts via one of: ag-grid-enterprise / @ag-grid-enterprise/charts', + }, + { + value: 'enterprise', + name: 'Enterprise', + description: + 'Using the Enterprise version of AG Charts via one of: ag-grid-charts-enterprise / @ag-grid-enterprise/charts-enterprise', + }, + ], + }); + }, + }, + setAnswers: { + usingCharts: (answer) => { + process.env.AG_IS_USING_CHARTS = answer; + }, + chartType: (answers) => { + process.env.AG_USING_CHARTS = answers; + }, + }, }; export default manifest; diff --git a/packages/cli/src/commands/migrate.ts b/packages/cli/src/commands/migrate.ts index dd90a0c4..ad6721b5 100644 --- a/packages/cli/src/commands/migrate.ts +++ b/packages/cli/src/commands/migrate.ts @@ -1,4 +1,3 @@ -import codemods from '../codemods/lib'; import { composeCodemods, createCodemodTask, @@ -11,24 +10,26 @@ import { TaskRunnerEnvironment, type VersionManifest, } from '@ag-grid-devtools/types'; -import { createFsHelpers } from '@ag-grid-devtools/worker-utils'; +import codemods from '../codemods/lib'; + import { nonNull } from '@ag-grid-devtools/utils'; +import { createFsHelpers } from '@ag-grid-devtools/worker-utils'; import { createTwoFilesPatch } from 'diff'; -import { dirname, join, resolve as pathResolve } from 'node:path'; import { cpus } from 'node:os'; +import { dirname, join, resolve as pathResolve } from 'node:path'; import semver from 'semver'; +import { dynamicRequire } from '@ag-grid-devtools/utils'; +import { relative, resolve } from 'node:path'; +import { fileURLToPath } from 'node:url'; import { type CliEnv, type CliOptions } from '../types/cli'; import { type WritableStream } from '../types/io'; import { CliArgsError, CliError } from '../utils/cli'; -import { findSourceFiles, findGitRoot } from '../utils/fs'; +import { findGitRoot, findSourceFiles } from '../utils/fs'; import { findInGitRepository, getUncommittedGitFiles } from '../utils/git'; -import { resolve, relative } from 'node:path'; import { getCliCommand, getCliPackageVersion } from '../utils/pkg'; import { green, indentErrorMessage, log } from '../utils/stdio'; import { Worker, WorkerTaskQueue, type WorkerOptions } from '../utils/worker'; -import { dynamicRequire } from '@ag-grid-devtools/utils'; -import { fileURLToPath } from 'node:url'; const { versions } = codemods; @@ -90,10 +91,11 @@ export interface MigrateCommandArgs { * The path of the user config to load */ userConfigPath?: string; + /** - * Hint about which AG Chart features / package is required. + * INTERNAL: Disable interactive prompts for testing */ - usingCharts?: 'community' | 'enterprise' | 'none'; + nonInteractive?: boolean; } function usage(env: CliEnv): string { @@ -118,9 +120,6 @@ Options: --config= Loads a .cjs or .cts configuration file to customize the codemod behavior. See https://ag-grid.com/javascript-data-grid/codemods/#configuration-file - Version Specific Options: - --using-charts= v33 Which AG Charts bundle to used if it cannot be inferred automatically. One of: ['community' | 'enterprise' | 'none'] - Additional arguments: [......] List of input files and directories to operate on. Defaults to all source files in the current working directory excluding patterns in .gitignore @@ -143,7 +142,7 @@ export function parseArgs(args: string[], env: CliEnv): MigrateCommandArgs { help: false, input: [], userConfigPath: undefined, - usingCharts: 'community', + nonInteractive: false, }; let arg; while ((arg = args.shift())) { @@ -165,22 +164,6 @@ export function parseArgs(args: string[], env: CliEnv): MigrateCommandArgs { case '-d': options.allowDirty = true; break; - case '--using-charts': - { - let value = args.shift(); - if (!value || value.startsWith('-')) { - throw new CliArgsError(`Missing value for ${arg}`, usage(env)); - } - const validValues = ['community', 'enterprise', 'none']; - if (!validValues.includes(value)) { - throw new CliArgsError( - `Invalid value for ${arg}: ${value} (Pick one of: ${validValues.join()})`, - usage(env), - ); - } - options.usingCharts = value as 'community' | 'enterprise' | 'none'; - } - break; case '--no-allow-dirty': options.allowDirty = false; break; @@ -270,6 +253,14 @@ export function parseArgs(args: string[], env: CliEnv): MigrateCommandArgs { } break; } + case '--non-interactive': { + // private option to disable interactive prompts for testing + options.nonInteractive = true; + console.warn( + 'The --non-interactive option is deprecated and will be removed in a future release', + ); + break; + } case '--help': case '-h': @@ -328,7 +319,7 @@ async function migrate( verbose, userConfigPath, input, - usingCharts, + nonInteractive, } = args; let { cwd, env, stdio } = options; const { stdout, stderr } = stdio; @@ -353,10 +344,6 @@ async function migrate( skipFiles.add(userConfigPath); } - if (usingCharts) { - process.env.AG_USING_CHARTS = usingCharts; - } - const inputFilePaths = await findSourceFiles( cwd, input.length > 0 ? input : [cwd], @@ -456,6 +443,31 @@ async function migrate( // Process the tasks either in-process or via a worker pool const isSingleThreaded = numThreads === 0; + if (!nonInteractive) { + // See if any of the codemods have choices that need to be made by the user + for (let i = 0; i < codemodVersions.length; i++) { + const codemod = codemodVersions[i]; + const choices = codemod.choices; + if (!choices) continue; + + log( + stderr, + ['', `Codemod for version ${green(codemod.version, env)} requires user input:`, ''].join( + '\n', + ), + ); + + for (let key of Object.keys(choices)) { + const choice = choices[key]; + if (choice) { + const answer = await choice(); + const setAnswers = codemod.setAnswers?.[key] ?? (() => {}); + setAnswers(answer); + } + } + } + } + const codemodPaths = codemodVersions.map(({ codemodPath }) => join(CODEMODS_FOLDER, codemodPath, 'codemod'), ); diff --git a/packages/cli/src/test/e2e/gitignore-no-allow-untracked-error/gitignore-no-allow-untracked-error.test.ts b/packages/cli/src/test/e2e/gitignore-no-allow-untracked-error/gitignore-no-allow-untracked-error.test.ts index 0ecd5bcc..99c1495f 100644 --- a/packages/cli/src/test/e2e/gitignore-no-allow-untracked-error/gitignore-no-allow-untracked-error.test.ts +++ b/packages/cli/src/test/e2e/gitignore-no-allow-untracked-error/gitignore-no-allow-untracked-error.test.ts @@ -13,7 +13,7 @@ test( await env.writeTempSrc('untracked.js', '// untracked'); - await cli(['migrate', '--from=30.0.0'], env.cliOptions); + await cli(['migrate', '--non-interactive', '--from=30.0.0'], env.cliOptions); } catch (e) { error = e as Error; } finally { diff --git a/packages/cli/src/test/e2e/gitignore-no-allow-untracked/gitignore-no-allow-untracked.test.ts b/packages/cli/src/test/e2e/gitignore-no-allow-untracked/gitignore-no-allow-untracked.test.ts index f61a217d..e00afdc5 100644 --- a/packages/cli/src/test/e2e/gitignore-no-allow-untracked/gitignore-no-allow-untracked.test.ts +++ b/packages/cli/src/test/e2e/gitignore-no-allow-untracked/gitignore-no-allow-untracked.test.ts @@ -9,7 +9,7 @@ test( async () => { try { await env.init({ gitInit: true }); - await cli(['migrate', '--from=30.0.0'], env.cliOptions); + await cli(['migrate', '--non-interactive', '--from=30.0.0'], env.cliOptions); } finally { await env.removeGitFolder(); } diff --git a/packages/cli/src/test/e2e/gitignore-simple/gitignore-simple.test.ts b/packages/cli/src/test/e2e/gitignore-simple/gitignore-simple.test.ts index 75f4b935..677838c8 100644 --- a/packages/cli/src/test/e2e/gitignore-simple/gitignore-simple.test.ts +++ b/packages/cli/src/test/e2e/gitignore-simple/gitignore-simple.test.ts @@ -8,7 +8,10 @@ test( 'cli e2e - gitignore simple', async () => { await env.init(); - await cli(['migrate', '--allow-untracked', '--from=30.0.0'], env.cliOptions); + await cli( + ['migrate', '--allow-untracked', '--from=30.0.0', '--to=33', '--non-interactive'], + env.cliOptions, + ); // changed files diff --git a/packages/cli/src/test/e2e/gitignore-uncommitted-error/gitignore-uncommitted-error.test.ts b/packages/cli/src/test/e2e/gitignore-uncommitted-error/gitignore-uncommitted-error.test.ts index a157973a..202ca124 100644 --- a/packages/cli/src/test/e2e/gitignore-uncommitted-error/gitignore-uncommitted-error.test.ts +++ b/packages/cli/src/test/e2e/gitignore-uncommitted-error/gitignore-uncommitted-error.test.ts @@ -14,7 +14,7 @@ test( await env.writeTempSrc('uncommitted.js', `// uncommitted`); await env.addGitFile('uncommitted.js'); - await cli(['migrate', '--from=30.0.0'], env.cliOptions); + await cli(['migrate', '--non-interactive', '--from=30.0.0'], env.cliOptions); } catch (e) { error = e as Error; } finally { diff --git a/packages/cli/src/test/e2e/input-files-and-directories/input-files-and-directories.test.ts b/packages/cli/src/test/e2e/input-files-and-directories/input-files-and-directories.test.ts index cfbdf461..34b7e35c 100644 --- a/packages/cli/src/test/e2e/input-files-and-directories/input-files-and-directories.test.ts +++ b/packages/cli/src/test/e2e/input-files-and-directories/input-files-and-directories.test.ts @@ -9,7 +9,15 @@ test( async () => { await env.init(); await cli( - ['migrate', '--num-threads=3', '--allow-untracked', '--from=30.0.0', 'file1.js', 'dir'], + [ + 'migrate', + '--non-interactive', + '--num-threads=3', + '--allow-untracked', + '--from=30.0.0', + 'file1.js', + 'dir', + ], env.cliOptions, ); expect(await env.loadExpectedSrc('file1.js')).toEqual(await env.loadTempSrc('file1.js')); diff --git a/packages/cli/src/test/e2e/multi-thread/multi-thread.test.ts b/packages/cli/src/test/e2e/multi-thread/multi-thread.test.ts index 83a55998..207566e8 100644 --- a/packages/cli/src/test/e2e/multi-thread/multi-thread.test.ts +++ b/packages/cli/src/test/e2e/multi-thread/multi-thread.test.ts @@ -8,7 +8,10 @@ test( 'cli e2e - multi thread', async () => { await env.init(); - await cli(['migrate', '--num-threads=3', '--allow-untracked', '--from=30.0.0'], env.cliOptions); + await cli( + ['migrate', '--non-interactive', '--num-threads=3', '--allow-untracked', '--from=30.0.0'], + env.cliOptions, + ); expect(await env.loadExpectedSrc('file1.js')).toEqual(await env.loadTempSrc('file1.js')); expect(await env.loadExpectedSrc('file2.js')).toEqual(await env.loadTempSrc('file2.js')); expect(await env.loadExpectedSrc('file3.js')).toEqual(await env.loadTempSrc('file3.js')); diff --git a/packages/cli/src/test/e2e/single-thread/single-thread.test.ts b/packages/cli/src/test/e2e/single-thread/single-thread.test.ts index cbda5709..7090f323 100644 --- a/packages/cli/src/test/e2e/single-thread/single-thread.test.ts +++ b/packages/cli/src/test/e2e/single-thread/single-thread.test.ts @@ -8,7 +8,10 @@ test( 'cli e2e - single thread', async () => { await env.init(); - await cli(['migrate', '--num-threads=0', '--allow-untracked', '--from=30.0.0'], env.cliOptions); + await cli( + ['migrate', '--non-interactive', '--num-threads=0', '--allow-untracked', '--from=30.0.0'], + env.cliOptions, + ); expect(await env.loadExpectedSrc('file.js')).toEqual(await env.loadTempSrc('file.js')); }, env.TIMEOUT, diff --git a/packages/cli/src/test/e2e/user-config-multi-thread/user-config-single-thread.test.ts b/packages/cli/src/test/e2e/user-config-multi-thread/user-config-single-thread.test.ts index 0ca182d4..55837ab7 100644 --- a/packages/cli/src/test/e2e/user-config-multi-thread/user-config-single-thread.test.ts +++ b/packages/cli/src/test/e2e/user-config-multi-thread/user-config-single-thread.test.ts @@ -11,6 +11,7 @@ test( await cli( [ 'migrate', + '--non-interactive', '--num-threads=4', '--allow-untracked', '--from=30.0.0', diff --git a/packages/cli/src/test/e2e/user-config-single-thread/user-config-single-thread.test.ts b/packages/cli/src/test/e2e/user-config-single-thread/user-config-single-thread.test.ts index 041bb883..d7d3a270 100644 --- a/packages/cli/src/test/e2e/user-config-single-thread/user-config-single-thread.test.ts +++ b/packages/cli/src/test/e2e/user-config-single-thread/user-config-single-thread.test.ts @@ -11,6 +11,7 @@ test( await cli( [ 'migrate', + '--non-interactive', '--num-threads=0', '--allow-untracked', '--from=30.0.0', diff --git a/packages/cli/src/test/e2e/vue-ts-parser/vue-ts-parser.test.ts b/packages/cli/src/test/e2e/vue-ts-parser/vue-ts-parser.test.ts index 78d3fb2d..a31beca6 100644 --- a/packages/cli/src/test/e2e/vue-ts-parser/vue-ts-parser.test.ts +++ b/packages/cli/src/test/e2e/vue-ts-parser/vue-ts-parser.test.ts @@ -8,7 +8,10 @@ test( 'cli e2e - single thread', async () => { await env.init(); - await cli(['migrate', '--num-threads=0', '--allow-untracked', '--from=30.0.0'], env.cliOptions); + await cli( + ['migrate', '--non-interactive', '--num-threads=0', '--allow-untracked', '--from=30.0.0'], + env.cliOptions, + ); expect(await env.loadExpectedSrc('file.vue')).toEqual(await env.loadTempSrc('file.vue')); }, env.TIMEOUT, diff --git a/packages/types/src/manifest.ts b/packages/types/src/manifest.ts index 7882b5f8..2b05943b 100644 --- a/packages/types/src/manifest.ts +++ b/packages/types/src/manifest.ts @@ -3,10 +3,13 @@ export interface PackageManifest { versions: Array; } -export interface VersionManifest { +export interface VersionManifest { version: string; codemodPath: string; transforms: Array; + /** @inquirer/prompts */ + choices?: Record Promise>; + setAnswers?: Record void>; } export interface TransformManifest { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dc7dd5f1..fa16fa18 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -198,6 +198,9 @@ importers: packages/cli: dependencies: + '@inquirer/prompts': + specifier: ^7.1.0 + version: 7.1.0(@types/node@22.7.3) '@types/jscodeshift': specifier: 0.12.0 version: 0.12.0 @@ -1400,6 +1403,86 @@ packages: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} deprecated: Use @eslint/object-schema instead + '@inquirer/checkbox@4.0.2': + resolution: {integrity: sha512-+gznPl8ip8P8HYHYecDtUtdsh1t2jvb+sWCD72GAiZ9m45RqwrLmReDaqdC0umQfamtFXVRoMVJ2/qINKGm9Tg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/confirm@5.0.2': + resolution: {integrity: sha512-KJLUHOaKnNCYzwVbryj3TNBxyZIrr56fR5N45v6K9IPrbT6B7DcudBMfylkV1A8PUdJE15mybkEQyp2/ZUpxUA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/core@10.1.0': + resolution: {integrity: sha512-I+ETk2AL+yAVbvuKx5AJpQmoaWhpiTFOg/UJb7ZkMAK4blmtG8ATh5ct+T/8xNld0CZG/2UhtkdMwpgvld92XQ==} + engines: {node: '>=18'} + + '@inquirer/editor@4.1.0': + resolution: {integrity: sha512-K1gGWsxEqO23tVdp5MT3H799OZ4ER1za7Dlc8F4um0W7lwSv0KGR/YyrUEyimj0g7dXZd8XknM/5QA2/Uy+TbA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/expand@4.0.2': + resolution: {integrity: sha512-WdgCX1cUtinz+syKyZdJomovULYlKUWZbVYZzhf+ZeeYf4htAQ3jLymoNs3koIAKfZZl3HUBb819ClCBfyznaw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/figures@1.0.8': + resolution: {integrity: sha512-tKd+jsmhq21AP1LhexC0pPwsCxEhGgAkg28byjJAd+xhmIs8LUX8JbUc3vBf3PhLxWiB5EvyBE5X7JSPAqMAqg==} + engines: {node: '>=18'} + + '@inquirer/input@4.0.2': + resolution: {integrity: sha512-yCLCraigU085EcdpIVEDgyfGv4vBiE4I+k1qRkc9C5dMjWF42ADMGy1RFU94+eZlz4YlkmFsiyHZy0W1wdhaNg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/number@3.0.2': + resolution: {integrity: sha512-MKQhYofdUNk7eqJtz52KvM1dH6R93OMrqHduXCvuefKrsiMjHiMwjc3NZw5Imm2nqY7gWd9xdhYrtcHMJQZUxA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/password@4.0.2': + resolution: {integrity: sha512-tQXGSu7IO07gsYlGy3VgXRVsbOWqFBMbqAUrJSc1PDTQQ5Qdm+QVwkP0OC0jnUZ62D19iPgXOMO+tnWG+HhjNQ==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/prompts@7.1.0': + resolution: {integrity: sha512-5U/XiVRH2pp1X6gpNAjWOglMf38/Ys522ncEHIKT1voRUvSj/DQnR22OVxHnwu5S+rCFaUiPQ57JOtMFQayqYA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/rawlist@4.0.2': + resolution: {integrity: sha512-3XGcskMoVF8H0Dl1S5TSZ3rMPPBWXRcM0VeNVsS4ByWeWjSeb0lPqfnBg6N7T0608I1B2bSVnbi2cwCrmOD1Yw==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/search@3.0.2': + resolution: {integrity: sha512-Zv4FC7w4dJ13BOJfKRQCICQfShinGjb1bCEIHxTSnjj2telu3+3RHwHubPG9HyD4aix5s+lyAMEK/wSFD75HLA==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/select@4.0.2': + resolution: {integrity: sha512-uSWUzaSYAEj0hlzxa1mUB6VqrKaYx0QxGBLZzU4xWFxaSyGaXxsSE4OSOwdU24j0xl8OajgayqFXW0l2bkl2kg==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + + '@inquirer/type@3.0.1': + resolution: {integrity: sha512-+ksJMIy92sOAiAccGpcKZUc3bYO07cADnscIxHBknEm3uNts3movSmBofc1908BNy5edKscxYeAdaX1NXkHS6A==} + engines: {node: '>=18'} + peerDependencies: + '@types/node': '>=18' + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1934,6 +2017,10 @@ packages: ajv@8.13.0: resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2114,6 +2201,9 @@ packages: character-entities-legacy@3.0.0: resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + check-error@1.0.3: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} @@ -2124,6 +2214,10 @@ packages: cipher-base@1.0.4: resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==} + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + clone-deep@4.0.1: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} @@ -2358,6 +2452,7 @@ packages: eslint@8.57.0: resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true espree@9.6.1: @@ -2402,6 +2497,10 @@ packages: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -2608,6 +2707,10 @@ packages: resolution: {integrity: sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==} engines: {node: '>=10.18'} + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -2633,6 +2736,7 @@ packages: inflight@1.0.6: resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} @@ -2839,6 +2943,7 @@ packages: loupe@2.3.6: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} + deprecated: Please upgrade to 2.3.7 which fixes GHSA-4q6p-r6v2-jvc5 loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} @@ -2973,6 +3078,10 @@ packages: engines: {node: '>=12.0.0', npm: '>=6.0.0'} deprecated: This module has been superseded by the multiformats module + mute-stream@2.0.0: + resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} + engines: {node: ^18.17.0 || >=20.5.0} + nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3034,6 +3143,10 @@ packages: os-browserify@0.3.0: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -3464,6 +3577,10 @@ packages: resolution: {integrity: sha512-d2eda04AN/cPOR89F7Xv5bK/jrQEhmcLFe6HFldoeO9AJtps+fqEnh486vnT/8y4bw38pSyxDcTCAq+Ks2aJTg==} engines: {node: '>=14.0.0'} + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + tmp@0.2.3: resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} engines: {node: '>=14.14'} @@ -3508,6 +3625,10 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + typedoc@0.26.7: resolution: {integrity: sha512-gUeI/Wk99vjXXMi8kanwzyhmeFEGv1LTdTQsiyIsmSYsBebvFxhbcyAx7Zjo4cMbpLGxM4Uz3jVIjksu/I2v6Q==} engines: {node: '>= 18'} @@ -3701,6 +3822,10 @@ packages: engines: {node: '>=8'} hasBin: true + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -3739,6 +3864,10 @@ packages: resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} engines: {node: '>=12.20'} + yoctocolors-cjs@2.1.2: + resolution: {integrity: sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==} + engines: {node: '>=18'} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -4568,6 +4697,112 @@ snapshots: '@humanwhocodes/object-schema@2.0.3': {} + '@inquirer/checkbox@4.0.2(@types/node@22.7.3)': + dependencies: + '@inquirer/core': 10.1.0(@types/node@22.7.3) + '@inquirer/figures': 1.0.8 + '@inquirer/type': 3.0.1(@types/node@22.7.3) + '@types/node': 22.7.3 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/confirm@5.0.2(@types/node@22.7.3)': + dependencies: + '@inquirer/core': 10.1.0(@types/node@22.7.3) + '@inquirer/type': 3.0.1(@types/node@22.7.3) + '@types/node': 22.7.3 + + '@inquirer/core@10.1.0(@types/node@22.7.3)': + dependencies: + '@inquirer/figures': 1.0.8 + '@inquirer/type': 3.0.1(@types/node@22.7.3) + ansi-escapes: 4.3.2 + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.2 + transitivePeerDependencies: + - '@types/node' + + '@inquirer/editor@4.1.0(@types/node@22.7.3)': + dependencies: + '@inquirer/core': 10.1.0(@types/node@22.7.3) + '@inquirer/type': 3.0.1(@types/node@22.7.3) + '@types/node': 22.7.3 + external-editor: 3.1.0 + + '@inquirer/expand@4.0.2(@types/node@22.7.3)': + dependencies: + '@inquirer/core': 10.1.0(@types/node@22.7.3) + '@inquirer/type': 3.0.1(@types/node@22.7.3) + '@types/node': 22.7.3 + yoctocolors-cjs: 2.1.2 + + '@inquirer/figures@1.0.8': {} + + '@inquirer/input@4.0.2(@types/node@22.7.3)': + dependencies: + '@inquirer/core': 10.1.0(@types/node@22.7.3) + '@inquirer/type': 3.0.1(@types/node@22.7.3) + '@types/node': 22.7.3 + + '@inquirer/number@3.0.2(@types/node@22.7.3)': + dependencies: + '@inquirer/core': 10.1.0(@types/node@22.7.3) + '@inquirer/type': 3.0.1(@types/node@22.7.3) + '@types/node': 22.7.3 + + '@inquirer/password@4.0.2(@types/node@22.7.3)': + dependencies: + '@inquirer/core': 10.1.0(@types/node@22.7.3) + '@inquirer/type': 3.0.1(@types/node@22.7.3) + '@types/node': 22.7.3 + ansi-escapes: 4.3.2 + + '@inquirer/prompts@7.1.0(@types/node@22.7.3)': + dependencies: + '@inquirer/checkbox': 4.0.2(@types/node@22.7.3) + '@inquirer/confirm': 5.0.2(@types/node@22.7.3) + '@inquirer/editor': 4.1.0(@types/node@22.7.3) + '@inquirer/expand': 4.0.2(@types/node@22.7.3) + '@inquirer/input': 4.0.2(@types/node@22.7.3) + '@inquirer/number': 3.0.2(@types/node@22.7.3) + '@inquirer/password': 4.0.2(@types/node@22.7.3) + '@inquirer/rawlist': 4.0.2(@types/node@22.7.3) + '@inquirer/search': 3.0.2(@types/node@22.7.3) + '@inquirer/select': 4.0.2(@types/node@22.7.3) + '@types/node': 22.7.3 + + '@inquirer/rawlist@4.0.2(@types/node@22.7.3)': + dependencies: + '@inquirer/core': 10.1.0(@types/node@22.7.3) + '@inquirer/type': 3.0.1(@types/node@22.7.3) + '@types/node': 22.7.3 + yoctocolors-cjs: 2.1.2 + + '@inquirer/search@3.0.2(@types/node@22.7.3)': + dependencies: + '@inquirer/core': 10.1.0(@types/node@22.7.3) + '@inquirer/figures': 1.0.8 + '@inquirer/type': 3.0.1(@types/node@22.7.3) + '@types/node': 22.7.3 + yoctocolors-cjs: 2.1.2 + + '@inquirer/select@4.0.2(@types/node@22.7.3)': + dependencies: + '@inquirer/core': 10.1.0(@types/node@22.7.3) + '@inquirer/figures': 1.0.8 + '@inquirer/type': 3.0.1(@types/node@22.7.3) + '@types/node': 22.7.3 + ansi-escapes: 4.3.2 + yoctocolors-cjs: 2.1.2 + + '@inquirer/type@3.0.1(@types/node@22.7.3)': + dependencies: + '@types/node': 22.7.3 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -5176,6 +5411,10 @@ snapshots: require-from-string: 2.0.2 uri-js: 4.4.1 + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} @@ -5378,6 +5617,8 @@ snapshots: character-entities-legacy@3.0.0: {} + chardet@0.7.0: {} + check-error@1.0.3: dependencies: get-func-name: 2.0.2 @@ -5399,6 +5640,8 @@ snapshots: inherits: 2.0.4 safe-buffer: 5.2.1 + cli-width@4.1.0: {} + clone-deep@4.0.1: dependencies: is-plain-object: 2.0.4 @@ -5749,6 +5992,12 @@ snapshots: signal-exit: 4.1.0 strip-final-newline: 3.0.0 + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + fast-deep-equal@3.1.3: {} fast-diff@1.3.0: {} @@ -5973,6 +6222,10 @@ snapshots: hyperdyperid@1.2.0: {} + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + ieee754@1.2.1: {} ignore@5.3.1: {} @@ -6345,6 +6598,8 @@ snapshots: dependencies: '@multiformats/base-x': 4.0.1 + mute-stream@2.0.0: {} + nanoid@3.3.7: {} natural-compare@1.4.0: {} @@ -6428,6 +6683,8 @@ snapshots: os-browserify@0.3.0: {} + os-tmpdir@1.0.2: {} + p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -6849,6 +7106,10 @@ snapshots: tinyspy@2.2.0: {} + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + tmp@0.2.3: {} to-fast-properties@2.0.0: {} @@ -6882,6 +7143,8 @@ snapshots: type-fest@0.20.2: {} + type-fest@0.21.3: {} + typedoc@0.26.7(typescript@5.5.4): dependencies: lunr: 2.3.9 @@ -7107,6 +7370,12 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -7138,4 +7407,6 @@ snapshots: yocto-queue@1.0.0: {} + yoctocolors-cjs@2.1.2: {} + zwitch@2.0.4: {}