@shell-shock/preset-script 0.4.1 → 0.5.0

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 (74) hide show
  1. package/dist/components/banner-function-declaration.cjs +1 -1
  2. package/dist/components/banner-function-declaration.cjs.map +1 -1
  3. package/dist/components/banner-function-declaration.mjs +1 -1
  4. package/dist/components/banner-function-declaration.mjs.map +1 -1
  5. package/dist/components/bin-entry.cjs +6 -3
  6. package/dist/components/bin-entry.cjs.map +1 -1
  7. package/dist/components/bin-entry.d.cts.map +1 -1
  8. package/dist/components/bin-entry.d.mts.map +1 -1
  9. package/dist/components/bin-entry.mjs +6 -3
  10. package/dist/components/bin-entry.mjs.map +1 -1
  11. package/dist/components/command-entry.cjs +112 -74
  12. package/dist/components/command-entry.cjs.map +1 -1
  13. package/dist/components/command-entry.d.cts.map +1 -1
  14. package/dist/components/command-entry.d.mts.map +1 -1
  15. package/dist/components/command-entry.mjs +114 -76
  16. package/dist/components/command-entry.mjs.map +1 -1
  17. package/dist/components/command-router.cjs +5 -5
  18. package/dist/components/command-router.cjs.map +1 -1
  19. package/dist/components/command-router.d.cts +1 -1
  20. package/dist/components/command-router.d.cts.map +1 -1
  21. package/dist/components/command-router.d.mts +1 -1
  22. package/dist/components/command-router.d.mts.map +1 -1
  23. package/dist/components/command-router.mjs +5 -5
  24. package/dist/components/command-router.mjs.map +1 -1
  25. package/dist/components/console-builtin.cjs +22 -16
  26. package/dist/components/console-builtin.cjs.map +1 -1
  27. package/dist/components/console-builtin.d.cts +1 -0
  28. package/dist/components/console-builtin.d.cts.map +1 -1
  29. package/dist/components/console-builtin.d.mts +1 -0
  30. package/dist/components/console-builtin.d.mts.map +1 -1
  31. package/dist/components/console-builtin.mjs +22 -16
  32. package/dist/components/console-builtin.mjs.map +1 -1
  33. package/dist/components/help.cjs +27 -20
  34. package/dist/components/help.cjs.map +1 -1
  35. package/dist/components/help.d.cts +9 -9
  36. package/dist/components/help.d.cts.map +1 -1
  37. package/dist/components/help.d.mts +9 -9
  38. package/dist/components/help.d.mts.map +1 -1
  39. package/dist/components/help.mjs +28 -21
  40. package/dist/components/help.mjs.map +1 -1
  41. package/dist/components/helpers.cjs +54 -0
  42. package/dist/components/helpers.cjs.map +1 -0
  43. package/dist/components/helpers.d.cts +29 -0
  44. package/dist/components/helpers.d.cts.map +1 -0
  45. package/dist/components/helpers.d.mts +29 -0
  46. package/dist/components/helpers.d.mts.map +1 -0
  47. package/dist/components/helpers.mjs +50 -0
  48. package/dist/components/helpers.mjs.map +1 -0
  49. package/dist/components/index.cjs +1 -0
  50. package/dist/components/index.d.cts +2 -2
  51. package/dist/components/index.d.mts +2 -2
  52. package/dist/components/index.mjs +2 -2
  53. package/dist/components/utils-builtin.cjs +160 -6
  54. package/dist/components/utils-builtin.cjs.map +1 -1
  55. package/dist/components/utils-builtin.d.cts +9 -8
  56. package/dist/components/utils-builtin.d.cts.map +1 -1
  57. package/dist/components/utils-builtin.d.mts +9 -8
  58. package/dist/components/utils-builtin.d.mts.map +1 -1
  59. package/dist/components/utils-builtin.mjs +161 -8
  60. package/dist/components/utils-builtin.mjs.map +1 -1
  61. package/dist/components/virtual-command-entry.cjs +12 -8
  62. package/dist/components/virtual-command-entry.cjs.map +1 -1
  63. package/dist/components/virtual-command-entry.mjs +12 -8
  64. package/dist/components/virtual-command-entry.mjs.map +1 -1
  65. package/dist/helpers/ansi-utils.cjs +4 -4
  66. package/dist/helpers/ansi-utils.cjs.map +1 -1
  67. package/dist/helpers/ansi-utils.mjs +4 -4
  68. package/dist/helpers/ansi-utils.mjs.map +1 -1
  69. package/dist/index.cjs +1 -1
  70. package/dist/index.cjs.map +1 -1
  71. package/dist/index.mjs +1 -1
  72. package/dist/index.mjs.map +1 -1
  73. package/dist/types/plugin.d.cts.map +1 -1
  74. package/package.json +24 -10
@@ -1 +1 @@
1
- {"version":3,"file":"command-entry.cjs","names":["code","computed","For","Show","ElseClause","FunctionDeclaration","IfStatement","usePowerlines","EntryFile","TSDoc","TSDocParam","TSDocRemarks","TSDocTitle","DynamicPathSegmentsParserLogic","OptionsInterfaceDeclaration","OptionsParserLogic","getAppBin","getDynamicPathSegmentName","isDynamicPathSegment","findFilePath","relativePath","joinPaths","replaceExtension","camelCase","constantCase","pascalCase","defu","BannerFunctionDeclaration","CommandHelp","VirtualCommandEntry","CommandInvocation","props","command","_$memo","name","path","segments","filter","segment","length","map","join","_$createIntrinsic","CommandHandlerDeclaration","children","context","_$createComponent","heading","title","description","replace","async","parameters","type","default","envPrefix","config","isCaseSensitive","condition","CommandEntry","imports","builtinImports","rest","filePath","commandSourcePath","entryPath","value","entry","input","file","typeDefinition","output","id","_$mergeProps","env","console","utils","each","Object","values","child","when","isVirtual","fallback"],"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 type { Children } from \"@alloy-js/core\";\nimport { code, computed, For, Show } from \"@alloy-js/core\";\nimport {\n ElseClause,\n FunctionDeclaration,\n IfStatement\n} from \"@alloy-js/typescript\";\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 {\n TSDoc,\n TSDocParam,\n TSDocRemarks,\n TSDocTitle\n} from \"@powerlines/plugin-alloy/typescript/components/tsdoc\";\nimport {\n DynamicPathSegmentsParserLogic,\n OptionsInterfaceDeclaration,\n OptionsParserLogic\n} from \"@shell-shock/core/components/options-parser-logic\";\nimport {\n getAppBin,\n getDynamicPathSegmentName,\n isDynamicPathSegment\n} from \"@shell-shock/core/plugin-utils/context-helpers\";\nimport type { CommandTree } from \"@shell-shock/core/types/command\";\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 { constantCase } from \"@stryke/string-format/constant-case\";\nimport { pascalCase } from \"@stryke/string-format/pascal-case\";\nimport defu from \"defu\";\nimport type { ScriptPresetContext } from \"../types/plugin\";\nimport { BannerFunctionDeclaration } from \"./banner-function-declaration\";\nimport { CommandHelp } from \"./help\";\nimport { VirtualCommandEntry } from \"./virtual-command-entry\";\n\nexport function CommandInvocation(props: { command: CommandTree }) {\n const { command } = props;\n\n return (\n <>\n {code`return Promise.resolve(handle${pascalCase(command.name)}(options${\n command.path.segments.filter(segment => isDynamicPathSegment(segment))\n .length > 0\n ? `, ${command.path.segments\n .filter(segment => isDynamicPathSegment(segment))\n .map(segment => camelCase(getDynamicPathSegmentName(segment)))\n .join(\", \")}`\n : \"\"\n }));`}\n <hbr />\n </>\n );\n}\n\nexport interface CommandHandlerDeclarationProps {\n command: CommandTree;\n children?: Children;\n}\n\n/**\n * A component that generates the `handler` function declaration for a command.\n */\nexport function CommandHandlerDeclaration(\n props: CommandHandlerDeclarationProps\n) {\n const { command, children } = props;\n\n const context = usePowerlines<ScriptPresetContext>();\n\n return (\n <>\n <TSDoc\n heading={`The ${command.title} (${getAppBin(\n context\n )} ${command.path.segments\n .map(segment =>\n isDynamicPathSegment(segment)\n ? `[${constantCase(getDynamicPathSegmentName(segment))}]`\n : segment\n )\n .join(\" \")}) command.`}>\n <TSDocRemarks>{`${command.description.replace(/\\.+$/, \"\")}.`}</TSDocRemarks>\n <hbr />\n <TSDocTitle>{command.title}</TSDocTitle>\n <TSDocParam name=\"args\">{`The command-line arguments passed to the command.`}</TSDocParam>\n </TSDoc>\n <FunctionDeclaration\n export\n async\n name=\"handler\"\n parameters={[{ name: \"args\", type: \"string[]\", default: \"getArgs()\" }]}>\n <DynamicPathSegmentsParserLogic\n path={command.path}\n envPrefix={context.config.envPrefix}\n />\n <hbr />\n <hbr />\n <OptionsParserLogic\n command={command}\n envPrefix={context.config.envPrefix}\n isCaseSensitive={context.config.isCaseSensitive}\n />\n <hbr />\n <hbr />\n {code`writeLine(\"\");\n banner();`}\n <hbr />\n <hbr />\n {children}\n <hbr />\n <hbr />\n <IfStatement condition={code`options.help`}>\n <CommandHelp command={command} />\n </IfStatement>\n <ElseClause>\n <hbr />\n <CommandInvocation command={command} />\n </ElseClause>\n </FunctionDeclaration>\n </>\n );\n}\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<ScriptPresetContext>();\n const filePath = computed(() =>\n joinPaths(\n command.path.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]: `handle${pascalCase(command.name)}`\n })}\n builtinImports={defu(builtinImports ?? {}, {\n env: [\"env\", \"isCI\"],\n console: [\n \"warn\",\n \"error\",\n \"table\",\n \"colors\",\n \"stripAnsi\",\n \"writeLine\",\n \"splitText\"\n ],\n utils: [\"getArgs\", \"hasFlag\", \"isMinimal\"]\n })}>\n <BannerFunctionDeclaration command={command} />\n <hbr />\n <hbr />\n <OptionsInterfaceDeclaration command={command} />\n <hbr />\n <hbr />\n <CommandHandlerDeclaration command={command} />\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.cjs","names":["code","computed","For","Show","ElseClause","FunctionDeclaration","IfStatement","VarDeclaration","usePowerlines","EntryFile","TSDoc","TSDocParam","TSDocRemarks","TSDocTitle","CommandParserLogic","OptionsInterfaceDeclaration","getAppBin","getDynamicPathSegmentName","isDynamicPathSegment","findFilePath","relativePath","joinPaths","replaceExtension","camelCase","constantCase","kebabCase","pascalCase","defu","BannerFunctionDeclaration","CommandHelp","IsDebug","VirtualCommandEntry","CommandInvocation","props","command","_$createComponent","name","initializer","segments","map","segment","join","_$createIntrinsic","_$memo","arguments","length","argument","CommandHandlerDeclaration","children","context","heading","title","description","replace","async","parameters","type","default","envPrefix","config","isCaseSensitive","condition","Object","values","options","option","CommandEntry","imports","builtinImports","rest","filePath","filter","commandSourcePath","entryPath","value","entry","input","file","typeDefinition","output","id","_$mergeProps","path","env","console","utils","each","child","when","isVirtual","fallback"],"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 type { Children } from \"@alloy-js/core\";\nimport { code, computed, For, Show } from \"@alloy-js/core\";\nimport {\n ElseClause,\n FunctionDeclaration,\n IfStatement,\n VarDeclaration\n} from \"@alloy-js/typescript\";\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 {\n TSDoc,\n TSDocParam,\n TSDocRemarks,\n TSDocTitle\n} from \"@powerlines/plugin-alloy/typescript/components/tsdoc\";\nimport {\n CommandParserLogic,\n OptionsInterfaceDeclaration\n} from \"@shell-shock/core/components/options-parser-logic\";\nimport {\n getAppBin,\n getDynamicPathSegmentName,\n isDynamicPathSegment\n} from \"@shell-shock/core/plugin-utils/context-helpers\";\nimport type { CommandTree } from \"@shell-shock/core/types/command\";\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 { constantCase } from \"@stryke/string-format/constant-case\";\nimport { kebabCase } from \"@stryke/string-format/kebab-case\";\nimport { pascalCase } from \"@stryke/string-format/pascal-case\";\nimport defu from \"defu\";\nimport type { ScriptPresetContext } from \"../types/plugin\";\nimport { BannerFunctionDeclaration } from \"./banner-function-declaration\";\nimport { CommandHelp } from \"./help\";\nimport { IsDebug } from \"./helpers\";\nimport { VirtualCommandEntry } from \"./virtual-command-entry\";\n\nexport function CommandInvocation(props: { command: CommandTree }) {\n const { command } = props;\n\n return (\n <>\n <VarDeclaration\n name=\"__context\"\n initializer={code`{ path: \\`${command.segments\n .map(segment =>\n isDynamicPathSegment(segment)\n ? `\\${${camelCase(getDynamicPathSegmentName(segment))}}`\n : segment\n )\n .join(\"/\")}\\`, segments: [${command.segments\n .map(segment =>\n isDynamicPathSegment(segment)\n ? camelCase(getDynamicPathSegmentName(segment))\n : `\"${segment}\"`\n )\n .join(\", \")}] }`}\n />\n <hbr />\n <hbr />\n {code`\n\n internal_commandContext.call(__context, () => {\n return Promise.resolve(Reflect.apply(handle${pascalCase(\n command.name\n )}, __context, [options${\n command.arguments.length > 0\n ? `, ${command.arguments\n .map(argument => camelCase(argument.name))\n .join(\", \")}`\n : \"\"\n }]));\n });\n\n `}\n <hbr />\n </>\n );\n}\n\nexport interface CommandHandlerDeclarationProps {\n command: CommandTree;\n children?: Children;\n}\n\n/**\n * A component that generates the `handler` function declaration for a command.\n */\nexport function CommandHandlerDeclaration(\n props: CommandHandlerDeclarationProps\n) {\n const { command, children } = props;\n\n const context = usePowerlines<ScriptPresetContext>();\n\n return (\n <>\n <OptionsInterfaceDeclaration command={command} />\n <hbr />\n <hbr />\n <TSDoc\n heading={`The ${command.title} (${getAppBin(context)} ${command.segments\n .map(segment =>\n isDynamicPathSegment(segment)\n ? `[${constantCase(getDynamicPathSegmentName(segment))}]`\n : segment\n )\n .join(\" \")}) command.`}>\n <TSDocRemarks>{`${command.description.replace(/\\.+$/, \"\")}.`}</TSDocRemarks>\n <hbr />\n <TSDocTitle>{command.title}</TSDocTitle>\n <TSDocParam name=\"args\">{`The command-line arguments passed to the command.`}</TSDocParam>\n </TSDoc>\n <FunctionDeclaration\n export\n async\n name=\"handler\"\n parameters={[{ name: \"args\", type: \"string[]\", default: \"getArgs()\" }]}>\n <CommandParserLogic\n command={command}\n envPrefix={context.config.envPrefix}\n isCaseSensitive={context.config.isCaseSensitive}\n />\n <hbr />\n <hbr />\n {code`writeLine(\"\");\n banner(); `}\n <hbr />\n <hbr />\n <IfStatement condition={<IsDebug />}>\n {code`\n writeLine(\"\");\n writeLine(colors.text.body.tertiary(\"Debug mode is enabled. Additional debug information may be logged to the console.\"));\n\n writeLine(\"\");\n debug(\\`Command path: ${command.segments\n .map(segment =>\n isDynamicPathSegment(segment)\n ? `\\${${camelCase(getDynamicPathSegmentName(segment))}}`\n : segment\n )\n .join(\" / \")} \\\\n\\\\nOptions: \\\\n${Object.values(command.options)\n .map(\n option =>\n ` - ${kebabCase(option.name)}: \\${options.${camelCase(\n option.name\n )} === undefined ? \"\" : JSON.stringify(options.${camelCase(\n option.name\n )})}`\n )\n .join(\"\\\\n\")}${\n command.arguments.length > 0\n ? ` \\\\n\\\\nArguments: \\\\n${command.arguments\n .map(\n argument =>\n ` - ${kebabCase(argument.name)}: \\${${camelCase(\n argument.name\n )} === undefined ? \"\" : JSON.stringify(${camelCase(\n argument.name\n )})}`\n )\n .join(\"\\\\n\")}`\n : \"\"\n }\\`); `}\n </IfStatement>\n <hbr />\n <hbr />\n {children}\n <hbr />\n <hbr />\n <IfStatement condition={code`options.help`}>\n <CommandHelp command={command} />\n </IfStatement>\n <ElseClause>\n <hbr />\n <CommandInvocation command={command} />\n </ElseClause>\n </FunctionDeclaration>\n </>\n );\n}\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<ScriptPresetContext>();\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]: `handle${pascalCase(command.name)}`\n })}\n builtinImports={defu(builtinImports ?? {}, {\n env: [\"env\", \"isCI\", \"isDevelopment\", \"isDebug\"],\n console: [\n \"debug\",\n \"warn\",\n \"error\",\n \"table\",\n \"colors\",\n \"stripAnsi\",\n \"writeLine\",\n \"splitText\"\n ],\n utils: [\n \"getArgs\",\n \"hasFlag\",\n \"isMinimal\",\n \"isUnicodeSupported\",\n \"internal_commandContext\"\n ]\n })}>\n <BannerFunctionDeclaration command={command} />\n <hbr />\n <hbr />\n <OptionsInterfaceDeclaration command={command} />\n <hbr />\n <hbr />\n <CommandHandlerDeclaration command={command} />\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 +1 @@
1
- {"version":3,"file":"command-entry.d.cts","names":[],"sources":["../../src/components/command-entry.tsx"],"sourcesContent":[],"mappings":";;;;;iBAyDgB,iBAAA;WAAoC;AAApD,CAAA,CAAA,EAAiE,QAAjD;AAmBC,UAAA,8BAAA,CAA8B;EAQ/B,OAAA,EAPL,WAOK;EA6DC,QAAA,CAAA,EAnEJ,QAmEI;;;;;AAUD,iBAvEA,yBAAA,CAuEqC,KAAA,EAtE5C,8BAsE4C,CAAA,EAtEd,QAsEc;UAVpC,iBAAA,SAA0B,KACzC;WAGS;;;;;iBAMK,YAAA,QAAoB,oBAAiB"}
1
+ {"version":3,"file":"command-entry.d.cts","names":[],"sources":["../../src/components/command-entry.tsx"],"sourcesContent":[],"mappings":";;;;;iBA2DgB,iBAAA;WAAoC;AAApD,CAAA,CAAA,EAAiE,QAAjD;AA2CC,UAAA,8BAAA,CAA8B;EAQ/B,OAAA,EAPL,WAOK;EA8FC,QAAA,CAAA,EApGJ,QAoGI;;;;;AAUD,iBAxGA,yBAAA,CAwGqC,KAAA,EAvG5C,8BAuG4C,CAAA,EAvGd,QAuGc;UAVpC,iBAAA,SAA0B,KACzC;WAGS;;;;;iBAMK,YAAA,QAAoB,oBAAiB"}
@@ -1 +1 @@
1
- {"version":3,"file":"command-entry.d.mts","names":[],"sources":["../../src/components/command-entry.tsx"],"sourcesContent":[],"mappings":";;;;;iBAyDgB,iBAAA;WAAoC;AAApD,CAAA,CAAA,EAAiE,QAAjD;AAmBC,UAAA,8BAAA,CAA8B;EAQ/B,OAAA,EAPL,WAOK;EA6DC,QAAA,CAAA,EAnEJ,QAmEI;;;;;AAUD,iBAvEA,yBAAA,CAuEqC,KAAA,EAtE5C,8BAsE4C,CAAA,EAtEd,QAsEc;UAVpC,iBAAA,SAA0B,KACzC;WAGS;;;;;iBAMK,YAAA,QAAoB,oBAAiB"}
1
+ {"version":3,"file":"command-entry.d.mts","names":[],"sources":["../../src/components/command-entry.tsx"],"sourcesContent":[],"mappings":";;;;;iBA2DgB,iBAAA;WAAoC;AAApD,CAAA,CAAA,EAAiE,QAAjD;AA2CC,UAAA,8BAAA,CAA8B;EAQ/B,OAAA,EAPL,WAOK;EA8FC,QAAA,CAAA,EApGJ,QAoGI;;;;;AAUD,iBAxGA,yBAAA,CAwGqC,KAAA,EAvG5C,8BAuG4C,CAAA,EAvGd,QAuGc;UAVpC,iBAAA,SAA0B,KACzC;WAGS;;;;;iBAMK,YAAA,QAAoB,oBAAiB"}
@@ -1,9 +1,10 @@
1
1
  import { BannerFunctionDeclaration } from "./banner-function-declaration.mjs";
2
2
  import { CommandHelp } from "./help.mjs";
3
+ import { IsDebug } from "./helpers.mjs";
3
4
  import { VirtualCommandEntry } from "./virtual-command-entry.mjs";
4
5
  import { createComponent, createIntrinsic, memo, mergeProps } from "@alloy-js/core/jsx-runtime";
5
6
  import { For, Show, code, computed } from "@alloy-js/core";
6
- import { ElseClause, FunctionDeclaration, IfStatement } from "@alloy-js/typescript";
7
+ import { ElseClause, FunctionDeclaration, IfStatement, VarDeclaration } from "@alloy-js/typescript";
7
8
  import { usePowerlines } from "@powerlines/plugin-alloy/core/contexts/context";
8
9
  import { getAppBin, getDynamicPathSegmentName, isDynamicPathSegment } from "@shell-shock/core/plugin-utils/context-helpers";
9
10
  import { EntryFile } from "@powerlines/plugin-alloy/typescript/components/entry-file";
@@ -11,16 +12,34 @@ import { TSDoc, TSDocParam, TSDocRemarks, TSDocTitle } from "@powerlines/plugin-
11
12
  import { replaceExtension } from "@stryke/path/replace";
12
13
  import { pascalCase } from "@stryke/string-format/pascal-case";
13
14
  import defu from "defu";
14
- import { DynamicPathSegmentsParserLogic, OptionsInterfaceDeclaration, OptionsParserLogic } from "@shell-shock/core/components/options-parser-logic";
15
+ import { CommandParserLogic, OptionsInterfaceDeclaration } from "@shell-shock/core/components/options-parser-logic";
15
16
  import { findFilePath, relativePath } from "@stryke/path/find";
16
17
  import { joinPaths } from "@stryke/path/join";
17
18
  import { camelCase } from "@stryke/string-format/camel-case";
18
19
  import { constantCase } from "@stryke/string-format/constant-case";
20
+ import { kebabCase } from "@stryke/string-format/kebab-case";
19
21
 
20
22
  //#region src/components/command-entry.tsx
21
23
  function CommandInvocation(props) {
22
24
  const { command } = props;
23
- return [memo(() => code`return Promise.resolve(handle${pascalCase(command.name)}(options${command.path.segments.filter((segment) => isDynamicPathSegment(segment)).length > 0 ? `, ${command.path.segments.filter((segment) => isDynamicPathSegment(segment)).map((segment) => camelCase(getDynamicPathSegmentName(segment))).join(", ")}` : ""}));`), createIntrinsic("hbr", {})];
25
+ return [
26
+ createComponent(VarDeclaration, {
27
+ name: "__context",
28
+ get initializer() {
29
+ return code`{ path: \`${command.segments.map((segment) => isDynamicPathSegment(segment) ? `\${${camelCase(getDynamicPathSegmentName(segment))}}` : segment).join("/")}\`, segments: [${command.segments.map((segment) => isDynamicPathSegment(segment) ? camelCase(getDynamicPathSegmentName(segment)) : `"${segment}"`).join(", ")}] }`;
30
+ }
31
+ }),
32
+ createIntrinsic("hbr", {}),
33
+ createIntrinsic("hbr", {}),
34
+ memo(() => code`
35
+
36
+ internal_commandContext.call(__context, () => {
37
+ return Promise.resolve(Reflect.apply(handle${pascalCase(command.name)}, __context, [options${command.arguments.length > 0 ? `, ${command.arguments.map((argument) => camelCase(argument.name)).join(", ")}` : ""}]));
38
+ });
39
+
40
+ `),
41
+ createIntrinsic("hbr", {})
42
+ ];
24
43
  }
25
44
  /**
26
45
  * A component that generates the `handler` function declaration for a command.
@@ -28,76 +47,87 @@ function CommandInvocation(props) {
28
47
  function CommandHandlerDeclaration(props) {
29
48
  const { command, children } = props;
30
49
  const context = usePowerlines();
31
- return [createComponent(TSDoc, {
32
- get heading() {
33
- return `The ${command.title} (${getAppBin(context)} ${command.path.segments.map((segment) => isDynamicPathSegment(segment) ? `[${constantCase(getDynamicPathSegmentName(segment))}]` : segment).join(" ")}) command.`;
34
- },
35
- get children() {
36
- return [
37
- createComponent(TSDocRemarks, { get children() {
38
- return `${command.description.replace(/\.+$/, "")}.`;
39
- } }),
40
- createIntrinsic("hbr", {}),
41
- createComponent(TSDocTitle, { get children() {
42
- return command.title;
43
- } }),
44
- createComponent(TSDocParam, {
45
- name: "args",
46
- children: `The command-line arguments passed to the command.`
47
- })
48
- ];
49
- }
50
- }), createComponent(FunctionDeclaration, {
51
- "export": true,
52
- async: true,
53
- name: "handler",
54
- parameters: [{
55
- name: "args",
56
- type: "string[]",
57
- default: "getArgs()"
58
- }],
59
- get children() {
60
- return [
61
- createComponent(DynamicPathSegmentsParserLogic, {
62
- get path() {
63
- return command.path;
64
- },
65
- get envPrefix() {
66
- return context.config.envPrefix;
67
- }
68
- }),
69
- createIntrinsic("hbr", {}),
70
- createIntrinsic("hbr", {}),
71
- createComponent(OptionsParserLogic, {
72
- command,
73
- get envPrefix() {
74
- return context.config.envPrefix;
75
- },
76
- get isCaseSensitive() {
77
- return context.config.isCaseSensitive;
78
- }
79
- }),
80
- createIntrinsic("hbr", {}),
81
- createIntrinsic("hbr", {}),
82
- code`writeLine("");
83
- banner();`,
84
- createIntrinsic("hbr", {}),
85
- createIntrinsic("hbr", {}),
86
- children,
87
- createIntrinsic("hbr", {}),
88
- createIntrinsic("hbr", {}),
89
- createComponent(IfStatement, {
90
- condition: code`options.help`,
91
- get children() {
92
- return createComponent(CommandHelp, { command });
93
- }
94
- }),
95
- createComponent(ElseClause, { get children() {
96
- return [createIntrinsic("hbr", {}), createComponent(CommandInvocation, { command })];
97
- } })
98
- ];
99
- }
100
- })];
50
+ return [
51
+ createComponent(OptionsInterfaceDeclaration, { command }),
52
+ createIntrinsic("hbr", {}),
53
+ createIntrinsic("hbr", {}),
54
+ createComponent(TSDoc, {
55
+ get heading() {
56
+ return `The ${command.title} (${getAppBin(context)} ${command.segments.map((segment) => isDynamicPathSegment(segment) ? `[${constantCase(getDynamicPathSegmentName(segment))}]` : segment).join(" ")}) command.`;
57
+ },
58
+ get children() {
59
+ return [
60
+ createComponent(TSDocRemarks, { get children() {
61
+ return `${command.description.replace(/\.+$/, "")}.`;
62
+ } }),
63
+ createIntrinsic("hbr", {}),
64
+ createComponent(TSDocTitle, { get children() {
65
+ return command.title;
66
+ } }),
67
+ createComponent(TSDocParam, {
68
+ name: "args",
69
+ children: `The command-line arguments passed to the command.`
70
+ })
71
+ ];
72
+ }
73
+ }),
74
+ createComponent(FunctionDeclaration, {
75
+ "export": true,
76
+ async: true,
77
+ name: "handler",
78
+ parameters: [{
79
+ name: "args",
80
+ type: "string[]",
81
+ default: "getArgs()"
82
+ }],
83
+ get children() {
84
+ return [
85
+ createComponent(CommandParserLogic, {
86
+ command,
87
+ get envPrefix() {
88
+ return context.config.envPrefix;
89
+ },
90
+ get isCaseSensitive() {
91
+ return context.config.isCaseSensitive;
92
+ }
93
+ }),
94
+ createIntrinsic("hbr", {}),
95
+ createIntrinsic("hbr", {}),
96
+ code`writeLine("");
97
+ banner(); `,
98
+ createIntrinsic("hbr", {}),
99
+ createIntrinsic("hbr", {}),
100
+ createComponent(IfStatement, {
101
+ get condition() {
102
+ return createComponent(IsDebug, {});
103
+ },
104
+ get children() {
105
+ return code`
106
+ writeLine("");
107
+ writeLine(colors.text.body.tertiary("Debug mode is enabled. Additional debug information may be logged to the console."));
108
+
109
+ writeLine("");
110
+ debug(\`Command path: ${command.segments.map((segment) => isDynamicPathSegment(segment) ? `\${${camelCase(getDynamicPathSegmentName(segment))}}` : segment).join(" / ")} \\n\\nOptions: \\n${Object.values(command.options).map((option) => ` - ${kebabCase(option.name)}: \${options.${camelCase(option.name)} === undefined ? "" : JSON.stringify(options.${camelCase(option.name)})}`).join("\\n")}${command.arguments.length > 0 ? ` \\n\\nArguments: \\n${command.arguments.map((argument) => ` - ${kebabCase(argument.name)}: \${${camelCase(argument.name)} === undefined ? "" : JSON.stringify(${camelCase(argument.name)})}`).join("\\n")}` : ""}\`); `;
111
+ }
112
+ }),
113
+ createIntrinsic("hbr", {}),
114
+ createIntrinsic("hbr", {}),
115
+ children,
116
+ createIntrinsic("hbr", {}),
117
+ createIntrinsic("hbr", {}),
118
+ createComponent(IfStatement, {
119
+ condition: code`options.help`,
120
+ get children() {
121
+ return createComponent(CommandHelp, { command });
122
+ }
123
+ }),
124
+ createComponent(ElseClause, { get children() {
125
+ return [createIntrinsic("hbr", {}), createComponent(CommandInvocation, { command })];
126
+ } })
127
+ ];
128
+ }
129
+ })
130
+ ];
101
131
  }
102
132
  /**
103
133
  * The command entry point for the Shell Shock project.
@@ -105,7 +135,7 @@ function CommandHandlerDeclaration(props) {
105
135
  function CommandEntry(props) {
106
136
  const { command, imports, builtinImports, ...rest } = props;
107
137
  const context = usePowerlines();
108
- const filePath = computed(() => joinPaths(command.path.segments.filter((segment) => !isDynamicPathSegment(segment)).join("/"), "index.ts"));
138
+ const filePath = computed(() => joinPaths(command.segments.filter((segment) => !isDynamicPathSegment(segment)).join("/"), "index.ts"));
109
139
  const commandSourcePath = computed(() => replaceExtension(relativePath(joinPaths(context.entryPath, findFilePath(filePath.value)), command.entry.input?.file || command.entry.file)));
110
140
  const typeDefinition = computed(() => ({
111
141
  ...command.entry,
@@ -123,8 +153,14 @@ function CommandEntry(props) {
123
153
  },
124
154
  get builtinImports() {
125
155
  return defu(builtinImports ?? {}, {
126
- env: ["env", "isCI"],
156
+ env: [
157
+ "env",
158
+ "isCI",
159
+ "isDevelopment",
160
+ "isDebug"
161
+ ],
127
162
  console: [
163
+ "debug",
128
164
  "warn",
129
165
  "error",
130
166
  "table",
@@ -136,7 +172,9 @@ function CommandEntry(props) {
136
172
  utils: [
137
173
  "getArgs",
138
174
  "hasFlag",
139
- "isMinimal"
175
+ "isMinimal",
176
+ "isUnicodeSupported",
177
+ "internal_commandContext"
140
178
  ]
141
179
  });
142
180
  },
@@ -1 +1 @@
1
- {"version":3,"file":"command-entry.mjs","names":["code","computed","For","Show","ElseClause","FunctionDeclaration","IfStatement","usePowerlines","EntryFile","TSDoc","TSDocParam","TSDocRemarks","TSDocTitle","DynamicPathSegmentsParserLogic","OptionsInterfaceDeclaration","OptionsParserLogic","getAppBin","getDynamicPathSegmentName","isDynamicPathSegment","findFilePath","relativePath","joinPaths","replaceExtension","camelCase","constantCase","pascalCase","defu","BannerFunctionDeclaration","CommandHelp","VirtualCommandEntry","CommandInvocation","props","command","_$memo","name","path","segments","filter","segment","length","map","join","_$createIntrinsic","CommandHandlerDeclaration","children","context","_$createComponent","heading","title","description","replace","async","parameters","type","default","envPrefix","config","isCaseSensitive","condition","CommandEntry","imports","builtinImports","rest","filePath","commandSourcePath","entryPath","value","entry","input","file","typeDefinition","output","id","_$mergeProps","env","console","utils","each","Object","values","child","when","isVirtual","fallback"],"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 type { Children } from \"@alloy-js/core\";\nimport { code, computed, For, Show } from \"@alloy-js/core\";\nimport {\n ElseClause,\n FunctionDeclaration,\n IfStatement\n} from \"@alloy-js/typescript\";\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 {\n TSDoc,\n TSDocParam,\n TSDocRemarks,\n TSDocTitle\n} from \"@powerlines/plugin-alloy/typescript/components/tsdoc\";\nimport {\n DynamicPathSegmentsParserLogic,\n OptionsInterfaceDeclaration,\n OptionsParserLogic\n} from \"@shell-shock/core/components/options-parser-logic\";\nimport {\n getAppBin,\n getDynamicPathSegmentName,\n isDynamicPathSegment\n} from \"@shell-shock/core/plugin-utils/context-helpers\";\nimport type { CommandTree } from \"@shell-shock/core/types/command\";\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 { constantCase } from \"@stryke/string-format/constant-case\";\nimport { pascalCase } from \"@stryke/string-format/pascal-case\";\nimport defu from \"defu\";\nimport type { ScriptPresetContext } from \"../types/plugin\";\nimport { BannerFunctionDeclaration } from \"./banner-function-declaration\";\nimport { CommandHelp } from \"./help\";\nimport { VirtualCommandEntry } from \"./virtual-command-entry\";\n\nexport function CommandInvocation(props: { command: CommandTree }) {\n const { command } = props;\n\n return (\n <>\n {code`return Promise.resolve(handle${pascalCase(command.name)}(options${\n command.path.segments.filter(segment => isDynamicPathSegment(segment))\n .length > 0\n ? `, ${command.path.segments\n .filter(segment => isDynamicPathSegment(segment))\n .map(segment => camelCase(getDynamicPathSegmentName(segment)))\n .join(\", \")}`\n : \"\"\n }));`}\n <hbr />\n </>\n );\n}\n\nexport interface CommandHandlerDeclarationProps {\n command: CommandTree;\n children?: Children;\n}\n\n/**\n * A component that generates the `handler` function declaration for a command.\n */\nexport function CommandHandlerDeclaration(\n props: CommandHandlerDeclarationProps\n) {\n const { command, children } = props;\n\n const context = usePowerlines<ScriptPresetContext>();\n\n return (\n <>\n <TSDoc\n heading={`The ${command.title} (${getAppBin(\n context\n )} ${command.path.segments\n .map(segment =>\n isDynamicPathSegment(segment)\n ? `[${constantCase(getDynamicPathSegmentName(segment))}]`\n : segment\n )\n .join(\" \")}) command.`}>\n <TSDocRemarks>{`${command.description.replace(/\\.+$/, \"\")}.`}</TSDocRemarks>\n <hbr />\n <TSDocTitle>{command.title}</TSDocTitle>\n <TSDocParam name=\"args\">{`The command-line arguments passed to the command.`}</TSDocParam>\n </TSDoc>\n <FunctionDeclaration\n export\n async\n name=\"handler\"\n parameters={[{ name: \"args\", type: \"string[]\", default: \"getArgs()\" }]}>\n <DynamicPathSegmentsParserLogic\n path={command.path}\n envPrefix={context.config.envPrefix}\n />\n <hbr />\n <hbr />\n <OptionsParserLogic\n command={command}\n envPrefix={context.config.envPrefix}\n isCaseSensitive={context.config.isCaseSensitive}\n />\n <hbr />\n <hbr />\n {code`writeLine(\"\");\n banner();`}\n <hbr />\n <hbr />\n {children}\n <hbr />\n <hbr />\n <IfStatement condition={code`options.help`}>\n <CommandHelp command={command} />\n </IfStatement>\n <ElseClause>\n <hbr />\n <CommandInvocation command={command} />\n </ElseClause>\n </FunctionDeclaration>\n </>\n );\n}\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<ScriptPresetContext>();\n const filePath = computed(() =>\n joinPaths(\n command.path.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]: `handle${pascalCase(command.name)}`\n })}\n builtinImports={defu(builtinImports ?? {}, {\n env: [\"env\", \"isCI\"],\n console: [\n \"warn\",\n \"error\",\n \"table\",\n \"colors\",\n \"stripAnsi\",\n \"writeLine\",\n \"splitText\"\n ],\n utils: [\"getArgs\", \"hasFlag\", \"isMinimal\"]\n })}>\n <BannerFunctionDeclaration command={command} />\n <hbr />\n <hbr />\n <OptionsInterfaceDeclaration command={command} />\n <hbr />\n <hbr />\n <CommandHandlerDeclaration command={command} />\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":";;;;;;;;;;;;;;;;;;;;AAyDA,SAAgB8B,kBAAkBC,OAAiC;CACjE,MAAM,EAAEC,YAAYD;AAEpB,QAAA,CAAAE,WAEKjC,IAAI,gCAAgCyB,WAAWO,QAAQE,KAAK,CAAA,UAC3DF,QAAQG,KAAKC,SAASC,QAAOC,YAAWpB,qBAAqBoB,QAAQ,CAAC,CACnEC,SAAS,IACR,KAAKP,QAAQG,KAAKC,SACfC,QAAOC,YAAWpB,qBAAqBoB,QAAQ,CAAC,CAChDE,KAAIF,YAAWf,UAAUN,0BAA0BqB,QAAQ,CAAC,CAAC,CAC7DG,KAAK,KAAK,KACb,GAAE,KACH,EAAAC,gBAAA,OAAA,EAAA,CAAA,CAAA;;;;;AAcX,SAAgBC,0BACdZ,OACA;CACA,MAAM,EAAEC,SAASY,aAAab;CAE9B,MAAMc,UAAUtC,eAAoC;AAEpD,QAAA,CAAAuC,gBAEKrC,OAAK;EAAA,IACJsC,UAAO;AAAA,UAAE,OAAOf,QAAQgB,MAAK,IAAKhC,UAChC6B,QACD,CAAA,GAAIb,QAAQG,KAAKC,SACfI,KAAIF,YACHpB,qBAAqBoB,QAAQ,GACzB,IAAId,aAAaP,0BAA0BqB,QAAQ,CAAC,CAAA,KACpDA,QACL,CACAG,KAAK,IAAI,CAAA;;EAAY,IAAAG,WAAA;AAAA,UAAA;IAAAE,gBACvBnC,cAAY,EAAA,IAAAiC,WAAA;AAAA,YAAE,GAAGZ,QAAQiB,YAAYC,QAAQ,QAAQ,GAAG,CAAA;OAAG,CAAA;IAAAR,gBAAA,OAAA,EAAA,CAAA;IAAAI,gBAE3DlC,YAAU,EAAA,IAAAgC,WAAA;AAAA,YAAEZ,QAAQgB;OAAK,CAAA;IAAAF,gBACzBpC,YAAU;KAACwB,MAAI;KAAAU,UAAS;KAAmD,CAAA;IAAA;;EAAA,CAAA,EAAAE,gBAE7EzC,qBAAmB;EAAA,UAAA;EAElB8C,OAAK;EACLjB,MAAI;EACJkB,YAAY,CAAC;GAAElB,MAAM;GAAQmB,MAAM;GAAYC,SAAS;GAAa,CAAC;EAAA,IAAAV,WAAA;AAAA,UAAA;IAAAE,gBACrEjC,gCAA8B;KAAA,IAC7BsB,OAAI;AAAA,aAAEH,QAAQG;;KAAI,IAClBoB,YAAS;AAAA,aAAEV,QAAQW,OAAOD;;KAAS,CAAA;IAAAb,gBAAA,OAAA,EAAA,CAAA;IAAAA,gBAAA,OAAA,EAAA,CAAA;IAAAI,gBAIpC/B,oBAAkB;KACRiB;KAAO,IAChBuB,YAAS;AAAA,aAAEV,QAAQW,OAAOD;;KAAS,IACnCE,kBAAe;AAAA,aAAEZ,QAAQW,OAAOC;;KAAe,CAAA;IAAAf,gBAAA,OAAA,EAAA,CAAA;IAAAA,gBAAA,OAAA,EAAA,CAAA;IAIhD1C,IAAI;;IACK0C,gBAAA,OAAA,EAAA,CAAA;IAAAA,gBAAA,OAAA,EAAA,CAAA;IAGTE;IAAQF,gBAAA,OAAA,EAAA,CAAA;IAAAA,gBAAA,OAAA,EAAA,CAAA;IAAAI,gBAGRxC,aAAW;KAACoD,WAAW1D,IAAI;KAAc,IAAA4C,WAAA;AAAA,aAAAE,gBACvClB,aAAW,EAAUI,SAAO,CAAA;;KAAA,CAAA;IAAAc,gBAE9B1C,YAAU,EAAA,IAAAwC,WAAA;AAAA,YAAA,CAAAF,gBAAA,OAAA,EAAA,CAAA,EAAAI,gBAERhB,mBAAiB,EAAUE,SAAO,CAAA,CAAA;OAAA,CAAA;IAAA;;EAAA,CAAA,CAAA;;;;;AAiB7C,SAAgB2B,aAAa5B,OAA0B;CACrD,MAAM,EAAEC,SAAS4B,SAASC,gBAAgB,GAAGC,SAAS/B;CAEtD,MAAMc,UAAUtC,eAAoC;CACpD,MAAMwD,WAAW9D,eACfoB,UACEW,QAAQG,KAAKC,SACVC,QAAOC,YAAW,CAACpB,qBAAqBoB,QAAQ,CAAC,CACjDG,KAAK,IAAI,EACZ,WAEJ,CAAC;CACD,MAAMuB,oBAAoB/D,eACxBqB,iBACEF,aACEC,UAAUwB,QAAQoB,WAAW9C,aAAa4C,SAASG,MAAM,CAAC,EAC1DlC,QAAQmC,MAAMC,OAAOC,QAAQrC,QAAQmC,MAAME,KAE/C,CACF,CAAC;CACD,MAAMC,iBAAiBrE,gBAAgB;EACrC,GAAG+B,QAAQmC;EACXI,QAAQvC,QAAQwC;EACjB,EAAE;AAEH,QAAA,CAAA1B,gBAEKtC,WAASiE,WACJX,MAAI;EAAA,IACR3B,OAAI;AAAA,UAAE4B,SAASG;;EAAK,IACpBI,iBAAc;AAAA,UAAEA,eAAeJ;;EAAK,IACpCN,UAAO;AAAA,UAAElC,KAAKkC,WAAW,EAAE,EAAE,GAC1BI,kBAAkBE,QAAQ,SAASzC,WAAWO,QAAQE,KAAK,IAC7D,CAAC;;EAAA,IACF2B,iBAAc;AAAA,UAAEnC,KAAKmC,kBAAkB,EAAE,EAAE;IACzCa,KAAK,CAAC,OAAO,OAAO;IACpBC,SAAS;KACP;KACA;KACA;KACA;KACA;KACA;KACA;KACD;IACDC,OAAO;KAAC;KAAW;KAAW;KAAW;IAC1C,CAAC;;EAAA,IAAAhC,WAAA;AAAA,UAAA;IAAAE,gBACDnB,2BAAyB,EAAUK,SAAO,CAAA;IAAAU,gBAAA,OAAA,EAAA,CAAA;IAAAA,gBAAA,OAAA,EAAA,CAAA;IAAAI,gBAG1ChC,6BAA2B,EAAUkB,SAAO,CAAA;IAAAU,gBAAA,OAAA,EAAA,CAAA;IAAAA,gBAAA,OAAA,EAAA,CAAA;IAAAI,gBAG5CH,2BAAyB,EAAUX,SAAO,CAAA;IAAA;;EAAA,CAAA,CAAA,EAAAc,gBAE5C5C,KAAG;EAAA,IAAC2E,OAAI;AAAA,UAAEC,OAAOC,OAAO/C,QAAQY,SAAS;;EAAAA,WACvCoC,UAAKlC,gBACH3C,MAAI;GAAA,IACH8E,OAAI;AAAA,WAAED,MAAME;;GAAS,IACrBC,WAAQ;AAAA,WAAArC,gBAAGa,cAAY,EAAC3B,SAASgD,OAAK,CAAA;;GAAA,IAAApC,WAAA;AAAA,WAAAE,gBACrCjB,qBAAmB,EAACG,SAASgD,OAAK,CAAA;;GAAA,CAAA;EAEtC,CAAA,CAAA"}
1
+ {"version":3,"file":"command-entry.mjs","names":["code","computed","For","Show","ElseClause","FunctionDeclaration","IfStatement","VarDeclaration","usePowerlines","EntryFile","TSDoc","TSDocParam","TSDocRemarks","TSDocTitle","CommandParserLogic","OptionsInterfaceDeclaration","getAppBin","getDynamicPathSegmentName","isDynamicPathSegment","findFilePath","relativePath","joinPaths","replaceExtension","camelCase","constantCase","kebabCase","pascalCase","defu","BannerFunctionDeclaration","CommandHelp","IsDebug","VirtualCommandEntry","CommandInvocation","props","command","_$createComponent","name","initializer","segments","map","segment","join","_$createIntrinsic","_$memo","arguments","length","argument","CommandHandlerDeclaration","children","context","heading","title","description","replace","async","parameters","type","default","envPrefix","config","isCaseSensitive","condition","Object","values","options","option","CommandEntry","imports","builtinImports","rest","filePath","filter","commandSourcePath","entryPath","value","entry","input","file","typeDefinition","output","id","_$mergeProps","path","env","console","utils","each","child","when","isVirtual","fallback"],"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 type { Children } from \"@alloy-js/core\";\nimport { code, computed, For, Show } from \"@alloy-js/core\";\nimport {\n ElseClause,\n FunctionDeclaration,\n IfStatement,\n VarDeclaration\n} from \"@alloy-js/typescript\";\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 {\n TSDoc,\n TSDocParam,\n TSDocRemarks,\n TSDocTitle\n} from \"@powerlines/plugin-alloy/typescript/components/tsdoc\";\nimport {\n CommandParserLogic,\n OptionsInterfaceDeclaration\n} from \"@shell-shock/core/components/options-parser-logic\";\nimport {\n getAppBin,\n getDynamicPathSegmentName,\n isDynamicPathSegment\n} from \"@shell-shock/core/plugin-utils/context-helpers\";\nimport type { CommandTree } from \"@shell-shock/core/types/command\";\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 { constantCase } from \"@stryke/string-format/constant-case\";\nimport { kebabCase } from \"@stryke/string-format/kebab-case\";\nimport { pascalCase } from \"@stryke/string-format/pascal-case\";\nimport defu from \"defu\";\nimport type { ScriptPresetContext } from \"../types/plugin\";\nimport { BannerFunctionDeclaration } from \"./banner-function-declaration\";\nimport { CommandHelp } from \"./help\";\nimport { IsDebug } from \"./helpers\";\nimport { VirtualCommandEntry } from \"./virtual-command-entry\";\n\nexport function CommandInvocation(props: { command: CommandTree }) {\n const { command } = props;\n\n return (\n <>\n <VarDeclaration\n name=\"__context\"\n initializer={code`{ path: \\`${command.segments\n .map(segment =>\n isDynamicPathSegment(segment)\n ? `\\${${camelCase(getDynamicPathSegmentName(segment))}}`\n : segment\n )\n .join(\"/\")}\\`, segments: [${command.segments\n .map(segment =>\n isDynamicPathSegment(segment)\n ? camelCase(getDynamicPathSegmentName(segment))\n : `\"${segment}\"`\n )\n .join(\", \")}] }`}\n />\n <hbr />\n <hbr />\n {code`\n\n internal_commandContext.call(__context, () => {\n return Promise.resolve(Reflect.apply(handle${pascalCase(\n command.name\n )}, __context, [options${\n command.arguments.length > 0\n ? `, ${command.arguments\n .map(argument => camelCase(argument.name))\n .join(\", \")}`\n : \"\"\n }]));\n });\n\n `}\n <hbr />\n </>\n );\n}\n\nexport interface CommandHandlerDeclarationProps {\n command: CommandTree;\n children?: Children;\n}\n\n/**\n * A component that generates the `handler` function declaration for a command.\n */\nexport function CommandHandlerDeclaration(\n props: CommandHandlerDeclarationProps\n) {\n const { command, children } = props;\n\n const context = usePowerlines<ScriptPresetContext>();\n\n return (\n <>\n <OptionsInterfaceDeclaration command={command} />\n <hbr />\n <hbr />\n <TSDoc\n heading={`The ${command.title} (${getAppBin(context)} ${command.segments\n .map(segment =>\n isDynamicPathSegment(segment)\n ? `[${constantCase(getDynamicPathSegmentName(segment))}]`\n : segment\n )\n .join(\" \")}) command.`}>\n <TSDocRemarks>{`${command.description.replace(/\\.+$/, \"\")}.`}</TSDocRemarks>\n <hbr />\n <TSDocTitle>{command.title}</TSDocTitle>\n <TSDocParam name=\"args\">{`The command-line arguments passed to the command.`}</TSDocParam>\n </TSDoc>\n <FunctionDeclaration\n export\n async\n name=\"handler\"\n parameters={[{ name: \"args\", type: \"string[]\", default: \"getArgs()\" }]}>\n <CommandParserLogic\n command={command}\n envPrefix={context.config.envPrefix}\n isCaseSensitive={context.config.isCaseSensitive}\n />\n <hbr />\n <hbr />\n {code`writeLine(\"\");\n banner(); `}\n <hbr />\n <hbr />\n <IfStatement condition={<IsDebug />}>\n {code`\n writeLine(\"\");\n writeLine(colors.text.body.tertiary(\"Debug mode is enabled. Additional debug information may be logged to the console.\"));\n\n writeLine(\"\");\n debug(\\`Command path: ${command.segments\n .map(segment =>\n isDynamicPathSegment(segment)\n ? `\\${${camelCase(getDynamicPathSegmentName(segment))}}`\n : segment\n )\n .join(\" / \")} \\\\n\\\\nOptions: \\\\n${Object.values(command.options)\n .map(\n option =>\n ` - ${kebabCase(option.name)}: \\${options.${camelCase(\n option.name\n )} === undefined ? \"\" : JSON.stringify(options.${camelCase(\n option.name\n )})}`\n )\n .join(\"\\\\n\")}${\n command.arguments.length > 0\n ? ` \\\\n\\\\nArguments: \\\\n${command.arguments\n .map(\n argument =>\n ` - ${kebabCase(argument.name)}: \\${${camelCase(\n argument.name\n )} === undefined ? \"\" : JSON.stringify(${camelCase(\n argument.name\n )})}`\n )\n .join(\"\\\\n\")}`\n : \"\"\n }\\`); `}\n </IfStatement>\n <hbr />\n <hbr />\n {children}\n <hbr />\n <hbr />\n <IfStatement condition={code`options.help`}>\n <CommandHelp command={command} />\n </IfStatement>\n <ElseClause>\n <hbr />\n <CommandInvocation command={command} />\n </ElseClause>\n </FunctionDeclaration>\n </>\n );\n}\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<ScriptPresetContext>();\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]: `handle${pascalCase(command.name)}`\n })}\n builtinImports={defu(builtinImports ?? {}, {\n env: [\"env\", \"isCI\", \"isDevelopment\", \"isDebug\"],\n console: [\n \"debug\",\n \"warn\",\n \"error\",\n \"table\",\n \"colors\",\n \"stripAnsi\",\n \"writeLine\",\n \"splitText\"\n ],\n utils: [\n \"getArgs\",\n \"hasFlag\",\n \"isMinimal\",\n \"isUnicodeSupported\",\n \"internal_commandContext\"\n ]\n })}>\n <BannerFunctionDeclaration command={command} />\n <hbr />\n <hbr />\n <OptionsInterfaceDeclaration command={command} />\n <hbr />\n <hbr />\n <CommandHandlerDeclaration command={command} />\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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"}
@@ -22,7 +22,7 @@ function CommandRouterRoute() {
22
22
  return `handle${(0, __stryke_string_format_pascal_case.pascalCase)(command.name)}`;
23
23
  },
24
24
  get importPath() {
25
- return `./${command.path.segments.filter((segment) => !(0, __shell_shock_core_plugin_utils_context_helpers.isDynamicPathSegment)(segment))[command.path.segments.filter((segment) => !(0, __shell_shock_core_plugin_utils_context_helpers.isDynamicPathSegment)(segment)).length - 1]}`;
25
+ return `./${command.segments.filter((segment) => !(0, __shell_shock_core_plugin_utils_context_helpers.isDynamicPathSegment)(segment))[command.segments.filter((segment) => !(0, __shell_shock_core_plugin_utils_context_helpers.isDynamicPathSegment)(segment)).length - 1]}`;
26
26
  },
27
27
  exportName: "handler"
28
28
  });
@@ -36,9 +36,9 @@ function CommandRouterRoute() {
36
36
  * The command router component.
37
37
  */
38
38
  function CommandRouter(props) {
39
- const { path, commands, route } = props;
39
+ const { segments, commands, route } = props;
40
40
  const context = (0, __powerlines_plugin_alloy_core_contexts_context.usePowerlines)();
41
- const index = (0, __alloy_js_core.computed)(() => 2 + (path.length ?? 0));
41
+ const index = (0, __alloy_js_core.computed)(() => 2 + (segments.length ?? 0));
42
42
  return (0, __alloy_js_core_jsx_runtime.createComponent)(__alloy_js_core.Show, {
43
43
  get when() {
44
44
  return commands && Object.keys(commands).length > 0;
@@ -75,7 +75,7 @@ function CommandRouter(props) {
75
75
  get fallback() {
76
76
  return (0, __alloy_js_core_jsx_runtime.createComponent)(__alloy_js_typescript.IfStatement, {
77
77
  get condition() {
78
- return __alloy_js_core.code`${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(/-/g, \"\")"} === "${context.config.isCaseSensitive ? subcommand.name : subcommand.name.toLowerCase().replaceAll(/-/g, "")}"${subcommand.alias && subcommand.alias.length > 0 ? ` || ${subcommand.alias.map((alias) => `${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(/-/g, \"\")"} === "${context.config.isCaseSensitive ? alias : alias.toLowerCase().replaceAll(/-/g, "")}"`).join(" || ")}` : ""}`;
78
+ return __alloy_js_core.code`${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")"} === "${context.config.isCaseSensitive ? subcommand.name : subcommand.name.toLowerCase().replaceAll("-", "").replaceAll("_", "")}"${subcommand.alias && subcommand.alias.length > 0 ? ` || ${subcommand.alias.map((alias) => `${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")"} === "${context.config.isCaseSensitive ? alias : alias.toLowerCase().replaceAll("-", "").replaceAll("_", "")}"`).join(" || ")}` : ""}`;
79
79
  },
80
80
  get children() {
81
81
  return (0, __alloy_js_core_jsx_runtime.createComponent)(__alloy_js_core.Show, {
@@ -93,7 +93,7 @@ function CommandRouter(props) {
93
93
  get children() {
94
94
  return (0, __alloy_js_core_jsx_runtime.createComponent)(__alloy_js_typescript.ElseIfClause, {
95
95
  get condition() {
96
- return __alloy_js_core.code`${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(/-/g, \"\")"} === "${context.config.isCaseSensitive ? subcommand.name : subcommand.name.toLowerCase().replaceAll(/-/g, "")}"${subcommand.alias && subcommand.alias.length > 0 ? ` || ${subcommand.alias.map((alias) => `${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(/-/g, \"\")"} === "${context.config.isCaseSensitive ? alias : alias.toLowerCase().replaceAll(/-/g, "")}"`).join(" || ")}` : ""}`;
96
+ return __alloy_js_core.code`${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")"} === "${context.config.isCaseSensitive ? subcommand.name : subcommand.name.toLowerCase().replaceAll("-", "").replaceAll("_", "")}"${subcommand.alias && subcommand.alias.length > 0 ? ` || ${subcommand.alias.map((alias) => `${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")"} === "${context.config.isCaseSensitive ? alias : alias.toLowerCase().replaceAll("-", "").replaceAll("_", "")}"`).join(" || ")}` : ""}`;
97
97
  },
98
98
  get children() {
99
99
  return (0, __alloy_js_core_jsx_runtime.createComponent)(__alloy_js_core.Show, {
@@ -1 +1 @@
1
- {"version":3,"file":"command-router.cjs","names":["code","computed","For","Show","ElseIfClause","IfStatement","VarDeclaration","usePowerlines","DynamicImportStatement","CommandContext","useCommand","isDynamicPathSegment","pascalCase","CommandRouterRoute","command","_$createComponent","when","isVirtual","children","name","importPath","path","segments","filter","segment","length","exportName","_$createIntrinsic","_$memo","CommandRouter","props","commands","route","context","index","Object","keys","type","initializer","condition","value","each","values","subcommand","idx","Provider","Boolean","fallback","config","isCaseSensitive","toLowerCase","replaceAll","alias","map","join","cmd","i","JSON","stringify"],"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 type { Children } from \"@alloy-js/core\";\nimport { code, computed, For, Show } from \"@alloy-js/core\";\nimport {\n ElseIfClause,\n IfStatement,\n VarDeclaration\n} from \"@alloy-js/typescript\";\nimport { usePowerlines } from \"@powerlines/plugin-alloy/core/contexts/context\";\nimport { DynamicImportStatement } from \"@powerlines/plugin-alloy/typescript/components/dynamic-import-statement\";\nimport { CommandContext, useCommand } from \"@shell-shock/core/contexts/command\";\nimport { isDynamicPathSegment } from \"@shell-shock/core/plugin-utils/context-helpers\";\nimport type { CommandTree } from \"@shell-shock/core/types/command\";\nimport { pascalCase } from \"@stryke/string-format/pascal-case\";\nimport type { ScriptPresetContext } from \"../types/plugin\";\n\nexport function CommandRouterRoute() {\n const command = useCommand();\n\n return (\n <>\n <Show when={!command.isVirtual}>\n <DynamicImportStatement\n name={`handle${pascalCase(command.name)}`}\n importPath={`./${\n command.path.segments.filter(\n segment => !isDynamicPathSegment(segment)\n )[\n command.path.segments.filter(\n segment => !isDynamicPathSegment(segment)\n ).length - 1\n ]\n }`}\n exportName=\"handler\"\n />\n </Show>\n <hbr />\n {code`return handle${pascalCase(command.name)}(args);`}\n </>\n );\n}\n\nexport interface CommandRouterProps {\n path: string[];\n commands?: Record<string, CommandTree>;\n route?: Children;\n}\n\n/**\n * The command router component.\n */\nexport function CommandRouter(props: CommandRouterProps) {\n const { path, commands, route } = props;\n\n const context = usePowerlines<ScriptPresetContext>();\n const index = computed(() => 2 + (path.length ?? 0));\n\n return (\n <Show when={commands && Object.keys(commands).length > 0}>\n <VarDeclaration\n let\n name=\"command\"\n type=\"string\"\n initializer={code`\"\";`}\n />\n <hbr />\n <IfStatement\n condition={code`args.length > ${\n index.value\n } && args[${index.value}]`}>{code`command = args[${\n index.value\n }];`}</IfStatement>\n <hbr />\n <For each={Object.values(commands ?? {})}>\n {(subcommand, idx) => (\n <CommandContext.Provider value={subcommand}>\n <Show\n when={Boolean(idx)}\n fallback={\n <IfStatement\n condition={code`${\n context.config.isCaseSensitive\n ? \"command\"\n : 'command.toLowerCase().replaceAll(/-/g, \"\")'\n } === \"${\n context.config.isCaseSensitive\n ? subcommand.name\n : subcommand.name.toLowerCase().replaceAll(/-/g, \"\")\n }\"${\n subcommand.alias && subcommand.alias.length > 0\n ? ` || ${subcommand.alias\n .map(\n alias =>\n `${context.config.isCaseSensitive ? \"command\" : 'command.toLowerCase().replaceAll(/-/g, \"\")'} === \"${\n context.config.isCaseSensitive\n ? alias\n : alias.toLowerCase().replaceAll(/-/g, \"\")\n }\"`\n )\n .join(\" || \")}`\n : \"\"\n }`}>\n <Show when={Boolean(route)} fallback={<CommandRouterRoute />}>\n {route}\n </Show>\n </IfStatement>\n }>\n <ElseIfClause\n condition={code`${\n context.config.isCaseSensitive\n ? \"command\"\n : 'command.toLowerCase().replaceAll(/-/g, \"\")'\n } === \"${\n context.config.isCaseSensitive\n ? subcommand.name\n : subcommand.name.toLowerCase().replaceAll(/-/g, \"\")\n }\"${\n subcommand.alias && subcommand.alias.length > 0\n ? ` || ${subcommand.alias\n .map(\n alias =>\n `${context.config.isCaseSensitive ? \"command\" : 'command.toLowerCase().replaceAll(/-/g, \"\")'} === \"${\n context.config.isCaseSensitive\n ? alias\n : alias.toLowerCase().replaceAll(/-/g, \"\")\n }\"`\n )\n .join(\" || \")}`\n : \"\"\n }`}>\n <Show when={Boolean(route)} fallback={<CommandRouterRoute />}>\n {route}\n </Show>\n </ElseIfClause>\n </Show>\n </CommandContext.Provider>\n )}\n </For>\n <ElseIfClause\n condition={code`Boolean(command)`}>{code`const suggestions = didYouMean(command, [${Object.values(\n commands ?? {}\n )\n .map(\n cmd =>\n `\"${cmd.name}\"${(cmd.alias ?? []).map((alias, i) => (i === 0 ? `, \"${alias}\"` : ` \"${alias}\"`)).join(\"\")}`\n )\n .join(\", \")}], {\n caseSensitive: ${JSON.stringify(context.config.isCaseSensitive)},\n returnType: ReturnTypeEnums.ALL_CLOSEST_MATCHES,\n thresholdType: ThresholdTypeEnums.SIMILARITY,\n threshold: 0.75\n });\n error(\\`Unknown command: \"\\${command}\"\\${suggestions && suggestions.length > 0 ? \\`, did you mean: \\${suggestions.length === 1 ? \\`\"\\${suggestions[0]}\"\\` : suggestions.map((suggestion, i) => i < suggestions.length - 1 ? \\`\"\\${suggestion}\", \\` : \\`or \"\\${suggestion}\"\\`)}?\\` : \"\"} \\`);`}</ElseIfClause>\n </Show>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"command-router.cjs","names":["code","computed","For","Show","ElseIfClause","IfStatement","VarDeclaration","usePowerlines","DynamicImportStatement","CommandContext","useCommand","isDynamicPathSegment","pascalCase","CommandRouterRoute","command","_$createComponent","when","isVirtual","children","name","importPath","segments","filter","segment","length","exportName","_$createIntrinsic","_$memo","CommandRouter","props","commands","route","context","index","Object","keys","type","initializer","condition","value","each","values","subcommand","idx","Provider","Boolean","fallback","config","isCaseSensitive","toLowerCase","replaceAll","alias","map","join","cmd","i","JSON","stringify"],"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 type { Children } from \"@alloy-js/core\";\nimport { code, computed, For, Show } from \"@alloy-js/core\";\nimport {\n ElseIfClause,\n IfStatement,\n VarDeclaration\n} from \"@alloy-js/typescript\";\nimport { usePowerlines } from \"@powerlines/plugin-alloy/core/contexts/context\";\nimport { DynamicImportStatement } from \"@powerlines/plugin-alloy/typescript/components/dynamic-import-statement\";\nimport { CommandContext, useCommand } from \"@shell-shock/core/contexts/command\";\nimport { isDynamicPathSegment } from \"@shell-shock/core/plugin-utils/context-helpers\";\nimport type { CommandTree } from \"@shell-shock/core/types/command\";\nimport { pascalCase } from \"@stryke/string-format/pascal-case\";\nimport type { ScriptPresetContext } from \"../types/plugin\";\n\nexport function CommandRouterRoute() {\n const command = useCommand();\n\n return (\n <>\n <Show when={!command.isVirtual}>\n <DynamicImportStatement\n name={`handle${pascalCase(command.name)}`}\n importPath={`./${\n command.segments.filter(segment => !isDynamicPathSegment(segment))[\n command.segments.filter(segment => !isDynamicPathSegment(segment))\n .length - 1\n ]\n }`}\n exportName=\"handler\"\n />\n </Show>\n <hbr />\n {code`return handle${pascalCase(command.name)}(args);`}\n </>\n );\n}\n\nexport interface CommandRouterProps {\n segments: string[];\n commands?: Record<string, CommandTree>;\n route?: Children;\n}\n\n/**\n * The command router component.\n */\nexport function CommandRouter(props: CommandRouterProps) {\n const { segments, commands, route } = props;\n\n const context = usePowerlines<ScriptPresetContext>();\n const index = computed(() => 2 + (segments.length ?? 0));\n\n return (\n <Show when={commands && Object.keys(commands).length > 0}>\n <VarDeclaration\n let\n name=\"command\"\n type=\"string\"\n initializer={code`\"\";`}\n />\n <hbr />\n <IfStatement\n condition={code`args.length > ${\n index.value\n } && args[${index.value}]`}>{code`command = args[${\n index.value\n }];`}</IfStatement>\n <hbr />\n <For each={Object.values(commands ?? {})}>\n {(subcommand, idx) => (\n <CommandContext.Provider value={subcommand}>\n <Show\n when={Boolean(idx)}\n fallback={\n <IfStatement\n condition={code`${\n context.config.isCaseSensitive\n ? \"command\"\n : 'command.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n } === \"${\n context.config.isCaseSensitive\n ? subcommand.name\n : subcommand.name\n .toLowerCase()\n .replaceAll(\"-\", \"\")\n .replaceAll(\"_\", \"\")\n }\"${\n subcommand.alias && subcommand.alias.length > 0\n ? ` || ${subcommand.alias\n .map(\n alias =>\n `${context.config.isCaseSensitive ? \"command\" : 'command.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'} === \"${\n context.config.isCaseSensitive\n ? alias\n : alias\n .toLowerCase()\n .replaceAll(\"-\", \"\")\n .replaceAll(\"_\", \"\")\n }\"`\n )\n .join(\" || \")}`\n : \"\"\n }`}>\n <Show when={Boolean(route)} fallback={<CommandRouterRoute />}>\n {route}\n </Show>\n </IfStatement>\n }>\n <ElseIfClause\n condition={code`${\n context.config.isCaseSensitive\n ? \"command\"\n : 'command.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n } === \"${\n context.config.isCaseSensitive\n ? subcommand.name\n : subcommand.name\n .toLowerCase()\n .replaceAll(\"-\", \"\")\n .replaceAll(\"_\", \"\")\n }\"${\n subcommand.alias && subcommand.alias.length > 0\n ? ` || ${subcommand.alias\n .map(\n alias =>\n `${context.config.isCaseSensitive ? \"command\" : 'command.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'} === \"${\n context.config.isCaseSensitive\n ? alias\n : alias\n .toLowerCase()\n .replaceAll(\"-\", \"\")\n .replaceAll(\"_\", \"\")\n }\"`\n )\n .join(\" || \")}`\n : \"\"\n }`}>\n <Show when={Boolean(route)} fallback={<CommandRouterRoute />}>\n {route}\n </Show>\n </ElseIfClause>\n </Show>\n </CommandContext.Provider>\n )}\n </For>\n <ElseIfClause\n condition={code`Boolean(command)`}>{code`const suggestions = didYouMean(command, [${Object.values(\n commands ?? {}\n )\n .map(\n cmd =>\n `\"${cmd.name}\"${(cmd.alias ?? []).map((alias, i) => (i === 0 ? `, \"${alias}\"` : ` \"${alias}\"`)).join(\"\")}`\n )\n .join(\", \")}], {\n caseSensitive: ${JSON.stringify(context.config.isCaseSensitive)},\n returnType: ReturnTypeEnums.ALL_CLOSEST_MATCHES,\n thresholdType: ThresholdTypeEnums.SIMILARITY,\n threshold: 0.75\n });\n error(\\`Unknown command: \"\\${command}\"\\${suggestions && suggestions.length > 0 ? \\`, did you mean: \\${suggestions.length === 1 ? \\`\"\\${suggestions[0]}\"\\` : suggestions.map((suggestion, i) => i < suggestions.length - 1 ? \\`\"\\${suggestion}\", \\` : \\`or \"\\${suggestion}\"\\`)}?\\` : \"\"} \\`);`}</ElseIfClause>\n </Show>\n );\n}\n"],"mappings":"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"}
@@ -4,7 +4,7 @@ import { CommandTree } from "@shell-shock/core/types/command";
4
4
  //#region src/components/command-router.d.ts
5
5
  declare function CommandRouterRoute(): Children;
6
6
  interface CommandRouterProps {
7
- path: string[];
7
+ segments: string[];
8
8
  commands?: Record<string, CommandTree>;
9
9
  route?: Children;
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"command-router.d.cts","names":[],"sources":["../../src/components/command-router.tsx"],"sourcesContent":[],"mappings":";;;;iBAiCgB,kBAAA,CAAA,GAAkB;UA0BjB,kBAAA;EA1BD,IAAA,EAAA,MAAA,EAAA;EA0BC,QAAA,CAAA,EAEJ,MAFI,CAAA,MAAkB,EAEP,WAFO,CAAA;EAEP,KAAA,CAAA,EAClB,QADkB;;;;AAO5B;iBAAgB,aAAA,QAAqB,qBAAkB"}
1
+ {"version":3,"file":"command-router.d.cts","names":[],"sources":["../../src/components/command-router.tsx"],"sourcesContent":[],"mappings":";;;;iBAiCgB,kBAAA,CAAA,GAAkB;UAuBjB,kBAAA;EAvBD,QAAA,EAAA,MAAA,EAAA;EAuBC,QAAA,CAAA,EAEJ,MAFI,CAAA,MAAkB,EAEP,WAFO,CAAA;EAEP,KAAA,CAAA,EAClB,QADkB;;;;AAO5B;iBAAgB,aAAA,QAAqB,qBAAkB"}
@@ -4,7 +4,7 @@ import { CommandTree } from "@shell-shock/core/types/command";
4
4
  //#region src/components/command-router.d.ts
5
5
  declare function CommandRouterRoute(): Children;
6
6
  interface CommandRouterProps {
7
- path: string[];
7
+ segments: string[];
8
8
  commands?: Record<string, CommandTree>;
9
9
  route?: Children;
10
10
  }
@@ -1 +1 @@
1
- {"version":3,"file":"command-router.d.mts","names":[],"sources":["../../src/components/command-router.tsx"],"sourcesContent":[],"mappings":";;;;iBAiCgB,kBAAA,CAAA,GAAkB;UA0BjB,kBAAA;EA1BD,IAAA,EAAA,MAAA,EAAA;EA0BC,QAAA,CAAA,EAEJ,MAFI,CAAA,MAAkB,EAEP,WAFO,CAAA;EAEP,KAAA,CAAA,EAClB,QADkB;;;;AAO5B;iBAAgB,aAAA,QAAqB,qBAAkB"}
1
+ {"version":3,"file":"command-router.d.mts","names":[],"sources":["../../src/components/command-router.tsx"],"sourcesContent":[],"mappings":";;;;iBAiCgB,kBAAA,CAAA,GAAkB;UAuBjB,kBAAA;EAvBD,QAAA,EAAA,MAAA,EAAA;EAuBC,QAAA,CAAA,EAEJ,MAFI,CAAA,MAAkB,EAEP,WAFO,CAAA;EAEP,KAAA,CAAA,EAClB,QADkB;;;;AAO5B;iBAAgB,aAAA,QAAqB,qBAAkB"}
@@ -21,7 +21,7 @@ function CommandRouterRoute() {
21
21
  return `handle${pascalCase(command.name)}`;
22
22
  },
23
23
  get importPath() {
24
- return `./${command.path.segments.filter((segment) => !isDynamicPathSegment(segment))[command.path.segments.filter((segment) => !isDynamicPathSegment(segment)).length - 1]}`;
24
+ return `./${command.segments.filter((segment) => !isDynamicPathSegment(segment))[command.segments.filter((segment) => !isDynamicPathSegment(segment)).length - 1]}`;
25
25
  },
26
26
  exportName: "handler"
27
27
  });
@@ -35,9 +35,9 @@ function CommandRouterRoute() {
35
35
  * The command router component.
36
36
  */
37
37
  function CommandRouter(props) {
38
- const { path, commands, route } = props;
38
+ const { segments, commands, route } = props;
39
39
  const context = usePowerlines();
40
- const index = computed(() => 2 + (path.length ?? 0));
40
+ const index = computed(() => 2 + (segments.length ?? 0));
41
41
  return createComponent(Show, {
42
42
  get when() {
43
43
  return commands && Object.keys(commands).length > 0;
@@ -74,7 +74,7 @@ function CommandRouter(props) {
74
74
  get fallback() {
75
75
  return createComponent(IfStatement, {
76
76
  get condition() {
77
- return code`${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(/-/g, \"\")"} === "${context.config.isCaseSensitive ? subcommand.name : subcommand.name.toLowerCase().replaceAll(/-/g, "")}"${subcommand.alias && subcommand.alias.length > 0 ? ` || ${subcommand.alias.map((alias) => `${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(/-/g, \"\")"} === "${context.config.isCaseSensitive ? alias : alias.toLowerCase().replaceAll(/-/g, "")}"`).join(" || ")}` : ""}`;
77
+ return code`${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")"} === "${context.config.isCaseSensitive ? subcommand.name : subcommand.name.toLowerCase().replaceAll("-", "").replaceAll("_", "")}"${subcommand.alias && subcommand.alias.length > 0 ? ` || ${subcommand.alias.map((alias) => `${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")"} === "${context.config.isCaseSensitive ? alias : alias.toLowerCase().replaceAll("-", "").replaceAll("_", "")}"`).join(" || ")}` : ""}`;
78
78
  },
79
79
  get children() {
80
80
  return createComponent(Show, {
@@ -92,7 +92,7 @@ function CommandRouter(props) {
92
92
  get children() {
93
93
  return createComponent(ElseIfClause, {
94
94
  get condition() {
95
- return code`${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(/-/g, \"\")"} === "${context.config.isCaseSensitive ? subcommand.name : subcommand.name.toLowerCase().replaceAll(/-/g, "")}"${subcommand.alias && subcommand.alias.length > 0 ? ` || ${subcommand.alias.map((alias) => `${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(/-/g, \"\")"} === "${context.config.isCaseSensitive ? alias : alias.toLowerCase().replaceAll(/-/g, "")}"`).join(" || ")}` : ""}`;
95
+ return code`${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")"} === "${context.config.isCaseSensitive ? subcommand.name : subcommand.name.toLowerCase().replaceAll("-", "").replaceAll("_", "")}"${subcommand.alias && subcommand.alias.length > 0 ? ` || ${subcommand.alias.map((alias) => `${context.config.isCaseSensitive ? "command" : "command.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")"} === "${context.config.isCaseSensitive ? alias : alias.toLowerCase().replaceAll("-", "").replaceAll("_", "")}"`).join(" || ")}` : ""}`;
96
96
  },
97
97
  get children() {
98
98
  return createComponent(Show, {