@shell-shock/preset-cli 0.9.15 → 0.9.16

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 (27) hide show
  1. package/dist/components/command-entry.cjs +2 -2
  2. package/dist/components/command-entry.mjs +2 -2
  3. package/dist/components/command-entry.mjs.map +1 -1
  4. package/dist/components/command-router.cjs +4 -2
  5. package/dist/components/command-router.mjs +4 -2
  6. package/dist/components/command-router.mjs.map +1 -1
  7. package/dist/components/upgrade-builtin.cjs +6 -0
  8. package/dist/components/upgrade-builtin.d.cts.map +1 -1
  9. package/dist/components/upgrade-builtin.d.mts.map +1 -1
  10. package/dist/components/upgrade-builtin.mjs +6 -0
  11. package/dist/components/upgrade-builtin.mjs.map +1 -1
  12. package/dist/index.cjs +2 -5
  13. package/dist/index.mjs +2 -5
  14. package/dist/index.mjs.map +1 -1
  15. package/dist/packages/plugin-changelog/dist/components/changelog-command.cjs +2 -2
  16. package/dist/packages/plugin-changelog/dist/components/changelog-command.mjs +1 -1
  17. package/dist/packages/plugin-changelog/dist/index.cjs +1 -1
  18. package/dist/packages/unified/dist/{html-Dw6VvFHa.cjs → html-BwC2s0z0.cjs} +44 -44
  19. package/dist/packages/unified/dist/{html-Dw6VvFHa.mjs → html-BwC2s0z0.mjs} +45 -45
  20. package/dist/packages/unified/dist/html-BwC2s0z0.mjs.map +1 -0
  21. package/dist/packages/unified/dist/markdown/index.cjs +1 -1
  22. package/dist/packages/unified/dist/markdown/index.mjs +1 -1
  23. package/dist/packages/unified/dist/{markdown-BGGlzivq.cjs → markdown-D89Le-_6.cjs} +3 -3
  24. package/dist/packages/unified/dist/{markdown-BGGlzivq.mjs → markdown-D89Le-_6.mjs} +4 -4
  25. package/dist/packages/unified/dist/{markdown-BGGlzivq.mjs.map → markdown-D89Le-_6.mjs.map} +1 -1
  26. package/package.json +15 -15
  27. package/dist/packages/unified/dist/html-Dw6VvFHa.mjs.map +0 -1
@@ -367,7 +367,7 @@ function CommandEntry(props) {
367
367
  }
368
368
  }), (0, _alloy_js_core_jsx_runtime.createComponent)(_alloy_js_core.Show, {
369
369
  get when() {
370
- return (arg.kind === _shell_shock_core.CommandParameterKinds.string || arg.kind === _shell_shock_core.CommandParameterKinds.number) && arg.variadic;
370
+ return arg.variadic;
371
371
  },
372
372
  get children() {
373
373
  return (0, _alloy_js_core_jsx_runtime.createComponent)(_alloy_js_typescript.ElseIfClause, {
@@ -398,7 +398,7 @@ function CommandEntry(props) {
398
398
  return;
399
399
  }
400
400
 
401
- ${(0, _stryke_string_format_camel_case.camelCase)(arg.name)} = value.split(",").map(value => value.trim()).filter(Boolean)${arg.kind === _shell_shock_core.CommandParameterKinds.number ? `.map(Number)` : ""} ;
401
+ ${(0, _stryke_string_format_camel_case.camelCase)(arg.name)} = value.split(",").map(value => value.trim()).filter(Boolean)${arg.kind === _shell_shock_core.CommandParameterKinds.number ? `.map(Number)` : arg.kind === _shell_shock_core.CommandParameterKinds.boolean ? `.map(Boolean)` : ""} ;
402
402
  `;
403
403
  }
404
404
  });
@@ -364,7 +364,7 @@ function CommandEntry(props) {
364
364
  }
365
365
  }), createComponent(Show, {
366
366
  get when() {
367
- return (arg.kind === CommandParameterKinds.string || arg.kind === CommandParameterKinds.number) && arg.variadic;
367
+ return arg.variadic;
368
368
  },
369
369
  get children() {
370
370
  return createComponent(ElseIfClause, {
@@ -395,7 +395,7 @@ function CommandEntry(props) {
395
395
  return;
396
396
  }
397
397
 
398
- ${camelCase(arg.name)} = value.split(",").map(value => value.trim()).filter(Boolean)${arg.kind === CommandParameterKinds.number ? `.map(Number)` : ""} ;
398
+ ${camelCase(arg.name)} = value.split(",").map(value => value.trim()).filter(Boolean)${arg.kind === CommandParameterKinds.number ? `.map(Number)` : arg.kind === CommandParameterKinds.boolean ? `.map(Boolean)` : ""} ;
399
399
  `;
400
400
  }
401
401
  });
@@ -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 { 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 \"italic\",\n \"cursor\",\n \"stripAnsi\",\n \"writeLine\",\n \"splitText\",\n \"textColors\",\n \"createSpinner\"\n ],\n utils: [\"sleep\", \"isMinimal\", \"isInteractive\", \"isUnicodeSupported\"],\n state: [\n \"useGlobal\",\n \"GlobalOptions\",\n \"useGlobalOptions\",\n \"withCommand\",\n \"useArgs\",\n \"hasFlag\",\n \"isHelp\"\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(\n command.options ?? {}\n )\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 \\${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 \\${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 \\${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 \\${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 \\${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 \\${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 \\${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 \\${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 \\${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 \\${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 \\${italic(\"${command.title}\")} command 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 \"italic\",\n \"cursor\",\n \"stripAnsi\",\n \"writeLine\",\n \"splitText\",\n \"textColors\",\n \"createSpinner\"\n ],\n utils: [\"sleep\", \"isMinimal\", \"isInteractive\", \"isUnicodeSupported\"],\n state: [\n \"useGlobal\",\n \"GlobalOptions\",\n \"useGlobalOptions\",\n \"withCommand\",\n \"useArgs\",\n \"hasFlag\",\n \"isHelp\"\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(\n command.options ?? {}\n )\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 \\${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 \\${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 \\${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 \\${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 \\${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 \\${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 \\${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 \\${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 \\${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 when={arg.variadic}>\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 \\${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 : arg.kind === CommandParameterKinds.boolean\n ? `.map(Boolean)`\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 \\${italic(\"${\n command.title\n }\")} command 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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"}
@@ -63,10 +63,12 @@ function CommandRouter(props) {
63
63
 
64
64
  segments = segments.map(segment => dynamics[segment] || segment);
65
65
  const context = useGlobal();
66
- context.set("args", [args.length > 0 ? args[0] : undefined, args.length > 1 ? args[1] : undefined, ...segments, ...args.slice(${segments.length + 2})].filter(Boolean) as string[]);
66
+ if (context) {
67
+ context.inputArgs = [args.length > 0 ? args[0] : undefined, args.length > 1 ? args[1] : undefined, ...segments, ...args.slice(${segments.length + 2})].filter(Boolean) as string[];
68
+ }
67
69
 
68
70
  command = segments[0];
69
- args = context.get("args"); `),
71
+ args = context.inputArgs; `),
70
72
  (0, _alloy_js_core_jsx_runtime.createComponent)(_shell_shock_preset_script_components.CommandRouterBody, (0, _alloy_js_core_jsx_runtime.mergeProps)(props, {
71
73
  segments,
72
74
  commands
@@ -61,10 +61,12 @@ function CommandRouter(props) {
61
61
 
62
62
  segments = segments.map(segment => dynamics[segment] || segment);
63
63
  const context = useGlobal();
64
- context.set("args", [args.length > 0 ? args[0] : undefined, args.length > 1 ? args[1] : undefined, ...segments, ...args.slice(${segments.length + 2})].filter(Boolean) as string[]);
64
+ if (context) {
65
+ context.inputArgs = [args.length > 0 ? args[0] : undefined, args.length > 1 ? args[1] : undefined, ...segments, ...args.slice(${segments.length + 2})].filter(Boolean) as string[];
66
+ }
65
67
 
66
68
  command = segments[0];
67
- args = context.get("args"); `),
69
+ args = context.inputArgs; `),
68
70
  createComponent(CommandRouterBody, mergeProps(props, {
69
71
  segments,
70
72
  commands
@@ -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 { usePowerlines } from \"@powerlines/plugin-alloy/core/contexts/context\";\nimport type { CommandTree } from \"@shell-shock/core\";\nimport { getAppBin } 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\";\nimport type { CLIPresetContext } from \"../types\";\n\nexport interface CommandRouterSelectOptionsProps {\n commands?: Record<string, CommandTree>;\n}\n\nexport function CommandRouterSelectOptions(\n props: CommandRouterSelectOptionsProps\n) {\n const { commands } = props;\n\n const context = usePowerlines<CLIPresetContext>();\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: \\`(${getAppBin(\n context\n )} ${command.segments.join(\" \")})\\`${\n command.icon ? `, icon: \"${command.icon.trim()}\"` : \"\"\n } }`\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 = useGlobal();\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":";;;;;;;;;AA+BA,SAAgB,2BAAC,OAAgC;CAC/C,MAAA,EACF;CAEA,MAAO,UAAS,eAA0B;AACxC,QAAO,gBAAA,KAAA;EACP,IAAA,OAAA;AACA,UAAQ,OAAU,OAAG,YAAK,EAAA,CAAA;;EAE1B,QAAM;;EAEN,WAAO,YAAA,QAAA,YAAA,gBAAA,4BAAA,EACJ,IAAI,WAAY;AACd,UAAQ,QAAC,YAAA,EAAA;KAEX,CAAC,GAAG,IAAE,aAAA,QAAA,SAA2B,KAAS,YAAS,IAAA,QAAc,GAAG,CAAA,KAAA,KAAA,CAAA,aAAA,QAAA,MAAA,qBAAA,UAAA,QAAA,CAAA,GAAA,QAAA,SAAA,KAAA,IAAA,CAAA,KAAA,QAAA,OAAA,YAAA,QAAA,KAAA,MAAA,CAAA,KAAA,GAAA;EACtE,CAAC;;;;;AAMJ,SAAY,cAAA,OAAA;CACV,MAAM,EACJ,UACA,aACE;AACJ,QAAI;EAAA,gBAAA,iBAAA,WAAA,OAAA;GACG;GACN;GACH,CAAA,CAAA;EAAA,gBAAA,SAAA,EAAA,CAAA;EAAA,gBAAA,aAAA;;GAEE,IAAA,WAAA;AACG,WAAA;KAAS,IAAC;;;;;mDAKN,UACJ,CAAA;KAAA,WAAA;;;;;;;;;;;;;;;;;;;wIAmBmG,SAAA,SAAA,EAAA;;;sCAGtF;KAAA,gBAAA,mBAAA,WAAA,OAAA;MACR;MACQ;MACX,CAAC,CAAA;KAAA;;GAEL,CAAC;EAAE,gBAAa,SAAa,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 { usePowerlines } from \"@powerlines/plugin-alloy/core/contexts/context\";\nimport type { CommandTree } from \"@shell-shock/core\";\nimport { getAppBin } 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\";\nimport type { CLIPresetContext } from \"../types\";\n\nexport interface CommandRouterSelectOptionsProps {\n commands?: Record<string, CommandTree>;\n}\n\nexport function CommandRouterSelectOptions(\n props: CommandRouterSelectOptionsProps\n) {\n const { commands } = props;\n\n const context = usePowerlines<CLIPresetContext>();\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: \\`(${getAppBin(\n context\n )} ${command.segments.join(\" \")})\\`${\n command.icon ? `, icon: \"${command.icon.trim()}\"` : \"\"\n } }`\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 = useGlobal();\n if (context) {\n context.inputArgs = [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\n command = segments[0];\n args = context.inputArgs; `}\n <CommandRouterBody {...props} segments={segments} commands={commands} />\n </IfStatement>\n <Spacing />\n </>\n );\n}\n"],"mappings":";;;;;;;;;AA+BA,SAAgB,2BAAC,OAAgC;CAC/C,MAAA,EACF;CAEA,MAAO,UAAS,eAA0B;AACxC,QAAO,gBAAA,KAAA;EACP,IAAA,OAAA;AACA,UAAQ,OAAU,OAAG,YAAK,EAAA,CAAA;;EAE1B,QAAM;;EAEN,WAAO,YAAA,QAAA,YAAA,gBAAA,4BAAA,EACJ,IAAI,WAAY;AACd,UAAQ,QAAC,YAAA,EAAA;KAEX,CAAC,GAAG,IAAE,aAAA,QAAA,SAA2B,KAAS,YAAS,IAAA,QAAc,GAAG,CAAA,KAAA,KAAA,CAAA,aAAA,QAAA,MAAA,qBAAA,UAAA,QAAA,CAAA,GAAA,QAAA,SAAA,KAAA,IAAA,CAAA,KAAA,QAAA,OAAA,YAAA,QAAA,KAAA,MAAA,CAAA,KAAA,GAAA;EACtE,CAAC;;;;;AAMJ,SAAY,cAAA,OAAA;CACV,MAAM,EACJ,UACA,aACE;AACJ,QAAI;EAAA,gBAAA,iBAAA,WAAA,OAAA;GACG;GACN;GACH,CAAA,CAAA;EAAA,gBAAA,SAAA,EAAA,CAAA;EAAA,gBAAA,aAAA;;GAEE,IAAA,WAAA;AACG,WAAA;KAAS,IAAC;;;;;mDAKN,UACJ,CAAA;KAAA,WAAA;;;;;;;;;;;;;;;;;;;;0IAoBO,SAAA,SAAA,EAAA;;;;oCAIuB;KAAA,gBAAA,mBAAA,WAAA,OAAA;MAC3B;;MAED,CAAC,CAAA;KAAA;;GAEL,CAAC;EAAE,gBAAe,SAAA,EAAA,CAAA;EAAA"}
@@ -66,6 +66,9 @@ function ExecuteUpgradeFunctionDeclaration() {
66
66
  await upgrade();
67
67
  spinner.success("Update successful! Please restart the application to apply the update.");
68
68
 
69
+ writeLine("");
70
+ help(\`You can view the changelog for this release at any time by running the \${inlineCode("${(0, _shell_shock_core_plugin_utils.getAppBin)(context)} changelog --latest")} command.\`);
71
+
69
72
  writeLine("");
70
73
  writeLine("Press any key to exit the application...");
71
74
 
@@ -102,6 +105,9 @@ function ExecuteUpgradeFunctionDeclaration() {
102
105
  await upgrade();
103
106
  spinner.success("Update successful! Please restart the application to apply the update.");
104
107
 
108
+ writeLine("");
109
+ help(\`You can view the changelog for this release at any time by running the \${inlineCode("${(0, _shell_shock_core_plugin_utils.getAppBin)(context)} changelog --latest")} command.\`);
110
+
105
111
  writeLine("");
106
112
  writeLine("Press any key to exit the application...");
107
113
 
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade-builtin.d.cts","names":[],"sources":["../../src/components/upgrade-builtin.tsx"],"mappings":";;;;;;;iBAqCgB,iCAAA,CAAA,GAAiC,iBAAA,CAAA,QAAA;;;;iBA6IjC,cAAA,CAAe,KAAA,EAAO,mBAAA,GAAmB,iBAAA,CAAA,QAAA"}
1
+ {"version":3,"file":"upgrade-builtin.d.cts","names":[],"sources":["../../src/components/upgrade-builtin.tsx"],"mappings":";;;;;;;iBAqCgB,iCAAA,CAAA,GAAiC,iBAAA,CAAA,QAAA;;;;iBAuJjC,cAAA,CAAe,KAAA,EAAO,mBAAA,GAAmB,iBAAA,CAAA,QAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade-builtin.d.mts","names":[],"sources":["../../src/components/upgrade-builtin.tsx"],"mappings":";;;;;;;iBAqCgB,iCAAA,CAAA,GAAiC,iBAAA,CAAA,QAAA;;;;iBA6IjC,cAAA,CAAe,KAAA,EAAO,mBAAA,GAAmB,iBAAA,CAAA,QAAA"}
1
+ {"version":3,"file":"upgrade-builtin.d.mts","names":[],"sources":["../../src/components/upgrade-builtin.tsx"],"mappings":";;;;;;;iBAqCgB,iCAAA,CAAA,GAAiC,iBAAA,CAAA,QAAA;;;;iBAuJjC,cAAA,CAAe,KAAA,EAAO,mBAAA,GAAmB,iBAAA,CAAA,QAAA"}
@@ -64,6 +64,9 @@ function ExecuteUpgradeFunctionDeclaration() {
64
64
  await upgrade();
65
65
  spinner.success("Update successful! Please restart the application to apply the update.");
66
66
 
67
+ writeLine("");
68
+ help(\`You can view the changelog for this release at any time by running the \${inlineCode("${getAppBin(context)} changelog --latest")} command.\`);
69
+
67
70
  writeLine("");
68
71
  writeLine("Press any key to exit the application...");
69
72
 
@@ -100,6 +103,9 @@ function ExecuteUpgradeFunctionDeclaration() {
100
103
  await upgrade();
101
104
  spinner.success("Update successful! Please restart the application to apply the update.");
102
105
 
106
+ writeLine("");
107
+ help(\`You can view the changelog for this release at any time by running the \${inlineCode("${getAppBin(context)} changelog --latest")} command.\`);
108
+
103
109
  writeLine("");
104
110
  writeLine("Press any key to exit the application...");
105
111
 
@@ -1 +1 @@
1
- {"version":3,"file":"upgrade-builtin.mjs","names":[],"sources":["../../src/components/upgrade-builtin.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, Show, splitProps } from \"@alloy-js/core\";\nimport {\n ElseClause,\n ElseIfClause,\n FunctionDeclaration,\n IfStatement,\n VarDeclaration\n} from \"@alloy-js/typescript\";\nimport { Spacing } from \"@powerlines/plugin-alloy/core/components/spacing\";\nimport { usePowerlines } from \"@powerlines/plugin-alloy/core/contexts/context\";\nimport { getAppBin, getAppTitle } from \"@shell-shock/core/plugin-utils\";\nimport type { UpgradeBuiltinProps } from \"@shell-shock/plugin-upgrade/components/upgrade-builtin\";\nimport { UpgradeBuiltin as BaseUpgradeBuiltin } from \"@shell-shock/plugin-upgrade/components/upgrade-builtin\";\nimport { defu } from \"defu\";\nimport type { CLIPresetContext } from \"../types/plugin\";\n\n/**\n * A component to generate the `executeUpgrade` function in the `shell-shock:upgrade` builtin module.\n */\nexport function ExecuteUpgradeFunctionDeclaration() {\n const context = usePowerlines<CLIPresetContext>();\n\n return (\n <Show when={context.config.upgradeType !== false}>\n <FunctionDeclaration\n export\n async\n name=\"executeUpgrade\"\n doc={`Run upgrade processing for the ${getAppTitle(\n context,\n true\n )} application.`}>\n <IfStatement condition={code`await isCheckForUpdatesRequired()`}>\n <VarDeclaration\n const\n name=\"spinner\"\n initializer={code`createSpinner({\n message: \"Checking for updates...\"\n }).start(); `}\n />\n <VarDeclaration\n const\n name=\"result\"\n initializer={code`await checkForUpdates({ force: true }); `}\n />\n <IfStatement\n condition={code`(result as CheckForUpdatesErrorResult)?.isError`}>\n {code`spinner.error(\\`An error occurred while checking for ${getAppTitle(\n context,\n true\n )} application updates. Please try again later - if the problem persists, please contact support.\\`);\n debug((result as CheckForUpdatesErrorResult).error); `}\n </IfStatement>\n <ElseIfClause\n condition={code`!(result as CheckForUpdatesSuccessResult)?.isUpToDate`}>\n <Show\n when={\n context.config.upgradeType !== false &&\n (context.config.upgradeType === \"confirm\" ||\n context.config.upgradeType === \"manual\")\n }\n fallback={\n <>\n {code`spinner.stop();\n info(\\`A new version of ${getAppTitle(\n context,\n true\n )} is available: \\${red(\\`v\\${(result as CheckForUpdatesSuccessResult).currentVersion}\\`)} \\${textColors.body.tertiary(\"➜\")} \\${green(\\`v\\${(result as CheckForUpdatesSuccessResult).latestVersion}\\`)}\\${(result as CheckForUpdatesSuccessResult).package?.date ? textColors.body.tertiary(\\` (updated on \\${(result as CheckForUpdatesSuccessResult).package?.date})\\`) : \"\"}\\`);\n\n try {\n await upgrade();\n spinner.success(\"Update successful! Please restart the application to apply the update.\");\n\n writeLine(\"\");\n writeLine(\"Press any key to exit the application...\");\n\n await waitForKeyPress();\n return;\n } catch (err) {\n spinner.error(\\`An error occurred while updating ${getAppTitle(\n context,\n true\n )} to v\\${(result as CheckForUpdatesSuccessResult).latestVersion}. Please try again later - if the problem persists, please contact support.\\`);\n debug(err);\n } `}\n <Spacing />\n </>\n }>\n {code`spinner.stop();\n warn(\\`A new version of ${getAppTitle(\n context,\n true\n )} is available: \\${red(\\`v\\${(result as CheckForUpdatesSuccessResult).currentVersion}\\`)} \\${textColors.body.tertiary(\"➜\")} \\${green(\\`v\\${(result as CheckForUpdatesSuccessResult).latestVersion}\\`)}\\${(result as CheckForUpdatesSuccessResult).package.date ? textColors.body.tertiary(\\` (updated on \\${(result as CheckForUpdatesSuccessResult).package.date})\\`) : \"\"}${\n context.config.upgradeType !== false &&\n context.config.upgradeType === \"manual\"\n ? ` \\\\nPlease run \\`${getAppBin(\n context\n )} upgrade\\` to upgrade to the latest version.`\n : \"\"\n }\\`); `}\n <Spacing />\n <Show\n when={\n context.config.upgradeType !== false &&\n context.config.upgradeType === \"confirm\"\n }>\n {code`const willUpgradeNow = await confirm({\n message: \\`Would you like to update to v\\${(result as CheckForUpdatesSuccessResult).latestVersion} now?\\`,\n initialValue: true\n });\n if (isCancel(willUpgradeNow)) {\n return;\n }\n\n if (willUpgradeNow) {\n spinner.text = \\`Updating ${getAppTitle(\n context,\n true\n )} to v\\${(result as CheckForUpdatesSuccessResult).latestVersion}...\\`;\n spinner.start();\n\n try {\n await upgrade();\n spinner.success(\"Update successful! Please restart the application to apply the update.\");\n\n writeLine(\"\");\n writeLine(\"Press any key to exit the application...\");\n\n await waitForKeyPress();\n return;\n } catch (err) {\n spinner.error(\\`An error occurred while updating ${getAppTitle(\n context,\n true\n )} to v\\${(result as CheckForUpdatesSuccessResult).latestVersion}. Please try again later - if the problem persists, please contact support.\\`);\n return { error: err };\n }\n } else {\n help(\"Updates can be performed at any time by running the \\`${getAppBin(\n context\n )} upgrade\\` command. Please remember that keeping your application up to date is important for ensuring you have the latest features, performance improvements, and security patches.\");\n } `}\n </Show>\n </Show>\n </ElseIfClause>\n <ElseClause>{code`spinner.success(\"Currently running the latest version of ${getAppTitle(\n context,\n true\n )}.\");\n writeLine(\"\");\n `}</ElseClause>\n </IfStatement>\n </FunctionDeclaration>\n </Show>\n );\n}\n\n/**\n * A built-in upgrade module for Shell Shock.\n */\nexport function UpgradeBuiltin(props: UpgradeBuiltinProps) {\n const [{ children, builtinImports }, rest] = splitProps(props, [\n \"children\",\n \"builtinImports\"\n ]);\n\n return (\n <BaseUpgradeBuiltin\n {...rest}\n builtinImports={defu(builtinImports ?? {}, {\n console: [\"createSpinner\", \"debug\", \"info\"],\n prompts: [\"waitForKeyPress\"]\n })}>\n <ExecuteUpgradeFunctionDeclaration />\n <Spacing />\n <Show when={Boolean(children)}>{children}</Show>\n </BaseUpgradeBuiltin>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAgCA,SAAc,oCAAkC;;AAE9C,QAAA,gBAAA,MAAA;EACE,IAAC,OAAU;AACb,UAAA,QAAA,OAAA,gBAAA;;EAEA,IAAM,WAAU;;IAEV,UAAC;IACJ,OAAU;IACR,MAAA;IACC,IAAA,MAAA;AACA,YAAA,kCAAA,YAAA,SAAA,KAAA,CAAA;;IAEA,IAAI,WAAM;AACR,YAAO,gBAAA,aAAA;MACP,WAAA,IAAA;MACC,IAAA,WAAc;AAChB,cAAY;QAAA,gBAAgB,gBAAM;SAChC,SAAA;SACC,MAAA;SACI,aAAS,IAAA;;;SAGV,CAAC;QAAC,gBAAU,gBAAA;SAChB,SAAA;SACA,MAAA;SACC,aAAA,IAAA;SACA,CAAI;QAAE,gBAAM,aAAA;SACZ,WAAa,IAAK;SACnB,IAAA,WAAA;AACA,iBAAA,IAAA,wDAAA,YAAA,SAAA,KAAA,CAAA;;;SAGG,CAAA;QAAA,gBAAO,cAAA;SACP,WAAA,IAAA;SACC,IAAA,WAAY;AACb,iBAAO,gBAAU,MAAA;WACnB,IAAW,OAAA;AACZ,mBAAA,QAAA,OAAA,gBAAA,UAAA,QAAA,OAAA,gBAAA,aAAA,QAAA,OAAA,gBAAA;;WAEE,IAAA,WAAA;AACM,mBAAA,CAAA,WAAA,IAAA;8CAC2B,YAAQ,SAAA,KAAA,CAAA;;;;;;;;;;;;yEAY9B,YAAA,SAAA,KAAA,CAAA;;wBAEF,EAAA,gBAAiB,SAAO,EAAA,CAAU,CAAC;;WAErC,IAAE,WAAa;AACb,mBAAA;aAAA,WAAqB,IAAI;;;;cAEzB,IAAM,OAAA;AACN,sBAAM,QAAA,OAAA,gBAAA,SAAA,QAAA,OAAA,gBAAA;;cAEN,IAAA,WAAgB;AACd,sBAAO,IAAA;;;;;;;;;8CASW,YAAW,SAAA,KAAA,CAAA;;;;;;;;;;;;;uEAahC,YAAA,SAAA,KAAA,CAAA;;;;gFAIsC,UAAA,QAAA,CAAA;;;cAGzC,CAAA;aAAA;;WAEA,CAAA;;;sCAGF,IAAI,WAAA;AACF,gBAAO,IAAC,4DAA+B,YAAA,SAAA,KAAA,CAAA;;;WAI1C,CAAC;QAAC;;MAEN,CAAC;;IAEL,CAAC;;EAEL,CAAC;;;;;AAMJ,SAAgB,eAAY,OAA+B;CACzD,MAAM,CAAC,EACL,UACA,kBACC,QAAQ,WAAO,OAAS,CAAA,YAAY,iBAAA,CAAA;AACvC,QAAO,gBAAS,kBAAA,WAAA,MAAA;EACd,IAAI,iBAAe;AACjB,UAAO,OAAK,kBAAkB,EAAE,EAAC;IAC/B,SAAS;KAAC;KAAE;KAAA;KAAA;IACZ,SAAS,CAAC,kBAAa;IACxB,CAAC;;EAEJ,IAAI,WAAU;AACZ,UAAM;IAAA,gBAAY,mCAAA,EAAA,CAAA;IAAA,gBAAA,SAAA,EAAA,CAAA;IAAA,gBAAA,MAAA;KAChB,IAAG,OAAA;AACD,aAAE,QAAO,SAAA;;KAEJ;KACR,CAAC;IAAC;;EAEN,CAAC,CAAC"}
1
+ {"version":3,"file":"upgrade-builtin.mjs","names":[],"sources":["../../src/components/upgrade-builtin.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, Show, splitProps } from \"@alloy-js/core\";\nimport {\n ElseClause,\n ElseIfClause,\n FunctionDeclaration,\n IfStatement,\n VarDeclaration\n} from \"@alloy-js/typescript\";\nimport { Spacing } from \"@powerlines/plugin-alloy/core/components/spacing\";\nimport { usePowerlines } from \"@powerlines/plugin-alloy/core/contexts/context\";\nimport { getAppBin, getAppTitle } from \"@shell-shock/core/plugin-utils\";\nimport type { UpgradeBuiltinProps } from \"@shell-shock/plugin-upgrade/components/upgrade-builtin\";\nimport { UpgradeBuiltin as BaseUpgradeBuiltin } from \"@shell-shock/plugin-upgrade/components/upgrade-builtin\";\nimport { defu } from \"defu\";\nimport type { CLIPresetContext } from \"../types/plugin\";\n\n/**\n * A component to generate the `executeUpgrade` function in the `shell-shock:upgrade` builtin module.\n */\nexport function ExecuteUpgradeFunctionDeclaration() {\n const context = usePowerlines<CLIPresetContext>();\n\n return (\n <Show when={context.config.upgradeType !== false}>\n <FunctionDeclaration\n export\n async\n name=\"executeUpgrade\"\n doc={`Run upgrade processing for the ${getAppTitle(\n context,\n true\n )} application.`}>\n <IfStatement condition={code`await isCheckForUpdatesRequired()`}>\n <VarDeclaration\n const\n name=\"spinner\"\n initializer={code`createSpinner({\n message: \"Checking for updates...\"\n }).start(); `}\n />\n <VarDeclaration\n const\n name=\"result\"\n initializer={code`await checkForUpdates({ force: true }); `}\n />\n <IfStatement\n condition={code`(result as CheckForUpdatesErrorResult)?.isError`}>\n {code`spinner.error(\\`An error occurred while checking for ${getAppTitle(\n context,\n true\n )} application updates. Please try again later - if the problem persists, please contact support.\\`);\n debug((result as CheckForUpdatesErrorResult).error); `}\n </IfStatement>\n <ElseIfClause\n condition={code`!(result as CheckForUpdatesSuccessResult)?.isUpToDate`}>\n <Show\n when={\n context.config.upgradeType !== false &&\n (context.config.upgradeType === \"confirm\" ||\n context.config.upgradeType === \"manual\")\n }\n fallback={\n <>\n {code`spinner.stop();\n info(\\`A new version of ${getAppTitle(\n context,\n true\n )} is available: \\${red(\\`v\\${(result as CheckForUpdatesSuccessResult).currentVersion}\\`)} \\${textColors.body.tertiary(\"➜\")} \\${green(\\`v\\${(result as CheckForUpdatesSuccessResult).latestVersion}\\`)}\\${(result as CheckForUpdatesSuccessResult).package?.date ? textColors.body.tertiary(\\` (updated on \\${(result as CheckForUpdatesSuccessResult).package?.date})\\`) : \"\"}\\`);\n\n try {\n await upgrade();\n spinner.success(\"Update successful! Please restart the application to apply the update.\");\n\n writeLine(\"\");\n help(\\`You can view the changelog for this release at any time by running the \\${inlineCode(\"${getAppBin(\n context\n )} changelog --latest\")} command.\\`);\n\n writeLine(\"\");\n writeLine(\"Press any key to exit the application...\");\n\n await waitForKeyPress();\n return;\n } catch (err) {\n spinner.error(\\`An error occurred while updating ${getAppTitle(\n context,\n true\n )} to v\\${(result as CheckForUpdatesSuccessResult).latestVersion}. Please try again later - if the problem persists, please contact support.\\`);\n debug(err);\n } `}\n <Spacing />\n </>\n }>\n {code`spinner.stop();\n warn(\\`A new version of ${getAppTitle(\n context,\n true\n )} is available: \\${red(\\`v\\${(result as CheckForUpdatesSuccessResult).currentVersion}\\`)} \\${textColors.body.tertiary(\"➜\")} \\${green(\\`v\\${(result as CheckForUpdatesSuccessResult).latestVersion}\\`)}\\${(result as CheckForUpdatesSuccessResult).package.date ? textColors.body.tertiary(\\` (updated on \\${(result as CheckForUpdatesSuccessResult).package.date})\\`) : \"\"}${\n context.config.upgradeType !== false &&\n context.config.upgradeType === \"manual\"\n ? ` \\\\nPlease run \\`${getAppBin(\n context\n )} upgrade\\` to upgrade to the latest version.`\n : \"\"\n }\\`); `}\n <Spacing />\n <Show\n when={\n context.config.upgradeType !== false &&\n context.config.upgradeType === \"confirm\"\n }>\n {code`const willUpgradeNow = await confirm({\n message: \\`Would you like to update to v\\${(result as CheckForUpdatesSuccessResult).latestVersion} now?\\`,\n initialValue: true\n });\n if (isCancel(willUpgradeNow)) {\n return;\n }\n\n if (willUpgradeNow) {\n spinner.text = \\`Updating ${getAppTitle(\n context,\n true\n )} to v\\${(result as CheckForUpdatesSuccessResult).latestVersion}...\\`;\n spinner.start();\n\n try {\n await upgrade();\n spinner.success(\"Update successful! Please restart the application to apply the update.\");\n\n writeLine(\"\");\n help(\\`You can view the changelog for this release at any time by running the \\${inlineCode(\"${getAppBin(\n context\n )} changelog --latest\")} command.\\`);\n\n writeLine(\"\");\n writeLine(\"Press any key to exit the application...\");\n\n await waitForKeyPress();\n return;\n } catch (err) {\n spinner.error(\\`An error occurred while updating ${getAppTitle(\n context,\n true\n )} to v\\${(result as CheckForUpdatesSuccessResult).latestVersion}. Please try again later - if the problem persists, please contact support.\\`);\n return { error: err };\n }\n } else {\n help(\"Updates can be performed at any time by running the \\`${getAppBin(\n context\n )} upgrade\\` command. Please remember that keeping your application up to date is important for ensuring you have the latest features, performance improvements, and security patches.\");\n } `}\n </Show>\n </Show>\n </ElseIfClause>\n <ElseClause>{code`spinner.success(\"Currently running the latest version of ${getAppTitle(\n context,\n true\n )}.\");\n writeLine(\"\");\n `}</ElseClause>\n </IfStatement>\n </FunctionDeclaration>\n </Show>\n );\n}\n\n/**\n * A built-in upgrade module for Shell Shock.\n */\nexport function UpgradeBuiltin(props: UpgradeBuiltinProps) {\n const [{ children, builtinImports }, rest] = splitProps(props, [\n \"children\",\n \"builtinImports\"\n ]);\n\n return (\n <BaseUpgradeBuiltin\n {...rest}\n builtinImports={defu(builtinImports ?? {}, {\n console: [\"createSpinner\", \"debug\", \"info\"],\n prompts: [\"waitForKeyPress\"]\n })}>\n <ExecuteUpgradeFunctionDeclaration />\n <Spacing />\n <Show when={Boolean(children)}>{children}</Show>\n </BaseUpgradeBuiltin>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AAgCA,SAAc,oCAAkC;;AAE9C,QAAA,gBAAA,MAAA;EACE,IAAC,OAAU;AACb,UAAA,QAAA,OAAA,gBAAA;;EAEA,IAAM,WAAU;;IAEV,UAAC;IACJ,OAAU;IACR,MAAA;IACC,IAAA,MAAA;AACA,YAAA,kCAAA,YAAA,SAAA,KAAA,CAAA;;IAEA,IAAI,WAAM;AACR,YAAO,gBAAA,aAAA;MACP,WAAA,IAAA;MACC,IAAA,WAAc;AAChB,cAAY;QAAA,gBAAgB,gBAAM;SAChC,SAAA;SACC,MAAA;SACI,aAAS,IAAA;;;SAGV,CAAC;QAAC,gBAAU,gBAAA;SAChB,SAAA;SACA,MAAA;SACC,aAAA,IAAA;SACA,CAAI;QAAE,gBAAM,aAAA;SACZ,WAAa,IAAK;SACnB,IAAA,WAAA;AACA,iBAAA,IAAA,wDAAA,YAAA,SAAA,KAAA,CAAA;;;SAGG,CAAA;QAAA,gBAAO,cAAA;SACP,WAAA,IAAA;SACC,IAAA,WAAY;AACb,iBAAO,gBAAU,MAAA;WACnB,IAAW,OAAA;AACZ,mBAAA,QAAA,OAAA,gBAAA,UAAA,QAAA,OAAA,gBAAA,aAAA,QAAA,OAAA,gBAAA;;WAEE,IAAA,WAAA;AACM,mBAAA,CAAA,WAAA,IAAA;8CAC2B,YAAQ,SAAA,KAAA,CAAA;;;;;;;qHAOG,UAAA,QAAA,CAAA;;;;;;;;;;wBAUnC,EAAI,gBAAgB,SAAI,EAAS,CAAC,CAAA;;WAEpC,IAAI,WAAW;;;0CAEA,YAAA,SAAA,KAAA,CAAA,6WAAA,QAAA,OAAA,gBAAA,SAAA,QAAA,OAAA,gBAAA,WAAA,oBAAA,UAAA,QAAA,CAAA,gDAAA,GAAA,OAAA;aAAA,gBAAA,SAAA,EAAA,CAAA;aAAA,gBAAA,MAAA;cACb,IAAA,OAAW;;;cAGX,IAAM,WAAA;AACN,sBAAW,IAAC;;;;;;;;;8CASnB,YAAA,SAAA,KAAA,CAAA;;;;;;;;mHAQoC,UAAA,QAAA,CAAA;;;;;;;;uEAQK,YAAA,SAAA,KAAA,CAAA;;;;gFAIgB,UAAA,QAAA,CAAA;;;cAGpD,CAAA;aAAA;;WAEJ,CAAA;;SAED,CAAC;QAAE,gBAAkB,YAAA,EACpB,IAAE,WAAa;AACb,gBAAE,IAAO,4DAAA,YAAA,SAAA,KAAA,CAAA;;;;;;MAMhB,CAAC;;;;EAIT,CAAC;;;;;;CAOF,MAAM,CAAC,EACL,UACA,kBACC,QAAQ,WAAO,OAAQ,CAAA,YAAgB,iBAAgB,CAAA;AAC1D,QAAO,gBAAa,kBAAO,WAAA,MAAA;EACzB,IAAI,iBAAc;AAChB,UAAO,OAAK,kBAAa,EAAO,EAAE;IAChC,SAAS;KAAC;KAAiB;KAAM;KAAA;IACjC,SAAS,CAAC,kBAAA;IACX,CAAC;;EAEJ,IAAI,WAAW;AACb,UAAO;IAAC,gBAAiB,mCAA8B,EAAQ,CAAA;IAAA,gBAAoB,SAAU,EAAC,CAAA;IAAA,gBAAsB,MAAK;KACvH,IAAI,OAAO;AACT,aAAM,QAAI,SAAA;;KAER;KACL,CAAC;IAAC;;EAEN,CAAC,CAAC"}
package/dist/index.cjs CHANGED
@@ -71,6 +71,7 @@ const plugin = (options = {}) => {
71
71
  entry: { file: (0, _stryke_path.joinPaths)(this.entryPath, "bin.ts") },
72
72
  args: [],
73
73
  parent: null,
74
+ source: "file",
74
75
  children: this.commands
75
76
  }));
76
77
  return (0, _powerlines_plugin_alloy_render.render)(this, [
@@ -111,11 +112,7 @@ const plugin = (options = {}) => {
111
112
  "splitText"
112
113
  ],
113
114
  utils: ["isMinimal", "isInteractive"],
114
- state: [
115
- "useGlobal",
116
- "useArgs",
117
- "isHelp"
118
- ],
115
+ state: ["useArgs", "isHelp"],
119
116
  prompts: [
120
117
  "text",
121
118
  "numeric",
package/dist/index.mjs CHANGED
@@ -64,6 +64,7 @@ const plugin = (options = {}) => {
64
64
  entry: { file: joinPaths(this.entryPath, "bin.ts") },
65
65
  args: [],
66
66
  parent: null,
67
+ source: "file",
67
68
  children: this.commands
68
69
  }));
69
70
  return render(this, [
@@ -104,11 +105,7 @@ const plugin = (options = {}) => {
104
105
  "splitText"
105
106
  ],
106
107
  utils: ["isMinimal", "isInteractive"],
107
- state: [
108
- "useGlobal",
109
- "useArgs",
110
- "isHelp"
111
- ],
108
+ state: ["useArgs", "isHelp"],
112
109
  prompts: [
113
110
  "text",
114
111
  "numeric",
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.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, Show } from \"@alloy-js/core\";\nimport { VarDeclaration } from \"@alloy-js/typescript\";\nimport { Spacing } from \"@powerlines/plugin-alloy/core/components\";\nimport { render } from \"@powerlines/plugin-alloy/render\";\nimport {\n getAppDescription,\n getAppName,\n getCommandList\n} from \"@shell-shock/core/plugin-utils\";\nimport changelog from \"@shell-shock/plugin-changelog\";\nimport completions from \"@shell-shock/plugin-completions\";\nimport console from \"@shell-shock/plugin-console\";\nimport help from \"@shell-shock/plugin-help\";\nimport prompts from \"@shell-shock/plugin-prompts\";\nimport upgrade from \"@shell-shock/plugin-upgrade\";\nimport { BinEntry } from \"@shell-shock/preset-script/components/bin-entry\";\nimport { joinPaths } from \"@stryke/path\";\nimport type { Plugin } from \"powerlines\";\nimport { BannerBuiltin } from \"./components/banner-builtin\";\nimport { CommandEntry } from \"./components/command-entry\";\nimport { CommandRouter } from \"./components/command-router\";\nimport { UpgradeBuiltin } from \"./components/upgrade-builtin\";\nimport { VirtualCommandEntry } from \"./components/virtual-command-entry\";\nimport { getGlobalOptions } from \"./helpers/get-global-options\";\nimport type { CLIPresetContext, CLIPresetOptions } from \"./types/plugin\";\n\n/**\n * The Shell Shock CLI Preset plugin.\n *\n * @remarks\n * This preset includes a set of built-in modules and commands to create a CLI application, as well as configuration options to customize the generated code. It also includes the `prompts` plugin to provide interactive prompts in the CLI application, and the `upgrade` plugin to manage upgrading the local application's version.\n */\nexport const plugin = <TContext extends CLIPresetContext = CLIPresetContext>(\n options: CLIPresetOptions = {}\n): Plugin<TContext>[] => {\n return [\n ...console<TContext>(options),\n ...help<TContext>(options),\n ...prompts<TContext>(options),\n ...(options.changelog !== false\n ? [changelog<TContext>(options.changelog)]\n : []),\n ...(options.completions !== false\n ? completions<TContext>(options.completions)\n : []),\n upgrade<TContext>(options),\n {\n name: \"shell-shock:cli-preset\",\n config() {\n this.debug(\n \"Providing default configuration for the Shell Shock `cli` preset.\"\n );\n\n return {\n globalOptions: getGlobalOptions,\n isCaseSensitive: false,\n ...options\n };\n },\n prepare: {\n order: \"post\",\n async handler() {\n this.debug(\"Rendering built-in modules.\");\n\n const commands = await getCommandList(this);\n this.debug(\n `Rendering \\`banner\\` built-ins for each of the ${\n commands.length\n } command modules.`\n );\n\n const bin = computed(() => ({\n id: \"\",\n name: getAppName(this),\n title: \"\",\n description: getAppDescription(this),\n isVirtual: true,\n path: null,\n segments: [],\n alias: [],\n tags: [],\n options: Object.fromEntries(\n this.options.map(option => [option.name, option])\n ),\n entry: {\n file: joinPaths(this.entryPath, \"bin.ts\")\n },\n args: [],\n parent: null,\n children: this.commands\n }));\n\n return render(\n this,\n <>\n <UpgradeBuiltin />\n <BannerBuiltin command={bin.value} />\n <For\n each={commands.sort((a, b) => a.name.localeCompare(b.name))}\n doubleHardline>\n {command => <BannerBuiltin command={command} />}\n </For>\n </>\n );\n }\n }\n },\n {\n name: \"shell-shock:cli-preset:generate-entrypoint\",\n prepare: {\n order: \"post\",\n async handler() {\n this.debug(\n \"Rendering entrypoint modules for the Shell Shock `cli` preset.\"\n );\n\n return render(\n this,\n <>\n <BinEntry\n builtinImports={{\n console: [\n \"info\",\n \"debug\",\n \"warn\",\n \"help\",\n \"error\",\n \"cursor\",\n \"divider\",\n \"stripAnsi\",\n \"writeLine\",\n \"splitText\"\n ],\n utils: [\"isMinimal\", \"isInteractive\"],\n state: [\"useGlobal\", \"useArgs\", \"isHelp\"],\n prompts: [\n \"text\",\n \"numeric\",\n \"toggle\",\n \"select\",\n \"confirm\",\n \"isCancel\"\n ],\n env: [\"env\", \"paths\"],\n upgrade: [\"executeUpgrade\"]\n }}>\n <Show when={Object.keys(this.commands).length > 0}>\n <VarDeclaration\n let\n name=\"args\"\n type=\"string[]\"\n initializer={code`useArgs();`}\n />\n <hbr />\n <CommandRouter segments={[]} commands={this.commands ?? {}} />\n <hbr />\n </Show>\n <hbr />\n {code`await showBanner(0);`}\n <Spacing />\n {code`return showHelp(); `}\n </BinEntry>\n <Show when={Object.values(this.commands).length > 0}>\n <For each={Object.values(this.commands)} doubleHardline>\n {child => (\n <Show\n when={child.isVirtual}\n fallback={<CommandEntry command={child} />}>\n <VirtualCommandEntry command={child} />\n </Show>\n )}\n </For>\n </Show>\n </>\n );\n }\n }\n }\n ];\n};\n\nexport default plugin;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/index.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, Show } from \"@alloy-js/core\";\nimport { VarDeclaration } from \"@alloy-js/typescript\";\nimport { Spacing } from \"@powerlines/plugin-alloy/core/components\";\nimport { render } from \"@powerlines/plugin-alloy/render\";\nimport {\n getAppDescription,\n getAppName,\n getCommandList\n} from \"@shell-shock/core/plugin-utils\";\nimport changelog from \"@shell-shock/plugin-changelog\";\nimport completions from \"@shell-shock/plugin-completions\";\nimport console from \"@shell-shock/plugin-console\";\nimport help from \"@shell-shock/plugin-help\";\nimport prompts from \"@shell-shock/plugin-prompts\";\nimport upgrade from \"@shell-shock/plugin-upgrade\";\nimport { BinEntry } from \"@shell-shock/preset-script/components/bin-entry\";\nimport { joinPaths } from \"@stryke/path\";\nimport type { Plugin } from \"powerlines\";\nimport { BannerBuiltin } from \"./components/banner-builtin\";\nimport { CommandEntry } from \"./components/command-entry\";\nimport { CommandRouter } from \"./components/command-router\";\nimport { UpgradeBuiltin } from \"./components/upgrade-builtin\";\nimport { VirtualCommandEntry } from \"./components/virtual-command-entry\";\nimport { getGlobalOptions } from \"./helpers/get-global-options\";\nimport type { CLIPresetContext, CLIPresetOptions } from \"./types/plugin\";\n\n/**\n * The Shell Shock CLI Preset plugin.\n *\n * @remarks\n * This preset includes a set of built-in modules and commands to create a CLI application, as well as configuration options to customize the generated code. It also includes the `prompts` plugin to provide interactive prompts in the CLI application, and the `upgrade` plugin to manage upgrading the local application's version.\n */\nexport const plugin = <TContext extends CLIPresetContext = CLIPresetContext>(\n options: CLIPresetOptions = {}\n): Plugin<TContext>[] => {\n return [\n ...console<TContext>(options),\n ...help<TContext>(options),\n ...prompts<TContext>(options),\n ...(options.changelog !== false\n ? [changelog<TContext>(options.changelog)]\n : []),\n ...(options.completions !== false\n ? completions<TContext>(options.completions)\n : []),\n upgrade<TContext>(options),\n {\n name: \"shell-shock:cli-preset\",\n config() {\n this.debug(\n \"Providing default configuration for the Shell Shock `cli` preset.\"\n );\n\n return {\n globalOptions: getGlobalOptions,\n isCaseSensitive: false,\n ...options\n };\n },\n prepare: {\n order: \"post\",\n async handler() {\n this.debug(\"Rendering built-in modules.\");\n\n const commands = await getCommandList(this);\n this.debug(\n `Rendering \\`banner\\` built-ins for each of the ${\n commands.length\n } command modules.`\n );\n\n const bin = computed(() => ({\n id: \"\",\n name: getAppName(this),\n title: \"\",\n description: getAppDescription(this),\n isVirtual: true,\n path: null,\n segments: [],\n alias: [],\n tags: [],\n options: Object.fromEntries(\n this.options.map(option => [option.name, option])\n ),\n entry: {\n file: joinPaths(this.entryPath, \"bin.ts\")\n },\n args: [],\n parent: null,\n source: \"file\",\n children: this.commands\n }));\n\n return render(\n this,\n <>\n <UpgradeBuiltin />\n <BannerBuiltin command={bin.value} />\n <For\n each={commands.sort((a, b) => a.name.localeCompare(b.name))}\n doubleHardline>\n {command => <BannerBuiltin command={command} />}\n </For>\n </>\n );\n }\n }\n },\n {\n name: \"shell-shock:cli-preset:generate-entrypoint\",\n prepare: {\n order: \"post\",\n async handler() {\n this.debug(\n \"Rendering entrypoint modules for the Shell Shock `cli` preset.\"\n );\n\n return render(\n this,\n <>\n <BinEntry\n builtinImports={{\n console: [\n \"info\",\n \"debug\",\n \"warn\",\n \"help\",\n \"error\",\n \"cursor\",\n \"divider\",\n \"stripAnsi\",\n \"writeLine\",\n \"splitText\"\n ],\n utils: [\"isMinimal\", \"isInteractive\"],\n state: [\"useArgs\", \"isHelp\"],\n prompts: [\n \"text\",\n \"numeric\",\n \"toggle\",\n \"select\",\n \"confirm\",\n \"isCancel\"\n ],\n env: [\"env\", \"paths\"],\n upgrade: [\"executeUpgrade\"]\n }}>\n <Show when={Object.keys(this.commands).length > 0}>\n <VarDeclaration\n let\n name=\"args\"\n type=\"string[]\"\n initializer={code`useArgs();`}\n />\n <hbr />\n <CommandRouter segments={[]} commands={this.commands ?? {}} />\n <hbr />\n </Show>\n <hbr />\n {code`await showBanner(0);`}\n <Spacing />\n {code`return showHelp(); `}\n </BinEntry>\n <Show when={Object.values(this.commands).length > 0}>\n <For each={Object.values(this.commands)} doubleHardline>\n {child => (\n <Show\n when={child.isVirtual}\n fallback={<CommandEntry command={child} />}>\n <VirtualCommandEntry command={child} />\n </Show>\n )}\n </For>\n </Show>\n </>\n );\n }\n }\n }\n ];\n};\n\nexport default plugin;\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  const require_runtime = require('../../../../_virtual/_rolldown/runtime.cjs');
2
- const require_markdown_BGGlzivq = require('../../../unified/dist/markdown-BGGlzivq.cjs');
2
+ const require_markdown_D89Le__6 = require('../../../unified/dist/markdown-D89Le-_6.cjs');
3
3
  require('../../../unified/dist/markdown/index.cjs');
4
4
  let _alloy_js_core_jsx_runtime = require("@alloy-js/core/jsx-runtime");
5
5
  let _alloy_js_core = require("@alloy-js/core");
@@ -21,7 +21,7 @@ function ChangelogCommand() {
21
21
  const result = (0, _alloy_js_core.createResource)(async () => {
22
22
  const content = await context.fs.read(context.config.changelog.file);
23
23
  if (!content) return null;
24
- return require_markdown_BGGlzivq.g(content);
24
+ return require_markdown_D89Le__6.g(content);
25
25
  });
26
26
  return (0, _alloy_js_core_jsx_runtime.createComponent)(_powerlines_plugin_alloy_typescript.TypescriptFile, {
27
27
  get path() {
@@ -1,4 +1,4 @@
1
- import { g } from "../../../unified/dist/markdown-BGGlzivq.mjs";
1
+ import { g } from "../../../unified/dist/markdown-D89Le-_6.mjs";
2
2
  import "../../../unified/dist/markdown/index.mjs";
3
3
  import { createComponent } from "@alloy-js/core/jsx-runtime";
4
4
  import { Show, code, createResource } from "@alloy-js/core";
@@ -9,7 +9,7 @@ let _stryke_path_join = require("@stryke/path/join");
9
9
  let powerlines_plugin_utils = require("powerlines/plugin-utils");
10
10
  let _stryke_type_checks_is_set_string = require("@stryke/type-checks/is-set-string");
11
11
  let defu = require("defu");
12
- defu = require_runtime.__toESM(defu);
12
+ defu = require_runtime.__toESM(defu, 1);
13
13
 
14
14
  //#region ../plugin-changelog/dist/index.mjs
15
15
  /**