From da4f83b8bf3d7ca5d9b10b9a81cc74cf0215e39d Mon Sep 17 00:00:00 2001 From: maxnorm Date: Tue, 21 Jul 2026 19:41:54 -0400 Subject: [PATCH 1/4] fix: clear stdin for inquirer(windows/libuv bug) --- cli/package.json | 10 +- cli/src/modules/init/module.ts | 80 +++++---- cli/src/modules/init/prompts.ts | 70 +------- cli/src/utils/inquirer.ts | 105 ++++++++++++ package-lock.json | 286 ++++++++++++++++++-------------- 5 files changed, 325 insertions(+), 226 deletions(-) create mode 100644 cli/src/utils/inquirer.ts diff --git a/cli/package.json b/cli/package.json index cb36ec4f..a6552162 100644 --- a/cli/package.json +++ b/cli/package.json @@ -28,11 +28,11 @@ "LICENSE.md" ], "dependencies": { - "@inquirer/checkbox": "5.1.0", - "@inquirer/confirm": "6.0.8", - "@inquirer/core": "11.1.5", - "@inquirer/input": "5.0.8", - "@inquirer/select": "5.1.0", + "@inquirer/checkbox": "5.2.1", + "@inquirer/confirm": "6.1.1", + "@inquirer/core": "11.2.1", + "@inquirer/input": "5.1.2", + "@inquirer/select": "5.2.1", "@perfect-abstractions/compose": "0.0.4", "commander": "^13.1.0", "fs-extra": "^11.3.3", diff --git a/cli/src/modules/init/module.ts b/cli/src/modules/init/module.ts index 509b9d11..43b1d5fd 100644 --- a/cli/src/modules/init/module.ts +++ b/cli/src/modules/init/module.ts @@ -2,15 +2,13 @@ import { ComposeContext } from "../../context/types"; import { BasesCatalog } from "../config/types"; import { ConfigModule } from "../config/module"; import { - checkboxTheme, getOwnershipChoices, getOwnershipExtensionChoices, getRoleAccessChoices, getRoleAccessExtensionChoices, - loadPrompts, - selectTheme, toFacetChoices, } from "./prompts"; +import { checkboxTheme, clearStdin , inputTheme, loadPrompts, selectTheme } from "../../utils/inquirer"; import { getFrameworkDependencies } from "./frameworkDeps"; import { resolveAccessFlags } from "./flags"; import { splitCommaSeparated } from "../../utils/strings"; @@ -134,17 +132,17 @@ export const InitModule = { */ async runInitInteractive(ctx: ComposeContext): Promise { const { input, checkbox, select } = await loadPrompts(); - const promptContext = { clearPromptOnDone: true }; const catalog = ctx.config.bases as BasesCatalog; if (!ctx.param.projectName) { const outDir = String(ctx.param.outDir ?? process.cwd()); - + await clearStdin(); const projectName = await input({ message: "Enter project name:", default: "my-diamond", validate: (name) => validateProjectNameWithFolder(name, outDir), - }, promptContext); + theme: inputTheme, + }); ctx.param.projectName = projectName; } else { const projectNameValidation = validateProjectName(String(ctx.param.projectName)); @@ -163,6 +161,7 @@ export const InitModule = { })), ]; + await clearStdin(); const framework = await select({ message: "Select project framework:", choices: [ @@ -171,9 +170,10 @@ export const InitModule = { ] as const, default: "foundry", theme: selectTheme, - }, promptContext); + }); if (framework === "hardhat") { + await clearStdin(); const toolbox = await select({ message: "Select Hardhat toolbox:", choices: [ @@ -182,15 +182,16 @@ export const InitModule = { ], default: "ethers", theme: selectTheme, - }, promptContext); + }); ctx.param.toolbox = toolbox; } + await clearStdin(); const selectedBaseKey = await select({ message: "Select base:", choices: featureChoices, theme: selectTheme, - }, promptContext); + }); const selectedBase = selectedBaseKey === "none" ? ConfigModule.EMPTY_BASE @@ -200,47 +201,58 @@ export const InitModule = { const extensionChoices = toFacetChoices(Object.keys(availableExtensions)); const selectedExtensions = extensionChoices.length > 0 - ? await checkbox({ - message: "Select extension facets:", - choices: extensionChoices, - theme: checkboxTheme, - }, promptContext) + ? await (async () => { + await clearStdin(); + return checkbox({ + message: "Select extension facets:", + choices: extensionChoices, + theme: checkboxTheme, + }); + })() : []; const availableLibraryFacets = ConfigModule.getAvailableLibraryFacets(catalog, selectedBase); const libraryChoices = toFacetChoices(Object.keys(availableLibraryFacets)); + await clearStdin(); const selectedLibraries = await checkbox({ message: "Select Compose library facets:", choices: libraryChoices, theme: checkboxTheme, - }, promptContext); + }); const accessBases = ConfigModule.getAccessBases(catalog, selectedBaseKey); const selectedOwnership = selectedBase.accessType === "ownership" ? undefined - : await select({ - message: "Select ownership:", - choices: getOwnershipChoices(accessBases), - theme: selectTheme, - }, promptContext); + : await (async () => { + await clearStdin(); + return select({ + message: "Select ownership:", + choices: getOwnershipChoices(accessBases), + theme: selectTheme, + }); + })(); const ownershipExtensionChoices = getOwnershipExtensionChoices(accessBases, selectedOwnership); const selectedOwnershipExtensions = ownershipExtensionChoices.length > 0 - ? await checkbox({ - message: "Select ownership extension facets:", - choices: ownershipExtensionChoices, - theme: checkboxTheme, - }, promptContext) + ? await (async () => { + await clearStdin(); + return checkbox({ + message: "Select ownership extension facets:", + choices: ownershipExtensionChoices, + theme: checkboxTheme, + }); + })() : []; const accessChoices = getRoleAccessChoices(accessBases); + await clearStdin(); const selectedAccessControl = await select({ message: "Select access control:", choices: accessChoices, theme: selectTheme, - }, promptContext); + }); const selectedRoleAccess = selectedAccessControl ? [selectedAccessControl] : []; const selectedAccess = [ ...(selectedOwnership ? [selectedOwnership] : []), @@ -250,11 +262,14 @@ export const InitModule = { const accessExtensionChoices = getRoleAccessExtensionChoices(accessBases, selectedAccessControl); const selectedRoleAccessExtensions = accessExtensionChoices.length > 0 - ? await checkbox({ - message: "Select access control extension facets:", - choices: accessExtensionChoices, - theme: checkboxTheme, - }, promptContext) + ? await (async () => { + await clearStdin(); + return checkbox({ + message: "Select access control extension facets:", + choices: accessExtensionChoices, + theme: checkboxTheme, + }); + })() : []; const selectedAccessExtensions = [ ...selectedOwnershipExtensions, @@ -263,10 +278,11 @@ export const InitModule = { const { deps, packageType } = getFrameworkDependencies(framework, String(ctx.param.toolbox)); showDependencies(deps, packageType); + await clearStdin(); const installDeps = await (await loadPrompts()).confirm({ message: "Install project dependencies?", default: true, - }, promptContext); + }); ctx.param.installDeps = installDeps; const selection = ConfigModule.resolveCatalogSelection( diff --git a/cli/src/modules/init/prompts.ts b/cli/src/modules/init/prompts.ts index 16d6e8aa..6072baa1 100644 --- a/cli/src/modules/init/prompts.ts +++ b/cli/src/modules/init/prompts.ts @@ -1,34 +1,4 @@ import { BaseDefinition } from "../config/types"; -import { PromptApi } from "./types"; - -/** A choice option for an Inquirer select or checkbox prompt. */ -export type PromptChoice = { - name: string; - value: Value; -}; - -/** - * Dynamically imports the prompt primitives used by init. - * Importing the primitives directly keeps npm hoisting from resolving newer - * transitive prompt internals through the umbrella @inquirer/prompts package. - * - * @returns The prompt API with input, select, checkbox, and confirm methods. - */ -export async function loadPrompts(): Promise { - const [ - { default: input }, - { default: select }, - { default: checkbox }, - { default: confirm }, - ] = await Promise.all([ - import("@inquirer/input"), - import("@inquirer/select"), - import("@inquirer/checkbox"), - import("@inquirer/confirm"), - ]); - - return { input, select, checkbox, confirm } as unknown as PromptApi; -} /** * Converts an array of facet names into prompt choice objects. @@ -36,7 +6,7 @@ export async function loadPrompts(): Promise { * @param facetNames - The facet names to convert. * @returns Array of prompt choices with name and value set to the facet name. */ -export function toFacetChoices(facetNames: string[]): PromptChoice[] { +export function toFacetChoices(facetNames: string[]): { name: string; value: string }[] { return facetNames.map((facetName) => ({ name: facetName, value: facetName, @@ -51,7 +21,7 @@ export function toFacetChoices(facetNames: string[]): PromptChoice[] { */ export function getOwnershipChoices( accessBases: Record, -): PromptChoice[] { +): { name: string; value: string | undefined }[] { return [ { name: "None", value: undefined }, ...Object.entries(accessBases) @@ -73,7 +43,7 @@ export function getOwnershipChoices( export function getOwnershipExtensionChoices( accessBases: Record, selectedOwnership: string | undefined, -): PromptChoice[] { +): { name: string; value: string }[] { if (!selectedOwnership) return []; return toFacetChoices(Object.keys(accessBases[selectedOwnership]?.optional ?? {})); } @@ -86,7 +56,7 @@ export function getOwnershipExtensionChoices( */ export function getRoleAccessChoices( accessBases: Record, -): PromptChoice[] { +): { name: string; value: string | undefined }[] { return [ { name: "None", value: undefined }, ...Object.entries(accessBases) @@ -108,37 +78,7 @@ export function getRoleAccessChoices( export function getRoleAccessExtensionChoices( accessBases: Record, selectedRoleAccess: string | undefined, -): PromptChoice[] { +): { name: string; value: string }[] { if (!selectedRoleAccess) return []; return toFacetChoices(Object.keys(accessBases[selectedRoleAccess]?.optional ?? {})); } - -/** Custom theme for checkbox prompts with simplified icons, no help tip, and "None" when empty. */ -export const checkboxTheme = { - prefix: "", - icon: { - checked: "[✓]", - unchecked: "[ ]", - cursor: ">", - disabledChecked: "[✓]", - disabledUnchecked: "[ ]", - }, - style: { - keysHelpTip: () => undefined, - renderSelectedChoices: (selected: readonly { short: string }[]) => { - if (selected.length === 0) return "None"; - return selected.map((c) => c.short).join(", "); - }, - }, -} as const; - -/** Custom theme for select prompts with simplified cursor and no help tip. */ -export const selectTheme = { - prefix: "", - icon: { - cursor: ">", - }, - style: { - keysHelpTip: () => undefined, - }, -} as const; diff --git a/cli/src/utils/inquirer.ts b/cli/src/utils/inquirer.ts new file mode 100644 index 00000000..ed9e5f95 --- /dev/null +++ b/cli/src/utils/inquirer.ts @@ -0,0 +1,105 @@ +import type { PromptApi } from "../modules/init/types"; + +/** A choice option for an Inquirer select or checkbox prompt. */ +export type PromptChoice = { + name: string; + value: Value; +}; + +/** + * Dynamically imports the prompt primitives used by init. + * Importing the primitives directly keeps npm hoisting from resolving newer + * transitive prompt internals through the umbrella @inquirer/prompts package. + * + * @returns The prompt API with input, select, checkbox, and confirm methods. + */ +export async function loadPrompts(): Promise { + const [ + { default: input }, + { default: select }, + { default: checkbox }, + { default: confirm }, + ] = await Promise.all([ + import("@inquirer/input"), + import("@inquirer/select"), + import("@inquirer/checkbox"), + import("@inquirer/confirm"), + ]); + + return { input, select, checkbox, confirm } as unknown as PromptApi; +} + +/** Custom theme for checkbox prompts with simplified icons, no help tip, and "None" when empty. */ +export const checkboxTheme = { + prefix: "", + icon: { + checked: "[✓]", + unchecked: "[ ]", + cursor: ">", + disabledChecked: "[✓]", + disabledUnchecked: "[ ]", + }, + style: { + keysHelpTip: () => undefined, + renderSelectedChoices: (selected: readonly { short: string }[]) => { + if (selected.length === 0) return "None"; + return selected.map((c) => c.short).join(", "); + }, + }, +} as const; + +/** Custom theme for input prompts with no prefix or confirmation icon. */ +export const inputTheme = { + prefix: { + idle: undefined, + done: undefined, + active: undefined, + error: undefined, + }, + icon: { + state: { + done: "", + idle: "", + active: "", + error: "", + }, + }, + style: { + helpTip: () => undefined, + separator: ":", + }, +} as const; + +/** Custom theme for select prompts with simplified cursor and no help tip. */ +export const selectTheme = { + prefix: "", + icon: { + cursor: ">", + }, + style: { + keysHelpTip: () => undefined, + }, +} as const; + +/** + * Clear any buffered data from stdin before the next prompt. + * + * Works around a Windows/libuv bug where {@link https://nodejs.org/api/tty.html#readsetrawmodemode | setRawMode(true)} doesn't + * reliably switch to raw mode after a previous readline closes, causing + * users to press Enter twice to select. + */ +export async function clearStdin(): Promise { + return new Promise((resolve) => { + if (!process.stdin.isTTY) { + resolve(); + return; + } + try { + process.stdin.resume(); + while (process.stdin.read() !== null) { /* discard */ } + setTimeout(resolve, 20); + } catch { + resolve(); + } + }); +} diff --git a/package-lock.json b/package-lock.json index 94a7e4b6..dcd3706f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,14 +22,14 @@ }, "cli": { "name": "@perfect-abstractions/compose-cli", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT", "dependencies": { - "@inquirer/checkbox": "5.1.0", - "@inquirer/confirm": "6.0.8", - "@inquirer/core": "11.1.5", - "@inquirer/input": "5.0.8", - "@inquirer/select": "5.1.0", + "@inquirer/checkbox": "5.2.1", + "@inquirer/confirm": "6.1.1", + "@inquirer/core": "11.2.1", + "@inquirer/input": "5.1.2", + "@inquirer/select": "5.2.1", "@perfect-abstractions/compose": "0.0.4", "commander": "^13.1.0", "fs-extra": "^11.3.3", @@ -85,123 +85,9 @@ } } }, - "cli/node_modules/@inquirer/checkbox": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.1.0.tgz", - "integrity": "sha512-/HjF1LN0a1h4/OFsbGKHNDtWICFU/dqXCdym719HFTyJo9IG7Otr+ziGWc9S0iQuohRZllh+WprSgd5UW5Fw0g==", - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^2.0.3", - "@inquirer/core": "^11.1.5", - "@inquirer/figures": "^2.0.3", - "@inquirer/type": "^4.0.3" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "cli/node_modules/@inquirer/confirm": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.8.tgz", - "integrity": "sha512-Di6dgmiZ9xCSUxWUReWTqDtbhXCuG2MQm2xmgSAIruzQzBqNf49b8E07/vbCYY506kDe8BiwJbegXweG8M1klw==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^11.1.5", - "@inquirer/type": "^4.0.3" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "cli/node_modules/@inquirer/core": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.1.5.tgz", - "integrity": "sha512-QQPAX+lka8GyLcZ7u7Nb1h6q72iZ/oy0blilC3IB2nSt1Qqxp7akt94Jqhi/DzARuN3Eo9QwJRvtl4tmVe4T5A==", - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^2.0.3", - "@inquirer/figures": "^2.0.3", - "@inquirer/type": "^4.0.3", - "cli-width": "^4.1.0", - "fast-wrap-ansi": "^0.2.0", - "mute-stream": "^3.0.0", - "signal-exit": "^4.1.0" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "cli/node_modules/@inquirer/input": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.0.8.tgz", - "integrity": "sha512-p0IJslw0AmedLEkOU+yrEX3Aj2RTpQq7ZOf8nc1DIhjzaxRWrrgeuE5Kyh39fVRgtcACaMXx/9WNo8+GjgBOfw==", - "license": "MIT", - "dependencies": { - "@inquirer/core": "^11.1.5", - "@inquirer/type": "^4.0.3" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "cli/node_modules/@inquirer/select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.1.0.tgz", - "integrity": "sha512-OyYbKnchS1u+zRe14LpYrN8S0wH1vD0p2yKISvSsJdH2TpI87fh4eZdWnpdbrGauCRWDph3NwxRmM4Pcm/hx1Q==", - "license": "MIT", - "dependencies": { - "@inquirer/ansi": "^2.0.3", - "@inquirer/core": "^11.1.5", - "@inquirer/figures": "^2.0.3", - "@inquirer/type": "^4.0.3" - }, - "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, "cli/node_modules/@types/node": { "version": "22.19.13", - "devOptional": true, + "dev": true, "license": "MIT", "dependencies": { "undici-types": "~6.21.0" @@ -317,7 +203,7 @@ }, "cli/node_modules/undici-types": { "version": "6.21.0", - "devOptional": true, + "dev": true, "license": "MIT" }, "cli/node_modules/universalify": { @@ -469,6 +355,7 @@ "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.55.1.tgz", "integrity": "sha512-GAqHl9zERhC3bbBfubwUu07G3UXO06gORvOcsiTBZB3et0s3auNUbHlYdYNp4VKa3sUZqH5AcD3OKzU/KDGXjQ==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/client-common": "5.55.1", "@algolia/requester-browser-xhr": "5.55.1", @@ -613,6 +500,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", @@ -2674,6 +2562,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -2696,6 +2585,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -2805,6 +2695,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3226,6 +3117,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -4091,6 +3983,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/core/-/core-3.10.1.tgz", "integrity": "sha512-3pf2fXXw0eVk8WnC3T4LIigRDupcpvngpKo9Vy7mYyBhuddc0klDUuZAIfzMoK6z05pdlk6EFC/vBSX43+1O5w==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/babel": "3.10.1", "@docusaurus/bundler": "3.10.1", @@ -4423,6 +4316,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/plugin-content-docs/-/plugin-content-docs-3.10.1.tgz", "integrity": "sha512-2jRVrtzjf8LClGTHQlwlwuD3wQXRx3WEoF7XUarJ8Ou+0onV+SLtejsyfY9JLpfUh9hPhXM4pbBGkyAY4Bi3HQ==", "license": "MIT", + "peer": true, "dependencies": { "@docusaurus/core": "3.10.1", "@docusaurus/logger": "3.10.1", @@ -5462,6 +5356,76 @@ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" } }, + "node_modules/@inquirer/checkbox": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.2.1.tgz", + "integrity": "sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/confirm": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz", + "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", + "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7", + "cli-width": "^4.1.0", + "fast-wrap-ansi": "^0.2.0", + "mute-stream": "^3.0.0", + "signal-exit": "^4.1.0" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/external-editor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", @@ -5493,6 +5457,50 @@ "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" } }, + "node_modules/@inquirer/input": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.1.2.tgz", + "integrity": "sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==", + "license": "MIT", + "dependencies": { + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/select": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.2.1.tgz", + "integrity": "sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==", + "license": "MIT", + "dependencies": { + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" + }, + "engines": { + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/@inquirer/type": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-4.0.7.tgz", @@ -6123,6 +6131,7 @@ "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", "license": "MIT", + "peer": true, "dependencies": { "@types/mdx": "^2.0.0" }, @@ -6968,6 +6977,7 @@ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz", "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "^7.21.3", "@svgr/babel-preset": "8.1.0", @@ -7072,6 +7082,7 @@ "integrity": "sha512-1CuKjFkPxIgGdeHVuNbkxmBxkcbdc08u0aiI43pFq6yY1tTVKmXT9hFEooyyKs/sJ3xf1GPHyEwTtk9Xl8dvQw==", "hasInstallScript": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.27" @@ -8015,6 +8026,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.18.0" } @@ -8042,6 +8054,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -8222,6 +8235,7 @@ "integrity": "sha512-KA0OshtlcCCXmbfqyZkM5pV3/WNraJf7DkJRLpyrmwPtud57H5BDX7C3k0LPSPxpprfRL+cJDGabF10mvNCoCw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.64.0", "@typescript-eslint/types": "8.64.0", @@ -8696,6 +8710,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -8763,6 +8778,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -8808,6 +8824,7 @@ "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.55.1.tgz", "integrity": "sha512-FyaFnnsbVPtevQwqSj/SdxE3jAsSsY0BEH8IVLf9rXxEBdAhAmT6VKCVSMWoaPIHVN1Eufh/1w8q6k8URpIkWw==", "license": "MIT", + "peer": true, "dependencies": { "@algolia/abtesting": "1.21.1", "@algolia/client-abtesting": "5.55.1", @@ -9430,6 +9447,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.10.38", "caniuse-lite": "^1.0.30001799", @@ -10649,6 +10667,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -10972,13 +10991,15 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/cytoscape": { "version": "3.34.0", "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.0.tgz", "integrity": "sha512-62rNSrioXw93uliKFBwjukeQyeWwH2PqDrTac31r2P6464u3AUvTk0xS4LVvT251g7IgkFunrI48ZEZGjywSOg==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10" } @@ -11400,6 +11421,7 @@ "resolved": "https://registry.npmjs.org/d3-selection/-/d3-selection-3.0.0.tgz", "integrity": "sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==", "license": "ISC", + "peer": true, "engines": { "node": ">=12" } @@ -12210,6 +12232,7 @@ "integrity": "sha512-GVTD7s1vdIl6UYvAfriOPeY1Df8LIZjfofLvHwde+erDHGGuHyuM6xoxRxmHiebhYuD2p1vN4wWh0XzPARSGDQ==", "dev": true, "license": "MIT", + "peer": true, "workspaces": [ "packages/*" ], @@ -13047,6 +13070,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -14779,6 +14803,7 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -18294,6 +18319,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -19173,6 +19199,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", @@ -20076,6 +20103,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -21012,6 +21040,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -21021,6 +21050,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -21076,6 +21106,7 @@ "resolved": "https://registry.npmjs.org/@docusaurus/react-loadable/-/react-loadable-6.0.0.tgz", "integrity": "sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/react": "*" }, @@ -21104,6 +21135,7 @@ "resolved": "https://registry.npmjs.org/react-router/-/react-router-5.3.4.tgz", "integrity": "sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.12.13", "history": "^4.9.0", @@ -23136,6 +23168,7 @@ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -23254,7 +23287,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsyringe": { "version": "4.10.0", @@ -23360,6 +23394,7 @@ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -23736,6 +23771,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -23997,6 +24033,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.108.4.tgz", "integrity": "sha512-yur8LyJoeiWh47dErD+Ok7vlbmDsJ3UbbRPAoxbGJ54WpE2y5yVo5G/inUzujnYgw3tPmBRdn+G7PoxXaYC33w==", "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "^1.0.8", "@types/json-schema": "^7.0.15", @@ -24460,6 +24497,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", "license": "MIT", + "peer": true, "engines": { "node": ">=8.3.0" }, From 712650fb2a4c16565995305e98341592504c6f9e Mon Sep 17 00:00:00 2001 From: maxnorm Date: Tue, 21 Jul 2026 19:55:14 -0400 Subject: [PATCH 2/4] fix: update VERSION to read from package.json --- cli/src/utils/metadata.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/src/utils/metadata.ts b/cli/src/utils/metadata.ts index fec48f66..d39a29d3 100644 --- a/cli/src/utils/metadata.ts +++ b/cli/src/utils/metadata.ts @@ -1,5 +1,5 @@ export const COMPOSE_DOCS_URL = "https://compose.diamonds/"; -export const VERSION = "0.1.0"; +export const VERSION = require("../../package.json").version; export const COMPOSE_HEADER = ` _____ ____ __ __ _____ ____ _____ ______ _____ _ _____ From 39c213a0b9c3ed3a6d07668457fae122b13132d6 Mon Sep 17 00:00:00 2001 From: maxnorm Date: Tue, 21 Jul 2026 20:07:03 -0400 Subject: [PATCH 3/4] add changeset --- .changeset/busy-cougars-flash.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/busy-cougars-flash.md diff --git a/.changeset/busy-cougars-flash.md b/.changeset/busy-cougars-flash.md new file mode 100644 index 00000000..0a1e2844 --- /dev/null +++ b/.changeset/busy-cougars-flash.md @@ -0,0 +1,5 @@ +--- +"@perfect-abstractions/compose-cli": patch +--- + +fix cli rendering on windows From e0e782937ae1ebb4553b0fcbc6adc9f8613b9956 Mon Sep 17 00:00:00 2001 From: maxnorm Date: Tue, 21 Jul 2026 21:50:20 -0400 Subject: [PATCH 4/4] update package lock file --- cli/package-lock.json | 101 ++++++++++++++++++++---------------------- 1 file changed, 48 insertions(+), 53 deletions(-) diff --git a/cli/package-lock.json b/cli/package-lock.json index 92428f10..ccd0b56e 100644 --- a/cli/package-lock.json +++ b/cli/package-lock.json @@ -1,19 +1,19 @@ { "name": "@perfect-abstractions/compose-cli", - "version": "0.1.1", + "version": "0.1.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@perfect-abstractions/compose-cli", - "version": "0.1.1", + "version": "0.1.2", "license": "MIT", "dependencies": { - "@inquirer/checkbox": "5.1.0", - "@inquirer/confirm": "6.0.8", - "@inquirer/core": "11.1.5", - "@inquirer/input": "5.0.8", - "@inquirer/select": "5.1.0", + "@inquirer/checkbox": "5.2.1", + "@inquirer/confirm": "6.1.1", + "@inquirer/core": "11.2.1", + "@inquirer/input": "5.1.2", + "@inquirer/select": "5.2.1", "@perfect-abstractions/compose": "0.0.4", "commander": "^13.1.0", "fs-extra": "^11.3.3", @@ -667,18 +667,18 @@ } }, "node_modules/@inquirer/checkbox": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.1.0.tgz", - "integrity": "sha512-/HjF1LN0a1h4/OFsbGKHNDtWICFU/dqXCdym719HFTyJo9IG7Otr+ziGWc9S0iQuohRZllh+WprSgd5UW5Fw0g==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/checkbox/-/checkbox-5.2.1.tgz", + "integrity": "sha512-b6xmA/VlTe0ZgDQHDui+Nav470u7u49nRd8/iuhOcQPO9Ch7lGuogydhi2VOmNlZ+zXcM8IcPuNSwQcdJaF/kw==", "license": "MIT", "dependencies": { - "@inquirer/ansi": "^2.0.3", - "@inquirer/core": "^11.1.5", - "@inquirer/figures": "^2.0.3", - "@inquirer/type": "^4.0.3" + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -690,16 +690,16 @@ } }, "node_modules/@inquirer/confirm": { - "version": "6.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.0.8.tgz", - "integrity": "sha512-Di6dgmiZ9xCSUxWUReWTqDtbhXCuG2MQm2xmgSAIruzQzBqNf49b8E07/vbCYY506kDe8BiwJbegXweG8M1klw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-6.1.1.tgz", + "integrity": "sha512-eb8DBZcz/2qHWQda4rk2JiQk5h9QV/cVHi1yjt0f69WFZMRFn0sJTye3EAP8icut8UDMjQPsaH5KbcOogefrFQ==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.5", - "@inquirer/type": "^4.0.3" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -711,21 +711,21 @@ } }, "node_modules/@inquirer/core": { - "version": "11.1.5", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.1.5.tgz", - "integrity": "sha512-QQPAX+lka8GyLcZ7u7Nb1h6q72iZ/oy0blilC3IB2nSt1Qqxp7akt94Jqhi/DzARuN3Eo9QwJRvtl4tmVe4T5A==", + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-11.2.1.tgz", + "integrity": "sha512-Qd6GJT1yVyrZZCfN8W2qKF5ApmqryXRhRKCuip8h01x2w/esJQ2XIYc6f9abMIHgKQdBfFTSOdbHRLAhuM09UA==", "license": "MIT", "dependencies": { - "@inquirer/ansi": "^2.0.3", - "@inquirer/figures": "^2.0.3", - "@inquirer/type": "^4.0.3", + "@inquirer/ansi": "^2.0.7", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7", "cli-width": "^4.1.0", "fast-wrap-ansi": "^0.2.0", "mute-stream": "^3.0.0", "signal-exit": "^4.1.0" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -746,16 +746,16 @@ } }, "node_modules/@inquirer/input": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.0.8.tgz", - "integrity": "sha512-p0IJslw0AmedLEkOU+yrEX3Aj2RTpQq7ZOf8nc1DIhjzaxRWrrgeuE5Kyh39fVRgtcACaMXx/9WNo8+GjgBOfw==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@inquirer/input/-/input-5.1.2.tgz", + "integrity": "sha512-9K/DDBSQpOyZSkt6sOVP9Vo0TR7atX2kuILsUu0x3wVcVbe97lJwIJKMLdMw25tDYuXl/qp6erT0Xs1rfmcfZg==", "license": "MIT", "dependencies": { - "@inquirer/core": "^11.1.5", - "@inquirer/type": "^4.0.3" + "@inquirer/core": "^11.2.1", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -767,18 +767,18 @@ } }, "node_modules/@inquirer/select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.1.0.tgz", - "integrity": "sha512-OyYbKnchS1u+zRe14LpYrN8S0wH1vD0p2yKISvSsJdH2TpI87fh4eZdWnpdbrGauCRWDph3NwxRmM4Pcm/hx1Q==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@inquirer/select/-/select-5.2.1.tgz", + "integrity": "sha512-FlDndEUww8m7BfukO2nJa25vhD+H5jxxCv4oGioKqzyWz3nPHhhw4LKdYRSlXuAx7DsdWia7iyaBPKKS95Evfw==", "license": "MIT", "dependencies": { - "@inquirer/ansi": "^2.0.3", - "@inquirer/core": "^11.1.5", - "@inquirer/figures": "^2.0.3", - "@inquirer/type": "^4.0.3" + "@inquirer/ansi": "^2.0.7", + "@inquirer/core": "^11.2.1", + "@inquirer/figures": "^2.0.7", + "@inquirer/type": "^4.0.7" }, "engines": { - "node": ">=23.5.0 || ^22.13.0 || ^21.7.0 || ^20.12.0" + "node": ">=23.5.0 || ^22.13.0 || ^20.17.0" }, "peerDependencies": { "@types/node": ">=18" @@ -839,6 +839,7 @@ "integrity": "sha512-akNQMv0wW5uyRpD2v2IEyRSZiR+BeGuoB6L310EgGObO44HSMNT8z1xzio28V8qOrgYaopIDNA18YgdXd+qTiw==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -888,6 +889,7 @@ "integrity": "sha512-KA0OshtlcCCXmbfqyZkM5pV3/WNraJf7DkJRLpyrmwPtud57H5BDX7C3k0LPSPxpprfRL+cJDGabF10mvNCoCw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.64.0", "@typescript-eslint/types": "8.64.0", @@ -1100,6 +1102,7 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1276,6 +1279,7 @@ "integrity": "sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.2", @@ -1973,6 +1977,7 @@ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -2127,6 +2132,7 @@ "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2359,17 +2365,6 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } - }, - "node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", - "license": "MIT", - "optional": true, - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } } } }