@shell-shock/preset-cli 0.8.4 → 0.8.5

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.
Files changed (54) hide show
  1. package/README.md +1 -1
  2. package/dist/components/{banner-function-declaration.cjs → banner-builtin.cjs} +47 -36
  3. package/dist/components/banner-builtin.d.cts +23 -0
  4. package/dist/components/banner-builtin.d.cts.map +1 -0
  5. package/dist/components/banner-builtin.d.mts +23 -0
  6. package/dist/components/banner-builtin.d.mts.map +1 -0
  7. package/dist/components/banner-builtin.mjs +88 -0
  8. package/dist/components/banner-builtin.mjs.map +1 -0
  9. package/dist/components/command-entry.cjs +182 -186
  10. package/dist/components/command-entry.d.cts +1 -1
  11. package/dist/components/command-entry.d.cts.map +1 -1
  12. package/dist/components/command-entry.d.mts.map +1 -1
  13. package/dist/components/command-entry.mjs +182 -186
  14. package/dist/components/command-entry.mjs.map +1 -1
  15. package/dist/components/command-router.cjs +1 -1
  16. package/dist/components/command-router.mjs +1 -1
  17. package/dist/components/command-router.mjs.map +1 -1
  18. package/dist/components/index.cjs +3 -2
  19. package/dist/components/index.d.cts +2 -2
  20. package/dist/components/index.d.mts +2 -2
  21. package/dist/components/index.mjs +2 -2
  22. package/dist/components/virtual-command-entry.cjs +18 -22
  23. package/dist/components/virtual-command-entry.d.cts +1 -1
  24. package/dist/components/virtual-command-entry.d.cts.map +1 -1
  25. package/dist/components/virtual-command-entry.d.mts.map +1 -1
  26. package/dist/components/virtual-command-entry.mjs +18 -22
  27. package/dist/components/virtual-command-entry.mjs.map +1 -1
  28. package/dist/index.cjs +37 -7
  29. package/dist/index.d.cts.map +1 -1
  30. package/dist/index.d.mts.map +1 -1
  31. package/dist/index.mjs +38 -8
  32. package/dist/index.mjs.map +1 -1
  33. package/dist/plugin-banner/dist/components/banner-builtin.cjs +63 -0
  34. package/dist/plugin-banner/dist/components/banner-builtin.mjs +62 -0
  35. package/dist/plugin-banner/dist/components/banner-builtin.mjs.map +1 -0
  36. package/dist/plugin-banner/dist/components/banner-function-declaration.cjs +135 -0
  37. package/dist/plugin-banner/dist/components/banner-function-declaration.d.cts +45 -0
  38. package/dist/plugin-banner/dist/components/banner-function-declaration.d.cts.map +1 -0
  39. package/dist/plugin-banner/dist/components/banner-function-declaration.d.mts +45 -0
  40. package/dist/plugin-banner/dist/components/banner-function-declaration.d.mts.map +1 -0
  41. package/dist/plugin-banner/dist/components/banner-function-declaration.mjs +133 -0
  42. package/dist/plugin-banner/dist/components/banner-function-declaration.mjs.map +1 -0
  43. package/dist/plugin-help/dist/components/display.cjs +14 -0
  44. package/dist/plugin-help/dist/components/display.mjs +14 -0
  45. package/dist/plugin-help/dist/components/display.mjs.map +1 -1
  46. package/dist/plugin-help/dist/index.cjs +1 -1
  47. package/dist/plugin-help/dist/index.mjs +1 -1
  48. package/package.json +19 -19
  49. package/dist/components/banner-function-declaration.d.cts +0 -11
  50. package/dist/components/banner-function-declaration.d.cts.map +0 -1
  51. package/dist/components/banner-function-declaration.d.mts +0 -11
  52. package/dist/components/banner-function-declaration.d.mts.map +0 -1
  53. package/dist/components/banner-function-declaration.mjs +0 -78
  54. package/dist/components/banner-function-declaration.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"command-entry.mjs","names":[],"sources":["../../src/components/command-entry.tsx"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Shell Shock\n\n This code was released as part of the Shell Shock project. Shell Shock\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/shell-shock.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/shell-shock\n Documentation: https://docs.stormsoftware.com/projects/shell-shock\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { code, computed, For, Match, Show, Switch } from \"@alloy-js/core\";\nimport { ElseIfClause, IfStatement } from \"@alloy-js/typescript\";\nimport { Spacing } from \"@powerlines/plugin-alloy/core/components/spacing\";\nimport { usePowerlines } from \"@powerlines/plugin-alloy/core/contexts/context\";\nimport type { EntryFileProps } from \"@powerlines/plugin-alloy/typescript/components/entry-file\";\nimport { EntryFile } from \"@powerlines/plugin-alloy/typescript/components/entry-file\";\nimport type {\n CommandTree,\n NumberCommandParameter,\n StringCommandParameter\n} from \"@shell-shock/core\";\nimport { CommandParameterKinds } from \"@shell-shock/core\";\nimport { CommandValidationLogic } from \"@shell-shock/core/components/command-validation-logic\";\nimport {\n formatDescription,\n formatShortDescription,\n isDynamicPathSegment\n} from \"@shell-shock/core/plugin-utils\";\nimport { CommandHandlerDeclaration } from \"@shell-shock/preset-script/components/command-entry\";\nimport { findFilePath, relativePath } from \"@stryke/path/find\";\nimport { joinPaths } from \"@stryke/path/join\";\nimport { replaceExtension } from \"@stryke/path/replace\";\nimport { camelCase } from \"@stryke/string-format/camel-case\";\nimport { pascalCase } from \"@stryke/string-format/pascal-case\";\nimport defu from \"defu\";\nimport type { CLIPresetContext } from \"../types/plugin\";\nimport { BannerFunctionDeclaration } from \"./banner-function-declaration\";\nimport { VirtualCommandEntry } from \"./virtual-command-entry\";\n\nexport interface CommandEntryProps extends Omit<\n EntryFileProps,\n \"path\" | \"typeDefinition\"\n> {\n command: CommandTree;\n}\n\n/**\n * The command entry point for the Shell Shock project.\n */\nexport function CommandEntry(props: CommandEntryProps) {\n const { command, imports, builtinImports, ...rest } = props;\n\n const context = usePowerlines<CLIPresetContext>();\n const filePath = computed(() =>\n joinPaths(\n command.segments\n .filter(segment => !isDynamicPathSegment(segment))\n .join(\"/\"),\n \"index.ts\"\n )\n );\n const commandSourcePath = computed(() =>\n replaceExtension(\n relativePath(\n joinPaths(context.entryPath, findFilePath(filePath.value)),\n command.entry.input?.file || command.entry.file\n )\n )\n );\n const typeDefinition = computed(() => ({\n ...command.entry,\n output: command.id\n }));\n\n return (\n <>\n <EntryFile\n {...rest}\n path={filePath.value}\n typeDefinition={typeDefinition.value}\n imports={defu(imports ?? {}, {\n [commandSourcePath.value.startsWith(\".\")\n ? commandSourcePath.value\n : `./${commandSourcePath.value}`]:\n `handle${pascalCase(command.name)}`\n })}\n builtinImports={defu(builtinImports ?? {}, {\n env: [\"env\", \"isDevelopment\", \"isDebug\", \"paths\"],\n console: [\n \"debug\",\n \"info\",\n \"help\",\n \"warn\",\n \"error\",\n \"table\",\n \"colors\",\n \"cursor\",\n \"stripAnsi\",\n \"writeLine\",\n \"splitText\",\n \"createSpinner\"\n ],\n utils: [\n \"useApp\",\n \"useArgs\",\n \"hasFlag\",\n \"isMinimal\",\n \"isInteractive\",\n \"isHelp\",\n \"isUnicodeSupported\",\n \"internal_commandContext\"\n ],\n prompts: [\n \"text\",\n \"numeric\",\n \"toggle\",\n \"select\",\n \"confirm\",\n \"waitForKeyPress\",\n \"isCancel\",\n \"sleep\"\n ],\n [joinPaths(\n \"help\",\n ...command.segments.filter(\n segment => !isDynamicPathSegment(segment)\n )\n )]: [\"showHelp\"],\n upgrade: [\"executeUpgrade\"]\n })}>\n <BannerFunctionDeclaration command={command} />\n <Spacing />\n <CommandHandlerDeclaration\n command={command}\n banner={code`await banner();\n await executeUpgrade(); `}>\n <IfStatement condition={code`!isInteractive`}>\n <CommandValidationLogic command={command} />\n </IfStatement>\n <Show\n when={\n Object.values(command.options ?? {}).filter(\n option => !option.optional\n ).length > 0 ||\n Object.values(command.args ?? {}).filter(arg => !arg.optional)\n .length > 0\n }>\n <ElseIfClause\n condition={code`!isHelp && (${Object.values(command.options ?? {})\n .filter(option => !option.optional)\n .map(option =>\n (option.kind === CommandParameterKinds.string ||\n option.kind === CommandParameterKinds.number) &&\n option.variadic\n ? `(!options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n } || options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n }.length === 0)`\n : `options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n } === undefined`\n )\n .join(\" || \")}${\n Object.values(command.options ?? {}).filter(\n option => !option.optional\n ).length > 0 &&\n Object.values(command.args ?? {}).filter(arg => !arg.optional)\n .length > 0\n ? \" || \"\n : \"\"\n }${Object.values(command.args ?? {})\n .filter(arg => !arg.optional)\n .map(arg =>\n (arg.kind === CommandParameterKinds.string ||\n arg.kind === CommandParameterKinds.number) &&\n arg.variadic\n ? `(!${camelCase(\n arg.name\n )} || ${camelCase(arg.name)}.length === 0)`\n : `${camelCase(arg.name)} === undefined`\n )\n .join(\" || \")}) `}>\n {code`writeLine(\"\"); `}\n <Spacing />\n <For each={Object.values(command.options ?? {})} doubleHardline>\n {option => (\n <>\n <Show when={!option.optional}>\n <IfStatement\n condition={code`!options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n }`}>\n <Show\n when={\n option.kind === CommandParameterKinds.boolean ||\n !option.choices ||\n option.choices.length === 0\n }\n fallback={code`const value = await select({\n message: \\`Please select a value for the \\${colors.italic(\"${\n option.name\n }\")} option\\`, ${\n option.description\n ? `description: \\`${formatDescription(\n option.description\n )}\\`,\n `\n : \"\"\n }options: [ ${(\n option as\n | StringCommandParameter\n | NumberCommandParameter\n ).choices\n ?.map(\n choice =>\n `{ value: ${JSON.stringify(\n choice\n )}, label: \"${choice}\", ${\n option.description\n ? `description: \\`${formatShortDescription(\n option.description\n )}\\``\n : \"\"\n } }`\n )\n .join(\", \")} ]\n });\n if (isCancel(value)) {\n return;\n }\n\n options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n } = value;\n `}>\n <Switch>\n <Match\n when={\n option.kind === CommandParameterKinds.string\n }>{code`\n const value = await text({\n message: \\`Please provide a value for the \\${colors.italic(\"${\n option.name\n }\")} option\\`,\n ${\n option.description\n ? `description: \\`${formatDescription(\n option.description\n )}\\`,\n `\n : \"\"\n }validate(val) {\n if (!val || val.trim() === \"\") {\n return \"A value must be provided for this option\";\n }\n\n return null;\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n } = value;\n `}</Match>\n <Match\n when={\n option.kind === CommandParameterKinds.number\n }>{code`\n const value = await numeric({\n message: \\`Please provide a numeric value for the \\${colors.italic(\"${option.name}\")} option\\`,\n ${\n option.description\n ? `description: \\`${formatDescription(\n option.description\n )}\\`,\n `\n : \"\"\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n } = value;\n `}</Match>\n <Match\n when={\n option.kind === CommandParameterKinds.boolean\n }>{code`\n const value = await toggle({\n message: \\`Please select a value for the \\${colors.italic(\"${option.name}\")} option\\`,\n ${\n option.description\n ? `description: \\`${formatDescription(\n option.description\n )}\\`,\n `\n : \"\"\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n } = value;\n `}</Match>\n </Switch>\n </Show>\n </IfStatement>\n <Show\n when={\n (option.kind === CommandParameterKinds.string ||\n option.kind === CommandParameterKinds.number) &&\n option.variadic\n }>\n <ElseIfClause\n condition={code`options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n }.length === 0`}>\n {code`\n const value = await text({\n message: \\`Please provide one or more${\n option.kind === CommandParameterKinds.number\n ? \" numeric\"\n : \"\"\n } values for the \\${colors.italic(\"${\n option.name\n }\")} option (values are separated by a \\\\\",\\\\\" character)\\`,\n ${\n option.description\n ? `description: \\`${formatDescription(\n option.description\n )}\\`,\n `\n : \"\"\n }validate(val) {\n if (!val || val.trim() === \"\") {\n return \"A value must be provided for this option\";\n }\n if (val.split(\",\").map(v => v.trim()).filter(Boolean).length === 0) {\n return \"At least one value must be provided for this option\";\n }\n ${\n option.kind === CommandParameterKinds.number\n ? `const invalidIndex = val.split(\",\").map(v => v.trim()).filter(Boolean).findIndex(v => Number.isNaN(Number(v));\n if (invalidIndex !== -1) {\n return \\`Invalid numeric value provided for item #\\${invalidIndex + 1} - all provided items must be a valid number\\`;\n } `\n : \"\"\n }\n return undefined;\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n } = value.split(\",\").map(value => value.trim()).filter(Boolean)${\n option.kind === CommandParameterKinds.number\n ? `.map(Number)`\n : \"\"\n } ;\n `}\n </ElseIfClause>\n </Show>\n </Show>\n </>\n )}\n </For>\n <Spacing />\n <For each={command.args} doubleHardline>\n {arg => (\n <>\n <Show when={!arg.optional}>\n <IfStatement condition={code`!${camelCase(arg.name)}`}>\n <Show\n when={\n arg.kind === CommandParameterKinds.boolean ||\n !arg.choices ||\n arg.choices.length === 0\n }\n fallback={code`const value = await select({\n message: \\`Please select a value for the \\${colors.italic(\"${\n arg.name\n }\")} argument\\`,${\n arg.description\n ? `description: \\`${formatDescription(\n arg.description\n )}\\`,\n `\n : \"\"\n }\n options: [ ${(\n arg as\n | StringCommandParameter\n | NumberCommandParameter\n ).choices\n ?.map(\n choice =>\n `{ value: ${JSON.stringify(\n choice\n )}, label: \"${choice}\", ${\n arg.description\n ? `description: \\`${formatShortDescription(\n arg.description\n )}\\``\n : \"\"\n } }`\n )\n .join(\", \")} ]\n });\n if (isCancel(value)) {\n return;\n }\n\n ${camelCase(arg.name)} = value;\n `}>\n <Switch>\n <Match\n when={\n arg.kind === CommandParameterKinds.string\n }>{code`\n const value = await text({\n message: \\`Please provide a value for the \\${colors.italic(\"${arg.name}\")} argument\\`,\n ${\n arg.description\n ? `description: \\`${formatShortDescription(\n arg.description\n )}\\`,\n `\n : \"\"\n }validate(val) {\n if (!val || val.trim() === \"\") {\n return \"A value must be provided for this argument\";\n }\n\n return null;\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n ${camelCase(arg.name)} = value;\n `}</Match>\n <Match\n when={\n arg.kind === CommandParameterKinds.number\n }>{code`\n const value = await numeric({\n message: \\`Please provide a numeric value for the \\${colors.italic(\"${arg.name}\")} argument\\`,\n ${\n arg.description\n ? `description: \\`${formatShortDescription(\n arg.description\n )}\\`,\n `\n : \"\"\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n ${camelCase(arg.name)} = value;\n `}</Match>\n <Match\n when={\n arg.kind === CommandParameterKinds.boolean\n }>{code`\n const value = await toggle({\n message: \\`Please select a value for the \\${colors.italic(\"${arg.name}\")} argument\\`,\n ${\n arg.description\n ? `description: \\`${formatShortDescription(\n arg.description\n )}\\`,\n `\n : \"\"\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n ${camelCase(arg.name)} = value;\n `}</Match>\n </Switch>\n </Show>\n </IfStatement>\n <Show\n when={\n (arg.kind === CommandParameterKinds.string ||\n arg.kind === CommandParameterKinds.number) &&\n arg.variadic\n }>\n <ElseIfClause\n condition={code`${camelCase(arg.name)}.length === 0`}>\n {code`\n const value = await text({\n message: \\`Please provide one or more${\n arg.kind === CommandParameterKinds.number\n ? \" numeric\"\n : \"\"\n } values for the \\${colors.italic(\"${arg.name}\")} argument (values are separated by a \\\\\",\\\\\" character)\\`,\n ${\n arg.description\n ? `description: \\`${formatShortDescription(\n arg.description\n )}\\`,\n `\n : \"\"\n }validate(val) {\n if (!val || val.trim() === \"\") {\n return \"A value must be provided for this argument\";\n }\n if (val.split(\",\").map(v => v.trim()).filter(Boolean).length === 0) {\n return \"At least one value must be provided for this argument\";\n }\n ${\n arg.kind === CommandParameterKinds.number\n ? `const invalidIndex = val.split(\",\").map(v => v.trim()).filter(Boolean).findIndex(v => Number.isNaN(Number(v));\n if (invalidIndex !== -1) {\n return \\`Invalid numeric value provided for item #\\${invalidIndex + 1} - all provided items must be a valid number\\`;\n } `\n : \"\"\n }\n\n return undefined;\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n ${camelCase(arg.name)} = value.split(\",\").map(value => value.trim()).filter(Boolean)${\n arg.kind === CommandParameterKinds.number\n ? `.map(Number)`\n : \"\"\n } ;\n `}\n </ElseIfClause>\n </Show>\n </Show>\n </>\n )}\n </For>\n {code`writeLine(\"\"); `}\n <Spacing />\n <CommandValidationLogic command={command} />\n <IfStatement condition={code`failures.length > 0`}>\n {code`error(\"The following validation failures were found while processing the user provided input, and must be corrected before the command-line process can be executed: \\\\n\\\\n\" + failures.map(failure => \" - \" + failure).join(\"\\\\n\"));\n options.help = true; `}\n </IfStatement>\n </ElseIfClause>\n </Show>\n </CommandHandlerDeclaration>\n </EntryFile>\n <For each={Object.values(command.children)}>\n {child => (\n <Show\n when={child.isVirtual}\n fallback={<CommandEntry command={child} />}>\n <VirtualCommandEntry command={child} />\n </Show>\n )}\n </For>\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"command-entry.mjs","names":[],"sources":["../../src/components/command-entry.tsx"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Shell Shock\n\n This code was released as part of the Shell Shock project. Shell Shock\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/shell-shock.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/shell-shock\n Documentation: https://docs.stormsoftware.com/projects/shell-shock\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { code, computed, For, Match, Show, Switch } from \"@alloy-js/core\";\nimport { ElseIfClause, IfStatement } from \"@alloy-js/typescript\";\nimport { Spacing } from \"@powerlines/plugin-alloy/core/components/spacing\";\nimport { usePowerlines } from \"@powerlines/plugin-alloy/core/contexts/context\";\nimport type { EntryFileProps } from \"@powerlines/plugin-alloy/typescript/components/entry-file\";\nimport { EntryFile } from \"@powerlines/plugin-alloy/typescript/components/entry-file\";\nimport type {\n CommandTree,\n NumberCommandParameter,\n StringCommandParameter\n} from \"@shell-shock/core\";\nimport { CommandParameterKinds } from \"@shell-shock/core\";\nimport { CommandValidationLogic } from \"@shell-shock/core/components/command-validation-logic\";\nimport {\n formatDescription,\n formatShortDescription,\n isDynamicPathSegment\n} from \"@shell-shock/core/plugin-utils\";\nimport { CommandHandlerDeclaration } from \"@shell-shock/preset-script/components/command-entry\";\nimport { findFilePath, relativePath } from \"@stryke/path/find\";\nimport { joinPaths } from \"@stryke/path/join\";\nimport { replaceExtension } from \"@stryke/path/replace\";\nimport { camelCase } from \"@stryke/string-format/camel-case\";\nimport { pascalCase } from \"@stryke/string-format/pascal-case\";\nimport defu from \"defu\";\nimport type { CLIPresetContext } from \"../types/plugin\";\nimport { VirtualCommandEntry } from \"./virtual-command-entry\";\n\nexport interface CommandEntryProps extends Omit<\n EntryFileProps,\n \"path\" | \"typeDefinition\"\n> {\n command: CommandTree;\n}\n\n/**\n * The command entry point for the Shell Shock project.\n */\nexport function CommandEntry(props: CommandEntryProps) {\n const { command, imports, builtinImports, ...rest } = props;\n\n const context = usePowerlines<CLIPresetContext>();\n const filePath = computed(() =>\n joinPaths(\n command.segments\n .filter(segment => !isDynamicPathSegment(segment))\n .join(\"/\"),\n \"index.ts\"\n )\n );\n const commandSourcePath = computed(() =>\n replaceExtension(\n relativePath(\n joinPaths(context.entryPath, findFilePath(filePath.value)),\n command.entry.input?.file || command.entry.file\n )\n )\n );\n const typeDefinition = computed(() => ({\n ...command.entry,\n output: command.id\n }));\n\n return (\n <>\n <EntryFile\n {...rest}\n path={filePath.value}\n typeDefinition={typeDefinition.value}\n imports={defu(imports ?? {}, {\n [commandSourcePath.value.startsWith(\".\")\n ? commandSourcePath.value\n : `./${commandSourcePath.value}`]:\n `handle${pascalCase(command.name)}`\n })}\n builtinImports={defu(builtinImports ?? {}, {\n env: [\"env\", \"isDevelopment\", \"isDebug\", \"paths\"],\n console: [\n \"debug\",\n \"info\",\n \"help\",\n \"warn\",\n \"error\",\n \"table\",\n \"colors\",\n \"cursor\",\n \"stripAnsi\",\n \"writeLine\",\n \"splitText\",\n \"createSpinner\"\n ],\n utils: [\n \"sleep\",\n \"useApp\",\n \"useArgs\",\n \"hasFlag\",\n \"isMinimal\",\n \"isInteractive\",\n \"isHelp\",\n \"isUnicodeSupported\",\n \"internal_commandContext\"\n ],\n prompts: [\n \"text\",\n \"numeric\",\n \"toggle\",\n \"select\",\n \"confirm\",\n \"waitForKeyPress\",\n \"isCancel\"\n ],\n [joinPaths(\n \"help\",\n ...command.segments.filter(\n segment => !isDynamicPathSegment(segment)\n )\n )]: [\"showHelp\"],\n [joinPaths(\n \"banner\",\n ...command.segments.filter(\n segment => !isDynamicPathSegment(segment)\n )\n )]: [\"showBanner\"],\n upgrade: [\"executeUpgrade\"]\n })}>\n <Spacing />\n <CommandHandlerDeclaration\n command={command}\n banner={code`await showBanner();\n await executeUpgrade(); `}>\n <IfStatement condition={code`!isInteractive`}>\n <CommandValidationLogic command={command} />\n </IfStatement>\n <Show\n when={\n Object.values(command.options ?? {}).filter(\n option => !option.optional\n ).length > 0 ||\n Object.values(command.args ?? {}).filter(arg => !arg.optional)\n .length > 0\n }>\n <ElseIfClause\n condition={code`!isHelp && (${Object.values(command.options ?? {})\n .filter(option => !option.optional)\n .map(option =>\n (option.kind === CommandParameterKinds.string ||\n option.kind === CommandParameterKinds.number) &&\n option.variadic\n ? `(!options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n } || options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n }.length === 0)`\n : `options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n } === undefined`\n )\n .join(\" || \")}${\n Object.values(command.options ?? {}).filter(\n option => !option.optional\n ).length > 0 &&\n Object.values(command.args ?? {}).filter(arg => !arg.optional)\n .length > 0\n ? \" || \"\n : \"\"\n }${Object.values(command.args ?? {})\n .filter(arg => !arg.optional)\n .map(arg =>\n (arg.kind === CommandParameterKinds.string ||\n arg.kind === CommandParameterKinds.number) &&\n arg.variadic\n ? `(!${camelCase(\n arg.name\n )} || ${camelCase(arg.name)}.length === 0)`\n : `${camelCase(arg.name)} === undefined`\n )\n .join(\" || \")}) `}>\n {code`writeLine(\"\"); `}\n <Spacing />\n <For each={Object.values(command.options ?? {})} doubleHardline>\n {option => (\n <>\n <Show when={!option.optional}>\n <IfStatement\n condition={code`!options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n }`}>\n <Show\n when={\n option.kind === CommandParameterKinds.boolean ||\n !option.choices ||\n option.choices.length === 0\n }\n fallback={code`const value = await select({\n message: \\`Please select a value for the \\${colors.italic(\"${\n option.name\n }\")} option\\`, ${\n option.description\n ? `description: \\`${formatDescription(\n option.description\n )}\\`,\n `\n : \"\"\n }options: [ ${(\n option as\n | StringCommandParameter\n | NumberCommandParameter\n ).choices\n ?.map(\n choice =>\n `{ value: ${JSON.stringify(\n choice\n )}, label: \"${choice}\", ${\n option.description\n ? `description: \\`${formatShortDescription(\n option.description\n )}\\``\n : \"\"\n } }`\n )\n .join(\", \")} ]\n });\n if (isCancel(value)) {\n return;\n }\n\n options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n } = value;\n `}>\n <Switch>\n <Match\n when={\n option.kind === CommandParameterKinds.string\n }>{code`\n const value = await text({\n message: \\`Please provide a value for the \\${colors.italic(\"${\n option.name\n }\")} option\\`,\n ${\n option.description\n ? `description: \\`${formatDescription(\n option.description\n )}\\`,\n `\n : \"\"\n }validate(val) {\n if (!val || val.trim() === \"\") {\n return \"A value must be provided for this option\";\n }\n\n return null;\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n } = value;\n `}</Match>\n <Match\n when={\n option.kind === CommandParameterKinds.number\n }>{code`\n const value = await numeric({\n message: \\`Please provide a numeric value for the \\${colors.italic(\"${option.name}\")} option\\`,\n ${\n option.description\n ? `description: \\`${formatDescription(\n option.description\n )}\\`,\n `\n : \"\"\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n } = value;\n `}</Match>\n <Match\n when={\n option.kind === CommandParameterKinds.boolean\n }>{code`\n const value = await toggle({\n message: \\`Please select a value for the \\${colors.italic(\"${option.name}\")} option\\`,\n ${\n option.description\n ? `description: \\`${formatDescription(\n option.description\n )}\\`,\n `\n : \"\"\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n } = value;\n `}</Match>\n </Switch>\n </Show>\n </IfStatement>\n <Show\n when={\n (option.kind === CommandParameterKinds.string ||\n option.kind === CommandParameterKinds.number) &&\n option.variadic\n }>\n <ElseIfClause\n condition={code`options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n }.length === 0`}>\n {code`\n const value = await text({\n message: \\`Please provide one or more${\n option.kind === CommandParameterKinds.number\n ? \" numeric\"\n : \"\"\n } values for the \\${colors.italic(\"${\n option.name\n }\")} option (values are separated by a \\\\\",\\\\\" character)\\`,\n ${\n option.description\n ? `description: \\`${formatDescription(\n option.description\n )}\\`,\n `\n : \"\"\n }validate(val) {\n if (!val || val.trim() === \"\") {\n return \"A value must be provided for this option\";\n }\n if (val.split(\",\").map(v => v.trim()).filter(Boolean).length === 0) {\n return \"At least one value must be provided for this option\";\n }\n ${\n option.kind === CommandParameterKinds.number\n ? `const invalidIndex = val.split(\",\").map(v => v.trim()).filter(Boolean).findIndex(v => Number.isNaN(Number(v));\n if (invalidIndex !== -1) {\n return \\`Invalid numeric value provided for item #\\${invalidIndex + 1} - all provided items must be a valid number\\`;\n } `\n : \"\"\n }\n return undefined;\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n options${\n option.name.includes(\"?\")\n ? `[\"${option.name}\"]`\n : `.${camelCase(option.name)}`\n } = value.split(\",\").map(value => value.trim()).filter(Boolean)${\n option.kind === CommandParameterKinds.number\n ? `.map(Number)`\n : \"\"\n } ;\n `}\n </ElseIfClause>\n </Show>\n </Show>\n </>\n )}\n </For>\n <Spacing />\n <For each={command.args} doubleHardline>\n {arg => (\n <>\n <Show when={!arg.optional}>\n <IfStatement condition={code`!${camelCase(arg.name)}`}>\n <Show\n when={\n arg.kind === CommandParameterKinds.boolean ||\n !arg.choices ||\n arg.choices.length === 0\n }\n fallback={code`const value = await select({\n message: \\`Please select a value for the \\${colors.italic(\"${\n arg.name\n }\")} argument\\`,${\n arg.description\n ? `description: \\`${formatDescription(\n arg.description\n )}\\`,\n `\n : \"\"\n }\n options: [ ${(\n arg as\n | StringCommandParameter\n | NumberCommandParameter\n ).choices\n ?.map(\n choice =>\n `{ value: ${JSON.stringify(\n choice\n )}, label: \"${choice}\", ${\n arg.description\n ? `description: \\`${formatShortDescription(\n arg.description\n )}\\``\n : \"\"\n } }`\n )\n .join(\", \")} ]\n });\n if (isCancel(value)) {\n return;\n }\n\n ${camelCase(arg.name)} = value;\n `}>\n <Switch>\n <Match\n when={\n arg.kind === CommandParameterKinds.string\n }>{code`\n const value = await text({\n message: \\`Please provide a value for the \\${colors.italic(\"${arg.name}\")} argument\\`,\n ${\n arg.description\n ? `description: \\`${formatShortDescription(\n arg.description\n )}\\`,\n `\n : \"\"\n }validate(val) {\n if (!val || val.trim() === \"\") {\n return \"A value must be provided for this argument\";\n }\n\n return null;\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n ${camelCase(arg.name)} = value;\n `}</Match>\n <Match\n when={\n arg.kind === CommandParameterKinds.number\n }>{code`\n const value = await numeric({\n message: \\`Please provide a numeric value for the \\${colors.italic(\"${arg.name}\")} argument\\`,\n ${\n arg.description\n ? `description: \\`${formatShortDescription(\n arg.description\n )}\\`,\n `\n : \"\"\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n ${camelCase(arg.name)} = value;\n `}</Match>\n <Match\n when={\n arg.kind === CommandParameterKinds.boolean\n }>{code`\n const value = await toggle({\n message: \\`Please select a value for the \\${colors.italic(\"${arg.name}\")} argument\\`,\n ${\n arg.description\n ? `description: \\`${formatShortDescription(\n arg.description\n )}\\`,\n `\n : \"\"\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n ${camelCase(arg.name)} = value;\n `}</Match>\n </Switch>\n </Show>\n </IfStatement>\n <Show\n when={\n (arg.kind === CommandParameterKinds.string ||\n arg.kind === CommandParameterKinds.number) &&\n arg.variadic\n }>\n <ElseIfClause\n condition={code`${camelCase(arg.name)}.length === 0`}>\n {code`\n const value = await text({\n message: \\`Please provide one or more${\n arg.kind === CommandParameterKinds.number\n ? \" numeric\"\n : \"\"\n } values for the \\${colors.italic(\"${arg.name}\")} argument (values are separated by a \\\\\",\\\\\" character)\\`,\n ${\n arg.description\n ? `description: \\`${formatShortDescription(\n arg.description\n )}\\`,\n `\n : \"\"\n }validate(val) {\n if (!val || val.trim() === \"\") {\n return \"A value must be provided for this argument\";\n }\n if (val.split(\",\").map(v => v.trim()).filter(Boolean).length === 0) {\n return \"At least one value must be provided for this argument\";\n }\n ${\n arg.kind === CommandParameterKinds.number\n ? `const invalidIndex = val.split(\",\").map(v => v.trim()).filter(Boolean).findIndex(v => Number.isNaN(Number(v));\n if (invalidIndex !== -1) {\n return \\`Invalid numeric value provided for item #\\${invalidIndex + 1} - all provided items must be a valid number\\`;\n } `\n : \"\"\n }\n\n return undefined;\n }\n });\n if (isCancel(value)) {\n return;\n }\n\n ${camelCase(arg.name)} = value.split(\",\").map(value => value.trim()).filter(Boolean)${\n arg.kind === CommandParameterKinds.number\n ? `.map(Number)`\n : \"\"\n } ;\n `}\n </ElseIfClause>\n </Show>\n </Show>\n </>\n )}\n </For>\n {code`writeLine(\"\"); `}\n <Spacing />\n <CommandValidationLogic command={command} />\n <IfStatement condition={code`failures.length > 0`}>\n {code`error(\"The following validation failures were found while processing the user provided input, and must be corrected before the command-line process can be executed: \\\\n\\\\n\" + failures.map(failure => \" - \" + failure).join(\"\\\\n\"));\n options.help = true; `}\n </IfStatement>\n </ElseIfClause>\n </Show>\n </CommandHandlerDeclaration>\n </EntryFile>\n <For each={Object.values(command.children)}>\n {child => (\n <Show\n when={child.isVirtual}\n fallback={<CommandEntry command={child} />}>\n <VirtualCommandEntry command={child} />\n </Show>\n )}\n </For>\n </>\n );\n}\n"],"mappings":"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"}
@@ -36,7 +36,7 @@ function CommandRouter(props) {
36
36
  condition: _alloy_js_core.code`isInteractive && !isHelp`,
37
37
  get children() {
38
38
  return [
39
- _alloy_js_core.code`await banner();
39
+ _alloy_js_core.code`await showBanner();
40
40
 
41
41
  let segments = await select({
42
42
  message: "Which command would you like to execute?",
@@ -34,7 +34,7 @@ function CommandRouter(props) {
34
34
  condition: code`isInteractive && !isHelp`,
35
35
  get children() {
36
36
  return [
37
- code`await banner();
37
+ code`await showBanner();
38
38
 
39
39
  let segments = await select({
40
40
  message: "Which command would you like to execute?",
@@ -1 +1 @@
1
- {"version":3,"file":"command-router.mjs","names":[],"sources":["../../src/components/command-router.tsx"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Shell Shock\n\n This code was released as part of the Shell Shock project. Shell Shock\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/shell-shock.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/shell-shock\n Documentation: https://docs.stormsoftware.com/projects/shell-shock\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { code, For } from \"@alloy-js/core\";\nimport { IfStatement } from \"@alloy-js/typescript\";\nimport { Spacing } from \"@powerlines/plugin-alloy/core/components/spacing\";\nimport type { CommandTree } from \"@shell-shock/core\";\nimport { formatShortDescription } from \"@shell-shock/core/plugin-utils\";\nimport type { CommandRouterProps } from \"@shell-shock/preset-script/components\";\nimport {\n CommandRouter as BaseCommandRouter,\n CommandRouterBody\n} from \"@shell-shock/preset-script/components\";\n\nexport interface CommandRouterSelectOptionsProps {\n commands?: Record<string, CommandTree>;\n}\n\nexport function CommandRouterSelectOptions(\n props: CommandRouterSelectOptionsProps\n) {\n const { commands } = props;\n\n return (\n <For each={Object.values(commands ?? {})} joiner=\",\" hardline>\n {command =>\n command.isVirtual ? (\n <CommandRouterSelectOptions commands={command.children ?? {}} />\n ) : (\n code`{ value: [${command.segments\n .map(segment => `\"${segment}\"`)\n .join(\n \", \"\n )}], label: \"${command.title}\", description: \\`${formatShortDescription(\n command.description\n )}\\`${command.icon ? `, icon: \"${command.icon}\"` : \"\"} }`\n )\n }\n </For>\n );\n}\n\n/**\n * A component that renders a command router interface, allowing users to select and execute commands from a provided list of commands and segments. This component serves as a wrapper around the base CommandRouter, adding additional UI elements and logic for command selection.\n */\nexport function CommandRouter(props: CommandRouterProps) {\n const { segments, commands } = props;\n\n return (\n <>\n <BaseCommandRouter {...props} segments={segments} commands={commands} />\n <Spacing />\n <IfStatement condition={code`isInteractive && !isHelp`}>\n {code`await banner();\n\n let segments = await select({\n message: \"Which command would you like to execute?\",\n options: [ `}\n <CommandRouterSelectOptions commands={commands} />\n {` ],\n });\n if (isCancel(segments)) {\n return;\n }\n\n let dynamics = {} as Record<string, string>;\n for (const dynamic of segments.filter(segment => segment.startsWith(\"[\") && segment.endsWith(\"]\"))) {\n const value = await text({\n message: \\`Please provide a value for \\${dynamic.replace(/^\\[+/, \"\").replace(/\\]+$/, \"\")}:\\`,\n });\n if (isCancel(value)) {\n return;\n }\n dynamics[dynamic] = value;\n }\n\n segments = segments.map(segment => dynamics[segment] || segment);\n const context = useApp();\n context.set(\"args\", [args.length > 0 ? args[0] : undefined, args.length > 1 ? args[1] : undefined, ...segments, ...args.slice(${\n segments.length + 2\n })].filter(Boolean) as string[]);\n\n command = segments[0];\n args = context.get(\"args\"); `}\n <CommandRouterBody {...props} segments={segments} commands={commands} />\n </IfStatement>\n <Spacing />\n </>\n );\n}\n"],"mappings":";;;;;;;;AA6BA,SAAgB,2BAAC,OAAgC;CAC/C,MAAA,EACF;AAEA,QAAO,gBAAS,KAAA;EACd,IAAM,OAAC;AACP,UAAA,OAAA,OAAA,YAAA,EAAA,CAAA;;;EAGA,UAAO;EACL,WAAU,YAAQ,QAAO,YAAgB,gBAAY,4BAAQ,EAC3D,IAAC,WAAS;AACR,UAAO,QAAC,YAAY,EAAA;KAEvB,CAAC,GAAG,IAAG,aAAA,QAAA,SAAA,KAAA,YAAA,IAAA,QAAA,GAAA,CAAA,KAAA,KAAA,CAAA,aAAA,QAAA,MAAA,oBAAA,uBAAA,QAAA,YAAA,CAAA,IAAA,QAAA,OAAA,YAAA,QAAA,KAAA,KAAA,GAAA;EACT,CAAC;;;;;AAMJ,SAAgB,cAAc,OAA2B;CACvD,MAAM,EACJ,UACA,aACD;AACH,QAAA;EAAA,gBAAA,iBAAA,WAAA,OAAA;;GAEE;GACC,CAAC,CAAC;EAAA,gBAAe,SAAU,EAAA,CAAO;EAAC,gBAAkB,aAAc;GACpE,WAAA,IAAA;GACF,IAAO,WAAS;AACd,WAAQ;KAAA,IAAQ;;;;;KAIM,gBAAY,4BAA8B,EAClD,UACT,CAAA;KAAA,WAAY;;;;;;;;;;;;;;;;;;;wIAmBD,SAAA,SAAA,EAAA;;;sCAGV;KAAA,gBAAA,mBAAA,WAAA,OAAA;;MAEU;MACX,CAAC,CAAA;KAAA;;GAEL,CAAC;EAAE,gBAAa,SAAS,EAAA,CAAA;EAAA"}
1
+ {"version":3,"file":"command-router.mjs","names":[],"sources":["../../src/components/command-router.tsx"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Shell Shock\n\n This code was released as part of the Shell Shock project. Shell Shock\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/shell-shock.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/shell-shock\n Documentation: https://docs.stormsoftware.com/projects/shell-shock\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { code, For } from \"@alloy-js/core\";\nimport { IfStatement } from \"@alloy-js/typescript\";\nimport { Spacing } from \"@powerlines/plugin-alloy/core/components/spacing\";\nimport type { CommandTree } from \"@shell-shock/core\";\nimport { formatShortDescription } from \"@shell-shock/core/plugin-utils\";\nimport type { CommandRouterProps } from \"@shell-shock/preset-script/components\";\nimport {\n CommandRouter as BaseCommandRouter,\n CommandRouterBody\n} from \"@shell-shock/preset-script/components\";\n\nexport interface CommandRouterSelectOptionsProps {\n commands?: Record<string, CommandTree>;\n}\n\nexport function CommandRouterSelectOptions(\n props: CommandRouterSelectOptionsProps\n) {\n const { commands } = props;\n\n return (\n <For each={Object.values(commands ?? {})} joiner=\",\" hardline>\n {command =>\n command.isVirtual ? (\n <CommandRouterSelectOptions commands={command.children ?? {}} />\n ) : (\n code`{ value: [${command.segments\n .map(segment => `\"${segment}\"`)\n .join(\n \", \"\n )}], label: \"${command.title}\", description: \\`${formatShortDescription(\n command.description\n )}\\`${command.icon ? `, icon: \"${command.icon}\"` : \"\"} }`\n )\n }\n </For>\n );\n}\n\n/**\n * A component that renders a command router interface, allowing users to select and execute commands from a provided list of commands and segments. This component serves as a wrapper around the base CommandRouter, adding additional UI elements and logic for command selection.\n */\nexport function CommandRouter(props: CommandRouterProps) {\n const { segments, commands } = props;\n\n return (\n <>\n <BaseCommandRouter {...props} segments={segments} commands={commands} />\n <Spacing />\n <IfStatement condition={code`isInteractive && !isHelp`}>\n {code`await showBanner();\n\n let segments = await select({\n message: \"Which command would you like to execute?\",\n options: [ `}\n <CommandRouterSelectOptions commands={commands} />\n {` ],\n });\n if (isCancel(segments)) {\n return;\n }\n\n let dynamics = {} as Record<string, string>;\n for (const dynamic of segments.filter(segment => segment.startsWith(\"[\") && segment.endsWith(\"]\"))) {\n const value = await text({\n message: \\`Please provide a value for \\${dynamic.replace(/^\\[+/, \"\").replace(/\\]+$/, \"\")}:\\`,\n });\n if (isCancel(value)) {\n return;\n }\n dynamics[dynamic] = value;\n }\n\n segments = segments.map(segment => dynamics[segment] || segment);\n const context = useApp();\n context.set(\"args\", [args.length > 0 ? args[0] : undefined, args.length > 1 ? args[1] : undefined, ...segments, ...args.slice(${\n segments.length + 2\n })].filter(Boolean) as string[]);\n\n command = segments[0];\n args = context.get(\"args\"); `}\n <CommandRouterBody {...props} segments={segments} commands={commands} />\n </IfStatement>\n <Spacing />\n </>\n );\n}\n"],"mappings":";;;;;;;;AA6BA,SAAgB,2BAAC,OAAgC;CAC/C,MAAA,EACF;AAEA,QAAO,gBAAS,KAAA;EACd,IAAM,OAAC;AACP,UAAA,OAAA,OAAA,YAAA,EAAA,CAAA;;;EAGA,UAAO;EACL,WAAU,YAAQ,QAAO,YAAgB,gBAAY,4BAAQ,EAC3D,IAAC,WAAS;AACR,UAAO,QAAC,YAAY,EAAA;KAEvB,CAAC,GAAG,IAAG,aAAA,QAAA,SAAA,KAAA,YAAA,IAAA,QAAA,GAAA,CAAA,KAAA,KAAA,CAAA,aAAA,QAAA,MAAA,oBAAA,uBAAA,QAAA,YAAA,CAAA,IAAA,QAAA,OAAA,YAAA,QAAA,KAAA,KAAA,GAAA;EACT,CAAC;;;;;AAMJ,SAAgB,cAAc,OAA2B;CACvD,MAAM,EACJ,UACA,aACD;AACH,QAAA;EAAA,gBAAA,iBAAA,WAAA,OAAA;;GAEE;GACC,CAAC,CAAC;EAAA,gBAAe,SAAU,EAAA,CAAO;EAAC,gBAAkB,aAAc;GACpE,WAAA,IAAA;GACF,IAAO,WAAS;AACd,WAAQ;KAAA,IAAQ;;;;;KAIM,gBAAY,4BAA8B,EAClD,UACT,CAAA;KAAA,WAAY;;;;;;;;;;;;;;;;;;;wIAmBD,SAAA,SAAA,EAAA;;;sCAGV;KAAA,gBAAA,mBAAA,WAAA,OAAA;;MAEU;MACX,CAAC,CAAA;KAAA;;GAEL,CAAC;EAAE,gBAAa,SAAS,EAAA,CAAA;EAAA"}
@@ -1,11 +1,12 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_components_banner_function_declaration = require('./banner-function-declaration.cjs');
2
+ const require_components_banner_builtin = require('./banner-builtin.cjs');
3
3
  const require_components_command_router = require('./command-router.cjs');
4
4
  const require_components_virtual_command_entry = require('./virtual-command-entry.cjs');
5
5
  const require_components_command_entry = require('./command-entry.cjs');
6
6
  const require_components_upgrade_builtin = require('./upgrade-builtin.cjs');
7
7
 
8
- exports.BannerFunctionDeclaration = require_components_banner_function_declaration.BannerFunctionDeclaration;
8
+ exports.BannerBuiltin = require_components_banner_builtin.BannerBuiltin;
9
+ exports.BannerFunctionBodyDeclaration = require_components_banner_builtin.BannerFunctionBodyDeclaration;
9
10
  exports.CommandEntry = require_components_command_entry.CommandEntry;
10
11
  exports.CommandRouter = require_components_command_router.CommandRouter;
11
12
  exports.CommandRouterSelectOptions = require_components_command_router.CommandRouterSelectOptions;
@@ -1,6 +1,6 @@
1
- import { BannerFunctionDeclaration } from "./banner-function-declaration.cjs";
1
+ import { BannerBuiltin, BannerBuiltinProps, BannerFunctionBodyDeclaration } from "./banner-builtin.cjs";
2
2
  import { CommandEntry, CommandEntryProps } from "./command-entry.cjs";
3
3
  import { CommandRouter, CommandRouterSelectOptions, CommandRouterSelectOptionsProps } from "./command-router.cjs";
4
4
  import { ExecuteUpgradeFunctionDeclaration, UpgradeBuiltin } from "./upgrade-builtin.cjs";
5
5
  import { VirtualCommandEntry, VirtualCommandEntryProps } from "./virtual-command-entry.cjs";
6
- export { BannerFunctionDeclaration, CommandEntry, CommandEntryProps, CommandRouter, CommandRouterSelectOptions, CommandRouterSelectOptionsProps, ExecuteUpgradeFunctionDeclaration, UpgradeBuiltin, VirtualCommandEntry, VirtualCommandEntryProps };
6
+ export { BannerBuiltin, BannerBuiltinProps, BannerFunctionBodyDeclaration, CommandEntry, CommandEntryProps, CommandRouter, CommandRouterSelectOptions, CommandRouterSelectOptionsProps, ExecuteUpgradeFunctionDeclaration, UpgradeBuiltin, VirtualCommandEntry, VirtualCommandEntryProps };
@@ -1,6 +1,6 @@
1
- import { BannerFunctionDeclaration } from "./banner-function-declaration.mjs";
1
+ import { BannerBuiltin, BannerBuiltinProps, BannerFunctionBodyDeclaration } from "./banner-builtin.mjs";
2
2
  import { CommandEntry, CommandEntryProps } from "./command-entry.mjs";
3
3
  import { CommandRouter, CommandRouterSelectOptions, CommandRouterSelectOptionsProps } from "./command-router.mjs";
4
4
  import { ExecuteUpgradeFunctionDeclaration, UpgradeBuiltin } from "./upgrade-builtin.mjs";
5
5
  import { VirtualCommandEntry, VirtualCommandEntryProps } from "./virtual-command-entry.mjs";
6
- export { BannerFunctionDeclaration, CommandEntry, CommandEntryProps, CommandRouter, CommandRouterSelectOptions, CommandRouterSelectOptionsProps, ExecuteUpgradeFunctionDeclaration, UpgradeBuiltin, VirtualCommandEntry, VirtualCommandEntryProps };
6
+ export { BannerBuiltin, BannerBuiltinProps, BannerFunctionBodyDeclaration, CommandEntry, CommandEntryProps, CommandRouter, CommandRouterSelectOptions, CommandRouterSelectOptionsProps, ExecuteUpgradeFunctionDeclaration, UpgradeBuiltin, VirtualCommandEntry, VirtualCommandEntryProps };
@@ -1,7 +1,7 @@
1
- import { BannerFunctionDeclaration } from "./banner-function-declaration.mjs";
1
+ import { BannerBuiltin, BannerFunctionBodyDeclaration } from "./banner-builtin.mjs";
2
2
  import { CommandRouter, CommandRouterSelectOptions } from "./command-router.mjs";
3
3
  import { VirtualCommandEntry } from "./virtual-command-entry.mjs";
4
4
  import { CommandEntry } from "./command-entry.mjs";
5
5
  import { ExecuteUpgradeFunctionDeclaration, UpgradeBuiltin } from "./upgrade-builtin.mjs";
6
6
 
7
- export { BannerFunctionDeclaration, CommandEntry, CommandRouter, CommandRouterSelectOptions, ExecuteUpgradeFunctionDeclaration, UpgradeBuiltin, VirtualCommandEntry };
7
+ export { BannerBuiltin, BannerFunctionBodyDeclaration, CommandEntry, CommandRouter, CommandRouterSelectOptions, ExecuteUpgradeFunctionDeclaration, UpgradeBuiltin, VirtualCommandEntry };
@@ -1,6 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
3
- const require_components_banner_function_declaration = require('./banner-function-declaration.cjs');
4
3
  const require_components_command_router = require('./command-router.cjs');
5
4
  const require_components_command_entry = require('./command-entry.cjs');
6
5
  let _alloy_js_core_jsx_runtime = require("@alloy-js/core/jsx-runtime");
@@ -58,37 +57,34 @@ function VirtualCommandEntry(props) {
58
57
  "isUnicodeSupported",
59
58
  "isInteractive",
60
59
  "isHelp",
61
- "findSuggestions"
60
+ "findSuggestions",
61
+ "sleep"
62
62
  ],
63
63
  prompts: [
64
64
  "text",
65
65
  "numeric",
66
66
  "toggle",
67
67
  "select",
68
- "isCancel",
69
- "sleep"
68
+ "isCancel"
70
69
  ],
71
- [(0, _stryke_path_join.joinPaths)("help", ...command.segments.filter((segment) => !(0, _shell_shock_core_plugin_utils.isDynamicPathSegment)(segment)))]: ["showHelp"]
70
+ [(0, _stryke_path_join.joinPaths)("help", ...command.segments.filter((segment) => !(0, _shell_shock_core_plugin_utils.isDynamicPathSegment)(segment)))]: ["showHelp"],
71
+ [(0, _stryke_path_join.joinPaths)("banner", ...command.segments.filter((segment) => !(0, _shell_shock_core_plugin_utils.isDynamicPathSegment)(segment)))]: ["showBanner"]
72
72
  });
73
73
  },
74
74
  get children() {
75
- return [
76
- (0, _alloy_js_core_jsx_runtime.createComponent)(require_components_banner_function_declaration.BannerFunctionDeclaration, { command }),
77
- (0, _alloy_js_core_jsx_runtime.createComponent)(_powerlines_plugin_alloy_core_components.Spacing, {}),
78
- (0, _alloy_js_core_jsx_runtime.createComponent)(_shell_shock_preset_script_components_virtual_command_entry.VirtualCommandHandlerDeclaration, {
79
- command,
80
- get children() {
81
- return (0, _alloy_js_core_jsx_runtime.createComponent)(require_components_command_router.CommandRouter, {
82
- get segments() {
83
- return command.segments;
84
- },
85
- get commands() {
86
- return command.children;
87
- }
88
- });
89
- }
90
- })
91
- ];
75
+ return [(0, _alloy_js_core_jsx_runtime.createComponent)(_powerlines_plugin_alloy_core_components.Spacing, {}), (0, _alloy_js_core_jsx_runtime.createComponent)(_shell_shock_preset_script_components_virtual_command_entry.VirtualCommandHandlerDeclaration, {
76
+ command,
77
+ get children() {
78
+ return (0, _alloy_js_core_jsx_runtime.createComponent)(require_components_command_router.CommandRouter, {
79
+ get segments() {
80
+ return command.segments;
81
+ },
82
+ get commands() {
83
+ return command.children;
84
+ }
85
+ });
86
+ }
87
+ })];
92
88
  }
93
89
  })), (0, _alloy_js_core_jsx_runtime.createComponent)(_alloy_js_core.For, {
94
90
  get each() {
@@ -1,6 +1,6 @@
1
1
  import * as _alloy_js_core0 from "@alloy-js/core";
2
- import { EntryFileProps } from "@powerlines/plugin-alloy/typescript/components/entry-file";
3
2
  import { CommandTree } from "@shell-shock/core";
3
+ import { EntryFileProps } from "@powerlines/plugin-alloy/typescript/components/entry-file";
4
4
 
5
5
  //#region src/components/virtual-command-entry.d.ts
6
6
  interface VirtualCommandEntryProps extends Omit<EntryFileProps, "path" | "typeDefinition"> {
@@ -1 +1 @@
1
- {"version":3,"file":"virtual-command-entry.d.cts","names":[],"sources":["../../src/components/virtual-command-entry.tsx"],"mappings":";;;;;UAmCiB,wBAAA,SAAiC,IAAA,CAChD,cAAA;EAGA,OAAA,EAAS,WAAA;AAAA;AAJX;;;AAAA,iBAUgB,mBAAA,CAAoB,KAAA,EAAO,wBAAA,GAAwB,eAAA,CAAA,QAAA"}
1
+ {"version":3,"file":"virtual-command-entry.d.cts","names":[],"sources":["../../src/components/virtual-command-entry.tsx"],"mappings":";;;;;UAkCiB,wBAAA,SAAiC,IAAA,CAChD,cAAA;EAGA,OAAA,EAAS,WAAA;AAAA;AAJX;;;AAAA,iBAUgB,mBAAA,CAAoB,KAAA,EAAO,wBAAA,GAAwB,eAAA,CAAA,QAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"virtual-command-entry.d.mts","names":[],"sources":["../../src/components/virtual-command-entry.tsx"],"mappings":";;;;;UAmCiB,wBAAA,SAAiC,IAAA,CAChD,cAAA;EAGA,OAAA,EAAS,WAAA;AAAA;AAJX;;;AAAA,iBAUgB,mBAAA,CAAoB,KAAA,EAAO,wBAAA,GAAwB,eAAA,CAAA,QAAA"}
1
+ {"version":3,"file":"virtual-command-entry.d.mts","names":[],"sources":["../../src/components/virtual-command-entry.tsx"],"mappings":";;;;;UAkCiB,wBAAA,SAAiC,IAAA,CAChD,cAAA;EAGA,OAAA,EAAS,WAAA;AAAA;AAJX;;;AAAA,iBAUgB,mBAAA,CAAoB,KAAA,EAAO,wBAAA,GAAwB,eAAA,CAAA,QAAA"}
@@ -1,4 +1,3 @@
1
- import { BannerFunctionDeclaration } from "./banner-function-declaration.mjs";
2
1
  import { CommandRouter } from "./command-router.mjs";
3
2
  import { CommandEntry } from "./command-entry.mjs";
4
3
  import { createComponent, mergeProps } from "@alloy-js/core/jsx-runtime";
@@ -55,37 +54,34 @@ function VirtualCommandEntry(props) {
55
54
  "isUnicodeSupported",
56
55
  "isInteractive",
57
56
  "isHelp",
58
- "findSuggestions"
57
+ "findSuggestions",
58
+ "sleep"
59
59
  ],
60
60
  prompts: [
61
61
  "text",
62
62
  "numeric",
63
63
  "toggle",
64
64
  "select",
65
- "isCancel",
66
- "sleep"
65
+ "isCancel"
67
66
  ],
68
- [joinPaths("help", ...command.segments.filter((segment) => !isDynamicPathSegment(segment)))]: ["showHelp"]
67
+ [joinPaths("help", ...command.segments.filter((segment) => !isDynamicPathSegment(segment)))]: ["showHelp"],
68
+ [joinPaths("banner", ...command.segments.filter((segment) => !isDynamicPathSegment(segment)))]: ["showBanner"]
69
69
  });
70
70
  },
71
71
  get children() {
72
- return [
73
- createComponent(BannerFunctionDeclaration, { command }),
74
- createComponent(Spacing, {}),
75
- createComponent(VirtualCommandHandlerDeclaration, {
76
- command,
77
- get children() {
78
- return createComponent(CommandRouter, {
79
- get segments() {
80
- return command.segments;
81
- },
82
- get commands() {
83
- return command.children;
84
- }
85
- });
86
- }
87
- })
88
- ];
72
+ return [createComponent(Spacing, {}), createComponent(VirtualCommandHandlerDeclaration, {
73
+ command,
74
+ get children() {
75
+ return createComponent(CommandRouter, {
76
+ get segments() {
77
+ return command.segments;
78
+ },
79
+ get commands() {
80
+ return command.children;
81
+ }
82
+ });
83
+ }
84
+ })];
89
85
  }
90
86
  })), createComponent(For, {
91
87
  get each() {
@@ -1 +1 @@
1
- {"version":3,"file":"virtual-command-entry.mjs","names":[],"sources":["../../src/components/virtual-command-entry.tsx"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Shell Shock\n\n This code was released as part of the Shell Shock project. Shell Shock\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/shell-shock.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/shell-shock\n Documentation: https://docs.stormsoftware.com/projects/shell-shock\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { computed, For, Show } from \"@alloy-js/core\";\nimport { Spacing } from \"@powerlines/plugin-alloy/core/components\";\nimport { usePowerlines } from \"@powerlines/plugin-alloy/core/contexts/context\";\nimport type { TypescriptFileImports } from \"@powerlines/plugin-alloy/types/components\";\nimport type { EntryFileProps } from \"@powerlines/plugin-alloy/typescript/components/entry-file\";\nimport { TypescriptFile } from \"@powerlines/plugin-alloy/typescript/components/typescript-file\";\nimport type { CommandTree } from \"@shell-shock/core\";\nimport { isDynamicPathSegment } from \"@shell-shock/core/plugin-utils\";\nimport { VirtualCommandHandlerDeclaration } from \"@shell-shock/preset-script/components/virtual-command-entry\";\nimport { joinPaths } from \"@stryke/path/join\";\nimport { pascalCase } from \"@stryke/string-format/pascal-case\";\nimport defu from \"defu\";\nimport type { CLIPresetContext } from \"../types/plugin\";\nimport { BannerFunctionDeclaration } from \"./banner-function-declaration\";\nimport { CommandEntry } from \"./command-entry\";\nimport { CommandRouter } from \"./command-router\";\n\nexport interface VirtualCommandEntryProps extends Omit<\n EntryFileProps,\n \"path\" | \"typeDefinition\"\n> {\n command: CommandTree;\n}\n\n/**\n * The virtual command entry point for the Shell Shock project.\n */\nexport function VirtualCommandEntry(props: VirtualCommandEntryProps) {\n const { command, imports, builtinImports, ...rest } = props;\n\n const context = usePowerlines<CLIPresetContext>();\n const filePath = computed(() =>\n joinPaths(\n context.entryPath,\n command.segments\n .filter(segment => !isDynamicPathSegment(segment))\n .join(\"/\"),\n \"index.ts\"\n )\n );\n\n return (\n <>\n <TypescriptFile\n {...rest}\n path={filePath.value}\n imports={defu(\n imports ?? {},\n Object.entries(command.children)\n .filter(([, child]) => child.isVirtual)\n .reduce((ret, [name, child]) => {\n ret[`./${child.name}`] = [\n { name: \"handler\", alias: `handle${pascalCase(name)}` }\n ];\n\n return ret;\n }, {} as TypescriptFileImports)\n )}\n builtinImports={defu(builtinImports ?? {}, {\n env: [\"isDevelopment\", \"isDebug\"],\n console: [\n \"warn\",\n \"error\",\n \"info\",\n \"help\",\n \"table\",\n \"colors\",\n \"writeLine\",\n \"splitText\",\n \"stripAnsi\"\n ],\n utils: [\n \"useApp\",\n \"useArgs\",\n \"hasFlag\",\n \"isMinimal\",\n \"isUnicodeSupported\",\n \"isInteractive\",\n \"isHelp\",\n \"findSuggestions\"\n ],\n prompts: [\"text\", \"numeric\", \"toggle\", \"select\", \"isCancel\", \"sleep\"],\n [joinPaths(\n \"help\",\n ...command.segments.filter(\n segment => !isDynamicPathSegment(segment)\n )\n )]: [\"showHelp\"]\n })}>\n <BannerFunctionDeclaration command={command} />\n <Spacing />\n <VirtualCommandHandlerDeclaration command={command}>\n <CommandRouter\n segments={command.segments}\n commands={command.children}\n />\n </VirtualCommandHandlerDeclaration>\n </TypescriptFile>\n <For each={Object.values(command.children)}>\n {child => (\n <Show\n when={child.isVirtual}\n fallback={<CommandEntry command={child} />}>\n <VirtualCommandEntry command={child} />\n </Show>\n )}\n </For>\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA0CA,SAAE,oBAAA,OAAA;CACA,MAAK,EACL,SACF,SACE,4BAEA;CACA,MAAM,UAAU,eAAc;CAC9B,MAAE,WAAS,eAAA,UAAA,QAAA,WAAA,QAAA,SAAA,QAAA,YAAA,CAAA,qBAAA,QAAA,CAAA,CAAA,KAAA,IAAA,EAAA,WAAA,CAAA;AACX,QAAI,CAAA,gBAAiB,gBAAA,WAAA,MAAA;EACnB,IAAE,OAAQ;AACR,UAAG,SAAO;;EAEZ,IAAG,UAAQ;AACX,UAAA,KAAA,WAAA,EAAA,EAAA,OAAA,QAAA,QAAA,SAAA,CAAA,QAAA,GAAA,WAAA,MAAA,UAAA,CAAA,QAAA,KAAA,CAAA,MAAA,WAAA;AACD,QAAA,KAAA,MAAA,UAAA,CAAA;;KAEM,OAAA,SAAA,WAAA,KAAA;KACJ,CAAA;AACE,WAAA;MACE,EAAE,CAAK,CAAA;;EAEZ,IAAI,iBAAa;AACf,UAAI,KAAQ,kBAAK,EAAA,EAAA;IACf,KAAE,CAAA,iBAAe,UAAgB;IACjC,SAAK;KAAA;KAAW;KAAW;KAAM;KAAS;KAAA;KAAA;KAAA;KAAA;KAAA;IAC1C,OAAK;KAAA;KAAa;KAAO;KAAW;KAAA;KAAA;KAAA;KAAA;KAAA;IACpC,SAAS;KAAC;KAAK;KAAc;KAAE;KAAA;KAAA;KAAA;KAC9B,UAAS,QAAO,GAAA,QAAU,SAAQ,QAAQ,YAAW,CAAI,qBAAI,QAAA,CAAA,CAAA,GAAA,CAAA,WAAA;IAC/D,CAAC;;EAEJ,IAAI,WAAM;AACR,UAAO;IAAC,gBAAO,2BAAqB,EACjC,SACF,CAAC;IAAA,gBAAoB,SAAC,EAAA,CAAA;IAAA,gBAAsB,kCAAA;KAClC;KACT,IAAE,WAAS;AACT,aAAO,gBAAC,eAAA;OACN,IAAC,WAAM;AACN,eAAK,QAAA;;OAEN,IAAC,WAAM;AACN,eAAO,QAAA;;OAET,CAAC;;KAEL,CAAC;IAAC;;EAEN,CAAC,CAAC,EAAE,gBAAa,KAAA;EAChB,IAAI,OAAK;AACP,UAAO,OAAO,OAAC,QAAA,SAAA;;EAEjB,WAAS,UAAA,gBAAmB,MAAA;GAC1B,IAAI,OAAG;AACL,WAAK,MAAO;;GAEd,IAAI,WAAC;AACH,WAAE,gBAAmB,cAAkB,EACrC,SAAC,OACF,CAAC;;GAEJ,IAAI,WAAW;AACb,WAAI,gBAAA,qBAAA,EACF,SAAM,OACP,CAAC;;GAEL,CAAC;EACH,CAAC,CAAC"}
1
+ {"version":3,"file":"virtual-command-entry.mjs","names":[],"sources":["../../src/components/virtual-command-entry.tsx"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Shell Shock\n\n This code was released as part of the Shell Shock project. Shell Shock\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/shell-shock.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/shell-shock\n Documentation: https://docs.stormsoftware.com/projects/shell-shock\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { computed, For, Show } from \"@alloy-js/core\";\nimport { Spacing } from \"@powerlines/plugin-alloy/core/components\";\nimport { usePowerlines } from \"@powerlines/plugin-alloy/core/contexts/context\";\nimport type { TypescriptFileImports } from \"@powerlines/plugin-alloy/types/components\";\nimport type { EntryFileProps } from \"@powerlines/plugin-alloy/typescript/components/entry-file\";\nimport { TypescriptFile } from \"@powerlines/plugin-alloy/typescript/components/typescript-file\";\nimport type { CommandTree } from \"@shell-shock/core\";\nimport { isDynamicPathSegment } from \"@shell-shock/core/plugin-utils\";\nimport { VirtualCommandHandlerDeclaration } from \"@shell-shock/preset-script/components/virtual-command-entry\";\nimport { joinPaths } from \"@stryke/path/join\";\nimport { pascalCase } from \"@stryke/string-format/pascal-case\";\nimport defu from \"defu\";\nimport type { CLIPresetContext } from \"../types/plugin\";\nimport { CommandEntry } from \"./command-entry\";\nimport { CommandRouter } from \"./command-router\";\n\nexport interface VirtualCommandEntryProps extends Omit<\n EntryFileProps,\n \"path\" | \"typeDefinition\"\n> {\n command: CommandTree;\n}\n\n/**\n * The virtual command entry point for the Shell Shock project.\n */\nexport function VirtualCommandEntry(props: VirtualCommandEntryProps) {\n const { command, imports, builtinImports, ...rest } = props;\n\n const context = usePowerlines<CLIPresetContext>();\n const filePath = computed(() =>\n joinPaths(\n context.entryPath,\n command.segments\n .filter(segment => !isDynamicPathSegment(segment))\n .join(\"/\"),\n \"index.ts\"\n )\n );\n\n return (\n <>\n <TypescriptFile\n {...rest}\n path={filePath.value}\n imports={defu(\n imports ?? {},\n Object.entries(command.children)\n .filter(([, child]) => child.isVirtual)\n .reduce((ret, [name, child]) => {\n ret[`./${child.name}`] = [\n { name: \"handler\", alias: `handle${pascalCase(name)}` }\n ];\n\n return ret;\n }, {} as TypescriptFileImports)\n )}\n builtinImports={defu(builtinImports ?? {}, {\n env: [\"isDevelopment\", \"isDebug\"],\n console: [\n \"warn\",\n \"error\",\n \"info\",\n \"help\",\n \"table\",\n \"colors\",\n \"writeLine\",\n \"splitText\",\n \"stripAnsi\"\n ],\n utils: [\n \"useApp\",\n \"useArgs\",\n \"hasFlag\",\n \"isMinimal\",\n \"isUnicodeSupported\",\n \"isInteractive\",\n \"isHelp\",\n \"findSuggestions\",\n \"sleep\"\n ],\n prompts: [\"text\", \"numeric\", \"toggle\", \"select\", \"isCancel\"],\n [joinPaths(\n \"help\",\n ...command.segments.filter(\n segment => !isDynamicPathSegment(segment)\n )\n )]: [\"showHelp\"],\n [joinPaths(\n \"banner\",\n ...command.segments.filter(\n segment => !isDynamicPathSegment(segment)\n )\n )]: [\"showBanner\"]\n })}>\n <Spacing />\n <VirtualCommandHandlerDeclaration command={command}>\n <CommandRouter\n segments={command.segments}\n commands={command.children}\n />\n </VirtualCommandHandlerDeclaration>\n </TypescriptFile>\n <For each={Object.values(command.children)}>\n {child => (\n <Show\n when={child.isVirtual}\n fallback={<CommandEntry command={child} />}>\n <VirtualCommandEntry command={child} />\n </Show>\n )}\n </For>\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAyCA,SAAE,oBAAA,OAAA;CACA,MAAK,EACL,SACF,SACE,4BAEA;CACA,MAAM,UAAU,eAAc;CAC9B,MAAE,WAAS,eAAA,UAAA,QAAA,WAAA,QAAA,SAAA,QAAA,YAAA,CAAA,qBAAA,QAAA,CAAA,CAAA,KAAA,IAAA,EAAA,WAAA,CAAA;AACX,QAAI,CAAA,gBAAiB,gBAAA,WAAA,MAAA;EACnB,IAAE,OAAQ;AACR,UAAG,SAAO;;EAEZ,IAAG,UAAQ;AACX,UAAA,KAAA,WAAA,EAAA,EAAA,OAAA,QAAA,QAAA,SAAA,CAAA,QAAA,GAAA,WAAA,MAAA,UAAA,CAAA,QAAA,KAAA,CAAA,MAAA,WAAA;AACD,QAAA,KAAA,MAAA,UAAA,CAAA;;KAEM,OAAA,SAAA,WAAA,KAAA;KACJ,CAAA;AACE,WAAA;MACE,EAAE,CAAK,CAAA;;EAEZ,IAAI,iBAAa;AACf,UAAI,KAAQ,kBAAK,EAAA,EAAA;IACf,KAAE,CAAA,iBAAe,UAAgB;IACjC,SAAK;KAAA;KAAW;KAAW;KAAM;KAAS;KAAA;KAAA;KAAA;KAAA;KAAA;IAC1C,OAAK;KAAA;KAAa;KAAO;KAAW;KAAA;KAAA;KAAA;KAAA;KAAA;KAAA;IACpC,SAAS;KAAC;KAAK;KAAc;KAAE;KAAA;KAAA;KAC9B,UAAS,QAAO,GAAA,QAAU,SAAQ,QAAQ,YAAW,CAAI,qBAAI,QAAA,CAAA,CAAA,GAAA,CAAA,WAAA;KAC7D,UAAM,UAAA,GAAA,QAAA,SAAA,QAAA,YAAA,CAAA,qBAAA,QAAA,CAAA,CAAA,GAAA,CAAA,aAAA;;;EAGX,IAAI,WAAU;AACZ,UAAG,CAAA,gBAAA,SAAA,EAAA,CAAA,EAAA,gBAAA,kCAAA;IACD;IACA,IAAE,WAAO;AACP,YAAO,gBAAE,eAAA;MACP,IAAC,WAAK;AACL,cAAM,QAAA;;MAEP,IAAC,WAAK;AACL,cAAM,QAAA;;MAER,CAAC;;IAEL,CAAC,CAAC;;EAEN,CAAC,CAAC,EAAE,gBAAU,KAAA;EACb,IAAI,OAAK;AACP,UAAO,OAAO,OAAC,QAAA,SAAA;;EAEjB,WAAS,UAAU,gBAAA,MAAA;GACjB,IAAI,OAAG;AACL,WAAK,MAAA;;GAEP,IAAI,WAAG;AACL,WAAK,gBAAK,cAAA,EACR,SAAC,OACF,CAAC;;GAEJ,IAAI,WAAQ;AACV,WAAO,gBAAiB,qBAAM,EAC5B,SAAI,OACL,CAAC;;GAEL,CAAC;EACH,CAAC,CAAC"}
package/dist/index.cjs CHANGED
@@ -1,19 +1,22 @@
1
1
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: 'Module' } });
2
2
  const require_runtime = require('./_virtual/_rolldown/runtime.cjs');
3
3
  const require_index = require('./plugin-help/dist/index.cjs');
4
- const require_components_banner_function_declaration = require('./components/banner-function-declaration.cjs');
4
+ const require_components_banner_builtin = require('./components/banner-builtin.cjs');
5
5
  const require_components_command_router = require('./components/command-router.cjs');
6
6
  const require_components_virtual_command_entry = require('./components/virtual-command-entry.cjs');
7
7
  const require_components_command_entry = require('./components/command-entry.cjs');
8
8
  const require_components_upgrade_builtin = require('./components/upgrade-builtin.cjs');
9
+ require('./components/index.cjs');
9
10
  const require_get_default_options = require('./helpers/get-default-options.cjs');
10
11
  let _alloy_js_core_jsx_runtime = require("@alloy-js/core/jsx-runtime");
11
12
  let _alloy_js_core = require("@alloy-js/core");
12
13
  let _alloy_js_typescript = require("@alloy-js/typescript");
13
14
  let _powerlines_plugin_alloy_core_components = require("@powerlines/plugin-alloy/core/components");
14
15
  let _powerlines_plugin_alloy_render = require("@powerlines/plugin-alloy/render");
16
+ let _shell_shock_core_plugin_utils = require("@shell-shock/core/plugin-utils");
15
17
  let _shell_shock_plugin_console = require("@shell-shock/plugin-console");
16
18
  _shell_shock_plugin_console = require_runtime.__toESM(_shell_shock_plugin_console);
19
+ let _stryke_path = require("@stryke/path");
17
20
  let _shell_shock_plugin_prompts = require("@shell-shock/plugin-prompts");
18
21
  _shell_shock_plugin_prompts = require_runtime.__toESM(_shell_shock_plugin_prompts);
19
22
  let _shell_shock_plugin_upgrade = require("@shell-shock/plugin-upgrade");
@@ -46,8 +49,38 @@ const plugin = (options = {}) => {
46
49
  prepare: {
47
50
  order: "post",
48
51
  async handler() {
49
- this.debug("Rendering upgrade built-in module.");
50
- return (0, _powerlines_plugin_alloy_render.render)(this, (0, _alloy_js_core_jsx_runtime.createComponent)(require_components_upgrade_builtin.UpgradeBuiltin, {}));
52
+ this.debug("Rendering built-in modules.");
53
+ const commands = await (0, _shell_shock_core_plugin_utils.getCommandList)(this);
54
+ this.debug(`Rendering \`banner\` built-ins for each of the ${commands.length} command modules.`);
55
+ const bin = (0, _alloy_js_core.computed)(() => ({
56
+ id: "",
57
+ name: (0, _shell_shock_core_plugin_utils.getAppName)(this),
58
+ title: (0, _shell_shock_core_plugin_utils.getAppTitle)(this),
59
+ description: (0, _shell_shock_core_plugin_utils.getAppDescription)(this),
60
+ isVirtual: true,
61
+ path: null,
62
+ segments: [],
63
+ alias: [],
64
+ options: Object.fromEntries(this.options.map((option) => [option.name, option])),
65
+ entry: { file: (0, _stryke_path.joinPaths)(this.entryPath, "bin.ts") },
66
+ args: [],
67
+ parent: null,
68
+ children: this.commands
69
+ }));
70
+ return (0, _powerlines_plugin_alloy_render.render)(this, [
71
+ (0, _alloy_js_core_jsx_runtime.createComponent)(require_components_upgrade_builtin.UpgradeBuiltin, {}),
72
+ (0, _alloy_js_core_jsx_runtime.createComponent)(require_components_banner_builtin.BannerBuiltin, { get command() {
73
+ return bin.value;
74
+ } }),
75
+ (0, _alloy_js_core_jsx_runtime.createComponent)(_powerlines_plugin_alloy_core_components.Spacing, {}),
76
+ (0, _alloy_js_core_jsx_runtime.createComponent)(_alloy_js_core.For, {
77
+ get each() {
78
+ return commands.sort((a, b) => a.name.localeCompare(b.name));
79
+ },
80
+ doubleHardline: true,
81
+ children: (command) => (0, _alloy_js_core_jsx_runtime.createComponent)(require_components_banner_builtin.BannerBuiltin, { command })
82
+ })
83
+ ]);
51
84
  }
52
85
  }
53
86
  },
@@ -91,9 +124,6 @@ const plugin = (options = {}) => {
91
124
  env: ["env", "paths"],
92
125
  upgrade: ["executeUpgrade"]
93
126
  },
94
- get prefix() {
95
- return [(0, _alloy_js_core_jsx_runtime.createComponent)(require_components_banner_function_declaration.BannerFunctionDeclaration, {}), (0, _alloy_js_core_jsx_runtime.createComponent)(_powerlines_plugin_alloy_core_components.Spacing, {})];
96
- },
97
127
  get children() {
98
128
  return [
99
129
  (0, _alloy_js_core_jsx_runtime.createComponent)(_alloy_js_core.Show, {
@@ -120,7 +150,7 @@ const plugin = (options = {}) => {
120
150
  }
121
151
  }),
122
152
  (0, _alloy_js_core_jsx_runtime.createIntrinsic)("hbr", {}),
123
- _alloy_js_core.code`await banner(0);`,
153
+ _alloy_js_core.code`await showBanner(0);`,
124
154
  (0, _alloy_js_core_jsx_runtime.createComponent)(_powerlines_plugin_alloy_core_components.Spacing, {}),
125
155
  _alloy_js_core.code`return showHelp(); `
126
156
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.tsx"],"mappings":";;;;;;AA0CA;;;;cAAa,MAAA,oBAA2B,gBAAA,GAAmB,gBAAA,EACzD,OAAA,GAAS,gBAAA,KACR,MAAA,CAAO,QAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.tsx"],"mappings":";;;;;;AAiDA;;;;cAAa,MAAA,oBAA2B,gBAAA,GAAmB,gBAAA,EACzD,OAAA,GAAS,gBAAA,KACR,MAAA,CAAO,QAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.tsx"],"mappings":";;;;;;AA0CA;;;;cAAa,MAAA,oBAA2B,gBAAA,GAAmB,gBAAA,EACzD,OAAA,GAAS,gBAAA,KACR,MAAA,CAAO,QAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.tsx"],"mappings":";;;;;;AAiDA;;;;cAAa,MAAA,oBAA2B,gBAAA,GAAmB,gBAAA,EACzD,OAAA,GAAS,gBAAA,KACR,MAAA,CAAO,QAAA"}