@maizzle/framework 6.0.0-rc.17 → 6.0.0-rc.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/maizzle.mjs +1 -1
- package/dist/build.d.ts +6 -5
- package/dist/build.d.ts.map +1 -1
- package/dist/{build.mjs → build.js} +13 -9
- package/dist/build.js.map +1 -0
- package/dist/components/Body.vue +10 -0
- package/dist/components/Button.vue +70 -11
- package/dist/components/Column.vue +10 -0
- package/dist/components/Container.vue +29 -1
- package/dist/components/Html.vue +10 -0
- package/dist/components/Layout.vue +27 -12
- package/dist/components/MarkdownLayout.vue +39 -0
- package/dist/components/Overlap.vue +10 -0
- package/dist/components/Preheader.vue +3 -8
- package/dist/components/Row.vue +10 -0
- package/dist/components/Section.vue +10 -0
- package/dist/components/{utils.mjs → utils.js} +1 -1
- package/dist/components/utils.js.map +1 -0
- package/dist/composables/{defineConfig.mjs → defineConfig.js} +3 -3
- package/dist/composables/defineConfig.js.map +1 -0
- package/dist/composables/{renderContext.mjs → renderContext.js} +1 -1
- package/dist/composables/renderContext.js.map +1 -0
- package/dist/composables/useBaseUrl.d.ts +19 -0
- package/dist/composables/useBaseUrl.d.ts.map +1 -0
- package/dist/composables/useBaseUrl.js +27 -0
- package/dist/composables/useBaseUrl.js.map +1 -0
- package/dist/composables/{useConfig.mjs → useConfig.js} +1 -1
- package/dist/composables/useConfig.js.map +1 -0
- package/dist/composables/{useDoctype.mjs → useDoctype.js} +2 -2
- package/dist/composables/useDoctype.js.map +1 -0
- package/dist/composables/{useEvent.mjs → useEvent.js} +2 -2
- package/dist/composables/useEvent.js.map +1 -0
- package/dist/composables/{useFont.mjs → useFont.js} +2 -2
- package/dist/composables/useFont.js.map +1 -0
- package/dist/composables/{useOutlookFallback.mjs → useOutlookFallback.js} +1 -1
- package/dist/composables/useOutlookFallback.js.map +1 -0
- package/dist/composables/{usePlaintext.mjs → usePlaintext.js} +2 -2
- package/dist/composables/usePlaintext.js.map +1 -0
- package/dist/composables/{usePreheader.mjs → usePreheader.js} +2 -2
- package/dist/composables/usePreheader.js.map +1 -0
- package/dist/composables/useTransformers.d.ts +34 -0
- package/dist/composables/useTransformers.d.ts.map +1 -0
- package/dist/composables/useTransformers.js +49 -0
- package/dist/composables/useTransformers.js.map +1 -0
- package/dist/composables/useUrlQuery.d.ts +19 -0
- package/dist/composables/useUrlQuery.d.ts.map +1 -0
- package/dist/composables/useUrlQuery.js +27 -0
- package/dist/composables/useUrlQuery.js.map +1 -0
- package/dist/config/{defaults.mjs → defaults.js} +8 -2
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/{index.mjs → index.js} +3 -3
- package/dist/config/index.js.map +1 -0
- package/dist/events/index.d.ts +8 -2
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/{index.mjs → index.js} +20 -4
- package/dist/events/index.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +37 -0
- package/dist/{plaintext.mjs → plaintext.js} +1 -1
- package/dist/plaintext.js.map +1 -0
- package/dist/{plugin.mjs → plugin.js} +5 -5
- package/dist/plugin.js.map +1 -0
- package/dist/plugins/postcss/{mergeMediaQueries.mjs → mergeMediaQueries.js} +1 -1
- package/dist/plugins/postcss/mergeMediaQueries.js.map +1 -0
- package/dist/plugins/postcss/{pruneVars.mjs → pruneVars.js} +1 -1
- package/dist/plugins/postcss/pruneVars.js.map +1 -0
- package/dist/plugins/postcss/{quoteFontFamilies.mjs → quoteFontFamilies.js} +1 -1
- package/dist/plugins/postcss/quoteFontFamilies.js.map +1 -0
- package/dist/plugins/postcss/{removeDeclarations.mjs → removeDeclarations.js} +1 -1
- package/dist/plugins/postcss/removeDeclarations.js.map +1 -0
- package/dist/plugins/postcss/{resolveMaizzleImports.mjs → resolveMaizzleImports.js} +1 -1
- package/dist/plugins/postcss/resolveMaizzleImports.js.map +1 -0
- package/dist/plugins/postcss/{resolveProps.mjs → resolveProps.js} +1 -1
- package/dist/plugins/postcss/resolveProps.js.map +1 -0
- package/dist/plugins/postcss/{tailwindCleanup.mjs → tailwindCleanup.js} +1 -1
- package/dist/plugins/postcss/tailwindCleanup.js.map +1 -0
- package/dist/{prepare.mjs → prepare.js} +4 -4
- package/dist/prepare.js.map +1 -0
- package/dist/render/{createRenderer.mjs → createRenderer.js} +19 -11
- package/dist/render/createRenderer.js.map +1 -0
- package/dist/render/{index.mjs → index.js} +5 -5
- package/dist/render/index.js.map +1 -0
- package/dist/render/{injectFonts.mjs → injectFonts.js} +2 -2
- package/dist/render/injectFonts.js.map +1 -0
- package/dist/render/plugins/{codeBlockExtract.mjs → codeBlockExtract.js} +1 -1
- package/dist/render/plugins/codeBlockExtract.js.map +1 -0
- package/dist/render/plugins/{markdownExtract.mjs → markdownExtract.js} +1 -1
- package/dist/render/plugins/markdownExtract.js.map +1 -0
- package/dist/render/plugins/{rawExtract.mjs → rawExtract.js} +1 -1
- package/dist/render/plugins/rawExtract.js.map +1 -0
- package/dist/render/plugins/{rowSourceLocation.mjs → rowSourceLocation.js} +1 -1
- package/dist/render/plugins/rowSourceLocation.js.map +1 -0
- package/dist/{serve.mjs → serve.js} +8 -8
- package/dist/serve.js.map +1 -0
- package/dist/server/{compatibility.mjs → compatibility.js} +4 -4
- package/dist/server/compatibility.js.map +1 -0
- package/dist/server/{email.mjs → email.js} +1 -1
- package/dist/server/email.js.map +1 -0
- package/dist/server/{linter.mjs → linter.js} +2 -2
- package/dist/server/linter.js.map +1 -0
- package/dist/server/{sfc-utils.mjs → sfc-utils.js} +1 -1
- package/dist/server/sfc-utils.js.map +1 -0
- package/dist/server/ui/App.vue +18 -0
- package/dist/server/ui/components/ui/command/Command.vue +4 -1
- package/dist/transformers/{addAttributes.mjs → addAttributes.js} +3 -3
- package/dist/transformers/addAttributes.js.map +1 -0
- package/dist/transformers/{attributeToStyle.mjs → attributeToStyle.js} +3 -3
- package/dist/transformers/attributeToStyle.js.map +1 -0
- package/dist/transformers/{base.mjs → base.js} +6 -6
- package/dist/transformers/base.js.map +1 -0
- package/dist/transformers/{columnWidth.mjs → columnWidth.js} +3 -3
- package/dist/transformers/columnWidth.js.map +1 -0
- package/dist/transformers/{entities.mjs → entities.js} +3 -3
- package/dist/transformers/entities.js.map +1 -0
- package/dist/transformers/filters/{defaults.mjs → defaults.js} +1 -1
- package/dist/transformers/filters/defaults.js.map +1 -0
- package/dist/transformers/filters/{index.mjs → index.js} +5 -5
- package/dist/transformers/filters/index.js.map +1 -0
- package/dist/transformers/{format.mjs → format.js} +1 -1
- package/dist/transformers/format.js.map +1 -0
- package/dist/transformers/index.js +113 -0
- package/dist/transformers/index.js.map +1 -0
- package/dist/transformers/{inlineCSS.mjs → inlineCSS.js} +5 -5
- package/dist/transformers/inlineCSS.js.map +1 -0
- package/dist/transformers/{inlineLink.mjs → inlineLink.js} +3 -3
- package/dist/transformers/inlineLink.js.map +1 -0
- package/dist/transformers/{minify.mjs → minify.js} +1 -1
- package/dist/transformers/minify.js.map +1 -0
- package/dist/transformers/msoPlaceholders.d.ts +28 -0
- package/dist/transformers/msoPlaceholders.d.ts.map +1 -0
- package/dist/transformers/msoPlaceholders.js +89 -0
- package/dist/transformers/msoPlaceholders.js.map +1 -0
- package/dist/transformers/{purgeCSS.mjs → purgeCSS.js} +5 -5
- package/dist/transformers/purgeCSS.js.map +1 -0
- package/dist/transformers/{removeAttributes.mjs → removeAttributes.js} +3 -3
- package/dist/transformers/removeAttributes.js.map +1 -0
- package/dist/transformers/{replaceStrings.mjs → replaceStrings.js} +1 -1
- package/dist/transformers/replaceStrings.js.map +1 -0
- package/dist/transformers/{safeClassNames.mjs → safeClassNames.js} +3 -3
- package/dist/transformers/safeClassNames.js.map +1 -0
- package/dist/transformers/{shorthandCSS.mjs → shorthandCSS.js} +3 -3
- package/dist/transformers/shorthandCSS.js.map +1 -0
- package/dist/transformers/{sixHex.mjs → sixHex.js} +3 -3
- package/dist/transformers/sixHex.js.map +1 -0
- package/dist/transformers/{tailwindComponent.mjs → tailwindComponent.js} +4 -4
- package/dist/transformers/tailwindComponent.js.map +1 -0
- package/dist/transformers/{tailwindcss.mjs → tailwindcss.js} +5 -5
- package/dist/transformers/tailwindcss.js.map +1 -0
- package/dist/transformers/{urlQuery.mjs → urlQuery.js} +2 -2
- package/dist/transformers/urlQuery.js.map +1 -0
- package/dist/types/config.d.ts +43 -2
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/utils/ast/index.js +5 -0
- package/dist/utils/ast/{parser.mjs → parser.js} +1 -1
- package/dist/utils/ast/parser.js.map +1 -0
- package/dist/utils/ast/{serializer.mjs → serializer.js} +2 -2
- package/dist/utils/ast/serializer.js.map +1 -0
- package/dist/utils/ast/{walker.mjs → walker.js} +1 -1
- package/dist/utils/ast/walker.js.map +1 -0
- package/dist/utils/{compileTailwindCss.mjs → compileTailwindCss.js} +7 -7
- package/dist/utils/compileTailwindCss.js.map +1 -0
- package/dist/utils/{decodeStyleEntities.mjs → decodeStyleEntities.js} +1 -1
- package/dist/utils/decodeStyleEntities.js.map +1 -0
- package/dist/utils/{detect.mjs → detect.js} +1 -1
- package/dist/utils/detect.js.map +1 -0
- package/dist/utils/{url.mjs → url.js} +1 -1
- package/dist/utils/url.js.map +1 -0
- package/node_modules/@clack/core/CHANGELOG.md +8 -0
- package/node_modules/@clack/core/dist/index.d.mts +18 -4
- package/node_modules/@clack/core/dist/index.mjs +16 -10
- package/node_modules/@clack/core/dist/index.mjs.map +1 -1
- package/node_modules/@clack/core/package.json +5 -2
- package/node_modules/@clack/prompts/CHANGELOG.md +15 -0
- package/node_modules/@clack/prompts/README.md +107 -2
- package/node_modules/@clack/prompts/dist/index.d.mts +16 -11
- package/node_modules/@clack/prompts/dist/index.mjs +114 -107
- package/node_modules/@clack/prompts/dist/index.mjs.map +1 -1
- package/node_modules/@clack/prompts/package.json +7 -4
- package/node_modules/fast-string-truncated-width/dist/index.js +36 -96
- package/node_modules/fast-string-truncated-width/dist/types.d.ts +0 -3
- package/node_modules/fast-string-truncated-width/dist/utils.d.ts +3 -3
- package/node_modules/fast-string-truncated-width/dist/utils.js +14 -9
- package/node_modules/fast-string-truncated-width/package.json +1 -1
- package/node_modules/fast-string-truncated-width/readme.md +2 -3
- package/node_modules/fast-string-width/package.json +2 -2
- package/node_modules/fast-string-width/readme.md +0 -3
- package/node_modules/fast-wrap-ansi/lib/main.js +4 -1
- package/node_modules/fast-wrap-ansi/lib/main.js.map +1 -1
- package/node_modules/fast-wrap-ansi/package.json +2 -2
- package/node_modules/tinyexec/README.md +1 -1
- package/node_modules/tinyexec/dist/main.d.mts +6 -6
- package/node_modules/tinyexec/dist/main.mjs +126 -134
- package/node_modules/tinyexec/package.json +9 -9
- package/package.json +3 -3
- package/dist/build.mjs.map +0 -1
- package/dist/components/utils.mjs.map +0 -1
- package/dist/composables/defineConfig.mjs.map +0 -1
- package/dist/composables/renderContext.mjs.map +0 -1
- package/dist/composables/useConfig.mjs.map +0 -1
- package/dist/composables/useDoctype.mjs.map +0 -1
- package/dist/composables/useEvent.mjs.map +0 -1
- package/dist/composables/useFont.mjs.map +0 -1
- package/dist/composables/useOutlookFallback.mjs.map +0 -1
- package/dist/composables/usePlaintext.mjs.map +0 -1
- package/dist/composables/usePreheader.mjs.map +0 -1
- package/dist/config/defaults.mjs.map +0 -1
- package/dist/config/index.mjs.map +0 -1
- package/dist/events/index.mjs.map +0 -1
- package/dist/index.mjs +0 -34
- package/dist/plaintext.mjs.map +0 -1
- package/dist/plugin.mjs.map +0 -1
- package/dist/plugins/postcss/mergeMediaQueries.mjs.map +0 -1
- package/dist/plugins/postcss/pruneVars.mjs.map +0 -1
- package/dist/plugins/postcss/quoteFontFamilies.mjs.map +0 -1
- package/dist/plugins/postcss/removeDeclarations.mjs.map +0 -1
- package/dist/plugins/postcss/resolveMaizzleImports.mjs.map +0 -1
- package/dist/plugins/postcss/resolveProps.mjs.map +0 -1
- package/dist/plugins/postcss/tailwindCleanup.mjs.map +0 -1
- package/dist/prepare.mjs.map +0 -1
- package/dist/render/createRenderer.mjs.map +0 -1
- package/dist/render/index.mjs.map +0 -1
- package/dist/render/injectFonts.mjs.map +0 -1
- package/dist/render/plugins/codeBlockExtract.mjs.map +0 -1
- package/dist/render/plugins/markdownExtract.mjs.map +0 -1
- package/dist/render/plugins/rawExtract.mjs.map +0 -1
- package/dist/render/plugins/rowSourceLocation.mjs.map +0 -1
- package/dist/serve.mjs.map +0 -1
- package/dist/server/compatibility.mjs.map +0 -1
- package/dist/server/email.mjs.map +0 -1
- package/dist/server/linter.mjs.map +0 -1
- package/dist/server/sfc-utils.mjs.map +0 -1
- package/dist/transformers/addAttributes.mjs.map +0 -1
- package/dist/transformers/attributeToStyle.mjs.map +0 -1
- package/dist/transformers/base.mjs.map +0 -1
- package/dist/transformers/columnWidth.mjs.map +0 -1
- package/dist/transformers/entities.mjs.map +0 -1
- package/dist/transformers/filters/defaults.mjs.map +0 -1
- package/dist/transformers/filters/index.mjs.map +0 -1
- package/dist/transformers/format.mjs.map +0 -1
- package/dist/transformers/index.mjs +0 -87
- package/dist/transformers/index.mjs.map +0 -1
- package/dist/transformers/inlineCSS.mjs.map +0 -1
- package/dist/transformers/inlineLink.mjs.map +0 -1
- package/dist/transformers/minify.mjs.map +0 -1
- package/dist/transformers/msoWidthFromClass.d.ts +0 -19
- package/dist/transformers/msoWidthFromClass.d.ts.map +0 -1
- package/dist/transformers/msoWidthFromClass.mjs +0 -61
- package/dist/transformers/msoWidthFromClass.mjs.map +0 -1
- package/dist/transformers/purgeCSS.mjs.map +0 -1
- package/dist/transformers/removeAttributes.mjs.map +0 -1
- package/dist/transformers/replaceStrings.mjs.map +0 -1
- package/dist/transformers/safeClassNames.mjs.map +0 -1
- package/dist/transformers/shorthandCSS.mjs.map +0 -1
- package/dist/transformers/sixHex.mjs.map +0 -1
- package/dist/transformers/tailwindComponent.mjs.map +0 -1
- package/dist/transformers/tailwindcss.mjs.map +0 -1
- package/dist/transformers/urlQuery.mjs.map +0 -1
- package/dist/utils/ast/index.mjs +0 -5
- package/dist/utils/ast/parser.mjs.map +0 -1
- package/dist/utils/ast/serializer.mjs.map +0 -1
- package/dist/utils/ast/walker.mjs.map +0 -1
- package/dist/utils/compileTailwindCss.mjs.map +0 -1
- package/dist/utils/decodeStyleEntities.mjs.map +0 -1
- package/dist/utils/detect.mjs.map +0 -1
- package/dist/utils/url.mjs.map +0 -1
- /package/dist/components/{Divider.vue → Hr.vue} +0 -0
- /package/dist/types/{config.mjs → config.js} +0 -0
- /package/dist/types/{index.mjs → index.js} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/utils/cursor.ts","../src/utils/settings.ts","../src/utils/string.ts","../src/utils/index.ts","../src/prompts/prompt.ts","../src/prompts/autocomplete.ts","../src/prompts/confirm.ts","../src/prompts/date.ts","../src/prompts/group-multiselect.ts","../src/prompts/multi-select.ts","../src/prompts/password.ts","../src/prompts/select.ts","../src/prompts/select-key.ts","../src/prompts/text.ts"],"sourcesContent":["export function findCursor<T extends { disabled?: boolean }>(\n\tcursor: number,\n\tdelta: number,\n\toptions: T[]\n) {\n\tconst hasEnabledOptions = options.some((opt) => !opt.disabled);\n\tif (!hasEnabledOptions) {\n\t\treturn cursor;\n\t}\n\tconst newCursor = cursor + delta;\n\tconst maxCursor = Math.max(options.length - 1, 0);\n\tconst clampedCursor = newCursor < 0 ? maxCursor : newCursor > maxCursor ? 0 : newCursor;\n\tconst newOption = options[clampedCursor];\n\tif (newOption.disabled) {\n\t\treturn findCursor(clampedCursor, delta < 0 ? -1 : 1, options);\n\t}\n\treturn clampedCursor;\n}\n","const actions = ['up', 'down', 'left', 'right', 'space', 'enter', 'cancel'] as const;\nexport type Action = (typeof actions)[number];\n\nconst DEFAULT_MONTH_NAMES = [\n\t'January',\n\t'February',\n\t'March',\n\t'April',\n\t'May',\n\t'June',\n\t'July',\n\t'August',\n\t'September',\n\t'October',\n\t'November',\n\t'December',\n];\n\n/** Global settings for Clack programs, stored in memory */\ninterface InternalClackSettings {\n\tactions: Set<Action>;\n\taliases: Map<string, Action>;\n\tmessages: {\n\t\tcancel: string;\n\t\terror: string;\n\t};\n\twithGuide: boolean;\n\tdate: {\n\t\tmonthNames: string[];\n\t\tmessages: {\n\t\t\tinvalidMonth: string;\n\t\t\trequired: string;\n\t\t\tinvalidDay: (days: number, month: string) => string;\n\t\t\tafterMin: (min: Date) => string;\n\t\t\tbeforeMax: (max: Date) => string;\n\t\t};\n\t};\n}\n\nexport const settings: InternalClackSettings = {\n\tactions: new Set(actions),\n\taliases: new Map<string, Action>([\n\t\t// vim support\n\t\t['k', 'up'],\n\t\t['j', 'down'],\n\t\t['h', 'left'],\n\t\t['l', 'right'],\n\t\t['\\x03', 'cancel'],\n\t\t// opinionated defaults!\n\t\t['escape', 'cancel'],\n\t]),\n\tmessages: {\n\t\tcancel: 'Canceled',\n\t\terror: 'Something went wrong',\n\t},\n\twithGuide: true,\n\tdate: {\n\t\tmonthNames: [...DEFAULT_MONTH_NAMES],\n\t\tmessages: {\n\t\t\trequired: 'Please enter a valid date',\n\t\t\tinvalidMonth: 'There are only 12 months in a year',\n\t\t\tinvalidDay: (days, month) => `There are only ${days} days in ${month}`,\n\t\t\tafterMin: (min) => `Date must be on or after ${min.toISOString().slice(0, 10)}`,\n\t\t\tbeforeMax: (max) => `Date must be on or before ${max.toISOString().slice(0, 10)}`,\n\t\t},\n\t},\n};\n\nexport interface ClackSettings {\n\t/**\n\t * Set custom global aliases for the default actions.\n\t * This will not overwrite existing aliases, it will only add new ones!\n\t *\n\t * @param aliases - An object that maps aliases to actions\n\t * @default { k: 'up', j: 'down', h: 'left', l: 'right', '\\x03': 'cancel', 'escape': 'cancel' }\n\t */\n\taliases?: Record<string, Action>;\n\n\t/**\n\t * Custom messages for prompts\n\t */\n\tmessages?: {\n\t\t/**\n\t\t * Custom message to display when a spinner is cancelled\n\t\t * @default \"Canceled\"\n\t\t */\n\t\tcancel?: string;\n\t\t/**\n\t\t * Custom message to display when a spinner encounters an error\n\t\t * @default \"Something went wrong\"\n\t\t */\n\t\terror?: string;\n\t};\n\n\twithGuide?: boolean;\n\n\t/**\n\t * Date prompt localization\n\t */\n\tdate?: {\n\t\t/** Month names for validation messages (January, February, ...) */\n\t\tmonthNames?: string[];\n\t\tmessages?: {\n\t\t\t/** Shown when date is missing */\n\t\t\trequired?: string;\n\t\t\t/** Shown when month > 12 */\n\t\t\tinvalidMonth?: string;\n\t\t\t/** (days, monthName) => message for invalid day */\n\t\t\tinvalidDay?: (days: number, month: string) => string;\n\t\t\t/** (min) => message when date is before minDate */\n\t\t\tafterMin?: (min: Date) => string;\n\t\t\t/** (max) => message when date is after maxDate */\n\t\t\tbeforeMax?: (max: Date) => string;\n\t\t};\n\t};\n}\n\nexport function updateSettings(updates: ClackSettings) {\n\t// Handle each property in the updates\n\tif (updates.aliases !== undefined) {\n\t\tconst aliases = updates.aliases;\n\t\tfor (const alias in aliases) {\n\t\t\tif (!Object.hasOwn(aliases, alias)) continue;\n\n\t\t\tconst action = aliases[alias];\n\t\t\tif (!settings.actions.has(action)) continue;\n\n\t\t\tif (!settings.aliases.has(alias)) {\n\t\t\t\tsettings.aliases.set(alias, action);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (updates.messages !== undefined) {\n\t\tconst messages = updates.messages;\n\t\tif (messages.cancel !== undefined) {\n\t\t\tsettings.messages.cancel = messages.cancel;\n\t\t}\n\t\tif (messages.error !== undefined) {\n\t\t\tsettings.messages.error = messages.error;\n\t\t}\n\t}\n\n\tif (updates.withGuide !== undefined) {\n\t\tsettings.withGuide = updates.withGuide !== false;\n\t}\n\n\tif (updates.date !== undefined) {\n\t\tconst date = updates.date;\n\t\tif (date.monthNames !== undefined) {\n\t\t\tsettings.date.monthNames = [...date.monthNames];\n\t\t}\n\t\tif (date.messages !== undefined) {\n\t\t\tif (date.messages.required !== undefined) {\n\t\t\t\tsettings.date.messages.required = date.messages.required;\n\t\t\t}\n\t\t\tif (date.messages.invalidMonth !== undefined) {\n\t\t\t\tsettings.date.messages.invalidMonth = date.messages.invalidMonth;\n\t\t\t}\n\t\t\tif (date.messages.invalidDay !== undefined) {\n\t\t\t\tsettings.date.messages.invalidDay = date.messages.invalidDay;\n\t\t\t}\n\t\t\tif (date.messages.afterMin !== undefined) {\n\t\t\t\tsettings.date.messages.afterMin = date.messages.afterMin;\n\t\t\t}\n\t\t\tif (date.messages.beforeMax !== undefined) {\n\t\t\t\tsettings.date.messages.beforeMax = date.messages.beforeMax;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Check if a key is an alias for a default action\n * @param key - The raw key which might match to an action\n * @param action - The action to match\n * @returns boolean\n */\nexport function isActionKey(key: string | Array<string | undefined>, action: Action) {\n\tif (typeof key === 'string') {\n\t\treturn settings.aliases.get(key) === action;\n\t}\n\n\tfor (const value of key) {\n\t\tif (value === undefined) continue;\n\t\tif (isActionKey(value, action)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n","export function diffLines(a: string, b: string) {\n\tif (a === b) return;\n\n\tconst aLines = a.split('\\n');\n\tconst bLines = b.split('\\n');\n\tconst numLines = Math.max(aLines.length, bLines.length);\n\tconst diff: number[] = [];\n\n\tfor (let i = 0; i < numLines; i++) {\n\t\tif (aLines[i] !== bLines[i]) diff.push(i);\n\t}\n\n\treturn {\n\t\tlines: diff,\n\t\tnumLinesBefore: aLines.length,\n\t\tnumLinesAfter: bLines.length,\n\t\tnumLines,\n\t};\n}\n","import { stdin, stdout } from 'node:process';\nimport type { Key } from 'node:readline';\nimport * as readline from 'node:readline';\nimport type { Readable, Writable } from 'node:stream';\nimport { ReadStream } from 'node:tty';\nimport { wrapAnsi } from 'fast-wrap-ansi';\nimport { cursor } from 'sisteransi';\nimport { isActionKey } from './settings.js';\n\nexport * from './settings.js';\nexport * from './string.js';\n\nconst isWindows = globalThis.process.platform.startsWith('win');\n\nexport const CANCEL_SYMBOL = Symbol('clack:cancel');\n\nexport function isCancel(value: unknown): value is symbol {\n\treturn value === CANCEL_SYMBOL;\n}\n\nexport function setRawMode(input: Readable, value: boolean) {\n\tconst i = input as typeof stdin;\n\n\tif (i.isTTY) i.setRawMode(value);\n}\n\ninterface BlockOptions {\n\tinput?: Readable;\n\toutput?: Writable;\n\toverwrite?: boolean;\n\thideCursor?: boolean;\n}\n\nexport function block({\n\tinput = stdin,\n\toutput = stdout,\n\toverwrite = true,\n\thideCursor = true,\n}: BlockOptions = {}) {\n\tconst rl = readline.createInterface({\n\t\tinput,\n\t\toutput,\n\t\tprompt: '',\n\t\ttabSize: 1,\n\t});\n\treadline.emitKeypressEvents(input, rl);\n\n\tif (input instanceof ReadStream && input.isTTY) {\n\t\tinput.setRawMode(true);\n\t}\n\n\tconst clear = (data: Buffer, { name, sequence }: Key) => {\n\t\tconst str = String(data);\n\t\tif (isActionKey([str, name, sequence], 'cancel')) {\n\t\t\tif (hideCursor) output.write(cursor.show);\n\t\t\tprocess.exit(0);\n\t\t\treturn;\n\t\t}\n\t\tif (!overwrite) return;\n\t\tconst dx = name === 'return' ? 0 : -1;\n\t\tconst dy = name === 'return' ? -1 : 0;\n\n\t\treadline.moveCursor(output, dx, dy, () => {\n\t\t\treadline.clearLine(output, 1, () => {\n\t\t\t\tinput.once('keypress', clear);\n\t\t\t});\n\t\t});\n\t};\n\tif (hideCursor) output.write(cursor.hide);\n\tinput.once('keypress', clear);\n\n\treturn () => {\n\t\tinput.off('keypress', clear);\n\t\tif (hideCursor) output.write(cursor.show);\n\n\t\t// Prevent Windows specific issues: https://github.com/bombshell-dev/clack/issues/176\n\t\tif (input instanceof ReadStream && input.isTTY && !isWindows) {\n\t\t\tinput.setRawMode(false);\n\t\t}\n\n\t\t// @ts-expect-error fix for https://github.com/nodejs/node/issues/31762#issuecomment-1441223907\n\t\trl.terminal = false;\n\t\trl.close();\n\t};\n}\n\nexport const getColumns = (output: Writable): number => {\n\tif ('columns' in output && typeof output.columns === 'number') {\n\t\treturn output.columns;\n\t}\n\treturn 80;\n};\n\nexport const getRows = (output: Writable): number => {\n\tif ('rows' in output && typeof output.rows === 'number') {\n\t\treturn output.rows;\n\t}\n\treturn 20;\n};\n\nexport function wrapTextWithPrefix(\n\toutput: Writable | undefined,\n\ttext: string,\n\tprefix: string,\n\tstartPrefix: string = prefix\n): string {\n\tconst columns = getColumns(output ?? stdout);\n\tconst wrapped = wrapAnsi(text, columns - prefix.length, {\n\t\thard: true,\n\t\ttrim: false,\n\t});\n\tconst lines = wrapped\n\t\t.split('\\n')\n\t\t.map((line, index) => {\n\t\t\treturn `${index === 0 ? startPrefix : prefix}${line}`;\n\t\t})\n\t\t.join('\\n');\n\treturn lines;\n}\n","import { stdin, stdout } from 'node:process';\nimport readline, { type Key, type ReadLine } from 'node:readline';\nimport type { Readable, Writable } from 'node:stream';\nimport { wrapAnsi } from 'fast-wrap-ansi';\nimport { cursor, erase } from 'sisteransi';\nimport type { ClackEvents, ClackState } from '../types.js';\nimport type { Action } from '../utils/index.js';\nimport {\n\tCANCEL_SYMBOL,\n\tdiffLines,\n\tgetRows,\n\tisActionKey,\n\tsetRawMode,\n\tsettings,\n} from '../utils/index.js';\n\nexport interface PromptOptions<TValue, Self extends Prompt<TValue>> {\n\trender(this: Omit<Self, 'prompt'>): string | undefined;\n\tinitialValue?: any;\n\tinitialUserInput?: string;\n\tvalidate?: ((value: TValue | undefined) => string | Error | undefined) | undefined;\n\tinput?: Readable;\n\toutput?: Writable;\n\tdebug?: boolean;\n\tsignal?: AbortSignal;\n}\n\nexport default class Prompt<TValue> {\n\tprotected input: Readable;\n\tprotected output: Writable;\n\tprivate _abortSignal?: AbortSignal;\n\n\tprivate rl: ReadLine | undefined;\n\tprivate opts: Omit<PromptOptions<TValue, Prompt<TValue>>, 'render' | 'input' | 'output'>;\n\tprivate _render: (context: Omit<Prompt<TValue>, 'prompt'>) => string | undefined;\n\tprivate _track = false;\n\tprivate _prevFrame = '';\n\tprivate _subscribers = new Map<string, { cb: (...args: any) => any; once?: boolean }[]>();\n\tprotected _cursor = 0;\n\n\tpublic state: ClackState = 'initial';\n\tpublic error = '';\n\tpublic value: TValue | undefined;\n\tpublic userInput = '';\n\n\tconstructor(options: PromptOptions<TValue, Prompt<TValue>>, trackValue = true) {\n\t\tconst { input = stdin, output = stdout, render, signal, ...opts } = options;\n\n\t\tthis.opts = opts;\n\t\tthis.onKeypress = this.onKeypress.bind(this);\n\t\tthis.close = this.close.bind(this);\n\t\tthis.render = this.render.bind(this);\n\t\tthis._render = render.bind(this);\n\t\tthis._track = trackValue;\n\t\tthis._abortSignal = signal;\n\n\t\tthis.input = input;\n\t\tthis.output = output;\n\t}\n\n\t/**\n\t * Unsubscribe all listeners\n\t */\n\tprotected unsubscribe() {\n\t\tthis._subscribers.clear();\n\t}\n\n\t/**\n\t * Set a subscriber with opts\n\t * @param event - The event name\n\t */\n\tprivate setSubscriber<T extends keyof ClackEvents<TValue>>(\n\t\tevent: T,\n\t\topts: { cb: ClackEvents<TValue>[T]; once?: boolean }\n\t) {\n\t\tconst params = this._subscribers.get(event) ?? [];\n\t\tparams.push(opts);\n\t\tthis._subscribers.set(event, params);\n\t}\n\n\t/**\n\t * Subscribe to an event\n\t * @param event - The event name\n\t * @param cb - The callback\n\t */\n\tpublic on<T extends keyof ClackEvents<TValue>>(event: T, cb: ClackEvents<TValue>[T]) {\n\t\tthis.setSubscriber(event, { cb });\n\t}\n\n\t/**\n\t * Subscribe to an event once\n\t * @param event - The event name\n\t * @param cb - The callback\n\t */\n\tpublic once<T extends keyof ClackEvents<TValue>>(event: T, cb: ClackEvents<TValue>[T]) {\n\t\tthis.setSubscriber(event, { cb, once: true });\n\t}\n\n\t/**\n\t * Emit an event with data\n\t * @param event - The event name\n\t * @param data - The data to pass to the callback\n\t */\n\tpublic emit<T extends keyof ClackEvents<TValue>>(\n\t\tevent: T,\n\t\t...data: Parameters<ClackEvents<TValue>[T]>\n\t) {\n\t\tconst cbs = this._subscribers.get(event) ?? [];\n\t\tconst cleanup: (() => void)[] = [];\n\n\t\tfor (const subscriber of cbs) {\n\t\t\tsubscriber.cb(...data);\n\n\t\t\tif (subscriber.once) {\n\t\t\t\tcleanup.push(() => cbs.splice(cbs.indexOf(subscriber), 1));\n\t\t\t}\n\t\t}\n\n\t\tfor (const cb of cleanup) {\n\t\t\tcb();\n\t\t}\n\t}\n\n\tpublic prompt() {\n\t\treturn new Promise<TValue | symbol | undefined>((resolve) => {\n\t\t\tif (this._abortSignal) {\n\t\t\t\tif (this._abortSignal.aborted) {\n\t\t\t\t\tthis.state = 'cancel';\n\n\t\t\t\t\tthis.close();\n\t\t\t\t\treturn resolve(CANCEL_SYMBOL);\n\t\t\t\t}\n\n\t\t\t\tthis._abortSignal.addEventListener(\n\t\t\t\t\t'abort',\n\t\t\t\t\t() => {\n\t\t\t\t\t\tthis.state = 'cancel';\n\t\t\t\t\t\tthis.close();\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true }\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.rl = readline.createInterface({\n\t\t\t\tinput: this.input,\n\t\t\t\ttabSize: 2,\n\t\t\t\tprompt: '',\n\t\t\t\tescapeCodeTimeout: 50,\n\t\t\t\tterminal: true,\n\t\t\t});\n\t\t\tthis.rl.prompt();\n\n\t\t\tif (this.opts.initialUserInput !== undefined) {\n\t\t\t\tthis._setUserInput(this.opts.initialUserInput, true);\n\t\t\t}\n\n\t\t\tthis.input.on('keypress', this.onKeypress);\n\t\t\tsetRawMode(this.input, true);\n\t\t\tthis.output.on('resize', this.render);\n\n\t\t\tthis.render();\n\n\t\t\tthis.once('submit', () => {\n\t\t\t\tthis.output.write(cursor.show);\n\t\t\t\tthis.output.off('resize', this.render);\n\t\t\t\tsetRawMode(this.input, false);\n\t\t\t\tresolve(this.value);\n\t\t\t});\n\t\t\tthis.once('cancel', () => {\n\t\t\t\tthis.output.write(cursor.show);\n\t\t\t\tthis.output.off('resize', this.render);\n\t\t\t\tsetRawMode(this.input, false);\n\t\t\t\tresolve(CANCEL_SYMBOL);\n\t\t\t});\n\t\t});\n\t}\n\n\tprotected _isActionKey(char: string | undefined, _key: Key): boolean {\n\t\treturn char === '\\t';\n\t}\n\n\tprotected _setValue(value: TValue | undefined): void {\n\t\tthis.value = value;\n\t\tthis.emit('value', this.value);\n\t}\n\n\tprotected _setUserInput(value: string | undefined, write?: boolean): void {\n\t\tthis.userInput = value ?? '';\n\t\tthis.emit('userInput', this.userInput);\n\t\tif (write && this._track && this.rl) {\n\t\t\tthis.rl.write(this.userInput);\n\t\t\tthis._cursor = this.rl.cursor;\n\t\t}\n\t}\n\n\tprotected _clearUserInput(): void {\n\t\tthis.rl?.write(null, { ctrl: true, name: 'u' });\n\t\tthis._setUserInput('');\n\t}\n\n\tprivate onKeypress(char: string | undefined, key: Key) {\n\t\tif (this._track && key.name !== 'return') {\n\t\t\tif (key.name && this._isActionKey(char, key)) {\n\t\t\t\tthis.rl?.write(null, { ctrl: true, name: 'h' });\n\t\t\t}\n\t\t\tthis._cursor = this.rl?.cursor ?? 0;\n\t\t\tthis._setUserInput(this.rl?.line);\n\t\t}\n\n\t\tif (this.state === 'error') {\n\t\t\tthis.state = 'active';\n\t\t}\n\t\tif (key?.name) {\n\t\t\tif (!this._track && settings.aliases.has(key.name)) {\n\t\t\t\tthis.emit('cursor', settings.aliases.get(key.name));\n\t\t\t}\n\t\t\tif (settings.actions.has(key.name as Action)) {\n\t\t\t\tthis.emit('cursor', key.name as Action);\n\t\t\t}\n\t\t}\n\t\tif (char && (char.toLowerCase() === 'y' || char.toLowerCase() === 'n')) {\n\t\t\tthis.emit('confirm', char.toLowerCase() === 'y');\n\t\t}\n\n\t\t// Call the key event handler and emit the key event\n\t\tthis.emit('key', char?.toLowerCase(), key);\n\n\t\tif (key?.name === 'return') {\n\t\t\tif (this.opts.validate) {\n\t\t\t\tconst problem = this.opts.validate(this.value);\n\t\t\t\tif (problem) {\n\t\t\t\t\tthis.error = problem instanceof Error ? problem.message : problem;\n\t\t\t\t\tthis.state = 'error';\n\t\t\t\t\tthis.rl?.write(this.userInput);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.state !== 'error') {\n\t\t\t\tthis.state = 'submit';\n\t\t\t}\n\t\t}\n\n\t\tif (isActionKey([char, key?.name, key?.sequence], 'cancel')) {\n\t\t\tthis.state = 'cancel';\n\t\t}\n\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\tthis.emit('finalize');\n\t\t}\n\t\tthis.render();\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\tprotected close() {\n\t\tthis.input.unpipe();\n\t\tthis.input.removeListener('keypress', this.onKeypress);\n\t\tthis.output.write('\\n');\n\t\tsetRawMode(this.input, false);\n\t\tthis.rl?.close();\n\t\tthis.rl = undefined;\n\t\tthis.emit(`${this.state}`, this.value);\n\t\tthis.unsubscribe();\n\t}\n\n\tprivate restoreCursor() {\n\t\tconst lines =\n\t\t\twrapAnsi(this._prevFrame, process.stdout.columns, { hard: true, trim: false }).split('\\n')\n\t\t\t\t.length - 1;\n\t\tthis.output.write(cursor.move(-999, lines * -1));\n\t}\n\n\tprivate render() {\n\t\tconst frame = wrapAnsi(this._render(this) ?? '', process.stdout.columns, {\n\t\t\thard: true,\n\t\t\ttrim: false,\n\t\t});\n\t\tif (frame === this._prevFrame) return;\n\n\t\tif (this.state === 'initial') {\n\t\t\tthis.output.write(cursor.hide);\n\t\t} else {\n\t\t\tconst diff = diffLines(this._prevFrame, frame);\n\t\t\tconst rows = getRows(this.output);\n\t\t\tthis.restoreCursor();\n\t\t\tif (diff) {\n\t\t\t\tconst diffOffsetAfter = Math.max(0, diff.numLinesAfter - rows);\n\t\t\t\tconst diffOffsetBefore = Math.max(0, diff.numLinesBefore - rows);\n\t\t\t\tlet diffLine = diff.lines.find((line) => line >= diffOffsetAfter);\n\n\t\t\t\tif (diffLine === undefined) {\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// If a single line has changed, only update that line\n\t\t\t\tif (diff.lines.length === 1) {\n\t\t\t\t\tthis.output.write(cursor.move(0, diffLine - diffOffsetBefore));\n\t\t\t\t\tthis.output.write(erase.lines(1));\n\t\t\t\t\tconst lines = frame.split('\\n');\n\t\t\t\t\tthis.output.write(lines[diffLine]);\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\tthis.output.write(cursor.move(0, lines.length - diffLine - 1));\n\t\t\t\t\treturn;\n\t\t\t\t\t// If many lines have changed, rerender everything past the first line\n\t\t\t\t} else if (diff.lines.length > 1) {\n\t\t\t\t\tif (diffOffsetAfter < diffOffsetBefore) {\n\t\t\t\t\t\tdiffLine = diffOffsetAfter;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst adjustedDiffLine = diffLine - diffOffsetBefore;\n\t\t\t\t\t\tif (adjustedDiffLine > 0) {\n\t\t\t\t\t\t\tthis.output.write(cursor.move(0, adjustedDiffLine));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.output.write(erase.down());\n\t\t\t\t\tconst lines = frame.split('\\n');\n\t\t\t\t\tconst newLines = lines.slice(diffLine);\n\t\t\t\t\tthis.output.write(newLines.join('\\n'));\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.output.write(erase.down());\n\t\t}\n\n\t\tthis.output.write(frame);\n\t\tif (this.state === 'initial') {\n\t\t\tthis.state = 'active';\n\t\t}\n\t\tthis._prevFrame = frame;\n\t}\n}\n","import type { Key } from 'node:readline';\nimport { styleText } from 'node:util';\nimport { findCursor } from '../utils/cursor.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\ninterface OptionLike {\n\tvalue: unknown;\n\tlabel?: string;\n\tdisabled?: boolean;\n}\n\ntype FilterFunction<T extends OptionLike> = (search: string, opt: T) => boolean;\n\nfunction getCursorForValue<T extends OptionLike>(\n\tselected: T['value'] | undefined,\n\titems: T[]\n): number {\n\tif (selected === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst currLength = items.length;\n\n\t// If filtering changed the available options, update cursor\n\tif (currLength === 0) {\n\t\treturn 0;\n\t}\n\n\t// Try to maintain the same selected item\n\tconst index = items.findIndex((item) => item.value === selected);\n\treturn index !== -1 ? index : 0;\n}\n\nfunction defaultFilter<T extends OptionLike>(input: string, option: T): boolean {\n\tconst label = option.label ?? String(option.value);\n\treturn label.toLowerCase().includes(input.toLowerCase());\n}\n\nfunction normalisedValue<T>(multiple: boolean, values: T[] | undefined): T | T[] | undefined {\n\tif (!values) {\n\t\treturn undefined;\n\t}\n\tif (multiple) {\n\t\treturn values;\n\t}\n\treturn values[0];\n}\n\nexport interface AutocompleteOptions<T extends OptionLike>\n\textends PromptOptions<T['value'] | T['value'][], AutocompletePrompt<T>> {\n\toptions: T[] | ((this: AutocompletePrompt<T>) => T[]);\n\tfilter?: FilterFunction<T>;\n\tmultiple?: boolean;\n\t/**\n\t * When set (non-empty), pressing Tab with no input fills the field with this value\n\t * and runs the normal filter/selection logic so the user can confirm with Enter.\n\t * Tab only fills the input when the placeholder matches at least one option under\n\t * the prompt's filter (so the value remains selectable).\n\t */\n\tplaceholder?: string;\n}\n\nexport default class AutocompletePrompt<T extends OptionLike> extends Prompt<\n\tT['value'] | T['value'][]\n> {\n\tfilteredOptions: T[];\n\tmultiple: boolean;\n\tisNavigating = false;\n\tselectedValues: Array<T['value']> = [];\n\n\tfocusedValue: T['value'] | undefined;\n\t#cursor = 0;\n\t#lastUserInput = '';\n\t#filterFn: FilterFunction<T> | undefined;\n\t#options: T[] | (() => T[]);\n\t#placeholder: string | undefined;\n\n\tget cursor(): number {\n\t\treturn this.#cursor;\n\t}\n\n\tget userInputWithCursor() {\n\t\tif (!this.userInput) {\n\t\t\treturn styleText(['inverse', 'hidden'], '_');\n\t\t}\n\t\tif (this._cursor >= this.userInput.length) {\n\t\t\treturn `${this.userInput}█`;\n\t\t}\n\t\tconst s1 = this.userInput.slice(0, this._cursor);\n\t\tconst [s2, ...s3] = this.userInput.slice(this._cursor);\n\t\treturn `${s1}${styleText('inverse', s2)}${s3.join('')}`;\n\t}\n\n\tget options(): T[] {\n\t\tif (typeof this.#options === 'function') {\n\t\t\treturn this.#options();\n\t\t}\n\t\treturn this.#options;\n\t}\n\n\tconstructor(opts: AutocompleteOptions<T>) {\n\t\tsuper(opts);\n\n\t\tthis.#options = opts.options;\n\t\tthis.#placeholder = opts.placeholder;\n\t\tconst options = this.options;\n\t\tthis.filteredOptions = [...options];\n\t\tthis.multiple = opts.multiple === true;\n\t\tthis.#filterFn =\n\t\t\ttypeof opts.options === 'function' ? opts.filter : (opts.filter ?? defaultFilter);\n\t\tlet initialValues: unknown[] | undefined;\n\t\tif (opts.initialValue && Array.isArray(opts.initialValue)) {\n\t\t\tif (this.multiple) {\n\t\t\t\tinitialValues = opts.initialValue;\n\t\t\t} else {\n\t\t\t\tinitialValues = opts.initialValue.slice(0, 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif (!this.multiple && this.options.length > 0) {\n\t\t\t\tinitialValues = [this.options[0].value];\n\t\t\t}\n\t\t}\n\n\t\tif (initialValues) {\n\t\t\tfor (const selectedValue of initialValues) {\n\t\t\t\tconst selectedIndex = options.findIndex((opt) => opt.value === selectedValue);\n\t\t\t\tif (selectedIndex !== -1) {\n\t\t\t\t\tthis.toggleSelected(selectedValue);\n\t\t\t\t\tthis.#cursor = selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.focusedValue = this.options[this.#cursor]?.value;\n\n\t\tthis.on('key', (char, key) => this.#onKey(char, key));\n\t\tthis.on('userInput', (value) => this.#onUserInputChanged(value));\n\t}\n\n\tprotected override _isActionKey(char: string | undefined, key: Key): boolean {\n\t\treturn (\n\t\t\tchar === '\\t' ||\n\t\t\t(this.multiple &&\n\t\t\t\tthis.isNavigating &&\n\t\t\t\tkey.name === 'space' &&\n\t\t\t\tchar !== undefined &&\n\t\t\t\tchar !== '')\n\t\t);\n\t}\n\n\t#onKey(_char: string | undefined, key: Key): void {\n\t\tconst isUpKey = key.name === 'up';\n\t\tconst isDownKey = key.name === 'down';\n\t\tconst isReturnKey = key.name === 'return';\n\n\t\t// Tab with empty input and placeholder: fill input with placeholder to trigger autocomplete\n\t\t// Only when the placeholder matches at least one (non-disabled) option so the value remains selectable\n\t\tconst isEmptyOrOnlyTab = this.userInput === '' || this.userInput === '\\t';\n\t\tconst placeholder = this.#placeholder;\n\t\tconst options = this.options;\n\t\tconst placeholderMatchesOption =\n\t\t\tplaceholder !== undefined &&\n\t\t\tplaceholder !== '' &&\n\t\t\toptions.some(\n\t\t\t\t(opt) => !opt.disabled && (this.#filterFn ? this.#filterFn(placeholder, opt) : true)\n\t\t\t);\n\t\tif (key.name === 'tab' && isEmptyOrOnlyTab && placeholderMatchesOption) {\n\t\t\tif (this.userInput === '\\t') {\n\t\t\t\tthis._clearUserInput();\n\t\t\t}\n\t\t\tthis._setUserInput(placeholder, true);\n\t\t\tthis.isNavigating = false;\n\t\t\treturn;\n\t\t}\n\n\t\t// Start navigation mode with up/down arrows\n\t\tif (isUpKey || isDownKey) {\n\t\t\tthis.#cursor = findCursor(this.#cursor, isUpKey ? -1 : 1, this.filteredOptions);\n\t\t\tthis.focusedValue = this.filteredOptions[this.#cursor]?.value;\n\t\t\tif (!this.multiple) {\n\t\t\t\tthis.selectedValues = [this.focusedValue];\n\t\t\t}\n\t\t\tthis.isNavigating = true;\n\t\t} else if (isReturnKey) {\n\t\t\tthis.value = normalisedValue(this.multiple, this.selectedValues);\n\t\t} else {\n\t\t\tif (this.multiple) {\n\t\t\t\tif (\n\t\t\t\t\tthis.focusedValue !== undefined &&\n\t\t\t\t\t(key.name === 'tab' || (this.isNavigating && key.name === 'space'))\n\t\t\t\t) {\n\t\t\t\t\tthis.toggleSelected(this.focusedValue);\n\t\t\t\t} else {\n\t\t\t\t\tthis.isNavigating = false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.focusedValue) {\n\t\t\t\t\tthis.selectedValues = [this.focusedValue];\n\t\t\t\t}\n\t\t\t\tthis.isNavigating = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tdeselectAll() {\n\t\tthis.selectedValues = [];\n\t}\n\n\ttoggleSelected(value: T['value']) {\n\t\tif (this.filteredOptions.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.multiple) {\n\t\t\tif (this.selectedValues.includes(value)) {\n\t\t\t\tthis.selectedValues = this.selectedValues.filter((v) => v !== value);\n\t\t\t} else {\n\t\t\t\tthis.selectedValues = [...this.selectedValues, value];\n\t\t\t}\n\t\t} else {\n\t\t\tthis.selectedValues = [value];\n\t\t}\n\t}\n\n\t#onUserInputChanged(value: string): void {\n\t\tif (value !== this.#lastUserInput) {\n\t\t\tthis.#lastUserInput = value;\n\n\t\t\tconst options = this.options;\n\n\t\t\tif (value && this.#filterFn) {\n\t\t\t\tthis.filteredOptions = options.filter((opt) => this.#filterFn?.(value, opt));\n\t\t\t} else {\n\t\t\t\tthis.filteredOptions = [...options];\n\t\t\t}\n\t\t\tconst valueCursor = getCursorForValue(this.focusedValue, this.filteredOptions);\n\t\t\tthis.#cursor = findCursor(valueCursor, 0, this.filteredOptions);\n\t\t\tconst focusedOption = this.filteredOptions[this.#cursor];\n\t\t\tif (focusedOption && !focusedOption.disabled) {\n\t\t\t\tthis.focusedValue = focusedOption.value;\n\t\t\t} else {\n\t\t\t\tthis.focusedValue = undefined;\n\t\t\t}\n\t\t\tif (!this.multiple) {\n\t\t\t\tif (this.focusedValue !== undefined) {\n\t\t\t\t\tthis.toggleSelected(this.focusedValue);\n\t\t\t\t} else {\n\t\t\t\t\tthis.deselectAll();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import { cursor } from 'sisteransi';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface ConfirmOptions extends PromptOptions<boolean, ConfirmPrompt> {\n\tactive: string;\n\tinactive: string;\n\tinitialValue?: boolean;\n}\n\nexport default class ConfirmPrompt extends Prompt<boolean> {\n\tget cursor() {\n\t\treturn this.value ? 0 : 1;\n\t}\n\n\tprivate get _value() {\n\t\treturn this.cursor === 0;\n\t}\n\n\tconstructor(opts: ConfirmOptions) {\n\t\tsuper(opts, false);\n\t\tthis.value = !!opts.initialValue;\n\n\t\tthis.on('userInput', () => {\n\t\t\tthis.value = this._value;\n\t\t});\n\n\t\tthis.on('confirm', (confirm) => {\n\t\t\tthis.output.write(cursor.move(0, -1));\n\t\t\tthis.value = confirm;\n\t\t\tthis.state = 'submit';\n\t\t\tthis.close();\n\t\t});\n\n\t\tthis.on('cursor', () => {\n\t\t\tthis.value = !this.value;\n\t\t});\n\t}\n}\n","import type { Key } from 'node:readline';\nimport { settings } from '../utils/settings.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\ninterface SegmentConfig {\n\ttype: 'year' | 'month' | 'day';\n\tlen: number;\n}\n\nexport interface DateParts {\n\tyear: string;\n\tmonth: string;\n\tday: string;\n}\n\nexport type DateFormat = 'YMD' | 'MDY' | 'DMY';\n\nconst SEGMENTS: Record<string, SegmentConfig> = {\n\tY: { type: 'year', len: 4 },\n\tM: { type: 'month', len: 2 },\n\tD: { type: 'day', len: 2 },\n} as const;\n\nfunction segmentsFor(fmt: DateFormat): SegmentConfig[] {\n\treturn [...fmt].map((c) => SEGMENTS[c as keyof typeof SEGMENTS]);\n}\n\nfunction detectLocaleFormat(locale?: string): { segments: SegmentConfig[]; separator: string } {\n\tconst fmt = new Intl.DateTimeFormat(locale, {\n\t\tyear: 'numeric',\n\t\tmonth: '2-digit',\n\t\tday: '2-digit',\n\t});\n\tconst parts = fmt.formatToParts(new Date(2000, 0, 15));\n\tconst segments: SegmentConfig[] = [];\n\tlet separator = '/';\n\tfor (const p of parts) {\n\t\tif (p.type === 'literal') {\n\t\t\tseparator = p.value.trim() || p.value;\n\t\t} else if (p.type === 'year' || p.type === 'month' || p.type === 'day') {\n\t\t\tsegments.push({ type: p.type, len: p.type === 'year' ? 4 : 2 });\n\t\t}\n\t}\n\treturn { segments, separator };\n}\n\n/** Parse string segment values to numbers, treating blanks as 0 */\nfunction parseSegmentToNum(s: string): number {\n\treturn Number.parseInt((s || '0').replace(/_/g, '0'), 10) || 0;\n}\n\nfunction parse(parts: DateParts): { year: number; month: number; day: number } {\n\treturn {\n\t\tyear: parseSegmentToNum(parts.year),\n\t\tmonth: parseSegmentToNum(parts.month),\n\t\tday: parseSegmentToNum(parts.day),\n\t};\n}\n\nfunction daysInMonth(year: number, month: number): number {\n\treturn new Date(year || 2001, month || 1, 0).getDate();\n}\n\n/** Validate and return calendar parts, or undefined if invalid */\nfunction validParts(parts: DateParts): { year: number; month: number; day: number } | undefined {\n\tconst { year, month, day } = parse(parts);\n\tif (!year || year < 0 || year > 9999) return undefined;\n\tif (!month || month < 1 || month > 12) return undefined;\n\tif (!day || day < 1) return undefined;\n\tconst d = new Date(Date.UTC(year, month - 1, day));\n\tif (d.getUTCFullYear() !== year || d.getUTCMonth() !== month - 1 || d.getUTCDate() !== day)\n\t\treturn undefined;\n\treturn { year, month, day };\n}\n\nfunction toDate(parts: DateParts): Date | undefined {\n\tconst p = validParts(parts);\n\treturn p ? new Date(Date.UTC(p.year, p.month - 1, p.day)) : undefined;\n}\n\nfunction segmentBounds(\n\ttype: 'year' | 'month' | 'day',\n\tctx: { year: number; month: number },\n\tminDate: Date | undefined,\n\tmaxDate: Date | undefined\n): { min: number; max: number } {\n\tconst minP = minDate\n\t\t? {\n\t\t\t\tyear: minDate.getUTCFullYear(),\n\t\t\t\tmonth: minDate.getUTCMonth() + 1,\n\t\t\t\tday: minDate.getUTCDate(),\n\t\t\t}\n\t\t: null;\n\tconst maxP = maxDate\n\t\t? {\n\t\t\t\tyear: maxDate.getUTCFullYear(),\n\t\t\t\tmonth: maxDate.getUTCMonth() + 1,\n\t\t\t\tday: maxDate.getUTCDate(),\n\t\t\t}\n\t\t: null;\n\n\tif (type === 'year') {\n\t\treturn { min: minP?.year ?? 1, max: maxP?.year ?? 9999 };\n\t}\n\tif (type === 'month') {\n\t\treturn {\n\t\t\tmin: minP && ctx.year === minP.year ? minP.month : 1,\n\t\t\tmax: maxP && ctx.year === maxP.year ? maxP.month : 12,\n\t\t};\n\t}\n\treturn {\n\t\tmin: minP && ctx.year === minP.year && ctx.month === minP.month ? minP.day : 1,\n\t\tmax:\n\t\t\tmaxP && ctx.year === maxP.year && ctx.month === maxP.month\n\t\t\t\t? maxP.day\n\t\t\t\t: daysInMonth(ctx.year, ctx.month),\n\t};\n}\n\nexport interface DateOptions extends PromptOptions<Date, DatePrompt> {\n\tformat?: DateFormat;\n\tlocale?: string;\n\tseparator?: string;\n\tdefaultValue?: Date;\n\tinitialValue?: Date;\n\tminDate?: Date;\n\tmaxDate?: Date;\n}\n\nexport default class DatePrompt extends Prompt<Date> {\n\t#segments: SegmentConfig[];\n\t#separator: string;\n\t#segmentValues: DateParts;\n\t#minDate: Date | undefined;\n\t#maxDate: Date | undefined;\n\t#cursor = { segmentIndex: 0, positionInSegment: 0 };\n\t#segmentSelected = true;\n\t#pendingTensDigit: string | null = null;\n\n\tinlineError = '';\n\n\tget segmentCursor() {\n\t\treturn { ...this.#cursor };\n\t}\n\n\tget segmentValues(): DateParts {\n\t\treturn { ...this.#segmentValues };\n\t}\n\n\tget segments(): readonly SegmentConfig[] {\n\t\treturn this.#segments;\n\t}\n\n\tget separator(): string {\n\t\treturn this.#separator;\n\t}\n\n\tget formattedValue(): string {\n\t\treturn this.#format(this.#segmentValues);\n\t}\n\n\t#format(parts: DateParts): string {\n\t\treturn this.#segments.map((s) => parts[s.type]).join(this.#separator);\n\t}\n\n\t#refresh() {\n\t\tthis._setUserInput(this.#format(this.#segmentValues));\n\t\tthis._setValue(toDate(this.#segmentValues) ?? undefined);\n\t}\n\n\tconstructor(opts: DateOptions) {\n\t\tconst detected = opts.format\n\t\t\t? { segments: segmentsFor(opts.format), separator: opts.separator ?? '/' }\n\t\t\t: detectLocaleFormat(opts.locale);\n\t\tconst sep = opts.separator ?? detected.separator;\n\t\tconst segments = opts.format ? segmentsFor(opts.format) : detected.segments;\n\n\t\tconst initialDate = opts.initialValue ?? opts.defaultValue;\n\t\tconst segmentValues: DateParts = initialDate\n\t\t\t? {\n\t\t\t\t\tyear: String(initialDate.getUTCFullYear()).padStart(4, '0'),\n\t\t\t\t\tmonth: String(initialDate.getUTCMonth() + 1).padStart(2, '0'),\n\t\t\t\t\tday: String(initialDate.getUTCDate()).padStart(2, '0'),\n\t\t\t\t}\n\t\t\t: { year: '____', month: '__', day: '__' };\n\n\t\tconst initialDisplay = segments.map((s) => segmentValues[s.type]).join(sep);\n\n\t\tsuper({ ...opts, initialUserInput: initialDisplay }, false);\n\t\tthis.#segments = segments;\n\t\tthis.#separator = sep;\n\t\tthis.#segmentValues = segmentValues;\n\t\tthis.#minDate = opts.minDate;\n\t\tthis.#maxDate = opts.maxDate;\n\t\tthis.#refresh();\n\n\t\tthis.on('cursor', (key) => this.#onCursor(key));\n\t\tthis.on('key', (char, key) => this.#onKey(char, key));\n\t\tthis.on('finalize', () => this.#onFinalize(opts));\n\t}\n\n\t#seg(): { segment: SegmentConfig; index: number } | undefined {\n\t\tconst index = Math.max(0, Math.min(this.#cursor.segmentIndex, this.#segments.length - 1));\n\t\tconst segment = this.#segments[index];\n\t\tif (!segment) return undefined;\n\t\tthis.#cursor.positionInSegment = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.#cursor.positionInSegment, segment.len - 1)\n\t\t);\n\t\treturn { segment, index };\n\t}\n\n\t#navigate(direction: 1 | -1) {\n\t\tthis.inlineError = '';\n\t\tthis.#pendingTensDigit = null;\n\t\tconst ctx = this.#seg();\n\t\tif (!ctx) return;\n\t\tthis.#cursor.segmentIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.#segments.length - 1, ctx.index + direction)\n\t\t);\n\t\tthis.#cursor.positionInSegment = 0;\n\t\tthis.#segmentSelected = true;\n\t}\n\n\t#adjust(direction: 1 | -1) {\n\t\tconst ctx = this.#seg();\n\t\tif (!ctx) return;\n\t\tconst { segment } = ctx;\n\t\tconst raw = this.#segmentValues[segment.type];\n\t\tconst isBlank = !raw || raw.replace(/_/g, '') === '';\n\t\tconst num = Number.parseInt((raw || '0').replace(/_/g, '0'), 10) || 0;\n\t\tconst bounds = segmentBounds(\n\t\t\tsegment.type,\n\t\t\tparse(this.#segmentValues),\n\t\t\tthis.#minDate,\n\t\t\tthis.#maxDate\n\t\t);\n\n\t\tlet next: number;\n\t\tif (isBlank) {\n\t\t\tnext = direction === 1 ? bounds.min : bounds.max;\n\t\t} else {\n\t\t\tnext = Math.max(Math.min(bounds.max, num + direction), bounds.min);\n\t\t}\n\n\t\tthis.#segmentValues = {\n\t\t\t...this.#segmentValues,\n\t\t\t[segment.type]: next.toString().padStart(segment.len, '0'),\n\t\t};\n\t\tthis.#segmentSelected = true;\n\t\tthis.#pendingTensDigit = null;\n\t\tthis.#refresh();\n\t}\n\n\t#onCursor(key?: string) {\n\t\tif (!key) return;\n\t\tswitch (key) {\n\t\t\tcase 'right':\n\t\t\t\treturn this.#navigate(1);\n\t\t\tcase 'left':\n\t\t\t\treturn this.#navigate(-1);\n\t\t\tcase 'up':\n\t\t\t\treturn this.#adjust(1);\n\t\t\tcase 'down':\n\t\t\t\treturn this.#adjust(-1);\n\t\t}\n\t}\n\n\t#onKey(char: string | undefined, key: Key) {\n\t\t// Backspace\n\t\tconst isBackspace =\n\t\t\tkey?.name === 'backspace' ||\n\t\t\tkey?.sequence === '\\x7f' ||\n\t\t\tkey?.sequence === '\\b' ||\n\t\t\tchar === '\\x7f' ||\n\t\t\tchar === '\\b';\n\t\tif (isBackspace) {\n\t\t\tthis.inlineError = '';\n\t\t\tconst ctx = this.#seg();\n\t\t\tif (!ctx) return;\n\t\t\tif (!this.#segmentValues[ctx.segment.type].replace(/_/g, '')) {\n\t\t\t\tthis.#navigate(-1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#segmentValues[ctx.segment.type] = '_'.repeat(ctx.segment.len);\n\t\t\tthis.#segmentSelected = true;\n\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\tthis.#refresh();\n\t\t\treturn;\n\t\t}\n\n\t\t// Tab navigation\n\t\tif (key?.name === 'tab') {\n\t\t\tthis.inlineError = '';\n\t\t\tconst ctx = this.#seg();\n\t\t\tif (!ctx) return;\n\t\t\tconst dir = key.shift ? -1 : 1;\n\t\t\tconst next = ctx.index + dir;\n\t\t\tif (next >= 0 && next < this.#segments.length) {\n\t\t\t\tthis.#cursor.segmentIndex = next;\n\t\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\t\tthis.#segmentSelected = true;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Digit input\n\t\tif (char && /^[0-9]$/.test(char)) {\n\t\t\tconst ctx = this.#seg();\n\t\t\tif (!ctx) return;\n\t\t\tconst { segment } = ctx;\n\t\t\tconst isBlank = !this.#segmentValues[segment.type].replace(/_/g, '');\n\n\t\t\t// Pending tens digit: complete the two-digit entry\n\t\t\tif (this.#segmentSelected && this.#pendingTensDigit !== null && !isBlank) {\n\t\t\t\tconst newVal = this.#pendingTensDigit + char;\n\t\t\t\tconst newParts = { ...this.#segmentValues, [segment.type]: newVal };\n\t\t\t\tconst err = this.#validateSegment(newParts, segment);\n\t\t\t\tif (err) {\n\t\t\t\t\tthis.inlineError = err;\n\t\t\t\t\tthis.#pendingTensDigit = null;\n\t\t\t\t\tthis.#segmentSelected = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.inlineError = '';\n\t\t\t\tthis.#segmentValues[segment.type] = newVal;\n\t\t\t\tthis.#pendingTensDigit = null;\n\t\t\t\tthis.#segmentSelected = false;\n\t\t\t\tthis.#refresh();\n\t\t\t\tif (ctx.index < this.#segments.length - 1) {\n\t\t\t\t\tthis.#cursor.segmentIndex = ctx.index + 1;\n\t\t\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\t\t\tthis.#segmentSelected = true;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Clear-on-type: typing into a selected filled segment clears it first\n\t\t\tif (this.#segmentSelected && !isBlank) {\n\t\t\t\tthis.#segmentValues[segment.type] = '_'.repeat(segment.len);\n\t\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\t}\n\t\t\tthis.#segmentSelected = false;\n\t\t\tthis.#pendingTensDigit = null;\n\n\t\t\tconst display = this.#segmentValues[segment.type];\n\t\t\tconst firstBlank = display.indexOf('_');\n\t\t\tconst pos =\n\t\t\t\tfirstBlank >= 0 ? firstBlank : Math.min(this.#cursor.positionInSegment, segment.len - 1);\n\t\t\tif (pos < 0 || pos >= segment.len) return;\n\n\t\t\tlet newVal = display.slice(0, pos) + char + display.slice(pos + 1);\n\n\t\t\t// Smart digit placement\n\t\t\tlet shouldStaySelected = false;\n\t\t\tif (pos === 0 && display === '__' && (segment.type === 'month' || segment.type === 'day')) {\n\t\t\t\tconst digit = Number.parseInt(char, 10);\n\t\t\t\tnewVal = `0${char}`;\n\t\t\t\tshouldStaySelected = digit <= (segment.type === 'month' ? 1 : 2);\n\t\t\t}\n\t\t\tif (segment.type === 'year') {\n\t\t\t\tconst digits = display.replace(/_/g, '');\n\t\t\t\tnewVal = (digits + char).padStart(segment.len, '_');\n\t\t\t}\n\n\t\t\tif (!newVal.includes('_')) {\n\t\t\t\tconst newParts = { ...this.#segmentValues, [segment.type]: newVal };\n\t\t\t\tconst err = this.#validateSegment(newParts, segment);\n\t\t\t\tif (err) {\n\t\t\t\t\tthis.inlineError = err;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.inlineError = '';\n\n\t\t\tthis.#segmentValues[segment.type] = newVal;\n\n\t\t\t// Clamp only when the current segment is fully entered\n\t\t\tconst parsed = !newVal.includes('_') ? validParts(this.#segmentValues) : undefined;\n\t\t\tif (parsed) {\n\t\t\t\tconst { year, month } = parsed;\n\t\t\t\tconst maxDay = daysInMonth(year, month);\n\t\t\t\tthis.#segmentValues = {\n\t\t\t\t\tyear: String(Math.max(0, Math.min(9999, year))).padStart(4, '0'),\n\t\t\t\t\tmonth: String(Math.max(1, Math.min(12, month))).padStart(2, '0'),\n\t\t\t\t\tday: String(Math.max(1, Math.min(maxDay, parsed.day))).padStart(2, '0'),\n\t\t\t\t};\n\t\t\t}\n\t\t\tthis.#refresh();\n\n\t\t\t// Advance cursor\n\t\t\tconst nextBlank = newVal.indexOf('_');\n\t\t\tif (shouldStaySelected) {\n\t\t\t\tthis.#segmentSelected = true;\n\t\t\t\tthis.#pendingTensDigit = char;\n\t\t\t} else if (nextBlank >= 0) {\n\t\t\t\tthis.#cursor.positionInSegment = nextBlank;\n\t\t\t} else if (firstBlank >= 0 && ctx.index < this.#segments.length - 1) {\n\t\t\t\tthis.#cursor.segmentIndex = ctx.index + 1;\n\t\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\t\tthis.#segmentSelected = true;\n\t\t\t} else {\n\t\t\t\tthis.#cursor.positionInSegment = Math.min(pos + 1, segment.len - 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t#validateSegment(parts: DateParts, seg: SegmentConfig): string | undefined {\n\t\tconst { month, day } = parse(parts);\n\t\tif (seg.type === 'month' && (month < 0 || month > 12)) {\n\t\t\treturn settings.date.messages.invalidMonth;\n\t\t}\n\t\tif (seg.type === 'day' && (day < 0 || day > 31)) {\n\t\t\treturn settings.date.messages.invalidDay(31, 'any month');\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t#onFinalize(opts: DateOptions) {\n\t\tconst { year, month, day } = parse(this.#segmentValues);\n\t\tif (year && month && day) {\n\t\t\tconst maxDay = daysInMonth(year, month);\n\t\t\tthis.#segmentValues = {\n\t\t\t\t...this.#segmentValues,\n\t\t\t\tday: String(Math.min(day, maxDay)).padStart(2, '0'),\n\t\t\t};\n\t\t}\n\t\tthis.value = toDate(this.#segmentValues) ?? opts.defaultValue ?? undefined;\n\t}\n}\n","import Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface GroupMultiSelectOptions<T extends { value: any }>\n\textends PromptOptions<T['value'][], GroupMultiSelectPrompt<T>> {\n\toptions: Record<string, T[]>;\n\tinitialValues?: T['value'][];\n\trequired?: boolean;\n\tcursorAt?: T['value'];\n\tselectableGroups?: boolean;\n}\nexport default class GroupMultiSelectPrompt<T extends { value: any }> extends Prompt<T['value'][]> {\n\toptions: (T & { group: string | boolean })[];\n\tcursor = 0;\n\t#selectableGroups: boolean;\n\n\tgetGroupItems(group: string): T[] {\n\t\treturn this.options.filter((o) => o.group === group);\n\t}\n\n\tisGroupSelected(group: string) {\n\t\tconst items = this.getGroupItems(group);\n\t\tconst value = this.value;\n\t\tif (value === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\treturn items.every((i) => value.includes(i.value));\n\t}\n\n\tprivate toggleValue() {\n\t\tconst item = this.options[this.cursor];\n\t\tif (this.value === undefined) {\n\t\t\tthis.value = [];\n\t\t}\n\t\tif (item.group === true) {\n\t\t\tconst group = item.value;\n\t\t\tconst groupedItems = this.getGroupItems(group);\n\t\t\tif (this.isGroupSelected(group)) {\n\t\t\t\tthis.value = this.value.filter(\n\t\t\t\t\t(v: string) => groupedItems.findIndex((i) => i.value === v) === -1\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.value = [...this.value, ...groupedItems.map((i) => i.value)];\n\t\t\t}\n\t\t\tthis.value = Array.from(new Set(this.value));\n\t\t} else {\n\t\t\tconst selected = this.value.includes(item.value);\n\t\t\tthis.value = selected\n\t\t\t\t? this.value.filter((v: T['value']) => v !== item.value)\n\t\t\t\t: [...this.value, item.value];\n\t\t}\n\t}\n\n\tconstructor(opts: GroupMultiSelectOptions<T>) {\n\t\tsuper(opts, false);\n\t\tconst { options } = opts;\n\t\tthis.#selectableGroups = opts.selectableGroups !== false;\n\t\tthis.options = Object.entries(options).flatMap(([key, option]) => [\n\t\t\t{ value: key, group: true, label: key },\n\t\t\t...option.map((opt) => ({ ...opt, group: key })),\n\t\t]) as any;\n\t\tthis.value = [...(opts.initialValues ?? [])];\n\t\tthis.cursor = Math.max(\n\t\t\tthis.options.findIndex(({ value }) => value === opts.cursorAt),\n\t\t\tthis.#selectableGroups ? 0 : 1\n\t\t);\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up': {\n\t\t\t\t\tthis.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n\t\t\t\t\tconst currentIsGroup = this.options[this.cursor]?.group === true;\n\t\t\t\t\tif (!this.#selectableGroups && currentIsGroup) {\n\t\t\t\t\t\tthis.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right': {\n\t\t\t\t\tthis.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n\t\t\t\t\tconst currentIsGroup = this.options[this.cursor]?.group === true;\n\t\t\t\t\tif (!this.#selectableGroups && currentIsGroup) {\n\t\t\t\t\t\tthis.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'space':\n\t\t\t\t\tthis.toggleValue();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n}\n","import { findCursor } from '../utils/cursor.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\ninterface OptionLike {\n\tvalue: any;\n\tdisabled?: boolean;\n}\n\nexport interface MultiSelectOptions<T extends OptionLike>\n\textends PromptOptions<T['value'][], MultiSelectPrompt<T>> {\n\toptions: T[];\n\tinitialValues?: T['value'][];\n\trequired?: boolean;\n\tcursorAt?: T['value'];\n}\nexport default class MultiSelectPrompt<T extends OptionLike> extends Prompt<T['value'][]> {\n\toptions: T[];\n\tcursor = 0;\n\n\tprivate get _value(): T['value'] {\n\t\treturn this.options[this.cursor].value;\n\t}\n\n\tprivate get _enabledOptions(): T[] {\n\t\treturn this.options.filter((option) => option.disabled !== true);\n\t}\n\n\tprivate toggleAll() {\n\t\tconst enabledOptions = this._enabledOptions;\n\t\tconst allSelected = this.value !== undefined && this.value.length === enabledOptions.length;\n\t\tthis.value = allSelected ? [] : enabledOptions.map((v) => v.value);\n\t}\n\n\tprivate toggleInvert() {\n\t\tconst value = this.value;\n\t\tif (!value) {\n\t\t\treturn;\n\t\t}\n\t\tconst notSelected = this._enabledOptions.filter((v) => !value.includes(v.value));\n\t\tthis.value = notSelected.map((v) => v.value);\n\t}\n\n\tprivate toggleValue() {\n\t\tif (this.value === undefined) {\n\t\t\tthis.value = [];\n\t\t}\n\t\tconst selected = this.value.includes(this._value);\n\t\tthis.value = selected\n\t\t\t? this.value.filter((value) => value !== this._value)\n\t\t\t: [...this.value, this._value];\n\t}\n\n\tconstructor(opts: MultiSelectOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\t\tthis.value = [...(opts.initialValues ?? [])];\n\t\tconst cursor = Math.max(\n\t\t\tthis.options.findIndex(({ value }) => value === opts.cursorAt),\n\t\t\t0\n\t\t);\n\t\tthis.cursor = this.options[cursor].disabled ? findCursor<T>(cursor, 1, this.options) : cursor;\n\t\tthis.on('key', (char) => {\n\t\t\tif (char === 'a') {\n\t\t\t\tthis.toggleAll();\n\t\t\t}\n\t\t\tif (char === 'i') {\n\t\t\t\tthis.toggleInvert();\n\t\t\t}\n\t\t});\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, -1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, 1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'space':\n\t\t\t\t\tthis.toggleValue();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n}\n","import { styleText } from 'node:util';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface PasswordOptions extends PromptOptions<string, PasswordPrompt> {\n\tmask?: string;\n}\nexport default class PasswordPrompt extends Prompt<string> {\n\tprivate _mask = '•';\n\tget cursor() {\n\t\treturn this._cursor;\n\t}\n\tget masked() {\n\t\treturn this.userInput.replaceAll(/./g, this._mask);\n\t}\n\tget userInputWithCursor() {\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\treturn this.masked;\n\t\t}\n\t\tconst userInput = this.userInput;\n\t\tif (this.cursor >= userInput.length) {\n\t\t\treturn `${this.masked}${styleText(['inverse', 'hidden'], '_')}`;\n\t\t}\n\t\tconst masked = this.masked;\n\t\tconst s1 = masked.slice(0, this.cursor);\n\t\tconst s2 = masked.slice(this.cursor);\n\t\treturn `${s1}${styleText('inverse', s2[0])}${s2.slice(1)}`;\n\t}\n\tclear() {\n\t\tthis._clearUserInput();\n\t}\n\tconstructor({ mask, ...opts }: PasswordOptions) {\n\t\tsuper(opts);\n\t\tthis._mask = mask ?? '•';\n\t\tthis.on('userInput', (input) => {\n\t\t\tthis._setValue(input);\n\t\t});\n\t}\n}\n","import { findCursor } from '../utils/cursor.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface SelectOptions<T extends { value: any; disabled?: boolean }>\n\textends PromptOptions<T['value'], SelectPrompt<T>> {\n\toptions: T[];\n\tinitialValue?: T['value'];\n}\nexport default class SelectPrompt<T extends { value: any; disabled?: boolean }> extends Prompt<\n\tT['value']\n> {\n\toptions: T[];\n\tcursor = 0;\n\n\tprivate get _selectedValue() {\n\t\treturn this.options[this.cursor];\n\t}\n\n\tprivate changeValue() {\n\t\tthis.value = this._selectedValue.value;\n\t}\n\n\tconstructor(opts: SelectOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\n\t\tconst initialCursor = this.options.findIndex(({ value }) => value === opts.initialValue);\n\t\tconst cursor = initialCursor === -1 ? 0 : initialCursor;\n\t\tthis.cursor = this.options[cursor].disabled ? findCursor<T>(cursor, 1, this.options) : cursor;\n\t\tthis.changeValue();\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, -1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, 1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthis.changeValue();\n\t\t});\n\t}\n}\n","import Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface SelectKeyOptions<T extends { value: string }>\n\textends PromptOptions<T['value'], SelectKeyPrompt<T>> {\n\toptions: T[];\n\tcaseSensitive?: boolean;\n}\nexport default class SelectKeyPrompt<T extends { value: string }> extends Prompt<T['value']> {\n\toptions: T[];\n\tcursor = 0;\n\n\tconstructor(opts: SelectKeyOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\t\tconst caseSensitive = opts.caseSensitive === true;\n\t\tconst keys = this.options.map(({ value: [initial] }) => {\n\t\t\treturn caseSensitive ? initial : initial?.toLowerCase();\n\t\t});\n\t\tthis.cursor = Math.max(keys.indexOf(opts.initialValue), 0);\n\n\t\tthis.on('key', (key, keyInfo) => {\n\t\t\tif (!key) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst casedKey = caseSensitive && keyInfo.shift ? key.toUpperCase() : key;\n\t\t\tif (!keys.includes(casedKey)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst value = this.options.find(({ value: [initial] }) => {\n\t\t\t\treturn caseSensitive ? initial === casedKey : initial?.toLowerCase() === key;\n\t\t\t});\n\t\t\tif (value) {\n\t\t\t\tthis.value = value.value;\n\t\t\t\tthis.state = 'submit';\n\t\t\t\tthis.emit('submit');\n\t\t\t}\n\t\t});\n\t}\n}\n","import { styleText } from 'node:util';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface TextOptions extends PromptOptions<string, TextPrompt> {\n\tplaceholder?: string;\n\tdefaultValue?: string;\n}\n\nexport default class TextPrompt extends Prompt<string> {\n\tget userInputWithCursor() {\n\t\tif (this.state === 'submit') {\n\t\t\treturn this.userInput;\n\t\t}\n\t\tconst userInput = this.userInput;\n\t\tif (this.cursor >= userInput.length) {\n\t\t\treturn `${this.userInput}█`;\n\t\t}\n\t\tconst s1 = userInput.slice(0, this.cursor);\n\t\tconst [s2, ...s3] = userInput.slice(this.cursor);\n\t\treturn `${s1}${styleText('inverse', s2)}${s3.join('')}`;\n\t}\n\tget cursor() {\n\t\treturn this._cursor;\n\t}\n\tconstructor(opts: TextOptions) {\n\t\tsuper({\n\t\t\t...opts,\n\t\t\tinitialUserInput: opts.initialUserInput ?? opts.initialValue,\n\t\t});\n\n\t\tthis.on('userInput', (input) => {\n\t\t\tthis._setValue(input);\n\t\t});\n\t\tthis.on('finalize', () => {\n\t\t\tif (!this.value) {\n\t\t\t\tthis.value = opts.defaultValue;\n\t\t\t}\n\t\t\tif (this.value === undefined) {\n\t\t\t\tthis.value = '';\n\t\t\t}\n\t\t});\n\t}\n}\n"],"names":["findCursor","cursor","delta","options","opt","newCursor","maxCursor","clampedCursor","actions","DEFAULT_MONTH_NAMES","settings","days","month","min","max","updateSettings","updates","aliases","alias","action","messages","date","isActionKey","key","value","diffLines","a","b","aLines","bLines","numLines","diff","i","isWindows","CANCEL_SYMBOL","isCancel","setRawMode","input","block","stdin","output","stdout","overwrite","hideCursor","rl","readline","ReadStream","clear","data","name","sequence","str","dx","dy","getColumns","getRows","wrapTextWithPrefix","text","prefix","startPrefix","columns","wrapAnsi","line","index","g$1","trackValue","render","signal","opts","event","params","cb","cbs","cleanup","subscriber","resolve","char","_key","write","problem","lines","frame","rows","diffOffsetAfter","diffOffsetBefore","diffLine","erase","adjustedDiffLine","newLines","getCursorForValue","selected","items","item","defaultFilter","option","normalisedValue","multiple","values","T$1","Prompt","#cursor","#lastUserInput","#filterFn","#options","#placeholder","styleText","s1","s2","s3","initialValues","selectedValue","selectedIndex","#onKey","#onUserInputChanged","_char","isUpKey","isDownKey","isReturnKey","isEmptyOrOnlyTab","placeholder","placeholderMatchesOption","v","valueCursor","focusedOption","ConfirmPrompt","confirm","SEGMENTS","segmentsFor","fmt","c","detectLocaleFormat","locale","parts","segments","separator","p","parseSegmentToNum","s","parse","daysInMonth","year","validParts","day","d","toDate","segmentBounds","type","ctx","minDate","maxDate","minP","maxP","DatePrompt","#segments","#separator","#segmentValues","#minDate","#maxDate","#segmentSelected","#pendingTensDigit","#format","#refresh","detected","sep","initialDate","segmentValues","initialDisplay","#onCursor","#onFinalize","#seg","segment","#navigate","direction","#adjust","raw","isBlank","num","bounds","next","dir","newVal","newParts","err","#validateSegment","display","firstBlank","pos","shouldStaySelected","digit","parsed","maxDay","nextBlank","seg","GroupMultiSelectPrompt","#selectableGroups","group","o","groupedItems","currentIsGroup","enabledOptions","allSelected","notSelected","PasswordPrompt","userInput","masked","mask","SelectPrompt","initialCursor","SelectKeyPrompt","caseSensitive","keys","initial","keyInfo","casedKey","TextPrompt"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/utils/cursor.ts","../src/utils/settings.ts","../src/utils/string.ts","../src/utils/index.ts","../src/prompts/prompt.ts","../src/prompts/autocomplete.ts","../src/prompts/confirm.ts","../src/prompts/date.ts","../src/prompts/group-multiselect.ts","../src/prompts/multi-line.ts","../src/prompts/multi-select.ts","../src/prompts/password.ts","../src/prompts/select.ts","../src/prompts/select-key.ts","../src/prompts/text.ts"],"sourcesContent":["export function findCursor<T extends { disabled?: boolean }>(\n\tcursor: number,\n\tdelta: number,\n\toptions: T[]\n) {\n\tconst hasEnabledOptions = options.some((opt) => !opt.disabled);\n\tif (!hasEnabledOptions) {\n\t\treturn cursor;\n\t}\n\tconst newCursor = cursor + delta;\n\tconst maxCursor = Math.max(options.length - 1, 0);\n\tconst clampedCursor = newCursor < 0 ? maxCursor : newCursor > maxCursor ? 0 : newCursor;\n\tconst newOption = options[clampedCursor];\n\tif (newOption.disabled) {\n\t\treturn findCursor(clampedCursor, delta < 0 ? -1 : 1, options);\n\t}\n\treturn clampedCursor;\n}\n\nexport function findTextCursor(\n\tcursor: number,\n\tdeltaX: number,\n\tdeltaY: number,\n\tvalue: string\n): number {\n\tconst lines = value.split('\\n');\n\tlet cursorY = 0;\n\tlet cursorX = cursor;\n\n\tfor (const line of lines) {\n\t\tif (cursorX <= line.length) {\n\t\t\tbreak;\n\t\t}\n\t\tcursorX -= line.length + 1;\n\t\tcursorY++;\n\t}\n\n\tcursorY = Math.max(0, Math.min(lines.length - 1, cursorY + deltaY));\n\n\tcursorX = Math.min(cursorX, lines[cursorY].length) + deltaX;\n\twhile (cursorX < 0 && cursorY > 0) {\n\t\tcursorY--;\n\t\tcursorX += lines[cursorY].length + 1;\n\t}\n\twhile (cursorX > lines[cursorY].length && cursorY < lines.length - 1) {\n\t\tcursorX -= lines[cursorY].length + 1;\n\t\tcursorY++;\n\t}\n\tcursorX = Math.max(0, Math.min(lines[cursorY].length, cursorX));\n\n\tlet newCursor = 0;\n\tfor (let i = 0; i < cursorY; i++) {\n\t\tnewCursor += lines[i].length + 1;\n\t}\n\treturn newCursor + cursorX;\n}\n","const actions = ['up', 'down', 'left', 'right', 'space', 'enter', 'cancel'] as const;\nexport type Action = (typeof actions)[number];\n\nconst DEFAULT_MONTH_NAMES = [\n\t'January',\n\t'February',\n\t'March',\n\t'April',\n\t'May',\n\t'June',\n\t'July',\n\t'August',\n\t'September',\n\t'October',\n\t'November',\n\t'December',\n];\n\n/** Global settings for Clack programs, stored in memory */\ninterface InternalClackSettings {\n\tactions: Set<Action>;\n\taliases: Map<string, Action>;\n\tmessages: {\n\t\tcancel: string;\n\t\terror: string;\n\t};\n\twithGuide: boolean;\n\tdate: {\n\t\tmonthNames: string[];\n\t\tmessages: {\n\t\t\tinvalidMonth: string;\n\t\t\trequired: string;\n\t\t\tinvalidDay: (days: number, month: string) => string;\n\t\t\tafterMin: (min: Date) => string;\n\t\t\tbeforeMax: (max: Date) => string;\n\t\t};\n\t};\n}\n\nexport const settings: InternalClackSettings = {\n\tactions: new Set(actions),\n\taliases: new Map<string, Action>([\n\t\t// vim support\n\t\t['k', 'up'],\n\t\t['j', 'down'],\n\t\t['h', 'left'],\n\t\t['l', 'right'],\n\t\t['\\x03', 'cancel'],\n\t\t// opinionated defaults!\n\t\t['escape', 'cancel'],\n\t]),\n\tmessages: {\n\t\tcancel: 'Canceled',\n\t\terror: 'Something went wrong',\n\t},\n\twithGuide: true,\n\tdate: {\n\t\tmonthNames: [...DEFAULT_MONTH_NAMES],\n\t\tmessages: {\n\t\t\trequired: 'Please enter a valid date',\n\t\t\tinvalidMonth: 'There are only 12 months in a year',\n\t\t\tinvalidDay: (days, month) => `There are only ${days} days in ${month}`,\n\t\t\tafterMin: (min) => `Date must be on or after ${min.toISOString().slice(0, 10)}`,\n\t\t\tbeforeMax: (max) => `Date must be on or before ${max.toISOString().slice(0, 10)}`,\n\t\t},\n\t},\n};\n\nexport interface ClackSettings {\n\t/**\n\t * Set custom global aliases for the default actions.\n\t * This will not overwrite existing aliases, it will only add new ones!\n\t *\n\t * @param aliases - An object that maps aliases to actions\n\t * @default { k: 'up', j: 'down', h: 'left', l: 'right', '\\x03': 'cancel', 'escape': 'cancel' }\n\t */\n\taliases?: Record<string, Action>;\n\n\t/**\n\t * Custom messages for prompts\n\t */\n\tmessages?: {\n\t\t/**\n\t\t * Custom message to display when a spinner is cancelled\n\t\t * @default \"Canceled\"\n\t\t */\n\t\tcancel?: string;\n\t\t/**\n\t\t * Custom message to display when a spinner encounters an error\n\t\t * @default \"Something went wrong\"\n\t\t */\n\t\terror?: string;\n\t};\n\n\twithGuide?: boolean;\n\n\t/**\n\t * Date prompt localization\n\t */\n\tdate?: {\n\t\t/** Month names for validation messages (January, February, ...) */\n\t\tmonthNames?: string[];\n\t\tmessages?: {\n\t\t\t/** Shown when date is missing */\n\t\t\trequired?: string;\n\t\t\t/** Shown when month > 12 */\n\t\t\tinvalidMonth?: string;\n\t\t\t/** (days, monthName) => message for invalid day */\n\t\t\tinvalidDay?: (days: number, month: string) => string;\n\t\t\t/** (min) => message when date is before minDate */\n\t\t\tafterMin?: (min: Date) => string;\n\t\t\t/** (max) => message when date is after maxDate */\n\t\t\tbeforeMax?: (max: Date) => string;\n\t\t};\n\t};\n}\n\nexport function updateSettings(updates: ClackSettings) {\n\t// Handle each property in the updates\n\tif (updates.aliases !== undefined) {\n\t\tconst aliases = updates.aliases;\n\t\tfor (const alias in aliases) {\n\t\t\tif (!Object.hasOwn(aliases, alias)) continue;\n\n\t\t\tconst action = aliases[alias];\n\t\t\tif (!settings.actions.has(action)) continue;\n\n\t\t\tif (!settings.aliases.has(alias)) {\n\t\t\t\tsettings.aliases.set(alias, action);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (updates.messages !== undefined) {\n\t\tconst messages = updates.messages;\n\t\tif (messages.cancel !== undefined) {\n\t\t\tsettings.messages.cancel = messages.cancel;\n\t\t}\n\t\tif (messages.error !== undefined) {\n\t\t\tsettings.messages.error = messages.error;\n\t\t}\n\t}\n\n\tif (updates.withGuide !== undefined) {\n\t\tsettings.withGuide = updates.withGuide !== false;\n\t}\n\n\tif (updates.date !== undefined) {\n\t\tconst date = updates.date;\n\t\tif (date.monthNames !== undefined) {\n\t\t\tsettings.date.monthNames = [...date.monthNames];\n\t\t}\n\t\tif (date.messages !== undefined) {\n\t\t\tif (date.messages.required !== undefined) {\n\t\t\t\tsettings.date.messages.required = date.messages.required;\n\t\t\t}\n\t\t\tif (date.messages.invalidMonth !== undefined) {\n\t\t\t\tsettings.date.messages.invalidMonth = date.messages.invalidMonth;\n\t\t\t}\n\t\t\tif (date.messages.invalidDay !== undefined) {\n\t\t\t\tsettings.date.messages.invalidDay = date.messages.invalidDay;\n\t\t\t}\n\t\t\tif (date.messages.afterMin !== undefined) {\n\t\t\t\tsettings.date.messages.afterMin = date.messages.afterMin;\n\t\t\t}\n\t\t\tif (date.messages.beforeMax !== undefined) {\n\t\t\t\tsettings.date.messages.beforeMax = date.messages.beforeMax;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * Check if a key is an alias for a default action\n * @param key - The raw key which might match to an action\n * @param action - The action to match\n * @returns boolean\n */\nexport function isActionKey(key: string | Array<string | undefined>, action: Action) {\n\tif (typeof key === 'string') {\n\t\treturn settings.aliases.get(key) === action;\n\t}\n\n\tfor (const value of key) {\n\t\tif (value === undefined) continue;\n\t\tif (isActionKey(value, action)) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n","export function diffLines(a: string, b: string) {\n\tif (a === b) return;\n\n\tconst aLines = a.split('\\n');\n\tconst bLines = b.split('\\n');\n\tconst numLines = Math.max(aLines.length, bLines.length);\n\tconst diff: number[] = [];\n\n\tfor (let i = 0; i < numLines; i++) {\n\t\tif (aLines[i] !== bLines[i]) diff.push(i);\n\t}\n\n\treturn {\n\t\tlines: diff,\n\t\tnumLinesBefore: aLines.length,\n\t\tnumLinesAfter: bLines.length,\n\t\tnumLines,\n\t};\n}\n","import { stdin, stdout } from 'node:process';\nimport type { Key } from 'node:readline';\nimport * as readline from 'node:readline';\nimport type { Readable, Writable } from 'node:stream';\nimport { ReadStream } from 'node:tty';\nimport { wrapAnsi } from 'fast-wrap-ansi';\nimport { cursor } from 'sisteransi';\nimport { isActionKey } from './settings.js';\n\nexport * from './settings.js';\nexport * from './string.js';\n\nconst isWindows = globalThis.process.platform.startsWith('win');\n\nexport const CANCEL_SYMBOL = Symbol('clack:cancel');\n\nexport function isCancel(value: unknown): value is symbol {\n\treturn value === CANCEL_SYMBOL;\n}\n\nexport function setRawMode(input: Readable, value: boolean) {\n\tconst i = input as typeof stdin;\n\n\tif (i.isTTY) i.setRawMode(value);\n}\n\ninterface BlockOptions {\n\tinput?: Readable;\n\toutput?: Writable;\n\toverwrite?: boolean;\n\thideCursor?: boolean;\n}\n\nexport function block({\n\tinput = stdin,\n\toutput = stdout,\n\toverwrite = true,\n\thideCursor = true,\n}: BlockOptions = {}) {\n\tconst rl = readline.createInterface({\n\t\tinput,\n\t\toutput,\n\t\tprompt: '',\n\t\ttabSize: 1,\n\t});\n\treadline.emitKeypressEvents(input, rl);\n\n\tif (input instanceof ReadStream && input.isTTY) {\n\t\tinput.setRawMode(true);\n\t}\n\n\tconst clear = (data: Buffer, { name, sequence }: Key) => {\n\t\tconst str = String(data);\n\t\tif (isActionKey([str, name, sequence], 'cancel')) {\n\t\t\tif (hideCursor) output.write(cursor.show);\n\t\t\tprocess.exit(0);\n\t\t\treturn;\n\t\t}\n\t\tif (!overwrite) return;\n\t\tconst dx = name === 'return' ? 0 : -1;\n\t\tconst dy = name === 'return' ? -1 : 0;\n\n\t\treadline.moveCursor(output, dx, dy, () => {\n\t\t\treadline.clearLine(output, 1, () => {\n\t\t\t\tinput.once('keypress', clear);\n\t\t\t});\n\t\t});\n\t};\n\tif (hideCursor) output.write(cursor.hide);\n\tinput.once('keypress', clear);\n\n\treturn () => {\n\t\tinput.off('keypress', clear);\n\t\tif (hideCursor) output.write(cursor.show);\n\n\t\t// Prevent Windows specific issues: https://github.com/bombshell-dev/clack/issues/176\n\t\tif (input instanceof ReadStream && input.isTTY && !isWindows) {\n\t\t\tinput.setRawMode(false);\n\t\t}\n\n\t\t// @ts-expect-error fix for https://github.com/nodejs/node/issues/31762#issuecomment-1441223907\n\t\trl.terminal = false;\n\t\trl.close();\n\t};\n}\n\nexport const getColumns = (output: Writable): number => {\n\tif ('columns' in output && typeof output.columns === 'number') {\n\t\treturn output.columns;\n\t}\n\treturn 80;\n};\n\nexport const getRows = (output: Writable): number => {\n\tif ('rows' in output && typeof output.rows === 'number') {\n\t\treturn output.rows;\n\t}\n\treturn 20;\n};\n\nexport function wrapTextWithPrefix(\n\toutput: Writable | undefined,\n\ttext: string,\n\tprefix: string,\n\tstartPrefix: string = prefix,\n\tlineFormatter?: (line: string, index: number) => string\n): string {\n\tconst columns = getColumns(output ?? stdout);\n\tconst wrapped = wrapAnsi(text, columns - prefix.length, {\n\t\thard: true,\n\t\ttrim: false,\n\t});\n\tconst lines = wrapped\n\t\t.split('\\n')\n\t\t.map((line, index) => {\n\t\t\tconst lineString = lineFormatter ? lineFormatter(line, index) : line;\n\t\t\treturn `${index === 0 ? startPrefix : prefix}${lineString}`;\n\t\t})\n\t\t.join('\\n');\n\treturn lines;\n}\n","import { stdin, stdout } from 'node:process';\nimport readline, { type Key, type ReadLine } from 'node:readline';\nimport type { Readable, Writable } from 'node:stream';\nimport { wrapAnsi } from 'fast-wrap-ansi';\nimport { cursor, erase } from 'sisteransi';\nimport type { ClackEvents, ClackState } from '../types.js';\nimport type { Action } from '../utils/index.js';\nimport {\n\tCANCEL_SYMBOL,\n\tdiffLines,\n\tgetRows,\n\tisActionKey,\n\tsetRawMode,\n\tsettings,\n} from '../utils/index.js';\n\nexport interface PromptOptions<TValue, Self extends Prompt<TValue>> {\n\trender(this: Omit<Self, 'prompt'>): string | undefined;\n\tinitialValue?: any;\n\tinitialUserInput?: string;\n\tvalidate?: ((value: TValue | undefined) => string | Error | undefined) | undefined;\n\tinput?: Readable;\n\toutput?: Writable;\n\tsignal?: AbortSignal;\n}\n\nexport default class Prompt<TValue> {\n\tprotected input: Readable;\n\tprotected output: Writable;\n\tprivate _abortSignal?: AbortSignal;\n\n\tprivate rl: ReadLine | undefined;\n\tprivate opts: Omit<PromptOptions<TValue, Prompt<TValue>>, 'render' | 'input' | 'output'>;\n\tprivate _render: (context: Omit<Prompt<TValue>, 'prompt'>) => string | undefined;\n\tprivate _track = false;\n\tprivate _prevFrame = '';\n\tprivate _subscribers = new Map<string, { cb: (...args: any) => any; once?: boolean }[]>();\n\tprotected _cursor = 0;\n\n\tpublic state: ClackState = 'initial';\n\tpublic error = '';\n\tpublic value: TValue | undefined;\n\tpublic userInput = '';\n\n\tconstructor(options: PromptOptions<TValue, Prompt<TValue>>, trackValue = true) {\n\t\tconst { input = stdin, output = stdout, render, signal, ...opts } = options;\n\n\t\tthis.opts = opts;\n\t\tthis.onKeypress = this.onKeypress.bind(this);\n\t\tthis.close = this.close.bind(this);\n\t\tthis.render = this.render.bind(this);\n\t\tthis._render = render.bind(this);\n\t\tthis._track = trackValue;\n\t\tthis._abortSignal = signal;\n\n\t\tthis.input = input;\n\t\tthis.output = output;\n\t}\n\n\t/**\n\t * Unsubscribe all listeners\n\t */\n\tprotected unsubscribe() {\n\t\tthis._subscribers.clear();\n\t}\n\n\t/**\n\t * Set a subscriber with opts\n\t * @param event - The event name\n\t */\n\tprivate setSubscriber<T extends keyof ClackEvents<TValue>>(\n\t\tevent: T,\n\t\topts: { cb: ClackEvents<TValue>[T]; once?: boolean }\n\t) {\n\t\tconst params = this._subscribers.get(event) ?? [];\n\t\tparams.push(opts);\n\t\tthis._subscribers.set(event, params);\n\t}\n\n\t/**\n\t * Subscribe to an event\n\t * @param event - The event name\n\t * @param cb - The callback\n\t */\n\tpublic on<T extends keyof ClackEvents<TValue>>(event: T, cb: ClackEvents<TValue>[T]) {\n\t\tthis.setSubscriber(event, { cb });\n\t}\n\n\t/**\n\t * Subscribe to an event once\n\t * @param event - The event name\n\t * @param cb - The callback\n\t */\n\tpublic once<T extends keyof ClackEvents<TValue>>(event: T, cb: ClackEvents<TValue>[T]) {\n\t\tthis.setSubscriber(event, { cb, once: true });\n\t}\n\n\t/**\n\t * Emit an event with data\n\t * @param event - The event name\n\t * @param data - The data to pass to the callback\n\t */\n\tpublic emit<T extends keyof ClackEvents<TValue>>(\n\t\tevent: T,\n\t\t...data: Parameters<ClackEvents<TValue>[T]>\n\t) {\n\t\tconst cbs = this._subscribers.get(event) ?? [];\n\t\tconst cleanup: (() => void)[] = [];\n\n\t\tfor (const subscriber of cbs) {\n\t\t\tsubscriber.cb(...data);\n\n\t\t\tif (subscriber.once) {\n\t\t\t\tcleanup.push(() => cbs.splice(cbs.indexOf(subscriber), 1));\n\t\t\t}\n\t\t}\n\n\t\tfor (const cb of cleanup) {\n\t\t\tcb();\n\t\t}\n\t}\n\n\tpublic prompt() {\n\t\treturn new Promise<TValue | symbol | undefined>((resolve) => {\n\t\t\tif (this._abortSignal) {\n\t\t\t\tif (this._abortSignal.aborted) {\n\t\t\t\t\tthis.state = 'cancel';\n\n\t\t\t\t\tthis.close();\n\t\t\t\t\treturn resolve(CANCEL_SYMBOL);\n\t\t\t\t}\n\n\t\t\t\tthis._abortSignal.addEventListener(\n\t\t\t\t\t'abort',\n\t\t\t\t\t() => {\n\t\t\t\t\t\tthis.state = 'cancel';\n\t\t\t\t\t\tthis.close();\n\t\t\t\t\t},\n\t\t\t\t\t{ once: true }\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.rl = readline.createInterface({\n\t\t\t\tinput: this.input,\n\t\t\t\ttabSize: 2,\n\t\t\t\tprompt: '',\n\t\t\t\tescapeCodeTimeout: 50,\n\t\t\t\tterminal: true,\n\t\t\t});\n\t\t\tthis.rl.prompt();\n\n\t\t\tif (this.opts.initialUserInput !== undefined) {\n\t\t\t\tthis._setUserInput(this.opts.initialUserInput, true);\n\t\t\t}\n\n\t\t\tthis.input.on('keypress', this.onKeypress);\n\t\t\tsetRawMode(this.input, true);\n\t\t\tthis.output.on('resize', this.render);\n\n\t\t\tthis.render();\n\n\t\t\tthis.once('submit', () => {\n\t\t\t\tthis.output.write(cursor.show);\n\t\t\t\tthis.output.off('resize', this.render);\n\t\t\t\tsetRawMode(this.input, false);\n\t\t\t\tresolve(this.value);\n\t\t\t});\n\t\t\tthis.once('cancel', () => {\n\t\t\t\tthis.output.write(cursor.show);\n\t\t\t\tthis.output.off('resize', this.render);\n\t\t\t\tsetRawMode(this.input, false);\n\t\t\t\tresolve(CANCEL_SYMBOL);\n\t\t\t});\n\t\t});\n\t}\n\n\tprotected _isActionKey(char: string | undefined, _key: Key): boolean {\n\t\treturn char === '\\t';\n\t}\n\n\tprotected _shouldSubmit(_char: string | undefined, _key: Key): boolean {\n\t\treturn true;\n\t}\n\n\tprotected _setValue(value: TValue | undefined): void {\n\t\tthis.value = value;\n\t\tthis.emit('value', this.value);\n\t}\n\n\tprotected _setUserInput(value: string | undefined, write?: boolean): void {\n\t\tthis.userInput = value ?? '';\n\t\tthis.emit('userInput', this.userInput);\n\t\tif (write && this._track && this.rl) {\n\t\t\tthis.rl.write(this.userInput);\n\t\t\tthis._cursor = this.rl.cursor;\n\t\t}\n\t}\n\n\tprotected _clearUserInput(): void {\n\t\tthis.rl?.write(null, { ctrl: true, name: 'u' });\n\t\tthis._setUserInput('');\n\t}\n\n\tprivate onKeypress(char: string | undefined, key: Key) {\n\t\tif (this._track && key.name !== 'return') {\n\t\t\tif (key.name && this._isActionKey(char, key)) {\n\t\t\t\tthis.rl?.write(null, { ctrl: true, name: 'h' });\n\t\t\t}\n\t\t\tthis._cursor = this.rl?.cursor ?? 0;\n\t\t\tthis._setUserInput(this.rl?.line);\n\t\t}\n\n\t\tif (this.state === 'error') {\n\t\t\tthis.state = 'active';\n\t\t}\n\t\tif (key?.name) {\n\t\t\tif (!this._track && settings.aliases.has(key.name)) {\n\t\t\t\tthis.emit('cursor', settings.aliases.get(key.name));\n\t\t\t}\n\t\t\tif (settings.actions.has(key.name as Action)) {\n\t\t\t\tthis.emit('cursor', key.name as Action);\n\t\t\t}\n\t\t}\n\t\tif (char && (char.toLowerCase() === 'y' || char.toLowerCase() === 'n')) {\n\t\t\tthis.emit('confirm', char.toLowerCase() === 'y');\n\t\t}\n\n\t\t// Call the key event handler and emit the key event\n\t\tthis.emit('key', char?.toLowerCase(), key);\n\n\t\tif (key?.name === 'return' && this._shouldSubmit(char, key)) {\n\t\t\tif (this.opts.validate) {\n\t\t\t\tconst problem = this.opts.validate(this.value);\n\t\t\t\tif (problem) {\n\t\t\t\t\tthis.error = problem instanceof Error ? problem.message : problem;\n\t\t\t\t\tthis.state = 'error';\n\t\t\t\t\tthis.rl?.write(this.userInput);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.state !== 'error') {\n\t\t\t\tthis.state = 'submit';\n\t\t\t}\n\t\t}\n\n\t\tif (isActionKey([char, key?.name, key?.sequence], 'cancel')) {\n\t\t\tthis.state = 'cancel';\n\t\t}\n\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\tthis.emit('finalize');\n\t\t}\n\t\tthis.render();\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\tthis.close();\n\t\t}\n\t}\n\n\tprotected close() {\n\t\tthis.input.unpipe();\n\t\tthis.input.removeListener('keypress', this.onKeypress);\n\t\tthis.output.write('\\n');\n\t\tsetRawMode(this.input, false);\n\t\tthis.rl?.close();\n\t\tthis.rl = undefined;\n\t\tthis.emit(`${this.state}`, this.value);\n\t\tthis.unsubscribe();\n\t}\n\n\tprivate restoreCursor() {\n\t\tconst lines =\n\t\t\twrapAnsi(this._prevFrame, process.stdout.columns, { hard: true, trim: false }).split('\\n')\n\t\t\t\t.length - 1;\n\t\tthis.output.write(cursor.move(-999, lines * -1));\n\t}\n\n\tprivate render() {\n\t\tconst frame = wrapAnsi(this._render(this) ?? '', process.stdout.columns, {\n\t\t\thard: true,\n\t\t\ttrim: false,\n\t\t});\n\t\tif (frame === this._prevFrame) return;\n\n\t\tif (this.state === 'initial') {\n\t\t\tthis.output.write(cursor.hide);\n\t\t} else {\n\t\t\tconst diff = diffLines(this._prevFrame, frame);\n\t\t\tconst rows = getRows(this.output);\n\t\t\tthis.restoreCursor();\n\t\t\tif (diff) {\n\t\t\t\tconst diffOffsetAfter = Math.max(0, diff.numLinesAfter - rows);\n\t\t\t\tconst diffOffsetBefore = Math.max(0, diff.numLinesBefore - rows);\n\t\t\t\tlet diffLine = diff.lines.find((line) => line >= diffOffsetAfter);\n\n\t\t\t\tif (diffLine === undefined) {\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// If a single line has changed, only update that line\n\t\t\t\tif (diff.lines.length === 1) {\n\t\t\t\t\tthis.output.write(cursor.move(0, diffLine - diffOffsetBefore));\n\t\t\t\t\tthis.output.write(erase.lines(1));\n\t\t\t\t\tconst lines = frame.split('\\n');\n\t\t\t\t\tthis.output.write(lines[diffLine]);\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\tthis.output.write(cursor.move(0, lines.length - diffLine - 1));\n\t\t\t\t\treturn;\n\t\t\t\t\t// If many lines have changed, rerender everything past the first line\n\t\t\t\t} else if (diff.lines.length > 1) {\n\t\t\t\t\tif (diffOffsetAfter < diffOffsetBefore) {\n\t\t\t\t\t\tdiffLine = diffOffsetAfter;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst adjustedDiffLine = diffLine - diffOffsetBefore;\n\t\t\t\t\t\tif (adjustedDiffLine > 0) {\n\t\t\t\t\t\t\tthis.output.write(cursor.move(0, adjustedDiffLine));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tthis.output.write(erase.down());\n\t\t\t\t\tconst lines = frame.split('\\n');\n\t\t\t\t\tconst newLines = lines.slice(diffLine);\n\t\t\t\t\tthis.output.write(newLines.join('\\n'));\n\t\t\t\t\tthis._prevFrame = frame;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.output.write(erase.down());\n\t\t}\n\n\t\tthis.output.write(frame);\n\t\tif (this.state === 'initial') {\n\t\t\tthis.state = 'active';\n\t\t}\n\t\tthis._prevFrame = frame;\n\t}\n}\n","import type { Key } from 'node:readline';\nimport { styleText } from 'node:util';\nimport { findCursor } from '../utils/cursor.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\ninterface OptionLike {\n\tvalue: unknown;\n\tlabel?: string;\n\tdisabled?: boolean;\n}\n\ntype FilterFunction<T extends OptionLike> = (search: string, opt: T) => boolean;\n\nfunction getCursorForValue<T extends OptionLike>(\n\tselected: T['value'] | undefined,\n\titems: T[]\n): number {\n\tif (selected === undefined) {\n\t\treturn 0;\n\t}\n\n\tconst currLength = items.length;\n\n\t// If filtering changed the available options, update cursor\n\tif (currLength === 0) {\n\t\treturn 0;\n\t}\n\n\t// Try to maintain the same selected item\n\tconst index = items.findIndex((item) => item.value === selected);\n\treturn index !== -1 ? index : 0;\n}\n\nfunction defaultFilter<T extends OptionLike>(input: string, option: T): boolean {\n\tconst label = option.label ?? String(option.value);\n\treturn label.toLowerCase().includes(input.toLowerCase());\n}\n\nfunction normalisedValue<T>(multiple: boolean, values: T[] | undefined): T | T[] | undefined {\n\tif (!values) {\n\t\treturn undefined;\n\t}\n\tif (multiple) {\n\t\treturn values;\n\t}\n\treturn values[0];\n}\n\nexport interface AutocompleteOptions<T extends OptionLike>\n\textends PromptOptions<T['value'] | T['value'][], AutocompletePrompt<T>> {\n\toptions: T[] | ((this: AutocompletePrompt<T>) => T[]);\n\tfilter?: FilterFunction<T>;\n\tmultiple?: boolean;\n\t/**\n\t * When set (non-empty), pressing Tab with no input fills the field with this value\n\t * and runs the normal filter/selection logic so the user can confirm with Enter.\n\t * Tab only fills the input when the placeholder matches at least one option under\n\t * the prompt's filter (so the value remains selectable).\n\t */\n\tplaceholder?: string;\n}\n\nexport default class AutocompletePrompt<T extends OptionLike> extends Prompt<\n\tT['value'] | T['value'][]\n> {\n\tfilteredOptions: T[];\n\tmultiple: boolean;\n\tisNavigating = false;\n\tselectedValues: Array<T['value']> = [];\n\n\tfocusedValue: T['value'] | undefined;\n\t#cursor = 0;\n\t#lastUserInput = '';\n\t#filterFn: FilterFunction<T> | undefined;\n\t#options: T[] | (() => T[]);\n\t#placeholder: string | undefined;\n\n\tget cursor(): number {\n\t\treturn this.#cursor;\n\t}\n\n\tget userInputWithCursor() {\n\t\tif (!this.userInput) {\n\t\t\treturn styleText(['inverse', 'hidden'], '_');\n\t\t}\n\t\tif (this._cursor >= this.userInput.length) {\n\t\t\treturn `${this.userInput}█`;\n\t\t}\n\t\tconst s1 = this.userInput.slice(0, this._cursor);\n\t\tconst [s2, ...s3] = this.userInput.slice(this._cursor);\n\t\treturn `${s1}${styleText('inverse', s2)}${s3.join('')}`;\n\t}\n\n\tget options(): T[] {\n\t\tif (typeof this.#options === 'function') {\n\t\t\treturn this.#options();\n\t\t}\n\t\treturn this.#options;\n\t}\n\n\tconstructor(opts: AutocompleteOptions<T>) {\n\t\tsuper(opts);\n\n\t\tthis.#options = opts.options;\n\t\tthis.#placeholder = opts.placeholder;\n\t\tconst options = this.options;\n\t\tthis.filteredOptions = [...options];\n\t\tthis.multiple = opts.multiple === true;\n\t\tthis.#filterFn =\n\t\t\ttypeof opts.options === 'function' ? opts.filter : (opts.filter ?? defaultFilter);\n\t\tlet initialValues: unknown[] | undefined;\n\t\tif (opts.initialValue && Array.isArray(opts.initialValue)) {\n\t\t\tif (this.multiple) {\n\t\t\t\tinitialValues = opts.initialValue;\n\t\t\t} else {\n\t\t\t\tinitialValues = opts.initialValue.slice(0, 1);\n\t\t\t}\n\t\t} else {\n\t\t\tif (!this.multiple && this.options.length > 0) {\n\t\t\t\tinitialValues = [this.options[0].value];\n\t\t\t}\n\t\t}\n\n\t\tif (initialValues) {\n\t\t\tfor (const selectedValue of initialValues) {\n\t\t\t\tconst selectedIndex = options.findIndex((opt) => opt.value === selectedValue);\n\t\t\t\tif (selectedIndex !== -1) {\n\t\t\t\t\tthis.toggleSelected(selectedValue);\n\t\t\t\t\tthis.#cursor = selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tthis.focusedValue = this.options[this.#cursor]?.value;\n\n\t\tthis.on('key', (char, key) => this.#onKey(char, key));\n\t\tthis.on('userInput', (value) => this.#onUserInputChanged(value));\n\t}\n\n\tprotected override _isActionKey(char: string | undefined, key: Key): boolean {\n\t\treturn (\n\t\t\tchar === '\\t' ||\n\t\t\t(this.multiple &&\n\t\t\t\tthis.isNavigating &&\n\t\t\t\tkey.name === 'space' &&\n\t\t\t\tchar !== undefined &&\n\t\t\t\tchar !== '')\n\t\t);\n\t}\n\n\t#onKey(_char: string | undefined, key: Key): void {\n\t\tconst isUpKey = key.name === 'up';\n\t\tconst isDownKey = key.name === 'down';\n\t\tconst isReturnKey = key.name === 'return';\n\n\t\t// Tab with empty input and placeholder: fill input with placeholder to trigger autocomplete\n\t\t// Only when the placeholder matches at least one (non-disabled) option so the value remains selectable\n\t\tconst isEmptyOrOnlyTab = this.userInput === '' || this.userInput === '\\t';\n\t\tconst placeholder = this.#placeholder;\n\t\tconst options = this.options;\n\t\tconst placeholderMatchesOption =\n\t\t\tplaceholder !== undefined &&\n\t\t\tplaceholder !== '' &&\n\t\t\toptions.some(\n\t\t\t\t(opt) => !opt.disabled && (this.#filterFn ? this.#filterFn(placeholder, opt) : true)\n\t\t\t);\n\t\tif (key.name === 'tab' && isEmptyOrOnlyTab && placeholderMatchesOption) {\n\t\t\tif (this.userInput === '\\t') {\n\t\t\t\tthis._clearUserInput();\n\t\t\t}\n\t\t\tthis._setUserInput(placeholder, true);\n\t\t\tthis.isNavigating = false;\n\t\t\treturn;\n\t\t}\n\n\t\t// Start navigation mode with up/down arrows\n\t\tif (isUpKey || isDownKey) {\n\t\t\tthis.#cursor = findCursor(this.#cursor, isUpKey ? -1 : 1, this.filteredOptions);\n\t\t\tthis.focusedValue = this.filteredOptions[this.#cursor]?.value;\n\t\t\tif (!this.multiple) {\n\t\t\t\tthis.selectedValues = [this.focusedValue];\n\t\t\t}\n\t\t\tthis.isNavigating = true;\n\t\t} else if (isReturnKey) {\n\t\t\tthis.value = normalisedValue(this.multiple, this.selectedValues);\n\t\t} else {\n\t\t\tif (this.multiple) {\n\t\t\t\tif (\n\t\t\t\t\tthis.focusedValue !== undefined &&\n\t\t\t\t\t(key.name === 'tab' || (this.isNavigating && key.name === 'space'))\n\t\t\t\t) {\n\t\t\t\t\tthis.toggleSelected(this.focusedValue);\n\t\t\t\t} else {\n\t\t\t\t\tthis.isNavigating = false;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (this.focusedValue) {\n\t\t\t\t\tthis.selectedValues = [this.focusedValue];\n\t\t\t\t}\n\t\t\t\tthis.isNavigating = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tdeselectAll() {\n\t\tthis.selectedValues = [];\n\t}\n\n\ttoggleSelected(value: T['value']) {\n\t\tif (this.filteredOptions.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.multiple) {\n\t\t\tif (this.selectedValues.includes(value)) {\n\t\t\t\tthis.selectedValues = this.selectedValues.filter((v) => v !== value);\n\t\t\t} else {\n\t\t\t\tthis.selectedValues = [...this.selectedValues, value];\n\t\t\t}\n\t\t} else {\n\t\t\tthis.selectedValues = [value];\n\t\t}\n\t}\n\n\t#onUserInputChanged(value: string): void {\n\t\tif (value !== this.#lastUserInput) {\n\t\t\tthis.#lastUserInput = value;\n\n\t\t\tconst options = this.options;\n\n\t\t\tif (value && this.#filterFn) {\n\t\t\t\tthis.filteredOptions = options.filter((opt) => this.#filterFn?.(value, opt));\n\t\t\t} else {\n\t\t\t\tthis.filteredOptions = [...options];\n\t\t\t}\n\t\t\tconst valueCursor = getCursorForValue(this.focusedValue, this.filteredOptions);\n\t\t\tthis.#cursor = findCursor(valueCursor, 0, this.filteredOptions);\n\t\t\tconst focusedOption = this.filteredOptions[this.#cursor];\n\t\t\tif (focusedOption && !focusedOption.disabled) {\n\t\t\t\tthis.focusedValue = focusedOption.value;\n\t\t\t} else {\n\t\t\t\tthis.focusedValue = undefined;\n\t\t\t}\n\t\t\tif (!this.multiple) {\n\t\t\t\tif (this.focusedValue !== undefined) {\n\t\t\t\t\tthis.toggleSelected(this.focusedValue);\n\t\t\t\t} else {\n\t\t\t\t\tthis.deselectAll();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n","import { cursor } from 'sisteransi';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface ConfirmOptions extends PromptOptions<boolean, ConfirmPrompt> {\n\tactive: string;\n\tinactive: string;\n\tinitialValue?: boolean;\n}\n\nexport default class ConfirmPrompt extends Prompt<boolean> {\n\tget cursor() {\n\t\treturn this.value ? 0 : 1;\n\t}\n\n\tprivate get _value() {\n\t\treturn this.cursor === 0;\n\t}\n\n\tconstructor(opts: ConfirmOptions) {\n\t\tsuper(opts, false);\n\t\tthis.value = !!opts.initialValue;\n\n\t\tthis.on('userInput', () => {\n\t\t\tthis.value = this._value;\n\t\t});\n\n\t\tthis.on('confirm', (confirm) => {\n\t\t\tthis.output.write(cursor.move(0, -1));\n\t\t\tthis.value = confirm;\n\t\t\tthis.state = 'submit';\n\t\t\tthis.close();\n\t\t});\n\n\t\tthis.on('cursor', () => {\n\t\t\tthis.value = !this.value;\n\t\t});\n\t}\n}\n","import type { Key } from 'node:readline';\nimport { settings } from '../utils/settings.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\ninterface SegmentConfig {\n\ttype: 'year' | 'month' | 'day';\n\tlen: number;\n}\n\nexport interface DateParts {\n\tyear: string;\n\tmonth: string;\n\tday: string;\n}\n\nexport type DateFormat = 'YMD' | 'MDY' | 'DMY';\n\nconst SEGMENTS: Record<string, SegmentConfig> = {\n\tY: { type: 'year', len: 4 },\n\tM: { type: 'month', len: 2 },\n\tD: { type: 'day', len: 2 },\n} as const;\n\nfunction segmentsFor(fmt: DateFormat): SegmentConfig[] {\n\treturn [...fmt].map((c) => SEGMENTS[c as keyof typeof SEGMENTS]);\n}\n\nfunction detectLocaleFormat(locale?: string): { segments: SegmentConfig[]; separator: string } {\n\tconst fmt = new Intl.DateTimeFormat(locale, {\n\t\tyear: 'numeric',\n\t\tmonth: '2-digit',\n\t\tday: '2-digit',\n\t});\n\tconst parts = fmt.formatToParts(new Date(2000, 0, 15));\n\tconst segments: SegmentConfig[] = [];\n\tlet separator = '/';\n\tfor (const p of parts) {\n\t\tif (p.type === 'literal') {\n\t\t\tseparator = p.value.trim() || p.value;\n\t\t} else if (p.type === 'year' || p.type === 'month' || p.type === 'day') {\n\t\t\tsegments.push({ type: p.type, len: p.type === 'year' ? 4 : 2 });\n\t\t}\n\t}\n\treturn { segments, separator };\n}\n\n/** Parse string segment values to numbers, treating blanks as 0 */\nfunction parseSegmentToNum(s: string): number {\n\treturn Number.parseInt((s || '0').replace(/_/g, '0'), 10) || 0;\n}\n\nfunction parse(parts: DateParts): { year: number; month: number; day: number } {\n\treturn {\n\t\tyear: parseSegmentToNum(parts.year),\n\t\tmonth: parseSegmentToNum(parts.month),\n\t\tday: parseSegmentToNum(parts.day),\n\t};\n}\n\nfunction daysInMonth(year: number, month: number): number {\n\treturn new Date(year || 2001, month || 1, 0).getDate();\n}\n\n/** Validate and return calendar parts, or undefined if invalid */\nfunction validParts(parts: DateParts): { year: number; month: number; day: number } | undefined {\n\tconst { year, month, day } = parse(parts);\n\tif (!year || year < 0 || year > 9999) return undefined;\n\tif (!month || month < 1 || month > 12) return undefined;\n\tif (!day || day < 1) return undefined;\n\tconst d = new Date(Date.UTC(year, month - 1, day));\n\tif (d.getUTCFullYear() !== year || d.getUTCMonth() !== month - 1 || d.getUTCDate() !== day)\n\t\treturn undefined;\n\treturn { year, month, day };\n}\n\nfunction toDate(parts: DateParts): Date | undefined {\n\tconst p = validParts(parts);\n\treturn p ? new Date(Date.UTC(p.year, p.month - 1, p.day)) : undefined;\n}\n\nfunction segmentBounds(\n\ttype: 'year' | 'month' | 'day',\n\tctx: { year: number; month: number },\n\tminDate: Date | undefined,\n\tmaxDate: Date | undefined\n): { min: number; max: number } {\n\tconst minP = minDate\n\t\t? {\n\t\t\t\tyear: minDate.getUTCFullYear(),\n\t\t\t\tmonth: minDate.getUTCMonth() + 1,\n\t\t\t\tday: minDate.getUTCDate(),\n\t\t\t}\n\t\t: null;\n\tconst maxP = maxDate\n\t\t? {\n\t\t\t\tyear: maxDate.getUTCFullYear(),\n\t\t\t\tmonth: maxDate.getUTCMonth() + 1,\n\t\t\t\tday: maxDate.getUTCDate(),\n\t\t\t}\n\t\t: null;\n\n\tif (type === 'year') {\n\t\treturn { min: minP?.year ?? 1, max: maxP?.year ?? 9999 };\n\t}\n\tif (type === 'month') {\n\t\treturn {\n\t\t\tmin: minP && ctx.year === minP.year ? minP.month : 1,\n\t\t\tmax: maxP && ctx.year === maxP.year ? maxP.month : 12,\n\t\t};\n\t}\n\treturn {\n\t\tmin: minP && ctx.year === minP.year && ctx.month === minP.month ? minP.day : 1,\n\t\tmax:\n\t\t\tmaxP && ctx.year === maxP.year && ctx.month === maxP.month\n\t\t\t\t? maxP.day\n\t\t\t\t: daysInMonth(ctx.year, ctx.month),\n\t};\n}\n\nexport interface DateOptions extends PromptOptions<Date, DatePrompt> {\n\tformat?: DateFormat;\n\tlocale?: string;\n\tseparator?: string;\n\tdefaultValue?: Date;\n\tinitialValue?: Date;\n\tminDate?: Date;\n\tmaxDate?: Date;\n}\n\nexport default class DatePrompt extends Prompt<Date> {\n\t#segments: SegmentConfig[];\n\t#separator: string;\n\t#segmentValues: DateParts;\n\t#minDate: Date | undefined;\n\t#maxDate: Date | undefined;\n\t#cursor = { segmentIndex: 0, positionInSegment: 0 };\n\t#segmentSelected = true;\n\t#pendingTensDigit: string | null = null;\n\n\tinlineError = '';\n\n\tget segmentCursor() {\n\t\treturn { ...this.#cursor };\n\t}\n\n\tget segmentValues(): DateParts {\n\t\treturn { ...this.#segmentValues };\n\t}\n\n\tget segments(): readonly SegmentConfig[] {\n\t\treturn this.#segments;\n\t}\n\n\tget separator(): string {\n\t\treturn this.#separator;\n\t}\n\n\tget formattedValue(): string {\n\t\treturn this.#format(this.#segmentValues);\n\t}\n\n\t#format(parts: DateParts): string {\n\t\treturn this.#segments.map((s) => parts[s.type]).join(this.#separator);\n\t}\n\n\t#refresh() {\n\t\tthis._setUserInput(this.#format(this.#segmentValues));\n\t\tthis._setValue(toDate(this.#segmentValues) ?? undefined);\n\t}\n\n\tconstructor(opts: DateOptions) {\n\t\tconst detected = opts.format\n\t\t\t? { segments: segmentsFor(opts.format), separator: opts.separator ?? '/' }\n\t\t\t: detectLocaleFormat(opts.locale);\n\t\tconst sep = opts.separator ?? detected.separator;\n\t\tconst segments = opts.format ? segmentsFor(opts.format) : detected.segments;\n\n\t\tconst initialDate = opts.initialValue ?? opts.defaultValue;\n\t\tconst segmentValues: DateParts = initialDate\n\t\t\t? {\n\t\t\t\t\tyear: String(initialDate.getUTCFullYear()).padStart(4, '0'),\n\t\t\t\t\tmonth: String(initialDate.getUTCMonth() + 1).padStart(2, '0'),\n\t\t\t\t\tday: String(initialDate.getUTCDate()).padStart(2, '0'),\n\t\t\t\t}\n\t\t\t: { year: '____', month: '__', day: '__' };\n\n\t\tconst initialDisplay = segments.map((s) => segmentValues[s.type]).join(sep);\n\n\t\tsuper({ ...opts, initialUserInput: initialDisplay }, false);\n\t\tthis.#segments = segments;\n\t\tthis.#separator = sep;\n\t\tthis.#segmentValues = segmentValues;\n\t\tthis.#minDate = opts.minDate;\n\t\tthis.#maxDate = opts.maxDate;\n\t\tthis.#refresh();\n\n\t\tthis.on('cursor', (key) => this.#onCursor(key));\n\t\tthis.on('key', (char, key) => this.#onKey(char, key));\n\t\tthis.on('finalize', () => this.#onFinalize(opts));\n\t}\n\n\t#seg(): { segment: SegmentConfig; index: number } | undefined {\n\t\tconst index = Math.max(0, Math.min(this.#cursor.segmentIndex, this.#segments.length - 1));\n\t\tconst segment = this.#segments[index];\n\t\tif (!segment) return undefined;\n\t\tthis.#cursor.positionInSegment = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.#cursor.positionInSegment, segment.len - 1)\n\t\t);\n\t\treturn { segment, index };\n\t}\n\n\t#navigate(direction: 1 | -1) {\n\t\tthis.inlineError = '';\n\t\tthis.#pendingTensDigit = null;\n\t\tconst ctx = this.#seg();\n\t\tif (!ctx) return;\n\t\tthis.#cursor.segmentIndex = Math.max(\n\t\t\t0,\n\t\t\tMath.min(this.#segments.length - 1, ctx.index + direction)\n\t\t);\n\t\tthis.#cursor.positionInSegment = 0;\n\t\tthis.#segmentSelected = true;\n\t}\n\n\t#adjust(direction: 1 | -1) {\n\t\tconst ctx = this.#seg();\n\t\tif (!ctx) return;\n\t\tconst { segment } = ctx;\n\t\tconst raw = this.#segmentValues[segment.type];\n\t\tconst isBlank = !raw || raw.replace(/_/g, '') === '';\n\t\tconst num = Number.parseInt((raw || '0').replace(/_/g, '0'), 10) || 0;\n\t\tconst bounds = segmentBounds(\n\t\t\tsegment.type,\n\t\t\tparse(this.#segmentValues),\n\t\t\tthis.#minDate,\n\t\t\tthis.#maxDate\n\t\t);\n\n\t\tlet next: number;\n\t\tif (isBlank) {\n\t\t\tnext = direction === 1 ? bounds.min : bounds.max;\n\t\t} else {\n\t\t\tnext = Math.max(Math.min(bounds.max, num + direction), bounds.min);\n\t\t}\n\n\t\tthis.#segmentValues = {\n\t\t\t...this.#segmentValues,\n\t\t\t[segment.type]: next.toString().padStart(segment.len, '0'),\n\t\t};\n\t\tthis.#segmentSelected = true;\n\t\tthis.#pendingTensDigit = null;\n\t\tthis.#refresh();\n\t}\n\n\t#onCursor(key?: string) {\n\t\tif (!key) return;\n\t\tswitch (key) {\n\t\t\tcase 'right':\n\t\t\t\treturn this.#navigate(1);\n\t\t\tcase 'left':\n\t\t\t\treturn this.#navigate(-1);\n\t\t\tcase 'up':\n\t\t\t\treturn this.#adjust(1);\n\t\t\tcase 'down':\n\t\t\t\treturn this.#adjust(-1);\n\t\t}\n\t}\n\n\t#onKey(char: string | undefined, key: Key) {\n\t\t// Backspace\n\t\tconst isBackspace =\n\t\t\tkey?.name === 'backspace' ||\n\t\t\tkey?.sequence === '\\x7f' ||\n\t\t\tkey?.sequence === '\\b' ||\n\t\t\tchar === '\\x7f' ||\n\t\t\tchar === '\\b';\n\t\tif (isBackspace) {\n\t\t\tthis.inlineError = '';\n\t\t\tconst ctx = this.#seg();\n\t\t\tif (!ctx) return;\n\t\t\tif (!this.#segmentValues[ctx.segment.type].replace(/_/g, '')) {\n\t\t\t\tthis.#navigate(-1);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#segmentValues[ctx.segment.type] = '_'.repeat(ctx.segment.len);\n\t\t\tthis.#segmentSelected = true;\n\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\tthis.#refresh();\n\t\t\treturn;\n\t\t}\n\n\t\t// Tab navigation\n\t\tif (key?.name === 'tab') {\n\t\t\tthis.inlineError = '';\n\t\t\tconst ctx = this.#seg();\n\t\t\tif (!ctx) return;\n\t\t\tconst dir = key.shift ? -1 : 1;\n\t\t\tconst next = ctx.index + dir;\n\t\t\tif (next >= 0 && next < this.#segments.length) {\n\t\t\t\tthis.#cursor.segmentIndex = next;\n\t\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\t\tthis.#segmentSelected = true;\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Digit input\n\t\tif (char && /^[0-9]$/.test(char)) {\n\t\t\tconst ctx = this.#seg();\n\t\t\tif (!ctx) return;\n\t\t\tconst { segment } = ctx;\n\t\t\tconst isBlank = !this.#segmentValues[segment.type].replace(/_/g, '');\n\n\t\t\t// Pending tens digit: complete the two-digit entry\n\t\t\tif (this.#segmentSelected && this.#pendingTensDigit !== null && !isBlank) {\n\t\t\t\tconst newVal = this.#pendingTensDigit + char;\n\t\t\t\tconst newParts = { ...this.#segmentValues, [segment.type]: newVal };\n\t\t\t\tconst err = this.#validateSegment(newParts, segment);\n\t\t\t\tif (err) {\n\t\t\t\t\tthis.inlineError = err;\n\t\t\t\t\tthis.#pendingTensDigit = null;\n\t\t\t\t\tthis.#segmentSelected = false;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.inlineError = '';\n\t\t\t\tthis.#segmentValues[segment.type] = newVal;\n\t\t\t\tthis.#pendingTensDigit = null;\n\t\t\t\tthis.#segmentSelected = false;\n\t\t\t\tthis.#refresh();\n\t\t\t\tif (ctx.index < this.#segments.length - 1) {\n\t\t\t\t\tthis.#cursor.segmentIndex = ctx.index + 1;\n\t\t\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\t\t\tthis.#segmentSelected = true;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Clear-on-type: typing into a selected filled segment clears it first\n\t\t\tif (this.#segmentSelected && !isBlank) {\n\t\t\t\tthis.#segmentValues[segment.type] = '_'.repeat(segment.len);\n\t\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\t}\n\t\t\tthis.#segmentSelected = false;\n\t\t\tthis.#pendingTensDigit = null;\n\n\t\t\tconst display = this.#segmentValues[segment.type];\n\t\t\tconst firstBlank = display.indexOf('_');\n\t\t\tconst pos =\n\t\t\t\tfirstBlank >= 0 ? firstBlank : Math.min(this.#cursor.positionInSegment, segment.len - 1);\n\t\t\tif (pos < 0 || pos >= segment.len) return;\n\n\t\t\tlet newVal = display.slice(0, pos) + char + display.slice(pos + 1);\n\n\t\t\t// Smart digit placement\n\t\t\tlet shouldStaySelected = false;\n\t\t\tif (pos === 0 && display === '__' && (segment.type === 'month' || segment.type === 'day')) {\n\t\t\t\tconst digit = Number.parseInt(char, 10);\n\t\t\t\tnewVal = `0${char}`;\n\t\t\t\tshouldStaySelected = digit <= (segment.type === 'month' ? 1 : 2);\n\t\t\t}\n\t\t\tif (segment.type === 'year') {\n\t\t\t\tconst digits = display.replace(/_/g, '');\n\t\t\t\tnewVal = (digits + char).padStart(segment.len, '_');\n\t\t\t}\n\n\t\t\tif (!newVal.includes('_')) {\n\t\t\t\tconst newParts = { ...this.#segmentValues, [segment.type]: newVal };\n\t\t\t\tconst err = this.#validateSegment(newParts, segment);\n\t\t\t\tif (err) {\n\t\t\t\t\tthis.inlineError = err;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.inlineError = '';\n\n\t\t\tthis.#segmentValues[segment.type] = newVal;\n\n\t\t\t// Clamp only when the current segment is fully entered\n\t\t\tconst parsed = !newVal.includes('_') ? validParts(this.#segmentValues) : undefined;\n\t\t\tif (parsed) {\n\t\t\t\tconst { year, month } = parsed;\n\t\t\t\tconst maxDay = daysInMonth(year, month);\n\t\t\t\tthis.#segmentValues = {\n\t\t\t\t\tyear: String(Math.max(0, Math.min(9999, year))).padStart(4, '0'),\n\t\t\t\t\tmonth: String(Math.max(1, Math.min(12, month))).padStart(2, '0'),\n\t\t\t\t\tday: String(Math.max(1, Math.min(maxDay, parsed.day))).padStart(2, '0'),\n\t\t\t\t};\n\t\t\t}\n\t\t\tthis.#refresh();\n\n\t\t\t// Advance cursor\n\t\t\tconst nextBlank = newVal.indexOf('_');\n\t\t\tif (shouldStaySelected) {\n\t\t\t\tthis.#segmentSelected = true;\n\t\t\t\tthis.#pendingTensDigit = char;\n\t\t\t} else if (nextBlank >= 0) {\n\t\t\t\tthis.#cursor.positionInSegment = nextBlank;\n\t\t\t} else if (firstBlank >= 0 && ctx.index < this.#segments.length - 1) {\n\t\t\t\tthis.#cursor.segmentIndex = ctx.index + 1;\n\t\t\t\tthis.#cursor.positionInSegment = 0;\n\t\t\t\tthis.#segmentSelected = true;\n\t\t\t} else {\n\t\t\t\tthis.#cursor.positionInSegment = Math.min(pos + 1, segment.len - 1);\n\t\t\t}\n\t\t}\n\t}\n\n\t#validateSegment(parts: DateParts, seg: SegmentConfig): string | undefined {\n\t\tconst { month, day } = parse(parts);\n\t\tif (seg.type === 'month' && (month < 0 || month > 12)) {\n\t\t\treturn settings.date.messages.invalidMonth;\n\t\t}\n\t\tif (seg.type === 'day' && (day < 0 || day > 31)) {\n\t\t\treturn settings.date.messages.invalidDay(31, 'any month');\n\t\t}\n\t\treturn undefined;\n\t}\n\n\t#onFinalize(opts: DateOptions) {\n\t\tconst { year, month, day } = parse(this.#segmentValues);\n\t\tif (year && month && day) {\n\t\t\tconst maxDay = daysInMonth(year, month);\n\t\t\tthis.#segmentValues = {\n\t\t\t\t...this.#segmentValues,\n\t\t\t\tday: String(Math.min(day, maxDay)).padStart(2, '0'),\n\t\t\t};\n\t\t}\n\t\tthis.value = toDate(this.#segmentValues) ?? opts.defaultValue ?? undefined;\n\t}\n}\n","import Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface GroupMultiSelectOptions<T extends { value: any }>\n\textends PromptOptions<T['value'][], GroupMultiSelectPrompt<T>> {\n\toptions: Record<string, T[]>;\n\tinitialValues?: T['value'][];\n\trequired?: boolean;\n\tcursorAt?: T['value'];\n\tselectableGroups?: boolean;\n}\nexport default class GroupMultiSelectPrompt<T extends { value: any }> extends Prompt<T['value'][]> {\n\toptions: (T & { group: string | boolean })[];\n\tcursor = 0;\n\t#selectableGroups: boolean;\n\n\tgetGroupItems(group: string): T[] {\n\t\treturn this.options.filter((o) => o.group === group);\n\t}\n\n\tisGroupSelected(group: string) {\n\t\tconst items = this.getGroupItems(group);\n\t\tconst value = this.value;\n\t\tif (value === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\treturn items.every((i) => value.includes(i.value));\n\t}\n\n\tprivate toggleValue() {\n\t\tconst item = this.options[this.cursor];\n\t\tif (this.value === undefined) {\n\t\t\tthis.value = [];\n\t\t}\n\t\tif (item.group === true) {\n\t\t\tconst group = item.value;\n\t\t\tconst groupedItems = this.getGroupItems(group);\n\t\t\tif (this.isGroupSelected(group)) {\n\t\t\t\tthis.value = this.value.filter(\n\t\t\t\t\t(v: string) => groupedItems.findIndex((i) => i.value === v) === -1\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tthis.value = [...this.value, ...groupedItems.map((i) => i.value)];\n\t\t\t}\n\t\t\tthis.value = Array.from(new Set(this.value));\n\t\t} else {\n\t\t\tconst selected = this.value.includes(item.value);\n\t\t\tthis.value = selected\n\t\t\t\t? this.value.filter((v: T['value']) => v !== item.value)\n\t\t\t\t: [...this.value, item.value];\n\t\t}\n\t}\n\n\tconstructor(opts: GroupMultiSelectOptions<T>) {\n\t\tsuper(opts, false);\n\t\tconst { options } = opts;\n\t\tthis.#selectableGroups = opts.selectableGroups !== false;\n\t\tthis.options = Object.entries(options).flatMap(([key, option]) => [\n\t\t\t{ value: key, group: true, label: key },\n\t\t\t...option.map((opt) => ({ ...opt, group: key })),\n\t\t]) as any;\n\t\tthis.value = [...(opts.initialValues ?? [])];\n\t\tthis.cursor = Math.max(\n\t\t\tthis.options.findIndex(({ value }) => value === opts.cursorAt),\n\t\t\tthis.#selectableGroups ? 0 : 1\n\t\t);\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up': {\n\t\t\t\t\tthis.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n\t\t\t\t\tconst currentIsGroup = this.options[this.cursor]?.group === true;\n\t\t\t\t\tif (!this.#selectableGroups && currentIsGroup) {\n\t\t\t\t\t\tthis.cursor = this.cursor === 0 ? this.options.length - 1 : this.cursor - 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right': {\n\t\t\t\t\tthis.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n\t\t\t\t\tconst currentIsGroup = this.options[this.cursor]?.group === true;\n\t\t\t\t\tif (!this.#selectableGroups && currentIsGroup) {\n\t\t\t\t\t\tthis.cursor = this.cursor === this.options.length - 1 ? 0 : this.cursor + 1;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'space':\n\t\t\t\t\tthis.toggleValue();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n}\n","import type { Key } from 'node:readline';\nimport { styleText } from 'node:util';\nimport { findTextCursor } from '../utils/cursor.js';\nimport { type Action, settings } from '../utils/index.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface MultiLineOptions extends PromptOptions<string, MultiLinePrompt> {\n\tplaceholder?: string;\n\tdefaultValue?: string;\n\tshowSubmit?: boolean;\n}\n\nexport default class MultiLinePrompt extends Prompt<string> {\n\t#lastKeyWasReturn = false;\n\t#showSubmit: boolean;\n\tpublic focused: 'editor' | 'submit' = 'editor';\n\n\tget userInputWithCursor() {\n\t\tif (this.state === 'submit') {\n\t\t\treturn this.userInput;\n\t\t}\n\t\tconst userInput = this.userInput;\n\t\tif (this.cursor >= userInput.length) {\n\t\t\treturn `${userInput}█`;\n\t\t}\n\t\tconst s1 = userInput.slice(0, this.cursor);\n\t\tconst s2 = userInput[this.cursor];\n\t\tconst s3 = userInput.slice(this.cursor + 1);\n\t\tif (s2 === '\\n') return `${s1}█\\n${s3}`;\n\t\treturn `${s1}${styleText('inverse', s2)}${s3}`;\n\t}\n\tget cursor() {\n\t\treturn this._cursor;\n\t}\n\t#insertAtCursor(char: string) {\n\t\tif (this.userInput.length === 0) {\n\t\t\tthis._setUserInput(char);\n\t\t\treturn;\n\t\t}\n\t\tthis._setUserInput(\n\t\t\tthis.userInput.slice(0, this.cursor) + char + this.userInput.slice(this.cursor)\n\t\t);\n\t}\n\t#handleCursor(key?: Action) {\n\t\tconst text = this.value ?? '';\n\t\tswitch (key) {\n\t\t\tcase 'up':\n\t\t\t\tthis._cursor = findTextCursor(this._cursor, 0, -1, text);\n\t\t\t\treturn;\n\t\t\tcase 'down':\n\t\t\t\tthis._cursor = findTextCursor(this._cursor, 0, 1, text);\n\t\t\t\treturn;\n\t\t\tcase 'left':\n\t\t\t\tthis._cursor = findTextCursor(this._cursor, -1, 0, text);\n\t\t\t\treturn;\n\t\t\tcase 'right':\n\t\t\t\tthis._cursor = findTextCursor(this._cursor, 1, 0, text);\n\t\t\t\treturn;\n\t\t}\n\t}\n\n\tprotected override _shouldSubmit(_char: string | undefined, _key: Key): boolean {\n\t\tif (this.#showSubmit) {\n\t\t\tif (this.focused === 'submit') {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\tthis.#insertAtCursor('\\n');\n\t\t\tthis._cursor++;\n\t\t\treturn false;\n\t\t}\n\t\tconst wasReturn = this.#lastKeyWasReturn;\n\t\tthis.#lastKeyWasReturn = true;\n\t\tif (wasReturn) {\n\t\t\tif (this.userInput[this.cursor - 1] === '\\n') {\n\t\t\t\tthis._setUserInput(\n\t\t\t\t\tthis.userInput.slice(0, this.cursor - 1) + this.userInput.slice(this.cursor)\n\t\t\t\t);\n\t\t\t\tthis._cursor--;\n\t\t\t}\n\t\t\treturn true;\n\t\t}\n\t\tthis.#insertAtCursor('\\n');\n\t\tthis._cursor++;\n\t\treturn false;\n\t}\n\n\tconstructor(opts: MultiLineOptions) {\n\t\tsuper(opts, false);\n\t\tthis.#showSubmit = opts.showSubmit ?? false;\n\n\t\tthis.on('key', (char, key) => {\n\t\t\tif (key?.name && settings.actions.has(key.name as Action)) {\n\t\t\t\tthis.#handleCursor(key.name as Action);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (char === '\\t' && this.#showSubmit) {\n\t\t\t\tthis.focused = this.focused === 'editor' ? 'submit' : 'editor';\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (key?.name === 'return') {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.#lastKeyWasReturn = false;\n\t\t\tif (key?.name === 'backspace' && this.cursor > 0) {\n\t\t\t\tthis._setUserInput(\n\t\t\t\t\tthis.userInput.slice(0, this.cursor - 1) + this.userInput.slice(this.cursor)\n\t\t\t\t);\n\t\t\t\tthis._cursor--;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (key?.name === 'delete' && this.cursor < this.userInput.length) {\n\t\t\t\tthis._setUserInput(\n\t\t\t\t\tthis.userInput.slice(0, this.cursor) + this.userInput.slice(this.cursor + 1)\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (char) {\n\t\t\t\tif (this.#showSubmit && this.focused === 'submit') {\n\t\t\t\t\tthis.focused = 'editor';\n\t\t\t\t}\n\t\t\t\tthis.#insertAtCursor(char ?? '');\n\t\t\t\tthis._cursor++;\n\t\t\t}\n\t\t});\n\n\t\tthis.on('userInput', (input) => {\n\t\t\tthis._setValue(input);\n\t\t});\n\t\tthis.on('finalize', () => {\n\t\t\tif (!this.value) {\n\t\t\t\tthis.value = opts.defaultValue;\n\t\t\t}\n\t\t\tif (this.value === undefined) {\n\t\t\t\tthis.value = '';\n\t\t\t}\n\t\t});\n\t}\n}\n","import { findCursor } from '../utils/cursor.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\ninterface OptionLike {\n\tvalue: any;\n\tdisabled?: boolean;\n}\n\nexport interface MultiSelectOptions<T extends OptionLike>\n\textends PromptOptions<T['value'][], MultiSelectPrompt<T>> {\n\toptions: T[];\n\tinitialValues?: T['value'][];\n\trequired?: boolean;\n\tcursorAt?: T['value'];\n}\nexport default class MultiSelectPrompt<T extends OptionLike> extends Prompt<T['value'][]> {\n\toptions: T[];\n\tcursor = 0;\n\n\tprivate get _value(): T['value'] {\n\t\treturn this.options[this.cursor].value;\n\t}\n\n\tprivate get _enabledOptions(): T[] {\n\t\treturn this.options.filter((option) => option.disabled !== true);\n\t}\n\n\tprivate toggleAll() {\n\t\tconst enabledOptions = this._enabledOptions;\n\t\tconst allSelected = this.value !== undefined && this.value.length === enabledOptions.length;\n\t\tthis.value = allSelected ? [] : enabledOptions.map((v) => v.value);\n\t}\n\n\tprivate toggleInvert() {\n\t\tconst value = this.value;\n\t\tif (!value) {\n\t\t\treturn;\n\t\t}\n\t\tconst notSelected = this._enabledOptions.filter((v) => !value.includes(v.value));\n\t\tthis.value = notSelected.map((v) => v.value);\n\t}\n\n\tprivate toggleValue() {\n\t\tif (this.value === undefined) {\n\t\t\tthis.value = [];\n\t\t}\n\t\tconst selected = this.value.includes(this._value);\n\t\tthis.value = selected\n\t\t\t? this.value.filter((value) => value !== this._value)\n\t\t\t: [...this.value, this._value];\n\t}\n\n\tconstructor(opts: MultiSelectOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\t\tthis.value = [...(opts.initialValues ?? [])];\n\t\tconst cursor = Math.max(\n\t\t\tthis.options.findIndex(({ value }) => value === opts.cursorAt),\n\t\t\t0\n\t\t);\n\t\tthis.cursor = this.options[cursor].disabled ? findCursor<T>(cursor, 1, this.options) : cursor;\n\t\tthis.on('key', (char) => {\n\t\t\tif (char === 'a') {\n\t\t\t\tthis.toggleAll();\n\t\t\t}\n\t\t\tif (char === 'i') {\n\t\t\t\tthis.toggleInvert();\n\t\t\t}\n\t\t});\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, -1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, 1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'space':\n\t\t\t\t\tthis.toggleValue();\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\t}\n}\n","import { styleText } from 'node:util';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface PasswordOptions extends PromptOptions<string, PasswordPrompt> {\n\tmask?: string;\n}\nexport default class PasswordPrompt extends Prompt<string> {\n\tprivate _mask = '•';\n\tget cursor() {\n\t\treturn this._cursor;\n\t}\n\tget masked() {\n\t\treturn this.userInput.replaceAll(/./g, this._mask);\n\t}\n\tget userInputWithCursor() {\n\t\tif (this.state === 'submit' || this.state === 'cancel') {\n\t\t\treturn this.masked;\n\t\t}\n\t\tconst userInput = this.userInput;\n\t\tif (this.cursor >= userInput.length) {\n\t\t\treturn `${this.masked}${styleText(['inverse', 'hidden'], '_')}`;\n\t\t}\n\t\tconst masked = this.masked;\n\t\tconst s1 = masked.slice(0, this.cursor);\n\t\tconst s2 = masked.slice(this.cursor);\n\t\treturn `${s1}${styleText('inverse', s2[0])}${s2.slice(1)}`;\n\t}\n\tclear() {\n\t\tthis._clearUserInput();\n\t}\n\tconstructor({ mask, ...opts }: PasswordOptions) {\n\t\tsuper(opts);\n\t\tthis._mask = mask ?? '•';\n\t\tthis.on('userInput', (input) => {\n\t\t\tthis._setValue(input);\n\t\t});\n\t}\n}\n","import { findCursor } from '../utils/cursor.js';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface SelectOptions<T extends { value: any; disabled?: boolean }>\n\textends PromptOptions<T['value'], SelectPrompt<T>> {\n\toptions: T[];\n\tinitialValue?: T['value'];\n}\nexport default class SelectPrompt<T extends { value: any; disabled?: boolean }> extends Prompt<\n\tT['value']\n> {\n\toptions: T[];\n\tcursor = 0;\n\n\tprivate get _selectedValue() {\n\t\treturn this.options[this.cursor];\n\t}\n\n\tprivate changeValue() {\n\t\tthis.value = this._selectedValue.value;\n\t}\n\n\tconstructor(opts: SelectOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\n\t\tconst initialCursor = this.options.findIndex(({ value }) => value === opts.initialValue);\n\t\tconst cursor = initialCursor === -1 ? 0 : initialCursor;\n\t\tthis.cursor = this.options[cursor].disabled ? findCursor<T>(cursor, 1, this.options) : cursor;\n\t\tthis.changeValue();\n\n\t\tthis.on('cursor', (key) => {\n\t\t\tswitch (key) {\n\t\t\t\tcase 'left':\n\t\t\t\tcase 'up':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, -1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'down':\n\t\t\t\tcase 'right':\n\t\t\t\t\tthis.cursor = findCursor<T>(this.cursor, 1, this.options);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthis.changeValue();\n\t\t});\n\t}\n}\n","import Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface SelectKeyOptions<T extends { value: string }>\n\textends PromptOptions<T['value'], SelectKeyPrompt<T>> {\n\toptions: T[];\n\tcaseSensitive?: boolean;\n}\nexport default class SelectKeyPrompt<T extends { value: string }> extends Prompt<T['value']> {\n\toptions: T[];\n\tcursor = 0;\n\n\tconstructor(opts: SelectKeyOptions<T>) {\n\t\tsuper(opts, false);\n\n\t\tthis.options = opts.options;\n\t\tconst caseSensitive = opts.caseSensitive === true;\n\t\tconst keys = this.options.map(({ value: [initial] }) => {\n\t\t\treturn caseSensitive ? initial : initial?.toLowerCase();\n\t\t});\n\t\tthis.cursor = Math.max(keys.indexOf(opts.initialValue), 0);\n\n\t\tthis.on('key', (key, keyInfo) => {\n\t\t\tif (!key) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst casedKey = caseSensitive && keyInfo.shift ? key.toUpperCase() : key;\n\t\t\tif (!keys.includes(casedKey)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst value = this.options.find(({ value: [initial] }) => {\n\t\t\t\treturn caseSensitive ? initial === casedKey : initial?.toLowerCase() === key;\n\t\t\t});\n\t\t\tif (value) {\n\t\t\t\tthis.value = value.value;\n\t\t\t\tthis.state = 'submit';\n\t\t\t\tthis.emit('submit');\n\t\t\t}\n\t\t});\n\t}\n}\n","import { styleText } from 'node:util';\nimport Prompt, { type PromptOptions } from './prompt.js';\n\nexport interface TextOptions extends PromptOptions<string, TextPrompt> {\n\tplaceholder?: string;\n\tdefaultValue?: string;\n}\n\nexport default class TextPrompt extends Prompt<string> {\n\tget userInputWithCursor() {\n\t\tif (this.state === 'submit') {\n\t\t\treturn this.userInput;\n\t\t}\n\t\tconst userInput = this.userInput;\n\t\tif (this.cursor >= userInput.length) {\n\t\t\treturn `${this.userInput}█`;\n\t\t}\n\t\tconst s1 = userInput.slice(0, this.cursor);\n\t\tconst [s2, ...s3] = userInput.slice(this.cursor);\n\t\treturn `${s1}${styleText('inverse', s2)}${s3.join('')}`;\n\t}\n\tget cursor() {\n\t\treturn this._cursor;\n\t}\n\tconstructor(opts: TextOptions) {\n\t\tsuper({\n\t\t\t...opts,\n\t\t\tinitialUserInput: opts.initialUserInput ?? opts.initialValue,\n\t\t});\n\n\t\tthis.on('userInput', (input) => {\n\t\t\tthis._setValue(input);\n\t\t});\n\t\tthis.on('finalize', () => {\n\t\t\tif (!this.value) {\n\t\t\t\tthis.value = opts.defaultValue;\n\t\t\t}\n\t\t\tif (this.value === undefined) {\n\t\t\t\tthis.value = '';\n\t\t\t}\n\t\t});\n\t}\n}\n"],"names":["findCursor","cursor","delta","options","opt","newCursor","maxCursor","clampedCursor","findTextCursor","deltaX","deltaY","value","lines","cursorY","cursorX","line","i","actions","DEFAULT_MONTH_NAMES","settings","days","month","min","max","updateSettings","updates","aliases","alias","action","messages","date","isActionKey","key","diffLines","a","b","aLines","bLines","numLines","diff","isWindows","CANCEL_SYMBOL","isCancel","setRawMode","input","block","stdin","output","stdout","overwrite","hideCursor","rl","readline","ReadStream","clear","data","name","sequence","str","dx","dy","getColumns","getRows","wrapTextWithPrefix","text","prefix","startPrefix","lineFormatter","columns","wrapAnsi","index","lineString","g$1","trackValue","render","signal","opts","event","params","cb","cbs","cleanup","subscriber","resolve","char","_key","_char","write","problem","frame","rows","diffOffsetAfter","diffOffsetBefore","diffLine","erase","adjustedDiffLine","newLines","getCursorForValue","selected","items","item","defaultFilter","option","normalisedValue","multiple","values","T$1","Prompt","#cursor","#lastUserInput","#filterFn","#options","#placeholder","styleText","s1","s2","s3","initialValues","selectedValue","selectedIndex","#onKey","#onUserInputChanged","isUpKey","isDownKey","isReturnKey","isEmptyOrOnlyTab","placeholder","placeholderMatchesOption","v","valueCursor","focusedOption","ConfirmPrompt","confirm","SEGMENTS","segmentsFor","fmt","c","detectLocaleFormat","locale","parts","segments","separator","p","parseSegmentToNum","s","parse","daysInMonth","year","validParts","day","d","toDate","segmentBounds","type","ctx","minDate","maxDate","minP","maxP","DatePrompt","#segments","#separator","#segmentValues","#minDate","#maxDate","#segmentSelected","#pendingTensDigit","#format","#refresh","detected","sep","initialDate","segmentValues","initialDisplay","#onCursor","#onFinalize","#seg","segment","#navigate","direction","#adjust","raw","isBlank","num","bounds","next","dir","newVal","newParts","err","#validateSegment","display","firstBlank","pos","shouldStaySelected","digit","parsed","maxDay","nextBlank","seg","GroupMultiSelectPrompt","#selectableGroups","group","o","groupedItems","currentIsGroup","MultiLinePrompt","#lastKeyWasReturn","#showSubmit","userInput","#insertAtCursor","#handleCursor","wasReturn","enabledOptions","allSelected","notSelected","PasswordPrompt","masked","mask","SelectPrompt","initialCursor","SelectKeyPrompt","caseSensitive","keys","initial","keyInfo","casedKey","TextPrompt"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@clack/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.mjs",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -46,8 +46,11 @@
|
|
|
46
46
|
"url": "https://twitter.com/n_moore"
|
|
47
47
|
},
|
|
48
48
|
"license": "MIT",
|
|
49
|
+
"engines": {
|
|
50
|
+
"node": ">= 20.12.0"
|
|
51
|
+
},
|
|
49
52
|
"dependencies": {
|
|
50
|
-
"fast-wrap-ansi": "^0.
|
|
53
|
+
"fast-wrap-ansi": "^0.2.0",
|
|
51
54
|
"sisteransi": "^1.0.5"
|
|
52
55
|
},
|
|
53
56
|
"devDependencies": {
|
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @clack/prompts
|
|
2
2
|
|
|
3
|
+
## 1.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- ea5702e: fix: add engines field expressing node >=20.12 requirement
|
|
8
|
+
- 814ab9a: Add new multiline prompt for multi-line text input.
|
|
9
|
+
|
|
10
|
+
### Patch Changes
|
|
11
|
+
|
|
12
|
+
- 5b897a7: Fix mixed type-only and runtime exports from @clack/core.
|
|
13
|
+
- Updated dependencies [78fd3ae]
|
|
14
|
+
- Updated dependencies [ea5702e]
|
|
15
|
+
- Updated dependencies [814ab9a]
|
|
16
|
+
- @clack/core@1.3.0
|
|
17
|
+
|
|
3
18
|
## 1.2.0
|
|
4
19
|
|
|
5
20
|
### Minor Changes
|