@maizzle/framework 6.0.0-rc.16 → 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 +20 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/{build.mjs → build.js} +14 -10
- 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 +13 -2
- package/dist/components/Section.vue +10 -0
- package/dist/components/Tailwind.vue +43 -0
- package/dist/components/{utils.d.mts → utils.d.ts} +1 -1
- package/dist/components/utils.d.ts.map +1 -0
- package/dist/components/{utils.mjs → utils.js} +1 -1
- package/dist/components/utils.js.map +1 -0
- package/dist/composables/{defineConfig.d.mts → defineConfig.d.ts} +2 -2
- package/dist/composables/defineConfig.d.ts.map +1 -0
- package/dist/composables/{defineConfig.mjs → defineConfig.js} +3 -3
- package/dist/composables/defineConfig.js.map +1 -0
- package/dist/composables/{renderContext.d.mts → renderContext.d.ts} +11 -5
- package/dist/composables/renderContext.d.ts.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.d.mts → useConfig.d.ts} +2 -2
- package/dist/composables/useConfig.d.ts.map +1 -0
- package/dist/composables/{useConfig.mjs → useConfig.js} +1 -1
- package/dist/composables/useConfig.js.map +1 -0
- package/dist/composables/{useDoctype.d.mts → useDoctype.d.ts} +1 -1
- package/dist/composables/useDoctype.d.ts.map +1 -0
- package/dist/composables/{useDoctype.mjs → useDoctype.js} +2 -2
- package/dist/composables/useDoctype.js.map +1 -0
- package/dist/composables/{useEvent.d.mts → useEvent.d.ts} +2 -2
- package/dist/composables/useEvent.d.ts.map +1 -0
- package/dist/composables/{useEvent.mjs → useEvent.js} +2 -2
- package/dist/composables/useEvent.js.map +1 -0
- package/dist/composables/{useFont.d.mts → useFont.d.ts} +1 -1
- package/dist/composables/useFont.d.ts.map +1 -0
- package/dist/composables/{useFont.mjs → useFont.js} +2 -2
- package/dist/composables/useFont.js.map +1 -0
- package/dist/composables/{useOutlookFallback.d.mts → useOutlookFallback.d.ts} +1 -1
- package/dist/composables/useOutlookFallback.d.ts.map +1 -0
- package/dist/composables/{useOutlookFallback.mjs → useOutlookFallback.js} +1 -1
- package/dist/composables/useOutlookFallback.js.map +1 -0
- package/dist/composables/{usePlaintext.d.mts → usePlaintext.d.ts} +1 -1
- package/dist/composables/usePlaintext.d.ts.map +1 -0
- package/dist/composables/{usePlaintext.mjs → usePlaintext.js} +2 -2
- package/dist/composables/usePlaintext.js.map +1 -0
- package/dist/composables/{usePreheader.d.mts → usePreheader.d.ts} +1 -1
- package/dist/composables/usePreheader.d.ts.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.d.mts → defaults.d.ts} +2 -2
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/{defaults.mjs → defaults.js} +8 -2
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/{index.d.mts → index.d.ts} +4 -4
- package/dist/config/index.d.ts.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.mts → index.d.ts} +10 -4
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/{index.mjs → index.js} +20 -4
- package/dist/events/index.js.map +1 -0
- package/dist/index.d.ts +37 -0
- package/dist/index.js +37 -0
- package/dist/{plaintext.d.mts → plaintext.d.ts} +1 -1
- package/dist/plaintext.d.ts.map +1 -0
- package/dist/{plaintext.mjs → plaintext.js} +1 -1
- package/dist/plaintext.js.map +1 -0
- package/dist/{plugin.d.mts → plugin.d.ts} +2 -2
- package/dist/plugin.d.ts.map +1 -0
- package/dist/{plugin.mjs → plugin.js} +5 -5
- package/dist/plugin.js.map +1 -0
- package/dist/plugins/postcss/{mergeMediaQueries.d.mts → mergeMediaQueries.d.ts} +2 -2
- package/dist/plugins/postcss/mergeMediaQueries.d.ts.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.d.mts → pruneVars.d.ts} +1 -1
- package/dist/plugins/postcss/pruneVars.d.ts.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.d.mts → quoteFontFamilies.d.ts} +1 -1
- package/dist/plugins/postcss/quoteFontFamilies.d.ts.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.d.mts → removeDeclarations.d.ts} +1 -1
- package/dist/plugins/postcss/removeDeclarations.d.ts.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.d.ts +16 -0
- package/dist/plugins/postcss/resolveMaizzleImports.d.ts.map +1 -0
- package/dist/plugins/postcss/resolveMaizzleImports.js +40 -0
- package/dist/plugins/postcss/resolveMaizzleImports.js.map +1 -0
- package/dist/plugins/postcss/{resolveProps.d.mts → resolveProps.d.ts} +1 -1
- package/dist/plugins/postcss/resolveProps.d.ts.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.d.mts → tailwindCleanup.d.ts} +2 -2
- package/dist/plugins/postcss/tailwindCleanup.d.ts.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.d.mts → prepare.d.ts} +1 -1
- package/dist/prepare.d.ts.map +1 -0
- package/dist/{prepare.mjs → prepare.js} +4 -4
- package/dist/prepare.js.map +1 -0
- package/dist/render/{createRenderer.d.mts → createRenderer.d.ts} +4 -3
- package/dist/render/createRenderer.d.ts.map +1 -0
- package/dist/render/{createRenderer.mjs → createRenderer.js} +21 -12
- package/dist/render/createRenderer.js.map +1 -0
- package/dist/render/index.d.ts +18 -0
- package/dist/render/index.d.ts.map +1 -0
- package/dist/render/index.js +45 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/{injectFonts.d.mts → injectFonts.d.ts} +2 -2
- package/dist/render/injectFonts.d.ts.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.d.mts → codeBlockExtract.d.ts} +1 -1
- package/dist/render/plugins/codeBlockExtract.d.ts.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.d.mts → markdownExtract.d.ts} +1 -1
- package/dist/render/plugins/markdownExtract.d.ts.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.d.mts → rawExtract.d.ts} +1 -1
- package/dist/render/plugins/rawExtract.d.ts.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.d.mts → rowSourceLocation.d.ts} +1 -1
- package/dist/render/plugins/rowSourceLocation.d.ts.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.d.mts → serve.d.ts} +2 -2
- package/dist/serve.d.ts.map +1 -0
- package/dist/{serve.mjs → serve.js} +23 -14
- package/dist/serve.js.map +1 -0
- package/dist/server/{compatibility.d.mts → compatibility.d.ts} +2 -2
- package/dist/server/compatibility.d.ts.map +1 -0
- package/dist/server/{compatibility.mjs → compatibility.js} +4 -4
- package/dist/server/compatibility.js.map +1 -0
- package/dist/server/{email.d.mts → email.d.ts} +2 -2
- package/dist/server/email.d.ts.map +1 -0
- package/dist/server/{email.mjs → email.js} +1 -1
- package/dist/server/email.js.map +1 -0
- package/dist/server/{linter.d.mts → linter.d.ts} +2 -2
- package/dist/server/linter.d.ts.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.d.mts → sfc-utils.d.ts} +1 -1
- package/dist/server/sfc-utils.d.ts.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/server/ui/pages/Preview.vue +78 -19
- package/dist/transformers/{addAttributes.d.mts → addAttributes.d.ts} +2 -2
- package/dist/transformers/addAttributes.d.ts.map +1 -0
- package/dist/transformers/{addAttributes.mjs → addAttributes.js} +3 -3
- package/dist/transformers/addAttributes.js.map +1 -0
- package/dist/transformers/{attributeToStyle.d.mts → attributeToStyle.d.ts} +2 -2
- package/dist/transformers/attributeToStyle.d.ts.map +1 -0
- package/dist/transformers/{attributeToStyle.mjs → attributeToStyle.js} +3 -3
- package/dist/transformers/attributeToStyle.js.map +1 -0
- package/dist/transformers/{base.d.mts → base.d.ts} +2 -2
- package/dist/transformers/base.d.ts.map +1 -0
- package/dist/transformers/{base.mjs → base.js} +6 -6
- package/dist/transformers/base.js.map +1 -0
- package/dist/transformers/{columnWidth.d.mts → columnWidth.d.ts} +1 -1
- package/dist/transformers/columnWidth.d.ts.map +1 -0
- package/dist/transformers/{columnWidth.mjs → columnWidth.js} +3 -3
- package/dist/transformers/columnWidth.js.map +1 -0
- package/dist/transformers/{entities.d.mts → entities.d.ts} +2 -2
- package/dist/transformers/entities.d.ts.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.d.mts → defaults.d.ts} +1 -1
- package/dist/transformers/filters/defaults.d.ts.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.d.mts → index.d.ts} +2 -2
- package/dist/transformers/filters/index.d.ts.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.d.mts → format.d.ts} +2 -2
- package/dist/transformers/format.d.ts.map +1 -0
- package/dist/transformers/{format.mjs → format.js} +1 -1
- package/dist/transformers/format.js.map +1 -0
- package/dist/transformers/{index.d.mts → index.d.ts} +4 -3
- package/dist/transformers/index.d.ts.map +1 -0
- package/dist/transformers/index.js +113 -0
- package/dist/transformers/index.js.map +1 -0
- package/dist/transformers/{inlineCSS.d.mts → inlineCSS.d.ts} +2 -2
- package/dist/transformers/inlineCSS.d.ts.map +1 -0
- package/dist/transformers/{inlineCSS.mjs → inlineCSS.js} +12 -6
- package/dist/transformers/inlineCSS.js.map +1 -0
- package/dist/transformers/{inlineLink.d.mts → inlineLink.d.ts} +1 -1
- package/dist/transformers/inlineLink.d.ts.map +1 -0
- package/dist/transformers/{inlineLink.mjs → inlineLink.js} +3 -3
- package/dist/transformers/inlineLink.js.map +1 -0
- package/dist/transformers/{minify.d.mts → minify.d.ts} +2 -2
- package/dist/transformers/minify.d.ts.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.d.mts → purgeCSS.d.ts} +2 -2
- package/dist/transformers/purgeCSS.d.ts.map +1 -0
- package/dist/transformers/{purgeCSS.mjs → purgeCSS.js} +49 -7
- package/dist/transformers/purgeCSS.js.map +1 -0
- package/dist/transformers/{removeAttributes.d.mts → removeAttributes.d.ts} +2 -2
- package/dist/transformers/removeAttributes.d.ts.map +1 -0
- package/dist/transformers/{removeAttributes.mjs → removeAttributes.js} +3 -3
- package/dist/transformers/removeAttributes.js.map +1 -0
- package/dist/transformers/{replaceStrings.d.mts → replaceStrings.d.ts} +2 -2
- package/dist/transformers/replaceStrings.d.ts.map +1 -0
- package/dist/transformers/{replaceStrings.mjs → replaceStrings.js} +1 -1
- package/dist/transformers/replaceStrings.js.map +1 -0
- package/dist/transformers/{safeClassNames.d.mts → safeClassNames.d.ts} +2 -2
- package/dist/transformers/safeClassNames.d.ts.map +1 -0
- package/dist/transformers/{safeClassNames.mjs → safeClassNames.js} +3 -3
- package/dist/transformers/safeClassNames.js.map +1 -0
- package/dist/transformers/{shorthandCSS.d.mts → shorthandCSS.d.ts} +2 -2
- package/dist/transformers/shorthandCSS.d.ts.map +1 -0
- package/dist/transformers/{shorthandCSS.mjs → shorthandCSS.js} +3 -3
- package/dist/transformers/shorthandCSS.js.map +1 -0
- package/dist/transformers/{sixHex.d.mts → sixHex.d.ts} +2 -2
- package/dist/transformers/sixHex.d.ts.map +1 -0
- package/dist/transformers/{sixHex.mjs → sixHex.js} +3 -3
- package/dist/transformers/sixHex.js.map +1 -0
- package/dist/transformers/tailwindComponent.d.ts +16 -0
- package/dist/transformers/tailwindComponent.d.ts.map +1 -0
- package/dist/transformers/tailwindComponent.js +93 -0
- package/dist/transformers/tailwindComponent.js.map +1 -0
- package/dist/transformers/{tailwindcss.d.mts → tailwindcss.d.ts} +2 -2
- package/dist/transformers/tailwindcss.d.ts.map +1 -0
- package/dist/transformers/{tailwindcss.mjs → tailwindcss.js} +6 -58
- package/dist/transformers/tailwindcss.js.map +1 -0
- package/dist/transformers/{urlQuery.d.mts → urlQuery.d.ts} +2 -2
- package/dist/transformers/urlQuery.d.ts.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.mts → config.d.ts} +45 -4
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/{index.d.mts → index.d.ts} +2 -2
- package/dist/utils/ast/index.d.ts +4 -0
- package/dist/utils/ast/index.js +5 -0
- package/dist/utils/ast/{parser.d.mts → parser.d.ts} +1 -1
- package/dist/utils/ast/parser.d.ts.map +1 -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.d.mts → serializer.d.ts} +1 -1
- package/dist/utils/ast/serializer.d.ts.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.d.mts → walker.d.ts} +1 -1
- package/dist/utils/ast/walker.d.ts.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.d.ts +16 -0
- package/dist/utils/compileTailwindCss.d.ts.map +1 -0
- package/dist/utils/compileTailwindCss.js +55 -0
- package/dist/utils/compileTailwindCss.js.map +1 -0
- package/dist/utils/{decodeStyleEntities.d.mts → decodeStyleEntities.d.ts} +1 -1
- package/dist/utils/decodeStyleEntities.d.ts.map +1 -0
- package/dist/utils/{decodeStyleEntities.mjs → decodeStyleEntities.js} +1 -1
- package/dist/utils/decodeStyleEntities.js.map +1 -0
- package/dist/utils/{detect.d.mts → detect.d.ts} +1 -1
- package/dist/utils/detect.d.ts.map +1 -0
- package/dist/utils/{detect.mjs → detect.js} +1 -1
- package/dist/utils/detect.js.map +1 -0
- package/dist/utils/{url.d.mts → url.d.ts} +1 -1
- package/dist/utils/url.d.ts.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 +15 -8
- package/dist/build.d.mts +0 -19
- package/dist/build.d.mts.map +0 -1
- package/dist/build.mjs.map +0 -1
- package/dist/components/utils.d.mts.map +0 -1
- package/dist/components/utils.mjs.map +0 -1
- package/dist/composables/defineConfig.d.mts.map +0 -1
- package/dist/composables/defineConfig.mjs.map +0 -1
- package/dist/composables/renderContext.d.mts.map +0 -1
- package/dist/composables/renderContext.mjs.map +0 -1
- package/dist/composables/useConfig.d.mts.map +0 -1
- package/dist/composables/useConfig.mjs.map +0 -1
- package/dist/composables/useDoctype.d.mts.map +0 -1
- package/dist/composables/useDoctype.mjs.map +0 -1
- package/dist/composables/useEvent.d.mts.map +0 -1
- package/dist/composables/useEvent.mjs.map +0 -1
- package/dist/composables/useFont.d.mts.map +0 -1
- package/dist/composables/useFont.mjs.map +0 -1
- package/dist/composables/useOutlookFallback.d.mts.map +0 -1
- package/dist/composables/useOutlookFallback.mjs.map +0 -1
- package/dist/composables/usePlaintext.d.mts.map +0 -1
- package/dist/composables/usePlaintext.mjs.map +0 -1
- package/dist/composables/usePreheader.d.mts.map +0 -1
- package/dist/composables/usePreheader.mjs.map +0 -1
- package/dist/config/defaults.d.mts.map +0 -1
- package/dist/config/defaults.mjs.map +0 -1
- package/dist/config/index.d.mts.map +0 -1
- package/dist/config/index.mjs.map +0 -1
- package/dist/events/index.d.mts.map +0 -1
- package/dist/events/index.mjs.map +0 -1
- package/dist/index.d.mts +0 -34
- package/dist/index.mjs +0 -34
- package/dist/plaintext.d.mts.map +0 -1
- package/dist/plaintext.mjs.map +0 -1
- package/dist/plugin.d.mts.map +0 -1
- package/dist/plugin.mjs.map +0 -1
- package/dist/plugins/postcss/mergeMediaQueries.d.mts.map +0 -1
- package/dist/plugins/postcss/mergeMediaQueries.mjs.map +0 -1
- package/dist/plugins/postcss/pruneVars.d.mts.map +0 -1
- package/dist/plugins/postcss/pruneVars.mjs.map +0 -1
- package/dist/plugins/postcss/quoteFontFamilies.d.mts.map +0 -1
- package/dist/plugins/postcss/quoteFontFamilies.mjs.map +0 -1
- package/dist/plugins/postcss/removeDeclarations.d.mts.map +0 -1
- package/dist/plugins/postcss/removeDeclarations.mjs.map +0 -1
- package/dist/plugins/postcss/resolveProps.d.mts.map +0 -1
- package/dist/plugins/postcss/resolveProps.mjs.map +0 -1
- package/dist/plugins/postcss/tailwindCleanup.d.mts.map +0 -1
- package/dist/plugins/postcss/tailwindCleanup.mjs.map +0 -1
- package/dist/prepare.d.mts.map +0 -1
- package/dist/prepare.mjs.map +0 -1
- package/dist/render/createRenderer.d.mts.map +0 -1
- package/dist/render/createRenderer.mjs.map +0 -1
- package/dist/render/index.d.mts +0 -26
- package/dist/render/index.d.mts.map +0 -1
- package/dist/render/index.mjs +0 -46
- package/dist/render/index.mjs.map +0 -1
- package/dist/render/injectFonts.d.mts.map +0 -1
- package/dist/render/injectFonts.mjs.map +0 -1
- package/dist/render/plugins/codeBlockExtract.d.mts.map +0 -1
- package/dist/render/plugins/codeBlockExtract.mjs.map +0 -1
- package/dist/render/plugins/markdownExtract.d.mts.map +0 -1
- package/dist/render/plugins/markdownExtract.mjs.map +0 -1
- package/dist/render/plugins/rawExtract.d.mts.map +0 -1
- package/dist/render/plugins/rawExtract.mjs.map +0 -1
- package/dist/render/plugins/rowSourceLocation.d.mts.map +0 -1
- package/dist/render/plugins/rowSourceLocation.mjs.map +0 -1
- package/dist/serve.d.mts.map +0 -1
- package/dist/serve.mjs.map +0 -1
- package/dist/server/compatibility.d.mts.map +0 -1
- package/dist/server/compatibility.mjs.map +0 -1
- package/dist/server/email.d.mts.map +0 -1
- package/dist/server/email.mjs.map +0 -1
- package/dist/server/linter.d.mts.map +0 -1
- package/dist/server/linter.mjs.map +0 -1
- package/dist/server/sfc-utils.d.mts.map +0 -1
- package/dist/server/sfc-utils.mjs.map +0 -1
- package/dist/transformers/addAttributes.d.mts.map +0 -1
- package/dist/transformers/addAttributes.mjs.map +0 -1
- package/dist/transformers/attributeToStyle.d.mts.map +0 -1
- package/dist/transformers/attributeToStyle.mjs.map +0 -1
- package/dist/transformers/base.d.mts.map +0 -1
- package/dist/transformers/base.mjs.map +0 -1
- package/dist/transformers/columnWidth.d.mts.map +0 -1
- package/dist/transformers/columnWidth.mjs.map +0 -1
- package/dist/transformers/entities.d.mts.map +0 -1
- package/dist/transformers/entities.mjs.map +0 -1
- package/dist/transformers/filters/defaults.d.mts.map +0 -1
- package/dist/transformers/filters/defaults.mjs.map +0 -1
- package/dist/transformers/filters/index.d.mts.map +0 -1
- package/dist/transformers/filters/index.mjs.map +0 -1
- package/dist/transformers/format.d.mts.map +0 -1
- package/dist/transformers/format.mjs.map +0 -1
- package/dist/transformers/index.d.mts.map +0 -1
- package/dist/transformers/index.mjs +0 -85
- package/dist/transformers/index.mjs.map +0 -1
- package/dist/transformers/inlineCSS.d.mts.map +0 -1
- package/dist/transformers/inlineCSS.mjs.map +0 -1
- package/dist/transformers/inlineLink.d.mts.map +0 -1
- package/dist/transformers/inlineLink.mjs.map +0 -1
- package/dist/transformers/minify.d.mts.map +0 -1
- package/dist/transformers/minify.mjs.map +0 -1
- package/dist/transformers/msoWidthFromClass.d.mts +0 -19
- package/dist/transformers/msoWidthFromClass.d.mts.map +0 -1
- package/dist/transformers/msoWidthFromClass.mjs +0 -61
- package/dist/transformers/msoWidthFromClass.mjs.map +0 -1
- package/dist/transformers/purgeCSS.d.mts.map +0 -1
- package/dist/transformers/purgeCSS.mjs.map +0 -1
- package/dist/transformers/removeAttributes.d.mts.map +0 -1
- package/dist/transformers/removeAttributes.mjs.map +0 -1
- package/dist/transformers/replaceStrings.d.mts.map +0 -1
- package/dist/transformers/replaceStrings.mjs.map +0 -1
- package/dist/transformers/safeClassNames.d.mts.map +0 -1
- package/dist/transformers/safeClassNames.mjs.map +0 -1
- package/dist/transformers/shorthandCSS.d.mts.map +0 -1
- package/dist/transformers/shorthandCSS.mjs.map +0 -1
- package/dist/transformers/sixHex.d.mts.map +0 -1
- package/dist/transformers/sixHex.mjs.map +0 -1
- package/dist/transformers/tailwindcss.d.mts.map +0 -1
- package/dist/transformers/tailwindcss.mjs.map +0 -1
- package/dist/transformers/urlQuery.d.mts.map +0 -1
- package/dist/transformers/urlQuery.mjs.map +0 -1
- package/dist/types/config.d.mts.map +0 -1
- package/dist/utils/ast/index.d.mts +0 -4
- package/dist/utils/ast/index.mjs +0 -5
- package/dist/utils/ast/parser.d.mts.map +0 -1
- package/dist/utils/ast/parser.mjs.map +0 -1
- package/dist/utils/ast/serializer.d.mts.map +0 -1
- package/dist/utils/ast/serializer.mjs.map +0 -1
- package/dist/utils/ast/walker.d.mts.map +0 -1
- package/dist/utils/ast/walker.mjs.map +0 -1
- package/dist/utils/decodeStyleEntities.d.mts.map +0 -1
- package/dist/utils/decodeStyleEntities.mjs.map +0 -1
- package/dist/utils/detect.d.mts.map +0 -1
- package/dist/utils/detect.mjs.map +0 -1
- package/dist/utils/url.d.mts.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,11 +1,17 @@
|
|
|
1
|
-
import{styleText as
|
|
2
|
-
`),s=t.split(`
|
|
3
|
-
`),
|
|
4
|
-
`).
|
|
5
|
-
`)
|
|
6
|
-
`),
|
|
7
|
-
`)
|
|
8
|
-
`);this.output.write(
|
|
9
|
-
`).
|
|
10
|
-
`)),this._prevFrame=t;return}}this.output.write(M.down())}this.output.write(t),this.state==="initial"&&(this.state="active"),this._prevFrame=t}}};function W(r,t){if(r===void 0||t.length===0)return 0;const e=t.findIndex(s=>s.value===r);return e!==-1?e:0}function B(r,t){return(t.label??String(t.value)).toLowerCase().includes(r.toLowerCase())}function J(r,t){if(t)return r?t:t[0]}let H=class extends p{filteredOptions;multiple;isNavigating=!1;selectedValues=[];focusedValue;#e=0;#o="";#t;#n;#a;get cursor(){return this.#e}get userInputWithCursor(){if(!this.userInput)return y(["inverse","hidden"],"_");if(this._cursor>=this.userInput.length)return`${this.userInput}\u2588`;const t=this.userInput.slice(0,this._cursor),[e,...s]=this.userInput.slice(this._cursor);return`${t}${y("inverse",e)}${s.join("")}`}get options(){return typeof this.#n=="function"?this.#n():this.#n}constructor(t){super(t),this.#n=t.options,this.#a=t.placeholder;const e=this.options;this.filteredOptions=[...e],this.multiple=t.multiple===!0,this.#t=typeof t.options=="function"?t.filter:t.filter??B;let s;if(t.initialValue&&Array.isArray(t.initialValue)?this.multiple?s=t.initialValue:s=t.initialValue.slice(0,1):!this.multiple&&this.options.length>0&&(s=[this.options[0].value]),s)for(const i of s){const n=e.findIndex(o=>o.value===i);n!==-1&&(this.toggleSelected(i),this.#e=n)}this.focusedValue=this.options[this.#e]?.value,this.on("key",(i,n)=>this.#s(i,n)),this.on("userInput",i=>this.#i(i))}_isActionKey(t,e){return t===" "||this.multiple&&this.isNavigating&&e.name==="space"&&t!==void 0&&t!==""}#s(t,e){const s=e.name==="up",i=e.name==="down",n=e.name==="return",o=this.userInput===""||this.userInput===" ",a=this.#a,h=this.options,l=a!==void 0&&a!==""&&h.some(f=>!f.disabled&&(this.#t?this.#t(a,f):!0));if(e.name==="tab"&&o&&l){this.userInput===" "&&this._clearUserInput(),this._setUserInput(a,!0),this.isNavigating=!1;return}s||i?(this.#e=d(this.#e,s?-1:1,this.filteredOptions),this.focusedValue=this.filteredOptions[this.#e]?.value,this.multiple||(this.selectedValues=[this.focusedValue]),this.isNavigating=!0):n?this.value=J(this.multiple,this.selectedValues):this.multiple?this.focusedValue!==void 0&&(e.name==="tab"||this.isNavigating&&e.name==="space")?this.toggleSelected(this.focusedValue):this.isNavigating=!1:(this.focusedValue&&(this.selectedValues=[this.focusedValue]),this.isNavigating=!1)}deselectAll(){this.selectedValues=[]}toggleSelected(t){this.filteredOptions.length!==0&&(this.multiple?this.selectedValues.includes(t)?this.selectedValues=this.selectedValues.filter(e=>e!==t):this.selectedValues=[...this.selectedValues,t]:this.selectedValues=[t])}#i(t){if(t!==this.#o){this.#o=t;const e=this.options;t&&this.#t?this.filteredOptions=e.filter(n=>this.#t?.(t,n)):this.filteredOptions=[...e];const s=W(this.focusedValue,this.filteredOptions);this.#e=d(s,0,this.filteredOptions);const i=this.filteredOptions[this.#e];i&&!i.disabled?this.focusedValue=i.value:this.focusedValue=void 0,this.multiple||(this.focusedValue!==void 0?this.toggleSelected(this.focusedValue):this.deselectAll())}}};class Q extends p{get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor(t){super(t,!1),this.value=!!t.initialValue,this.on("userInput",()=>{this.value=this._value}),this.on("confirm",e=>{this.output.write(c.move(0,-1)),this.value=e,this.state="submit",this.close()}),this.on("cursor",()=>{this.value=!this.value})}}const X={Y:{type:"year",len:4},M:{type:"month",len:2},D:{type:"day",len:2}};function L(r){return[...r].map(t=>X[t])}function Z(r){const t=new Intl.DateTimeFormat(r,{year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(new Date(2e3,0,15)),e=[];let s="/";for(const i of t)i.type==="literal"?s=i.value.trim()||i.value:(i.type==="year"||i.type==="month"||i.type==="day")&&e.push({type:i.type,len:i.type==="year"?4:2});return{segments:e,separator:s}}function k(r){return Number.parseInt((r||"0").replace(/_/g,"0"),10)||0}function I(r){return{year:k(r.year),month:k(r.month),day:k(r.day)}}function T(r,t){return new Date(r||2001,t||1,0).getDate()}function F(r){const{year:t,month:e,day:s}=I(r);if(!t||t<0||t>9999||!e||e<1||e>12||!s||s<1)return;const i=new Date(Date.UTC(t,e-1,s));if(!(i.getUTCFullYear()!==t||i.getUTCMonth()!==e-1||i.getUTCDate()!==s))return{year:t,month:e,day:s}}function N(r){const t=F(r);return t?new Date(Date.UTC(t.year,t.month-1,t.day)):void 0}function tt(r,t,e,s){const i=e?{year:e.getUTCFullYear(),month:e.getUTCMonth()+1,day:e.getUTCDate()}:null,n=s?{year:s.getUTCFullYear(),month:s.getUTCMonth()+1,day:s.getUTCDate()}:null;return r==="year"?{min:i?.year??1,max:n?.year??9999}:r==="month"?{min:i&&t.year===i.year?i.month:1,max:n&&t.year===n.year?n.month:12}:{min:i&&t.year===i.year&&t.month===i.month?i.day:1,max:n&&t.year===n.year&&t.month===n.month?n.day:T(t.year,t.month)}}class et extends p{#e;#o;#t;#n;#a;#s={segmentIndex:0,positionInSegment:0};#i=!0;#r=null;inlineError="";get segmentCursor(){return{...this.#s}}get segmentValues(){return{...this.#t}}get segments(){return this.#e}get separator(){return this.#o}get formattedValue(){return this.#c(this.#t)}#c(t){return this.#e.map(e=>t[e.type]).join(this.#o)}#h(){this._setUserInput(this.#c(this.#t)),this._setValue(N(this.#t)??void 0)}constructor(t){const e=t.format?{segments:L(t.format),separator:t.separator??"/"}:Z(t.locale),s=t.separator??e.separator,i=t.format?L(t.format):e.segments,n=t.initialValue??t.defaultValue,o=n?{year:String(n.getUTCFullYear()).padStart(4,"0"),month:String(n.getUTCMonth()+1).padStart(2,"0"),day:String(n.getUTCDate()).padStart(2,"0")}:{year:"____",month:"__",day:"__"},a=i.map(h=>o[h.type]).join(s);super({...t,initialUserInput:a},!1),this.#e=i,this.#o=s,this.#t=o,this.#n=t.minDate,this.#a=t.maxDate,this.#h(),this.on("cursor",h=>this.#d(h)),this.on("key",(h,l)=>this.#f(h,l)),this.on("finalize",()=>this.#g(t))}#u(){const t=Math.max(0,Math.min(this.#s.segmentIndex,this.#e.length-1)),e=this.#e[t];if(e)return this.#s.positionInSegment=Math.max(0,Math.min(this.#s.positionInSegment,e.len-1)),{segment:e,index:t}}#l(t){this.inlineError="",this.#r=null;const e=this.#u();e&&(this.#s.segmentIndex=Math.max(0,Math.min(this.#e.length-1,e.index+t)),this.#s.positionInSegment=0,this.#i=!0)}#p(t){const e=this.#u();if(!e)return;const{segment:s}=e,i=this.#t[s.type],n=!i||i.replace(/_/g,"")==="",o=Number.parseInt((i||"0").replace(/_/g,"0"),10)||0,a=tt(s.type,I(this.#t),this.#n,this.#a);let h;n?h=t===1?a.min:a.max:h=Math.max(Math.min(a.max,o+t),a.min),this.#t={...this.#t,[s.type]:h.toString().padStart(s.len,"0")},this.#i=!0,this.#r=null,this.#h()}#d(t){if(t)switch(t){case"right":return this.#l(1);case"left":return this.#l(-1);case"up":return this.#p(1);case"down":return this.#p(-1)}}#f(t,e){if(e?.name==="backspace"||e?.sequence==="\x7F"||e?.sequence==="\b"||t==="\x7F"||t==="\b"){this.inlineError="";const s=this.#u();if(!s)return;if(!this.#t[s.segment.type].replace(/_/g,"")){this.#l(-1);return}this.#t[s.segment.type]="_".repeat(s.segment.len),this.#i=!0,this.#s.positionInSegment=0,this.#h();return}if(e?.name==="tab"){this.inlineError="";const s=this.#u();if(!s)return;const i=e.shift?-1:1,n=s.index+i;n>=0&&n<this.#e.length&&(this.#s.segmentIndex=n,this.#s.positionInSegment=0,this.#i=!0);return}if(t&&/^[0-9]$/.test(t)){const s=this.#u();if(!s)return;const{segment:i}=s,n=!this.#t[i.type].replace(/_/g,"");if(this.#i&&this.#r!==null&&!n){const m=this.#r+t,g={...this.#t,[i.type]:m},b=this.#m(g,i);if(b){this.inlineError=b,this.#r=null,this.#i=!1;return}this.inlineError="",this.#t[i.type]=m,this.#r=null,this.#i=!1,this.#h(),s.index<this.#e.length-1&&(this.#s.segmentIndex=s.index+1,this.#s.positionInSegment=0,this.#i=!0);return}this.#i&&!n&&(this.#t[i.type]="_".repeat(i.len),this.#s.positionInSegment=0),this.#i=!1,this.#r=null;const o=this.#t[i.type],a=o.indexOf("_"),h=a>=0?a:Math.min(this.#s.positionInSegment,i.len-1);if(h<0||h>=i.len)return;let l=o.slice(0,h)+t+o.slice(h+1),f=!1;if(h===0&&o==="__"&&(i.type==="month"||i.type==="day")){const m=Number.parseInt(t,10);l=`0${t}`,f=m<=(i.type==="month"?1:2)}if(i.type==="year"&&(l=(o.replace(/_/g,"")+t).padStart(i.len,"_")),!l.includes("_")){const m={...this.#t,[i.type]:l},g=this.#m(m,i);if(g){this.inlineError=g;return}}this.inlineError="",this.#t[i.type]=l;const v=l.includes("_")?void 0:F(this.#t);if(v){const{year:m,month:g}=v,b=T(m,g);this.#t={year:String(Math.max(0,Math.min(9999,m))).padStart(4,"0"),month:String(Math.max(1,Math.min(12,g))).padStart(2,"0"),day:String(Math.max(1,Math.min(b,v.day))).padStart(2,"0")}}this.#h();const U=l.indexOf("_");f?(this.#i=!0,this.#r=t):U>=0?this.#s.positionInSegment=U:a>=0&&s.index<this.#e.length-1?(this.#s.segmentIndex=s.index+1,this.#s.positionInSegment=0,this.#i=!0):this.#s.positionInSegment=Math.min(h+1,i.len-1)}}#m(t,e){const{month:s,day:i}=I(t);if(e.type==="month"&&(s<0||s>12))return u.date.messages.invalidMonth;if(e.type==="day"&&(i<0||i>31))return u.date.messages.invalidDay(31,"any month")}#g(t){const{year:e,month:s,day:i}=I(this.#t);if(e&&s&&i){const n=T(e,s);this.#t={...this.#t,day:String(Math.min(i,n)).padStart(2,"0")}}this.value=N(this.#t)??t.defaultValue??void 0}}class st extends p{options;cursor=0;#e;getGroupItems(t){return this.options.filter(e=>e.group===t)}isGroupSelected(t){const e=this.getGroupItems(t),s=this.value;return s===void 0?!1:e.every(i=>s.includes(i.value))}toggleValue(){const t=this.options[this.cursor];if(this.value===void 0&&(this.value=[]),t.group===!0){const e=t.value,s=this.getGroupItems(e);this.isGroupSelected(e)?this.value=this.value.filter(i=>s.findIndex(n=>n.value===i)===-1):this.value=[...this.value,...s.map(i=>i.value)],this.value=Array.from(new Set(this.value))}else{const e=this.value.includes(t.value);this.value=e?this.value.filter(s=>s!==t.value):[...this.value,t.value]}}constructor(t){super(t,!1);const{options:e}=t;this.#e=t.selectableGroups!==!1,this.options=Object.entries(e).flatMap(([s,i])=>[{value:s,group:!0,label:s},...i.map(n=>({...n,group:s}))]),this.value=[...t.initialValues??[]],this.cursor=Math.max(this.options.findIndex(({value:s})=>s===t.cursorAt),this.#e?0:1),this.on("cursor",s=>{switch(s){case"left":case"up":{this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;const i=this.options[this.cursor]?.group===!0;!this.#e&&i&&(this.cursor=this.cursor===0?this.options.length-1:this.cursor-1);break}case"down":case"right":{this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;const i=this.options[this.cursor]?.group===!0;!this.#e&&i&&(this.cursor=this.cursor===this.options.length-1?0:this.cursor+1);break}case"space":this.toggleValue();break}})}}let it=class extends p{options;cursor=0;get _value(){return this.options[this.cursor].value}get _enabledOptions(){return this.options.filter(t=>t.disabled!==!0)}toggleAll(){const t=this._enabledOptions,e=this.value!==void 0&&this.value.length===t.length;this.value=e?[]:t.map(s=>s.value)}toggleInvert(){const t=this.value;if(!t)return;const e=this._enabledOptions.filter(s=>!t.includes(s.value));this.value=e.map(s=>s.value)}toggleValue(){this.value===void 0&&(this.value=[]);const t=this.value.includes(this._value);this.value=t?this.value.filter(e=>e!==this._value):[...this.value,this._value]}constructor(t){super(t,!1),this.options=t.options,this.value=[...t.initialValues??[]];const e=Math.max(this.options.findIndex(({value:s})=>s===t.cursorAt),0);this.cursor=this.options[e].disabled?d(e,1,this.options):e,this.on("key",s=>{s==="a"&&this.toggleAll(),s==="i"&&this.toggleInvert()}),this.on("cursor",s=>{switch(s){case"left":case"up":this.cursor=d(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=d(this.cursor,1,this.options);break;case"space":this.toggleValue();break}})}};class rt extends p{_mask="\u2022";get cursor(){return this._cursor}get masked(){return this.userInput.replaceAll(/./g,this._mask)}get userInputWithCursor(){if(this.state==="submit"||this.state==="cancel")return this.masked;const t=this.userInput;if(this.cursor>=t.length)return`${this.masked}${y(["inverse","hidden"],"_")}`;const e=this.masked,s=e.slice(0,this.cursor),i=e.slice(this.cursor);return`${s}${y("inverse",i[0])}${i.slice(1)}`}clear(){this._clearUserInput()}constructor({mask:t,...e}){super(e),this._mask=t??"\u2022",this.on("userInput",s=>{this._setValue(s)})}}class nt extends p{options;cursor=0;get _selectedValue(){return this.options[this.cursor]}changeValue(){this.value=this._selectedValue.value}constructor(t){super(t,!1),this.options=t.options;const e=this.options.findIndex(({value:i})=>i===t.initialValue),s=e===-1?0:e;this.cursor=this.options[s].disabled?d(s,1,this.options):s,this.changeValue(),this.on("cursor",i=>{switch(i){case"left":case"up":this.cursor=d(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=d(this.cursor,1,this.options);break}this.changeValue()})}}class ot extends p{options;cursor=0;constructor(t){super(t,!1),this.options=t.options;const e=t.caseSensitive===!0,s=this.options.map(({value:[i]})=>e?i:i?.toLowerCase());this.cursor=Math.max(s.indexOf(t.initialValue),0),this.on("key",(i,n)=>{if(!i)return;const o=e&&n.shift?i.toUpperCase():i;if(!s.includes(o))return;const a=this.options.find(({value:[h]})=>e?h===o:h?.toLowerCase()===i);a&&(this.value=a.value,this.state="submit",this.emit("submit"))})}}class at extends p{get userInputWithCursor(){if(this.state==="submit")return this.userInput;const t=this.userInput;if(this.cursor>=t.length)return`${this.userInput}\u2588`;const e=t.slice(0,this.cursor),[s,...i]=t.slice(this.cursor);return`${e}${y("inverse",s)}${i.join("")}`}get cursor(){return this._cursor}constructor(t){super({...t,initialUserInput:t.initialUserInput??t.initialValue}),this.on("userInput",e=>{this._setValue(e)}),this.on("finalize",()=>{this.value||(this.value=t.defaultValue),this.value===void 0&&(this.value="")})}}export{H as AutocompletePrompt,Q as ConfirmPrompt,et as DatePrompt,st as GroupMultiSelectPrompt,it as MultiSelectPrompt,rt as PasswordPrompt,p as Prompt,ot as SelectKeyPrompt,nt as SelectPrompt,at as TextPrompt,z as block,O as getColumns,A as getRows,q as isCancel,u as settings,K as updateSettings,R as wrapTextWithPrefix};
|
|
1
|
+
import{styleText as v}from"node:util";import{stdout as S,stdin as D}from"node:process";import*as b from"node:readline";import E from"node:readline";import{wrapAnsi as M}from"fast-wrap-ansi";import{cursor as c,erase as V}from"sisteransi";import{ReadStream as O}from"node:tty";function d(r,t,s){if(!s.some(o=>!o.disabled))return r;const e=r+t,i=Math.max(s.length-1,0),n=e<0?i:e>i?0:e;return s[n].disabled?d(n,t<0?-1:1,s):n}function I(r,t,s,e){const i=e.split(`
|
|
2
|
+
`);let n=0,o=r;for(const a of i){if(o<=a.length)break;o-=a.length+1,n++}for(n=Math.max(0,Math.min(i.length-1,n+s)),o=Math.min(o,i[n].length)+t;o<0&&n>0;)n--,o+=i[n].length+1;for(;o>i[n].length&&n<i.length-1;)o-=i[n].length+1,n++;o=Math.max(0,Math.min(i[n].length,o));let u=0;for(let a=0;a<n;a++)u+=i[a].length+1;return u+o}const G=["up","down","left","right","space","enter","cancel"],K=["January","February","March","April","May","June","July","August","September","October","November","December"],h={actions:new Set(G),aliases:new Map([["k","up"],["j","down"],["h","left"],["l","right"],["","cancel"],["escape","cancel"]]),messages:{cancel:"Canceled",error:"Something went wrong"},withGuide:!0,date:{monthNames:[...K],messages:{required:"Please enter a valid date",invalidMonth:"There are only 12 months in a year",invalidDay:(r,t)=>`There are only ${r} days in ${t}`,afterMin:r=>`Date must be on or after ${r.toISOString().slice(0,10)}`,beforeMax:r=>`Date must be on or before ${r.toISOString().slice(0,10)}`}}};function j(r){if(r.aliases!==void 0){const t=r.aliases;for(const s in t){if(!Object.hasOwn(t,s))continue;const e=t[s];h.actions.has(e)&&(h.aliases.has(s)||h.aliases.set(s,e))}}if(r.messages!==void 0){const t=r.messages;t.cancel!==void 0&&(h.messages.cancel=t.cancel),t.error!==void 0&&(h.messages.error=t.error)}if(r.withGuide!==void 0&&(h.withGuide=r.withGuide!==!1),r.date!==void 0){const t=r.date;t.monthNames!==void 0&&(h.date.monthNames=[...t.monthNames]),t.messages!==void 0&&(t.messages.required!==void 0&&(h.date.messages.required=t.messages.required),t.messages.invalidMonth!==void 0&&(h.date.messages.invalidMonth=t.messages.invalidMonth),t.messages.invalidDay!==void 0&&(h.date.messages.invalidDay=t.messages.invalidDay),t.messages.afterMin!==void 0&&(h.date.messages.afterMin=t.messages.afterMin),t.messages.beforeMax!==void 0&&(h.date.messages.beforeMax=t.messages.beforeMax))}}function C(r,t){if(typeof r=="string")return h.aliases.get(r)===t;for(const s of r)if(s!==void 0&&C(s,t))return!0;return!1}function z(r,t){if(r===t)return;const s=r.split(`
|
|
3
|
+
`),e=t.split(`
|
|
4
|
+
`),i=Math.max(s.length,e.length),n=[];for(let o=0;o<i;o++)s[o]!==e[o]&&n.push(o);return{lines:n,numLinesBefore:s.length,numLinesAfter:e.length,numLines:i}}const Y=globalThis.process.platform.startsWith("win"),k=Symbol("clack:cancel");function q(r){return r===k}function w(r,t){const s=r;s.isTTY&&s.setRawMode(t)}function R({input:r=D,output:t=S,overwrite:s=!0,hideCursor:e=!0}={}){const i=b.createInterface({input:r,output:t,prompt:"",tabSize:1});b.emitKeypressEvents(r,i),r instanceof O&&r.isTTY&&r.setRawMode(!0);const n=(o,{name:u,sequence:a})=>{const l=String(o);if(C([l,u,a],"cancel")){e&&t.write(c.show),process.exit(0);return}if(!s)return;const f=u==="return"?0:-1,y=u==="return"?-1:0;b.moveCursor(t,f,y,()=>{b.clearLine(t,1,()=>{r.once("keypress",n)})})};return e&&t.write(c.hide),r.once("keypress",n),()=>{r.off("keypress",n),e&&t.write(c.show),r instanceof O&&r.isTTY&&!Y&&r.setRawMode(!1),i.terminal=!1,i.close()}}const A=r=>"columns"in r&&typeof r.columns=="number"?r.columns:80,L=r=>"rows"in r&&typeof r.rows=="number"?r.rows:20;function W(r,t,s,e=s,i){const n=A(r??S);return M(t,n-s.length,{hard:!0,trim:!1}).split(`
|
|
5
|
+
`).map((o,u)=>{const a=i?i(o,u):o;return`${u===0?e:s}${a}`}).join(`
|
|
6
|
+
`)}let p=class{input;output;_abortSignal;rl;opts;_render;_track=!1;_prevFrame="";_subscribers=new Map;_cursor=0;state="initial";error="";value;userInput="";constructor(t,s=!0){const{input:e=D,output:i=S,render:n,signal:o,...u}=t;this.opts=u,this.onKeypress=this.onKeypress.bind(this),this.close=this.close.bind(this),this.render=this.render.bind(this),this._render=n.bind(this),this._track=s,this._abortSignal=o,this.input=e,this.output=i}unsubscribe(){this._subscribers.clear()}setSubscriber(t,s){const e=this._subscribers.get(t)??[];e.push(s),this._subscribers.set(t,e)}on(t,s){this.setSubscriber(t,{cb:s})}once(t,s){this.setSubscriber(t,{cb:s,once:!0})}emit(t,...s){const e=this._subscribers.get(t)??[],i=[];for(const n of e)n.cb(...s),n.once&&i.push(()=>e.splice(e.indexOf(n),1));for(const n of i)n()}prompt(){return new Promise(t=>{if(this._abortSignal){if(this._abortSignal.aborted)return this.state="cancel",this.close(),t(k);this._abortSignal.addEventListener("abort",()=>{this.state="cancel",this.close()},{once:!0})}this.rl=E.createInterface({input:this.input,tabSize:2,prompt:"",escapeCodeTimeout:50,terminal:!0}),this.rl.prompt(),this.opts.initialUserInput!==void 0&&this._setUserInput(this.opts.initialUserInput,!0),this.input.on("keypress",this.onKeypress),w(this.input,!0),this.output.on("resize",this.render),this.render(),this.once("submit",()=>{this.output.write(c.show),this.output.off("resize",this.render),w(this.input,!1),t(this.value)}),this.once("cancel",()=>{this.output.write(c.show),this.output.off("resize",this.render),w(this.input,!1),t(k)})})}_isActionKey(t,s){return t===" "}_shouldSubmit(t,s){return!0}_setValue(t){this.value=t,this.emit("value",this.value)}_setUserInput(t,s){this.userInput=t??"",this.emit("userInput",this.userInput),s&&this._track&&this.rl&&(this.rl.write(this.userInput),this._cursor=this.rl.cursor)}_clearUserInput(){this.rl?.write(null,{ctrl:!0,name:"u"}),this._setUserInput("")}onKeypress(t,s){if(this._track&&s.name!=="return"&&(s.name&&this._isActionKey(t,s)&&this.rl?.write(null,{ctrl:!0,name:"h"}),this._cursor=this.rl?.cursor??0,this._setUserInput(this.rl?.line)),this.state==="error"&&(this.state="active"),s?.name&&(!this._track&&h.aliases.has(s.name)&&this.emit("cursor",h.aliases.get(s.name)),h.actions.has(s.name)&&this.emit("cursor",s.name)),t&&(t.toLowerCase()==="y"||t.toLowerCase()==="n")&&this.emit("confirm",t.toLowerCase()==="y"),this.emit("key",t?.toLowerCase(),s),s?.name==="return"&&this._shouldSubmit(t,s)){if(this.opts.validate){const e=this.opts.validate(this.value);e&&(this.error=e instanceof Error?e.message:e,this.state="error",this.rl?.write(this.userInput))}this.state!=="error"&&(this.state="submit")}C([t,s?.name,s?.sequence],"cancel")&&(this.state="cancel"),(this.state==="submit"||this.state==="cancel")&&this.emit("finalize"),this.render(),(this.state==="submit"||this.state==="cancel")&&this.close()}close(){this.input.unpipe(),this.input.removeListener("keypress",this.onKeypress),this.output.write(`
|
|
7
|
+
`),w(this.input,!1),this.rl?.close(),this.rl=void 0,this.emit(`${this.state}`,this.value),this.unsubscribe()}restoreCursor(){const t=M(this._prevFrame,process.stdout.columns,{hard:!0,trim:!1}).split(`
|
|
8
|
+
`).length-1;this.output.write(c.move(-999,t*-1))}render(){const t=M(this._render(this)??"",process.stdout.columns,{hard:!0,trim:!1});if(t!==this._prevFrame){if(this.state==="initial")this.output.write(c.hide);else{const s=z(this._prevFrame,t),e=L(this.output);if(this.restoreCursor(),s){const i=Math.max(0,s.numLinesAfter-e),n=Math.max(0,s.numLinesBefore-e);let o=s.lines.find(u=>u>=i);if(o===void 0){this._prevFrame=t;return}if(s.lines.length===1){this.output.write(c.move(0,o-n)),this.output.write(V.lines(1));const u=t.split(`
|
|
9
|
+
`);this.output.write(u[o]),this._prevFrame=t,this.output.write(c.move(0,u.length-o-1));return}else if(s.lines.length>1){if(i<n)o=i;else{const a=o-n;a>0&&this.output.write(c.move(0,a))}this.output.write(V.down());const u=t.split(`
|
|
10
|
+
`).slice(o);this.output.write(u.join(`
|
|
11
|
+
`)),this._prevFrame=t;return}}this.output.write(V.down())}this.output.write(t),this.state==="initial"&&(this.state="active"),this._prevFrame=t}}};function B(r,t){if(r===void 0||t.length===0)return 0;const s=t.findIndex(e=>e.value===r);return s!==-1?s:0}function J(r,t){return(t.label??String(t.value)).toLowerCase().includes(r.toLowerCase())}function H(r,t){if(t)return r?t:t[0]}let Q=class extends p{filteredOptions;multiple;isNavigating=!1;selectedValues=[];focusedValue;#s=0;#r="";#t;#n;#u;get cursor(){return this.#s}get userInputWithCursor(){if(!this.userInput)return v(["inverse","hidden"],"_");if(this._cursor>=this.userInput.length)return`${this.userInput}\u2588`;const t=this.userInput.slice(0,this._cursor),[s,...e]=this.userInput.slice(this._cursor);return`${t}${v("inverse",s)}${e.join("")}`}get options(){return typeof this.#n=="function"?this.#n():this.#n}constructor(t){super(t),this.#n=t.options,this.#u=t.placeholder;const s=this.options;this.filteredOptions=[...s],this.multiple=t.multiple===!0,this.#t=typeof t.options=="function"?t.filter:t.filter??J;let e;if(t.initialValue&&Array.isArray(t.initialValue)?this.multiple?e=t.initialValue:e=t.initialValue.slice(0,1):!this.multiple&&this.options.length>0&&(e=[this.options[0].value]),e)for(const i of e){const n=s.findIndex(o=>o.value===i);n!==-1&&(this.toggleSelected(i),this.#s=n)}this.focusedValue=this.options[this.#s]?.value,this.on("key",(i,n)=>this.#e(i,n)),this.on("userInput",i=>this.#i(i))}_isActionKey(t,s){return t===" "||this.multiple&&this.isNavigating&&s.name==="space"&&t!==void 0&&t!==""}#e(t,s){const e=s.name==="up",i=s.name==="down",n=s.name==="return",o=this.userInput===""||this.userInput===" ",u=this.#u,a=this.options,l=u!==void 0&&u!==""&&a.some(f=>!f.disabled&&(this.#t?this.#t(u,f):!0));if(s.name==="tab"&&o&&l){this.userInput===" "&&this._clearUserInput(),this._setUserInput(u,!0),this.isNavigating=!1;return}e||i?(this.#s=d(this.#s,e?-1:1,this.filteredOptions),this.focusedValue=this.filteredOptions[this.#s]?.value,this.multiple||(this.selectedValues=[this.focusedValue]),this.isNavigating=!0):n?this.value=H(this.multiple,this.selectedValues):this.multiple?this.focusedValue!==void 0&&(s.name==="tab"||this.isNavigating&&s.name==="space")?this.toggleSelected(this.focusedValue):this.isNavigating=!1:(this.focusedValue&&(this.selectedValues=[this.focusedValue]),this.isNavigating=!1)}deselectAll(){this.selectedValues=[]}toggleSelected(t){this.filteredOptions.length!==0&&(this.multiple?this.selectedValues.includes(t)?this.selectedValues=this.selectedValues.filter(s=>s!==t):this.selectedValues=[...this.selectedValues,t]:this.selectedValues=[t])}#i(t){if(t!==this.#r){this.#r=t;const s=this.options;t&&this.#t?this.filteredOptions=s.filter(n=>this.#t?.(t,n)):this.filteredOptions=[...s];const e=B(this.focusedValue,this.filteredOptions);this.#s=d(e,0,this.filteredOptions);const i=this.filteredOptions[this.#s];i&&!i.disabled?this.focusedValue=i.value:this.focusedValue=void 0,this.multiple||(this.focusedValue!==void 0?this.toggleSelected(this.focusedValue):this.deselectAll())}}};class X extends p{get cursor(){return this.value?0:1}get _value(){return this.cursor===0}constructor(t){super(t,!1),this.value=!!t.initialValue,this.on("userInput",()=>{this.value=this._value}),this.on("confirm",s=>{this.output.write(c.move(0,-1)),this.value=s,this.state="submit",this.close()}),this.on("cursor",()=>{this.value=!this.value})}}const Z={Y:{type:"year",len:4},M:{type:"month",len:2},D:{type:"day",len:2}};function P(r){return[...r].map(t=>Z[t])}function tt(r){const t=new Intl.DateTimeFormat(r,{year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(new Date(2e3,0,15)),s=[];let e="/";for(const i of t)i.type==="literal"?e=i.value.trim()||i.value:(i.type==="year"||i.type==="month"||i.type==="day")&&s.push({type:i.type,len:i.type==="year"?4:2});return{segments:s,separator:e}}function U(r){return Number.parseInt((r||"0").replace(/_/g,"0"),10)||0}function x(r){return{year:U(r.year),month:U(r.month),day:U(r.day)}}function $(r,t){return new Date(r||2001,t||1,0).getDate()}function F(r){const{year:t,month:s,day:e}=x(r);if(!t||t<0||t>9999||!s||s<1||s>12||!e||e<1)return;const i=new Date(Date.UTC(t,s-1,e));if(!(i.getUTCFullYear()!==t||i.getUTCMonth()!==s-1||i.getUTCDate()!==e))return{year:t,month:s,day:e}}function N(r){const t=F(r);return t?new Date(Date.UTC(t.year,t.month-1,t.day)):void 0}function st(r,t,s,e){const i=s?{year:s.getUTCFullYear(),month:s.getUTCMonth()+1,day:s.getUTCDate()}:null,n=e?{year:e.getUTCFullYear(),month:e.getUTCMonth()+1,day:e.getUTCDate()}:null;return r==="year"?{min:i?.year??1,max:n?.year??9999}:r==="month"?{min:i&&t.year===i.year?i.month:1,max:n&&t.year===n.year?n.month:12}:{min:i&&t.year===i.year&&t.month===i.month?i.day:1,max:n&&t.year===n.year&&t.month===n.month?n.day:$(t.year,t.month)}}class et extends p{#s;#r;#t;#n;#u;#e={segmentIndex:0,positionInSegment:0};#i=!0;#o=null;inlineError="";get segmentCursor(){return{...this.#e}}get segmentValues(){return{...this.#t}}get segments(){return this.#s}get separator(){return this.#r}get formattedValue(){return this.#c(this.#t)}#c(t){return this.#s.map(s=>t[s.type]).join(this.#r)}#a(){this._setUserInput(this.#c(this.#t)),this._setValue(N(this.#t)??void 0)}constructor(t){const s=t.format?{segments:P(t.format),separator:t.separator??"/"}:tt(t.locale),e=t.separator??s.separator,i=t.format?P(t.format):s.segments,n=t.initialValue??t.defaultValue,o=n?{year:String(n.getUTCFullYear()).padStart(4,"0"),month:String(n.getUTCMonth()+1).padStart(2,"0"),day:String(n.getUTCDate()).padStart(2,"0")}:{year:"____",month:"__",day:"__"},u=i.map(a=>o[a.type]).join(e);super({...t,initialUserInput:u},!1),this.#s=i,this.#r=e,this.#t=o,this.#n=t.minDate,this.#u=t.maxDate,this.#a(),this.on("cursor",a=>this.#d(a)),this.on("key",(a,l)=>this.#f(a,l)),this.on("finalize",()=>this.#g(t))}#h(){const t=Math.max(0,Math.min(this.#e.segmentIndex,this.#s.length-1)),s=this.#s[t];if(s)return this.#e.positionInSegment=Math.max(0,Math.min(this.#e.positionInSegment,s.len-1)),{segment:s,index:t}}#l(t){this.inlineError="",this.#o=null;const s=this.#h();s&&(this.#e.segmentIndex=Math.max(0,Math.min(this.#s.length-1,s.index+t)),this.#e.positionInSegment=0,this.#i=!0)}#p(t){const s=this.#h();if(!s)return;const{segment:e}=s,i=this.#t[e.type],n=!i||i.replace(/_/g,"")==="",o=Number.parseInt((i||"0").replace(/_/g,"0"),10)||0,u=st(e.type,x(this.#t),this.#n,this.#u);let a;n?a=t===1?u.min:u.max:a=Math.max(Math.min(u.max,o+t),u.min),this.#t={...this.#t,[e.type]:a.toString().padStart(e.len,"0")},this.#i=!0,this.#o=null,this.#a()}#d(t){if(t)switch(t){case"right":return this.#l(1);case"left":return this.#l(-1);case"up":return this.#p(1);case"down":return this.#p(-1)}}#f(t,s){if(s?.name==="backspace"||s?.sequence==="\x7F"||s?.sequence==="\b"||t==="\x7F"||t==="\b"){this.inlineError="";const e=this.#h();if(!e)return;if(!this.#t[e.segment.type].replace(/_/g,"")){this.#l(-1);return}this.#t[e.segment.type]="_".repeat(e.segment.len),this.#i=!0,this.#e.positionInSegment=0,this.#a();return}if(s?.name==="tab"){this.inlineError="";const e=this.#h();if(!e)return;const i=s.shift?-1:1,n=e.index+i;n>=0&&n<this.#s.length&&(this.#e.segmentIndex=n,this.#e.positionInSegment=0,this.#i=!0);return}if(t&&/^[0-9]$/.test(t)){const e=this.#h();if(!e)return;const{segment:i}=e,n=!this.#t[i.type].replace(/_/g,"");if(this.#i&&this.#o!==null&&!n){const m=this.#o+t,g={...this.#t,[i.type]:m},_=this.#m(g,i);if(_){this.inlineError=_,this.#o=null,this.#i=!1;return}this.inlineError="",this.#t[i.type]=m,this.#o=null,this.#i=!1,this.#a(),e.index<this.#s.length-1&&(this.#e.segmentIndex=e.index+1,this.#e.positionInSegment=0,this.#i=!0);return}this.#i&&!n&&(this.#t[i.type]="_".repeat(i.len),this.#e.positionInSegment=0),this.#i=!1,this.#o=null;const o=this.#t[i.type],u=o.indexOf("_"),a=u>=0?u:Math.min(this.#e.positionInSegment,i.len-1);if(a<0||a>=i.len)return;let l=o.slice(0,a)+t+o.slice(a+1),f=!1;if(a===0&&o==="__"&&(i.type==="month"||i.type==="day")){const m=Number.parseInt(t,10);l=`0${t}`,f=m<=(i.type==="month"?1:2)}if(i.type==="year"&&(l=(o.replace(/_/g,"")+t).padStart(i.len,"_")),!l.includes("_")){const m={...this.#t,[i.type]:l},g=this.#m(m,i);if(g){this.inlineError=g;return}}this.inlineError="",this.#t[i.type]=l;const y=l.includes("_")?void 0:F(this.#t);if(y){const{year:m,month:g}=y,_=$(m,g);this.#t={year:String(Math.max(0,Math.min(9999,m))).padStart(4,"0"),month:String(Math.max(1,Math.min(12,g))).padStart(2,"0"),day:String(Math.max(1,Math.min(_,y.day))).padStart(2,"0")}}this.#a();const T=l.indexOf("_");f?(this.#i=!0,this.#o=t):T>=0?this.#e.positionInSegment=T:u>=0&&e.index<this.#s.length-1?(this.#e.segmentIndex=e.index+1,this.#e.positionInSegment=0,this.#i=!0):this.#e.positionInSegment=Math.min(a+1,i.len-1)}}#m(t,s){const{month:e,day:i}=x(t);if(s.type==="month"&&(e<0||e>12))return h.date.messages.invalidMonth;if(s.type==="day"&&(i<0||i>31))return h.date.messages.invalidDay(31,"any month")}#g(t){const{year:s,month:e,day:i}=x(this.#t);if(s&&e&&i){const n=$(s,e);this.#t={...this.#t,day:String(Math.min(i,n)).padStart(2,"0")}}this.value=N(this.#t)??t.defaultValue??void 0}}class it extends p{options;cursor=0;#s;getGroupItems(t){return this.options.filter(s=>s.group===t)}isGroupSelected(t){const s=this.getGroupItems(t),e=this.value;return e===void 0?!1:s.every(i=>e.includes(i.value))}toggleValue(){const t=this.options[this.cursor];if(this.value===void 0&&(this.value=[]),t.group===!0){const s=t.value,e=this.getGroupItems(s);this.isGroupSelected(s)?this.value=this.value.filter(i=>e.findIndex(n=>n.value===i)===-1):this.value=[...this.value,...e.map(i=>i.value)],this.value=Array.from(new Set(this.value))}else{const s=this.value.includes(t.value);this.value=s?this.value.filter(e=>e!==t.value):[...this.value,t.value]}}constructor(t){super(t,!1);const{options:s}=t;this.#s=t.selectableGroups!==!1,this.options=Object.entries(s).flatMap(([e,i])=>[{value:e,group:!0,label:e},...i.map(n=>({...n,group:e}))]),this.value=[...t.initialValues??[]],this.cursor=Math.max(this.options.findIndex(({value:e})=>e===t.cursorAt),this.#s?0:1),this.on("cursor",e=>{switch(e){case"left":case"up":{this.cursor=this.cursor===0?this.options.length-1:this.cursor-1;const i=this.options[this.cursor]?.group===!0;!this.#s&&i&&(this.cursor=this.cursor===0?this.options.length-1:this.cursor-1);break}case"down":case"right":{this.cursor=this.cursor===this.options.length-1?0:this.cursor+1;const i=this.options[this.cursor]?.group===!0;!this.#s&&i&&(this.cursor=this.cursor===this.options.length-1?0:this.cursor+1);break}case"space":this.toggleValue();break}})}}class rt extends p{#s=!1;#r;focused="editor";get userInputWithCursor(){if(this.state==="submit")return this.userInput;const t=this.userInput;if(this.cursor>=t.length)return`${t}\u2588`;const s=t.slice(0,this.cursor),e=t[this.cursor],i=t.slice(this.cursor+1);return e===`
|
|
12
|
+
`?`${s}\u2588
|
|
13
|
+
${i}`:`${s}${v("inverse",e)}${i}`}get cursor(){return this._cursor}#t(t){if(this.userInput.length===0){this._setUserInput(t);return}this._setUserInput(this.userInput.slice(0,this.cursor)+t+this.userInput.slice(this.cursor))}#n(t){const s=this.value??"";switch(t){case"up":this._cursor=I(this._cursor,0,-1,s);return;case"down":this._cursor=I(this._cursor,0,1,s);return;case"left":this._cursor=I(this._cursor,-1,0,s);return;case"right":this._cursor=I(this._cursor,1,0,s);return}}_shouldSubmit(t,s){if(this.#r)return this.focused==="submit"?!0:(this.#t(`
|
|
14
|
+
`),this._cursor++,!1);const e=this.#s;return this.#s=!0,e?(this.userInput[this.cursor-1]===`
|
|
15
|
+
`&&(this._setUserInput(this.userInput.slice(0,this.cursor-1)+this.userInput.slice(this.cursor)),this._cursor--),!0):(this.#t(`
|
|
16
|
+
`),this._cursor++,!1)}constructor(t){super(t,!1),this.#r=t.showSubmit??!1,this.on("key",(s,e)=>{if(e?.name&&h.actions.has(e.name)){this.#n(e.name);return}if(s===" "&&this.#r){this.focused=this.focused==="editor"?"submit":"editor";return}if(e?.name!=="return"){if(this.#s=!1,e?.name==="backspace"&&this.cursor>0){this._setUserInput(this.userInput.slice(0,this.cursor-1)+this.userInput.slice(this.cursor)),this._cursor--;return}if(e?.name==="delete"&&this.cursor<this.userInput.length){this._setUserInput(this.userInput.slice(0,this.cursor)+this.userInput.slice(this.cursor+1));return}s&&(this.#r&&this.focused==="submit"&&(this.focused="editor"),this.#t(s??""),this._cursor++)}}),this.on("userInput",s=>{this._setValue(s)}),this.on("finalize",()=>{this.value||(this.value=t.defaultValue),this.value===void 0&&(this.value="")})}}let nt=class extends p{options;cursor=0;get _value(){return this.options[this.cursor].value}get _enabledOptions(){return this.options.filter(t=>t.disabled!==!0)}toggleAll(){const t=this._enabledOptions,s=this.value!==void 0&&this.value.length===t.length;this.value=s?[]:t.map(e=>e.value)}toggleInvert(){const t=this.value;if(!t)return;const s=this._enabledOptions.filter(e=>!t.includes(e.value));this.value=s.map(e=>e.value)}toggleValue(){this.value===void 0&&(this.value=[]);const t=this.value.includes(this._value);this.value=t?this.value.filter(s=>s!==this._value):[...this.value,this._value]}constructor(t){super(t,!1),this.options=t.options,this.value=[...t.initialValues??[]];const s=Math.max(this.options.findIndex(({value:e})=>e===t.cursorAt),0);this.cursor=this.options[s].disabled?d(s,1,this.options):s,this.on("key",e=>{e==="a"&&this.toggleAll(),e==="i"&&this.toggleInvert()}),this.on("cursor",e=>{switch(e){case"left":case"up":this.cursor=d(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=d(this.cursor,1,this.options);break;case"space":this.toggleValue();break}})}};class ot extends p{_mask="\u2022";get cursor(){return this._cursor}get masked(){return this.userInput.replaceAll(/./g,this._mask)}get userInputWithCursor(){if(this.state==="submit"||this.state==="cancel")return this.masked;const t=this.userInput;if(this.cursor>=t.length)return`${this.masked}${v(["inverse","hidden"],"_")}`;const s=this.masked,e=s.slice(0,this.cursor),i=s.slice(this.cursor);return`${e}${v("inverse",i[0])}${i.slice(1)}`}clear(){this._clearUserInput()}constructor({mask:t,...s}){super(s),this._mask=t??"\u2022",this.on("userInput",e=>{this._setValue(e)})}}class ut extends p{options;cursor=0;get _selectedValue(){return this.options[this.cursor]}changeValue(){this.value=this._selectedValue.value}constructor(t){super(t,!1),this.options=t.options;const s=this.options.findIndex(({value:i})=>i===t.initialValue),e=s===-1?0:s;this.cursor=this.options[e].disabled?d(e,1,this.options):e,this.changeValue(),this.on("cursor",i=>{switch(i){case"left":case"up":this.cursor=d(this.cursor,-1,this.options);break;case"down":case"right":this.cursor=d(this.cursor,1,this.options);break}this.changeValue()})}}class at extends p{options;cursor=0;constructor(t){super(t,!1),this.options=t.options;const s=t.caseSensitive===!0,e=this.options.map(({value:[i]})=>s?i:i?.toLowerCase());this.cursor=Math.max(e.indexOf(t.initialValue),0),this.on("key",(i,n)=>{if(!i)return;const o=s&&n.shift?i.toUpperCase():i;if(!e.includes(o))return;const u=this.options.find(({value:[a]})=>s?a===o:a?.toLowerCase()===i);u&&(this.value=u.value,this.state="submit",this.emit("submit"))})}}class ht extends p{get userInputWithCursor(){if(this.state==="submit")return this.userInput;const t=this.userInput;if(this.cursor>=t.length)return`${this.userInput}\u2588`;const s=t.slice(0,this.cursor),[e,...i]=t.slice(this.cursor);return`${s}${v("inverse",e)}${i.join("")}`}get cursor(){return this._cursor}constructor(t){super({...t,initialUserInput:t.initialUserInput??t.initialValue}),this.on("userInput",s=>{this._setValue(s)}),this.on("finalize",()=>{this.value||(this.value=t.defaultValue),this.value===void 0&&(this.value="")})}}export{Q as AutocompletePrompt,X as ConfirmPrompt,et as DatePrompt,it as GroupMultiSelectPrompt,rt as MultiLinePrompt,nt as MultiSelectPrompt,ot as PasswordPrompt,p as Prompt,at as SelectKeyPrompt,ut as SelectPrompt,ht as TextPrompt,R as block,A as getColumns,L as getRows,q as isCancel,h as settings,j as updateSettings,W as wrapTextWithPrefix};
|
|
11
17
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -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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"}
|