@shell-shock/core 0.6.0 → 0.8.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 (77) hide show
  1. package/dist/components/docs.cjs +1 -1
  2. package/dist/components/docs.cjs.map +1 -1
  3. package/dist/components/docs.d.cts +5 -5
  4. package/dist/components/docs.d.mts +5 -5
  5. package/dist/components/docs.mjs +1 -1
  6. package/dist/components/docs.mjs.map +1 -1
  7. package/dist/components/helpers.cjs +15 -0
  8. package/dist/components/helpers.cjs.map +1 -0
  9. package/dist/components/helpers.d.cts +13 -0
  10. package/dist/components/helpers.d.cts.map +1 -0
  11. package/dist/components/helpers.d.mts +13 -0
  12. package/dist/components/helpers.d.mts.map +1 -0
  13. package/dist/components/helpers.mjs +14 -0
  14. package/dist/components/helpers.mjs.map +1 -0
  15. package/dist/components/index.cjs +5 -1
  16. package/dist/components/index.d.cts +3 -2
  17. package/dist/components/index.d.mts +3 -2
  18. package/dist/components/index.mjs +3 -2
  19. package/dist/components/options-parser-logic.cjs +156 -31
  20. package/dist/components/options-parser-logic.cjs.map +1 -1
  21. package/dist/components/options-parser-logic.d.cts +47 -8
  22. package/dist/components/options-parser-logic.d.cts.map +1 -1
  23. package/dist/components/options-parser-logic.d.mts +53 -14
  24. package/dist/components/options-parser-logic.d.mts.map +1 -1
  25. package/dist/components/options-parser-logic.mjs +154 -31
  26. package/dist/components/options-parser-logic.mjs.map +1 -1
  27. package/dist/components/usage.cjs +38 -5
  28. package/dist/components/usage.cjs.map +1 -1
  29. package/dist/components/usage.d.cts +2 -4
  30. package/dist/components/usage.d.cts.map +1 -1
  31. package/dist/components/usage.d.mts +2 -4
  32. package/dist/components/usage.d.mts.map +1 -1
  33. package/dist/components/usage.mjs +40 -7
  34. package/dist/components/usage.mjs.map +1 -1
  35. package/dist/helpers/persistence.cjs +31 -3
  36. package/dist/helpers/persistence.cjs.map +1 -1
  37. package/dist/helpers/persistence.mjs +31 -3
  38. package/dist/helpers/persistence.mjs.map +1 -1
  39. package/dist/helpers/resolve-command.cjs +68 -47
  40. package/dist/helpers/resolve-command.cjs.map +1 -1
  41. package/dist/helpers/resolve-command.mjs +70 -49
  42. package/dist/helpers/resolve-command.mjs.map +1 -1
  43. package/dist/helpers/validations.cjs +13 -36
  44. package/dist/helpers/validations.cjs.map +1 -1
  45. package/dist/helpers/validations.mjs +12 -36
  46. package/dist/helpers/validations.mjs.map +1 -1
  47. package/dist/index.d.cts +3 -2
  48. package/dist/index.d.mts +3 -2
  49. package/dist/plugin-utils/context-helpers.cjs +3 -45
  50. package/dist/plugin-utils/context-helpers.cjs.map +1 -1
  51. package/dist/plugin-utils/context-helpers.d.cts +1 -37
  52. package/dist/plugin-utils/context-helpers.d.cts.map +1 -1
  53. package/dist/plugin-utils/context-helpers.d.mts +1 -37
  54. package/dist/plugin-utils/context-helpers.d.mts.map +1 -1
  55. package/dist/plugin-utils/context-helpers.mjs +4 -44
  56. package/dist/plugin-utils/context-helpers.mjs.map +1 -1
  57. package/dist/plugin-utils/index.cjs +0 -2
  58. package/dist/plugin-utils/index.d.cts +2 -2
  59. package/dist/plugin-utils/index.d.mts +2 -2
  60. package/dist/plugin-utils/index.mjs +2 -2
  61. package/dist/plugin.cjs +9 -15
  62. package/dist/plugin.cjs.map +1 -1
  63. package/dist/plugin.d.cts.map +1 -1
  64. package/dist/plugin.d.mts.map +1 -1
  65. package/dist/plugin.mjs +9 -15
  66. package/dist/plugin.mjs.map +1 -1
  67. package/dist/types/command.d.cts +206 -33
  68. package/dist/types/command.d.cts.map +1 -1
  69. package/dist/types/command.d.mts +206 -33
  70. package/dist/types/command.d.mts.map +1 -1
  71. package/dist/types/index.d.cts +3 -2
  72. package/dist/types/index.d.mts +3 -2
  73. package/dist/types/runtime.d.cts +5 -15
  74. package/dist/types/runtime.d.cts.map +1 -1
  75. package/dist/types/runtime.d.mts +5 -15
  76. package/dist/types/runtime.d.mts.map +1 -1
  77. package/package.json +25 -11
package/dist/plugin.mjs CHANGED
@@ -80,13 +80,11 @@ const plugin = (options = {}) => {
80
80
  this.options = Object.values(getDefaultOptions(this, {
81
81
  id: null,
82
82
  name: this.config.name,
83
+ path: null,
84
+ segments: [],
83
85
  title: this.config.title,
84
86
  description: this.config.description,
85
87
  alias: [],
86
- path: {
87
- value: null,
88
- segments: []
89
- },
90
88
  isVirtual: false
91
89
  }));
92
90
  }
@@ -108,10 +106,8 @@ const plugin = (options = {}) => {
108
106
  const name = resolveCommandName(entry.file);
109
107
  ret.push({
110
108
  id,
111
- path: {
112
- value: path,
113
- segments: path.split("/").filter(Boolean)
114
- },
109
+ path,
110
+ segments: path.split("/").filter(Boolean),
115
111
  name,
116
112
  alias: [],
117
113
  isVirtual: false,
@@ -153,10 +149,8 @@ const plugin = (options = {}) => {
153
149
  const path = resolveCommandPath(this, file);
154
150
  ret.push({
155
151
  id,
156
- path: {
157
- value: path,
158
- segments: path.split("/").filter(Boolean)
159
- },
152
+ path,
153
+ segments: path.split("/").filter(Boolean),
160
154
  name,
161
155
  alias: [],
162
156
  isVirtual: true,
@@ -167,7 +161,7 @@ const plugin = (options = {}) => {
167
161
  parentPath = resolveParentPath(parentPath);
168
162
  }
169
163
  return ret;
170
- }, this.inputs).sort((a, b) => a.path.segments.length - b.path.segments.length);
164
+ }, this.inputs).sort((a, b) => a.segments.length - b.segments.length);
171
165
  this.debug(`Final command input list: \n${this.inputs.map((command) => ` - ${command.id}: ${replacePath(command.entry.file, this.commandsPath)}${command.isVirtual ? " (virtual)" : ""}`).join("\n")}`);
172
166
  }
173
167
  }
@@ -184,7 +178,7 @@ const plugin = (options = {}) => {
184
178
  this.debug(`Skipping reflection initialization as the meta checksum has not changed.`);
185
179
  await readCommandsPersistence(this);
186
180
  } else {
187
- for (const input of this.inputs.filter((input$1) => input$1.path.segments.filter((segment) => !isDynamicPathSegment(segment) && !isPathSegmentGroup(segment)).length === 1)) this.commands[input.name] = await reflectCommandTree(this, input);
181
+ for (const input of this.inputs.filter((input$1) => input$1.segments.filter((segment) => !isDynamicPathSegment(segment) && !isPathSegmentGroup(segment)).length === 1)) this.commands[input.name] = await reflectCommandTree(this, input);
188
182
  this.debug("Post-processing commands to ensure proper reflection.");
189
183
  this.options = this.options.map((option) => ({
190
184
  ...option,
@@ -250,7 +244,7 @@ const plugin = (options = {}) => {
250
244
  },
251
245
  async docs() {
252
246
  this.debug("Rendering entrypoint modules for the Shell Shock `script` preset.");
253
- const commands$1 = this.inputs.map((input) => getCommandTree(this, input.path.segments)).filter(Boolean);
247
+ const commands$1 = this.inputs.map((input) => getCommandTree(this, input.segments)).filter(Boolean);
254
248
  return render(this, createComponent(For, {
255
249
  get each() {
256
250
  return Object.values(commands$1);
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.mjs","names":["For","Show","render","automd","deepkit","nodejs","tsdown","toArray","chmodX","appendPath","findFilePath","isParentPath","joinPaths","replacePath","resolveParentPath","camelCase","constantCase","kebabCase","isSetObject","isSetString","defu","resolveEntries","CommandDocsFile","commands","getCommandsPersistencePath","readCommandsPersistence","writeCommandsPersistence","findCommandsRoot","reflectCommandTree","resolveCommandId","resolveCommandName","resolveCommandPath","formatBinaryPath","updatePackageJsonBinary","formatCommandTree","getDefaultOptions","validateCommand","getAppDescription","getAppName","getAppTitle","isDynamicPathSegment","isPathSegmentGroup","getCommandTree","traverseCommands","MAX_DEPTH","plugin","options","name","config","debug","result","output","buildPath","projectRoot","title","description","envPrefix","env","prefix","isCaseSensitive","format","dts","entry","Array","isArray","length","sourceRoot","undefined","build","platform","nodeProtocol","unbundle","noExternal","type","framework","includes","push","configResolved","order","handler","bin","packageJson","inputs","Object","values","id","alias","path","value","segments","isVirtual","commandsPath","entries","reduce","ret","file","Error","some","existing","split","filter","Boolean","input","map","command","join","warn","cmd","depth","parentPath","sort","a","b","prepare","skipCache","persistedMeta","checksum","meta","fs","existsSync","segment","option","optional","fromEntries","isValid","failures","error","failure","code","details","info","outputOptions","banner","chunk","isEntry","entryPath","facadeModuleId","fileName","mode","buildEnd","Promise","all","workspaceConfig","workspaceRoot","generators","docs","_$createComponent","each","doubleHardline","children","child","when","shellShock"],"sources":["../src/plugin.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 { For, Show } from \"@alloy-js/core/components\";\nimport { render } from \"@powerlines/plugin-alloy/render\";\nimport automd from \"@powerlines/plugin-automd\";\nimport deepkit from \"@powerlines/plugin-deepkit\";\nimport nodejs from \"@powerlines/plugin-nodejs\";\nimport tsdown from \"@powerlines/plugin-tsdown\";\nimport { toArray } from \"@stryke/convert/to-array\";\nimport { chmodX } from \"@stryke/fs/chmod-x\";\nimport { appendPath } from \"@stryke/path/append\";\nimport { findFilePath } from \"@stryke/path/file-path-fns\";\nimport { isParentPath } from \"@stryke/path/is-parent-path\";\nimport { joinPaths } from \"@stryke/path/join-paths\";\nimport { replacePath } from \"@stryke/path/replace\";\nimport { resolveParentPath } from \"@stryke/path/resolve-parent-path\";\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 { isSetObject } from \"@stryke/type-checks/is-set-object\";\nimport { isSetString } from \"@stryke/type-checks/is-set-string\";\nimport { defu } from \"defu\";\nimport type { Plugin } from \"powerlines\";\nimport { resolveEntries } from \"powerlines/lib/entry\";\nimport type { OutputOptions, RenderedChunk } from \"rolldown\";\nimport { CommandDocsFile } from \"./components/docs\";\nimport { commands } from \"./helpers/automd\";\nimport {\n getCommandsPersistencePath,\n readCommandsPersistence,\n writeCommandsPersistence\n} from \"./helpers/persistence\";\nimport {\n findCommandsRoot,\n reflectCommandTree,\n resolveCommandId,\n resolveCommandName,\n resolveCommandPath\n} from \"./helpers/resolve-command\";\nimport {\n formatBinaryPath,\n updatePackageJsonBinary\n} from \"./helpers/update-package-json\";\nimport { formatCommandTree, getDefaultOptions } from \"./helpers/utilities\";\nimport { validateCommand } from \"./helpers/validations\";\nimport {\n getAppDescription,\n getAppName,\n getAppTitle,\n isDynamicPathSegment,\n isPathSegmentGroup\n} from \"./plugin-utils/context-helpers\";\nimport { getCommandTree } from \"./plugin-utils/get-command-tree\";\nimport { traverseCommands } from \"./plugin-utils/traverse-command-tree\";\nimport type { CommandOption, CommandTree } from \"./types/command\";\nimport type { Options } from \"./types/config\";\nimport type { Context } from \"./types/context\";\n\nconst MAX_DEPTH = 50;\n\n/**\n * The core Powerlines plugin to build Shell Shock projects.\n */\nexport const plugin = <TContext extends Context = Context>(\n options: Options = {}\n) => {\n return [\n tsdown(),\n deepkit(),\n automd(),\n {\n name: \"shell-shock:config\",\n async config() {\n this.debug(\"Resolving the Shell Shock configuration.\");\n\n await updatePackageJsonBinary(this);\n\n const result = defu(\n {\n output: {\n buildPath: joinPaths(this.config.projectRoot, \"dist\")\n }\n },\n options,\n {\n name: getAppName(this),\n title: getAppTitle(this),\n description: getAppDescription(this),\n envPrefix: constantCase(getAppName(this)),\n env: {\n prefix: [] as string[]\n },\n isCaseSensitive: false,\n output: {\n format: \"esm\",\n dts: true\n },\n entry:\n !this.config.entry ||\n (Array.isArray(this.config.entry) &&\n this.config.entry.length === 0)\n ? [\n joinPaths(this.config.sourceRoot, \"**/*.ts\"),\n joinPaths(this.config.sourceRoot, \"**/*.tsx\")\n ]\n : undefined,\n build: {\n dts: false,\n platform: \"node\",\n nodeProtocol: true,\n unbundle: false,\n noExternal: [\"@powerlines/deepkit\"]\n },\n type: \"application\",\n framework: \"shell-shock\"\n }\n );\n if (!result.env.prefix.includes(result.envPrefix)) {\n result.env.prefix.push(result.envPrefix);\n }\n\n return result;\n },\n configResolved: {\n order: \"pre\",\n async handler() {\n this.debug(\"Shell Shock configuration has been resolved.\");\n\n this.config.bin = (isSetString(this.packageJson.bin)\n ? { [kebabCase(this.config.name)]: this.packageJson.bin }\n : this.packageJson.bin) ?? {\n [kebabCase(this.config.name)]: formatBinaryPath(\n this.config.output.format\n )\n };\n\n this.inputs ??= [];\n this.options = Object.values(\n getDefaultOptions(this, {\n id: null,\n name: this.config.name,\n title: this.config.title,\n description: this.config.description,\n alias: [],\n path: {\n value: null,\n segments: []\n },\n isVirtual: false\n })\n );\n }\n }\n },\n ...nodejs<TContext>(),\n {\n name: \"shell-shock:inputs\",\n async configResolved() {\n this.debug(\"Finding command entry point files.\");\n\n this.commandsPath = findCommandsRoot(this);\n const entries = await resolveEntries(\n this,\n toArray(this.config.entry || [])\n );\n\n this.debug(\n `Found ${\n entries.length\n } entry points specified in the configuration options.`\n );\n\n this.inputs = entries.reduce((ret, entry) => {\n if (!isParentPath(entry.file, this.commandsPath)) {\n throw new Error(\n `Command entry point \"${\n entry.file\n }\" is not located within the commands root \"${\n this.commandsPath\n }\". Please ensure that all command entry points are located within the current project.`\n );\n }\n\n const id = resolveCommandId(this, entry.file);\n if (!ret.some(existing => existing.id === id)) {\n const path = resolveCommandPath(this, entry.file);\n const name = resolveCommandName(entry.file);\n\n ret.push({\n id,\n path: {\n value: path,\n segments: path.split(\"/\").filter(Boolean)\n },\n name,\n alias: [],\n isVirtual: false,\n entry: {\n ...entry,\n file: entry.file,\n input: {\n file: entry.file,\n name: entry.name\n },\n output: name\n }\n });\n }\n\n return ret;\n }, this.inputs);\n\n this.debug(\n `Shell Shock will process ${\n this.inputs.length\n } command entry files: \\n${this.inputs\n .map(\n command =>\n ` - ${command.id}: ${replacePath(\n command.entry.file,\n this.commandsPath\n )}`\n )\n .join(\"\\n\")}`\n );\n }\n },\n {\n name: \"shell-shock:virtual-inputs\",\n configResolved: {\n order: \"post\",\n async handler() {\n if (this.inputs.length === 0) {\n this.warn(\n \"No commands were found in the project. Please ensure at least one command exists.\"\n );\n } else {\n this.debug(\n `Shell Shock will create an application with the following commands: \\n${this.inputs\n .filter(cmd => !cmd.isVirtual)\n .map(\n command =>\n ` - ${command.id}: ${replacePath(\n command.entry.file,\n this.commandsPath\n )}${command.isVirtual ? \" (virtual)\" : \"\"}`\n )\n .join(\"\\n\")}`\n );\n\n this.debug(\n \"Finding and adding virtual command inputs for each command previously found.\"\n );\n\n this.inputs = this.inputs\n .reduce((ret, command) => {\n let depth = 0;\n\n let parentPath = resolveParentPath(\n findFilePath(command.entry.file)\n );\n while (parentPath !== this.commandsPath) {\n if (depth++ > MAX_DEPTH) {\n throw new Error(\n `Maximum command virtual parent depth of ${\n MAX_DEPTH\n } exceeded while processing command: ${command.name}`\n );\n }\n\n if (\n !ret.some(\n existing =>\n findFilePath(existing.entry.file) === parentPath\n )\n ) {\n const file = joinPaths(parentPath, \"command.ts\");\n const id = resolveCommandId(this, file);\n if (!ret.some(existing => existing.id === id)) {\n const name = resolveCommandName(file);\n const path = resolveCommandPath(this, file);\n\n ret.push({\n id,\n path: {\n value: path,\n segments: path.split(\"/\").filter(Boolean)\n },\n name,\n alias: [],\n isVirtual: true,\n entry: {\n file\n }\n });\n }\n }\n\n parentPath = resolveParentPath(parentPath);\n }\n\n return ret;\n }, this.inputs)\n .sort((a, b) => a.path.segments.length - b.path.segments.length);\n\n this.debug(\n `Final command input list: \\n${this.inputs\n .map(\n command =>\n ` - ${command.id}: ${replacePath(\n command.entry.file,\n this.commandsPath\n )}${command.isVirtual ? \" (virtual)\" : \"\"}`\n )\n .join(\"\\n\")}`\n );\n }\n }\n }\n },\n {\n name: \"shell-shock:reflect-commands\",\n prepare: {\n order: \"post\",\n async handler() {\n this.debug(\"Initializing the CLI application's command tree.\");\n\n this.commands = {};\n if (\n this.config.command !== \"prepare\" &&\n this.config.skipCache !== true &&\n this.persistedMeta?.checksum === this.meta.checksum &&\n this.fs.existsSync(getCommandsPersistencePath(this))\n ) {\n this.debug(\n `Skipping reflection initialization as the meta checksum has not changed.`\n );\n\n await readCommandsPersistence(this);\n } else {\n for (const input of this.inputs.filter(\n input =>\n input.path.segments.filter(\n segment =>\n !isDynamicPathSegment(segment) &&\n !isPathSegmentGroup(segment)\n ).length === 1\n )) {\n this.commands[input.name] = await reflectCommandTree(this, input);\n }\n\n this.debug(\"Post-processing commands to ensure proper reflection.\");\n\n this.options = this.options.map(\n option =>\n ({\n ...option,\n name: camelCase(option.name),\n alias: option.alias ?? [],\n optional: option.optional ?? false\n }) as CommandOption\n );\n\n await traverseCommands(this, command => {\n command.options = Object.fromEntries(\n Object.entries(command.options).map(([name, option]) => [\n camelCase(name),\n {\n ...option,\n name: camelCase(name),\n alias: option.alias ?? [],\n optional: option.optional ?? false\n } as CommandOption\n ])\n );\n });\n\n await writeCommandsPersistence(this);\n }\n\n this.debug(\"Validating the CLI applications command tree.\");\n\n let isValid = true;\n await traverseCommands(this, command => {\n const failures = validateCommand(command);\n if (failures.length > 0) {\n this.error(\n `Found ${failures.length} issue${failures.length > 1 ? \"s\" : \"\"} with the ${\n command.title\n } command: \\n${failures\n .map(failure => ` - ${failure.code}: ${failure.details}`)\n .join(\"\\n\")}\\n`\n );\n isValid = false;\n }\n });\n if (!isValid) {\n throw new Error(\n `One or more commands in the command tree are invalid. Please review the errors above and correct them before proceeding.`\n );\n }\n\n this.info(\n `\\nCreating an application with the following command tree: \\n${formatCommandTree(\n this\n )}\\n`\n );\n }\n }\n },\n {\n name: \"shell-shock:chmod+x\",\n configResolved() {\n this.config.build.outputOptions ??= {} as OutputOptions;\n (this.config.build.outputOptions as OutputOptions).banner = (\n chunk: RenderedChunk\n ) => {\n if (\n chunk.isEntry &&\n joinPaths(this.entryPath, \"bin.ts\") === chunk.facadeModuleId\n ) {\n this.debug(\n `Adding hashbang to binary executable output file: ${chunk.fileName}`\n );\n\n return `#!/usr/bin/env ${\n this.config.mode === \"development\"\n ? \"-S NODE_OPTIONS=--enable-source-maps\"\n : \"\"\n } node\\n`;\n }\n return \"\";\n };\n },\n async buildEnd() {\n if (!isSetObject(this.config.bin)) {\n this.warn(\n `No binaries were found for the ${\n this.config.name\n } application. Please ensure the binaries are correctly configured in your Shell Shock configuration or package.json.`\n );\n } else {\n await Promise.all(\n Object.values(this.config.bin).map(async bin => {\n const path = appendPath(\n bin,\n joinPaths(\n this.workspaceConfig.workspaceRoot,\n this.config.projectRoot\n )\n );\n\n if (this.fs.existsSync(path)) {\n this.debug(\n `Adding executable permissions (chmod+x) to binary executable output file: ${path}`\n );\n\n await chmodX(path);\n } else {\n this.warn(\n `Unable to locate the binary executable output file: ${path}. This may indicate either a misconfiguration in the package.json file or an issue with the build process.`\n );\n }\n })\n );\n }\n }\n },\n {\n name: \"shell-shock:docs\",\n configResolved() {\n this.config.automd ??= {};\n this.config.automd.generators = {\n ...(this.config.automd.generators ?? {}),\n commands: commands(this)\n };\n },\n async docs() {\n this.debug(\n \"Rendering entrypoint modules for the Shell Shock `script` preset.\"\n );\n\n const commands = this.inputs\n .map(input => getCommandTree(this, input.path.segments))\n .filter(Boolean) as CommandTree[];\n\n return render(\n this,\n <For each={Object.values(commands)} doubleHardline>\n {child => (\n <Show when={!child.isVirtual}>\n <CommandDocsFile command={child} />\n </Show>\n )}\n </For>\n );\n }\n }\n ] as Plugin<TContext>[];\n};\n\nexport { plugin as shellShock };\nexport default plugin;\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugin.mjs","names":["For","Show","render","automd","deepkit","nodejs","tsdown","toArray","chmodX","appendPath","findFilePath","isParentPath","joinPaths","replacePath","resolveParentPath","camelCase","constantCase","kebabCase","isSetObject","isSetString","defu","resolveEntries","CommandDocsFile","commands","getCommandsPersistencePath","readCommandsPersistence","writeCommandsPersistence","findCommandsRoot","reflectCommandTree","resolveCommandId","resolveCommandName","resolveCommandPath","formatBinaryPath","updatePackageJsonBinary","formatCommandTree","getDefaultOptions","validateCommand","getAppDescription","getAppName","getAppTitle","isDynamicPathSegment","isPathSegmentGroup","getCommandTree","traverseCommands","MAX_DEPTH","plugin","options","name","config","debug","result","output","buildPath","projectRoot","title","description","envPrefix","env","prefix","isCaseSensitive","format","dts","entry","Array","isArray","length","sourceRoot","undefined","build","platform","nodeProtocol","unbundle","noExternal","type","framework","includes","push","configResolved","order","handler","bin","packageJson","inputs","Object","values","id","path","segments","alias","isVirtual","commandsPath","entries","reduce","ret","file","Error","some","existing","split","filter","Boolean","input","map","command","join","warn","cmd","depth","parentPath","sort","a","b","prepare","skipCache","persistedMeta","checksum","meta","fs","existsSync","segment","option","optional","fromEntries","isValid","failures","error","failure","code","details","info","outputOptions","banner","chunk","isEntry","entryPath","facadeModuleId","fileName","mode","buildEnd","Promise","all","workspaceConfig","workspaceRoot","generators","docs","_$createComponent","each","doubleHardline","children","child","when","shellShock"],"sources":["../src/plugin.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 { For, Show } from \"@alloy-js/core/components\";\nimport { render } from \"@powerlines/plugin-alloy/render\";\nimport automd from \"@powerlines/plugin-automd\";\nimport deepkit from \"@powerlines/plugin-deepkit\";\nimport nodejs from \"@powerlines/plugin-nodejs\";\nimport tsdown from \"@powerlines/plugin-tsdown\";\nimport { toArray } from \"@stryke/convert/to-array\";\nimport { chmodX } from \"@stryke/fs/chmod-x\";\nimport { appendPath } from \"@stryke/path/append\";\nimport { findFilePath } from \"@stryke/path/file-path-fns\";\nimport { isParentPath } from \"@stryke/path/is-parent-path\";\nimport { joinPaths } from \"@stryke/path/join-paths\";\nimport { replacePath } from \"@stryke/path/replace\";\nimport { resolveParentPath } from \"@stryke/path/resolve-parent-path\";\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 { isSetObject } from \"@stryke/type-checks/is-set-object\";\nimport { isSetString } from \"@stryke/type-checks/is-set-string\";\nimport { defu } from \"defu\";\nimport type { Plugin } from \"powerlines\";\nimport { resolveEntries } from \"powerlines/lib/entry\";\nimport type { OutputOptions, RenderedChunk } from \"rolldown\";\nimport { CommandDocsFile } from \"./components/docs\";\nimport { commands } from \"./helpers/automd\";\nimport {\n getCommandsPersistencePath,\n readCommandsPersistence,\n writeCommandsPersistence\n} from \"./helpers/persistence\";\nimport {\n findCommandsRoot,\n reflectCommandTree,\n resolveCommandId,\n resolveCommandName,\n resolveCommandPath\n} from \"./helpers/resolve-command\";\nimport {\n formatBinaryPath,\n updatePackageJsonBinary\n} from \"./helpers/update-package-json\";\nimport { formatCommandTree, getDefaultOptions } from \"./helpers/utilities\";\nimport { validateCommand } from \"./helpers/validations\";\nimport {\n getAppDescription,\n getAppName,\n getAppTitle,\n isDynamicPathSegment,\n isPathSegmentGroup\n} from \"./plugin-utils/context-helpers\";\nimport { getCommandTree } from \"./plugin-utils/get-command-tree\";\nimport { traverseCommands } from \"./plugin-utils/traverse-command-tree\";\nimport type { CommandOption, CommandTree } from \"./types/command\";\nimport type { Options } from \"./types/config\";\nimport type { Context } from \"./types/context\";\n\nconst MAX_DEPTH = 50;\n\n/**\n * The core Powerlines plugin to build Shell Shock projects.\n */\nexport const plugin = <TContext extends Context = Context>(\n options: Options = {}\n) => {\n return [\n tsdown(),\n deepkit(),\n automd(),\n {\n name: \"shell-shock:config\",\n async config() {\n this.debug(\"Resolving the Shell Shock configuration.\");\n\n await updatePackageJsonBinary(this);\n\n const result = defu(\n {\n output: {\n buildPath: joinPaths(this.config.projectRoot, \"dist\")\n }\n },\n options,\n {\n name: getAppName(this),\n title: getAppTitle(this),\n description: getAppDescription(this),\n envPrefix: constantCase(getAppName(this)),\n env: {\n prefix: [] as string[]\n },\n isCaseSensitive: false,\n output: {\n format: \"esm\",\n dts: true\n },\n entry:\n !this.config.entry ||\n (Array.isArray(this.config.entry) &&\n this.config.entry.length === 0)\n ? [\n joinPaths(this.config.sourceRoot, \"**/*.ts\"),\n joinPaths(this.config.sourceRoot, \"**/*.tsx\")\n ]\n : undefined,\n build: {\n dts: false,\n platform: \"node\",\n nodeProtocol: true,\n unbundle: false,\n noExternal: [\"@powerlines/deepkit\"]\n },\n type: \"application\",\n framework: \"shell-shock\"\n }\n );\n if (!result.env.prefix.includes(result.envPrefix)) {\n result.env.prefix.push(result.envPrefix);\n }\n\n return result;\n },\n configResolved: {\n order: \"pre\",\n async handler() {\n this.debug(\"Shell Shock configuration has been resolved.\");\n\n this.config.bin = (isSetString(this.packageJson.bin)\n ? { [kebabCase(this.config.name)]: this.packageJson.bin }\n : this.packageJson.bin) ?? {\n [kebabCase(this.config.name)]: formatBinaryPath(\n this.config.output.format\n )\n };\n\n this.inputs ??= [];\n this.options = Object.values(\n getDefaultOptions(this, {\n id: null,\n name: this.config.name,\n path: null,\n segments: [],\n title: this.config.title,\n description: this.config.description,\n alias: [],\n isVirtual: false\n })\n );\n }\n }\n },\n ...nodejs<TContext>(),\n {\n name: \"shell-shock:inputs\",\n async configResolved() {\n this.debug(\"Finding command entry point files.\");\n\n this.commandsPath = findCommandsRoot(this);\n const entries = await resolveEntries(\n this,\n toArray(this.config.entry || [])\n );\n\n this.debug(\n `Found ${\n entries.length\n } entry points specified in the configuration options.`\n );\n\n this.inputs = entries.reduce((ret, entry) => {\n if (!isParentPath(entry.file, this.commandsPath)) {\n throw new Error(\n `Command entry point \"${\n entry.file\n }\" is not located within the commands root \"${\n this.commandsPath\n }\". Please ensure that all command entry points are located within the current project.`\n );\n }\n\n const id = resolveCommandId(this, entry.file);\n if (!ret.some(existing => existing.id === id)) {\n const path = resolveCommandPath(this, entry.file);\n const name = resolveCommandName(entry.file);\n\n ret.push({\n id,\n path,\n segments: path.split(\"/\").filter(Boolean),\n name,\n alias: [],\n isVirtual: false,\n entry: {\n ...entry,\n file: entry.file,\n input: {\n file: entry.file,\n name: entry.name\n },\n output: name\n }\n });\n }\n\n return ret;\n }, this.inputs);\n\n this.debug(\n `Shell Shock will process ${\n this.inputs.length\n } command entry files: \\n${this.inputs\n .map(\n command =>\n ` - ${command.id}: ${replacePath(\n command.entry.file,\n this.commandsPath\n )}`\n )\n .join(\"\\n\")}`\n );\n }\n },\n {\n name: \"shell-shock:virtual-inputs\",\n configResolved: {\n order: \"post\",\n async handler() {\n if (this.inputs.length === 0) {\n this.warn(\n \"No commands were found in the project. Please ensure at least one command exists.\"\n );\n } else {\n this.debug(\n `Shell Shock will create an application with the following commands: \\n${this.inputs\n .filter(cmd => !cmd.isVirtual)\n .map(\n command =>\n ` - ${command.id}: ${replacePath(\n command.entry.file,\n this.commandsPath\n )}${command.isVirtual ? \" (virtual)\" : \"\"}`\n )\n .join(\"\\n\")}`\n );\n\n this.debug(\n \"Finding and adding virtual command inputs for each command previously found.\"\n );\n\n this.inputs = this.inputs\n .reduce((ret, command) => {\n let depth = 0;\n\n let parentPath = resolveParentPath(\n findFilePath(command.entry.file)\n );\n while (parentPath !== this.commandsPath) {\n if (depth++ > MAX_DEPTH) {\n throw new Error(\n `Maximum command virtual parent depth of ${\n MAX_DEPTH\n } exceeded while processing command: ${command.name}`\n );\n }\n\n if (\n !ret.some(\n existing =>\n findFilePath(existing.entry.file) === parentPath\n )\n ) {\n const file = joinPaths(parentPath, \"command.ts\");\n const id = resolveCommandId(this, file);\n if (!ret.some(existing => existing.id === id)) {\n const name = resolveCommandName(file);\n const path = resolveCommandPath(this, file);\n\n ret.push({\n id,\n path,\n segments: path.split(\"/\").filter(Boolean),\n name,\n alias: [],\n isVirtual: true,\n entry: {\n file\n }\n });\n }\n }\n\n parentPath = resolveParentPath(parentPath);\n }\n\n return ret;\n }, this.inputs)\n .sort((a, b) => a.segments.length - b.segments.length);\n\n this.debug(\n `Final command input list: \\n${this.inputs\n .map(\n command =>\n ` - ${command.id}: ${replacePath(\n command.entry.file,\n this.commandsPath\n )}${command.isVirtual ? \" (virtual)\" : \"\"}`\n )\n .join(\"\\n\")}`\n );\n }\n }\n }\n },\n {\n name: \"shell-shock:reflect-commands\",\n prepare: {\n order: \"post\",\n async handler() {\n this.debug(\"Initializing the CLI application's command tree.\");\n\n this.commands = {};\n if (\n this.config.command !== \"prepare\" &&\n this.config.skipCache !== true &&\n this.persistedMeta?.checksum === this.meta.checksum &&\n this.fs.existsSync(getCommandsPersistencePath(this))\n ) {\n this.debug(\n `Skipping reflection initialization as the meta checksum has not changed.`\n );\n\n await readCommandsPersistence(this);\n } else {\n for (const input of this.inputs.filter(\n input =>\n input.segments.filter(\n segment =>\n !isDynamicPathSegment(segment) &&\n !isPathSegmentGroup(segment)\n ).length === 1\n )) {\n this.commands[input.name] = await reflectCommandTree(this, input);\n }\n\n this.debug(\"Post-processing commands to ensure proper reflection.\");\n\n this.options = this.options.map(\n option =>\n ({\n ...option,\n name: camelCase(option.name),\n alias: option.alias ?? [],\n optional: option.optional ?? false\n }) as CommandOption\n );\n\n await traverseCommands(this, command => {\n command.options = Object.fromEntries(\n Object.entries(command.options).map(([name, option]) => [\n camelCase(name),\n {\n ...option,\n name: camelCase(name),\n alias: option.alias ?? [],\n optional: option.optional ?? false\n } as CommandOption\n ])\n );\n });\n\n await writeCommandsPersistence(this);\n }\n\n this.debug(\"Validating the CLI applications command tree.\");\n\n let isValid = true;\n await traverseCommands(this, command => {\n const failures = validateCommand(command);\n if (failures.length > 0) {\n this.error(\n `Found ${failures.length} issue${failures.length > 1 ? \"s\" : \"\"} with the ${\n command.title\n } command: \\n${failures\n .map(failure => ` - ${failure.code}: ${failure.details}`)\n .join(\"\\n\")}\\n`\n );\n isValid = false;\n }\n });\n if (!isValid) {\n throw new Error(\n `One or more commands in the command tree are invalid. Please review the errors above and correct them before proceeding.`\n );\n }\n\n this.info(\n `\\nCreating an application with the following command tree: \\n${formatCommandTree(\n this\n )}\\n`\n );\n }\n }\n },\n {\n name: \"shell-shock:chmod+x\",\n configResolved() {\n this.config.build.outputOptions ??= {} as OutputOptions;\n (this.config.build.outputOptions as OutputOptions).banner = (\n chunk: RenderedChunk\n ) => {\n if (\n chunk.isEntry &&\n joinPaths(this.entryPath, \"bin.ts\") === chunk.facadeModuleId\n ) {\n this.debug(\n `Adding hashbang to binary executable output file: ${chunk.fileName}`\n );\n\n return `#!/usr/bin/env ${\n this.config.mode === \"development\"\n ? \"-S NODE_OPTIONS=--enable-source-maps\"\n : \"\"\n } node\\n`;\n }\n return \"\";\n };\n },\n async buildEnd() {\n if (!isSetObject(this.config.bin)) {\n this.warn(\n `No binaries were found for the ${\n this.config.name\n } application. Please ensure the binaries are correctly configured in your Shell Shock configuration or package.json.`\n );\n } else {\n await Promise.all(\n Object.values(this.config.bin).map(async bin => {\n const path = appendPath(\n bin,\n joinPaths(\n this.workspaceConfig.workspaceRoot,\n this.config.projectRoot\n )\n );\n\n if (this.fs.existsSync(path)) {\n this.debug(\n `Adding executable permissions (chmod+x) to binary executable output file: ${path}`\n );\n\n await chmodX(path);\n } else {\n this.warn(\n `Unable to locate the binary executable output file: ${path}. This may indicate either a misconfiguration in the package.json file or an issue with the build process.`\n );\n }\n })\n );\n }\n }\n },\n {\n name: \"shell-shock:docs\",\n configResolved() {\n this.config.automd ??= {};\n this.config.automd.generators = {\n ...(this.config.automd.generators ?? {}),\n commands: commands(this)\n };\n },\n async docs() {\n this.debug(\n \"Rendering entrypoint modules for the Shell Shock `script` preset.\"\n );\n\n const commands = this.inputs\n .map(input => getCommandTree(this, input.segments))\n .filter(Boolean) as CommandTree[];\n\n return render(\n this,\n <For each={Object.values(commands)} doubleHardline>\n {child => (\n <Show when={!child.isVirtual}>\n <CommandDocsFile command={child} />\n </Show>\n )}\n </For>\n );\n }\n }\n ] as Plugin<TContext>[];\n};\n\nexport { plugin as shellShock };\nexport default plugin;\n"],"mappings":"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"}
@@ -1,94 +1,267 @@
1
- import { ReflectionKind } from "@powerlines/deepkit/vendor/type";
1
+ import { ReflectionFunction, ReflectionKind, ReflectionParameter, ReflectionProperty, SerializedTypes } from "@powerlines/deepkit/vendor/type";
2
2
  import { AnyFunction } from "@stryke/types/base";
3
3
  import { ResolvedEntryTypeDefinition } from "powerlines/types/resolved";
4
4
 
5
5
  //#region src/types/command.d.ts
6
- interface BaseCommandOption {
6
+ interface BaseCommandParameter {
7
+ /**
8
+ * The option name.
9
+ */
7
10
  name: string;
11
+ /**
12
+ * The option kind.
13
+ */
8
14
  kind: ReflectionKind;
15
+ /**
16
+ * The display title.
17
+ */
9
18
  title: string;
19
+ /**
20
+ * The option description.
21
+ */
10
22
  description: string;
23
+ /**
24
+ * Alternative option names.
25
+ */
11
26
  alias: string[];
27
+ /**
28
+ * The environment variable name or false to disable.
29
+ */
12
30
  env: string | false;
31
+ /**
32
+ * Whether the option is optional.
33
+ */
13
34
  optional: boolean;
14
35
  }
15
- interface StringCommandOption extends BaseCommandOption {
36
+ interface StringCommandParameter extends BaseCommandParameter {
37
+ /**
38
+ * The option kind.
39
+ */
16
40
  kind: ReflectionKind.string;
41
+ /**
42
+ * The default value.
43
+ */
17
44
  default?: string;
45
+ /**
46
+ * Whether the option accepts multiple values.
47
+ */
18
48
  variadic: boolean;
19
49
  }
20
- interface NumberCommandOption extends BaseCommandOption {
50
+ interface NumberCommandParameter extends BaseCommandParameter {
51
+ /**
52
+ * The option kind.
53
+ */
21
54
  kind: ReflectionKind.number;
55
+ /**
56
+ * The default value.
57
+ */
22
58
  default?: number;
59
+ /**
60
+ * Whether the option accepts multiple values.
61
+ */
23
62
  variadic: boolean;
24
63
  }
25
- interface BooleanCommandOption extends BaseCommandOption {
64
+ interface BooleanCommandParameter extends BaseCommandParameter {
65
+ /**
66
+ * The option kind.
67
+ */
26
68
  kind: ReflectionKind.boolean;
69
+ /**
70
+ * The default value.
71
+ */
27
72
  default?: boolean;
73
+ /**
74
+ * The option this negates.
75
+ */
28
76
  isNegativeOf?: string;
77
+ /**
78
+ * Whether to skip adding a negative option.
79
+ */
80
+ skipAddingNegative?: boolean;
81
+ }
82
+ interface StringCommandOption extends StringCommandParameter {
83
+ /**
84
+ * The property reflection.
85
+ */
86
+ reflection?: ReflectionProperty;
87
+ }
88
+ interface NumberCommandOption extends NumberCommandParameter {
89
+ /**
90
+ * The property reflection.
91
+ */
92
+ reflection?: ReflectionProperty;
93
+ }
94
+ interface BooleanCommandOption extends BooleanCommandParameter {
95
+ /**
96
+ * The property reflection.
97
+ */
98
+ reflection?: ReflectionProperty;
99
+ /**
100
+ * The option this negates.
101
+ */
102
+ isNegativeOf?: string;
103
+ /**
104
+ * Whether to skip adding a negative option.
105
+ */
29
106
  skipAddingNegative?: boolean;
30
107
  }
31
108
  type CommandOption = StringCommandOption | NumberCommandOption | BooleanCommandOption;
32
- interface CommandPath {
33
- value: string | null;
34
- segments: string[];
109
+ interface StringCommandArgument extends StringCommandParameter {
110
+ /**
111
+ * The parameter reflection.
112
+ */
113
+ reflection: ReflectionParameter;
114
+ }
115
+ interface NumberCommandArgument extends NumberCommandParameter {
116
+ /**
117
+ * The parameter reflection.
118
+ */
119
+ reflection: ReflectionParameter;
120
+ }
121
+ interface BooleanCommandArgument extends BooleanCommandParameter {
122
+ /**
123
+ * The parameter reflection.
124
+ */
125
+ reflection: ReflectionParameter;
35
126
  }
127
+ type CommandArgument = StringCommandArgument | NumberCommandArgument | BooleanCommandArgument;
36
128
  interface CommandBase {
129
+ /**
130
+ * The command id.
131
+ */
37
132
  id: string | null;
133
+ /**
134
+ * The command name.
135
+ */
38
136
  name: string;
137
+ /**
138
+ * The full command path value.
139
+ */
140
+ path: string | null;
141
+ /**
142
+ * The path segments.
143
+ */
144
+ segments: string[];
145
+ /**
146
+ * The display title.
147
+ */
39
148
  title?: string;
149
+ /**
150
+ * The command description.
151
+ */
40
152
  description?: string;
153
+ /**
154
+ * Alternative command names.
155
+ */
41
156
  alias?: string[];
42
- path: CommandPath;
157
+ /**
158
+ * The command icon.
159
+ */
160
+ icon?: string;
161
+ /**
162
+ * Whether the command is virtual.
163
+ */
43
164
  isVirtual: boolean;
44
165
  }
45
166
  interface CommandInput extends CommandBase {
167
+ /**
168
+ * The command id.
169
+ */
46
170
  id: string;
171
+ /**
172
+ * The resolved entry definition.
173
+ */
47
174
  entry: ResolvedEntryTypeDefinition;
48
175
  }
49
- type CommandDynamicSegment = {
50
- name: string;
51
- title: string;
52
- description: string;
53
- optional: boolean;
54
- } & ({
55
- default?: string;
56
- catchAll: false;
57
- variadic: false;
58
- } | {
59
- default?: string;
60
- catchAll: true;
61
- variadic: false;
62
- } | {
63
- default?: string[];
64
- catchAll: true;
65
- variadic: true;
66
- });
67
- interface CommandTreePath extends CommandPath {
68
- dynamics: Record<string, CommandDynamicSegment>;
69
- }
70
176
  type CommandTree = CommandInput & {
177
+ /**
178
+ * The display title.
179
+ */
71
180
  title: string;
181
+ /**
182
+ * The command description.
183
+ */
72
184
  description: string;
185
+ /**
186
+ * Alternative command names.
187
+ */
73
188
  alias: string[];
74
- path: CommandTreePath;
189
+ /**
190
+ * The command options.
191
+ */
75
192
  options: Record<string, CommandOption>;
193
+ /**
194
+ * The positional arguments provided to the command.
195
+ */
196
+ arguments: CommandArgument[];
197
+ /**
198
+ * The parent command.
199
+ */
76
200
  parent: null | CommandTree;
201
+ /**
202
+ * Child commands.
203
+ */
77
204
  children: Record<string, CommandTree>;
205
+ /**
206
+ * The command handler reflection.
207
+ */
208
+ reflection: ReflectionFunction | null;
78
209
  };
79
- type SerializedCommandTree = Omit<CommandTree, "parent" | "children"> & {
210
+ type SerializedCommandOption = Omit<CommandOption, "reflection">;
211
+ type SerializedCommandArgument = Omit<CommandArgument, "reflection">;
212
+ type SerializedCommandTree = Omit<CommandTree, "options" | "arguments" | "parent" | "children" | "reflection"> & {
213
+ /**
214
+ * The command options.
215
+ */
216
+ options: Record<string, SerializedCommandOption>;
217
+ /**
218
+ * The positional arguments provided to the command.
219
+ */
220
+ arguments: SerializedCommandArgument[];
221
+ /**
222
+ * The parent command id.
223
+ */
80
224
  parent: null | string;
225
+ /**
226
+ * Serialized child commands.
227
+ */
81
228
  children: Record<string, SerializedCommandTree>;
229
+ /**
230
+ * The command handler reflection.
231
+ */
232
+ reflection?: SerializedTypes;
82
233
  };
83
234
  interface Metadata {
235
+ /**
236
+ * The display name of the command.
237
+ *
238
+ * @remarks
239
+ * This value will be used in various displays of the user interface and documentation. If not provided, a formatted value of the command name will be used.
240
+ */
84
241
  title?: string;
242
+ /**
243
+ * A brief description of what the command does.
244
+ *
245
+ * @remarks
246
+ * This value will be used in various displays of the user interface and documentation. If not provided, a default message may be shown.
247
+ */
85
248
  description?: string;
249
+ /**
250
+ * One or more alternative names for the command.
251
+ */
86
252
  alias?: string | string[];
253
+ /**
254
+ * An optional icon to visually represent the command in user interfaces.
255
+ *
256
+ * @remarks
257
+ * This can be a string containing an emoji, a Unicode character, or any other symbol that helps to visually identify the command. If not provided, no icon will be displayed.
258
+ */
259
+ icon?: string;
87
260
  }
88
261
  interface CommandModule {
89
262
  metadata?: Metadata;
90
263
  default?: AnyFunction;
91
264
  }
92
265
  //#endregion
93
- export { BaseCommandOption, BooleanCommandOption, CommandBase, CommandDynamicSegment, CommandInput, CommandModule, CommandOption, CommandPath, CommandTree, CommandTreePath, Metadata, NumberCommandOption, SerializedCommandTree, StringCommandOption };
266
+ export { BaseCommandParameter, BooleanCommandArgument, BooleanCommandOption, BooleanCommandParameter, CommandArgument, CommandBase, CommandInput, CommandModule, CommandOption, CommandTree, Metadata, NumberCommandArgument, NumberCommandOption, NumberCommandParameter, SerializedCommandArgument, SerializedCommandOption, SerializedCommandTree, StringCommandArgument, StringCommandOption, StringCommandParameter };
94
267
  //# sourceMappingURL=command.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"command.d.cts","names":[],"sources":["../../src/types/command.ts"],"sourcesContent":[],"mappings":";;;;;UAsBiB,iBAAA;;EAAA,IAAA,EAET,cAF0B;EAUjB,KAAA,EAAA,MAAA;EAMA,WAAA,EAAA,MAAA;EAMA,KAAA,EAAA,MAAA,EAAA;EAOL,GAAA,EAAA,MAAA,GAAA,KAAa;EACrB,QAAA,EAAA,OAAA;;AAEA,UAtBa,mBAAA,SAA4B,iBAsBzC,CAAA;EAAoB,IAAA,EArBhB,cAAA,CAAe,MAqBC;EAEP,OAAA,CAAA,EAAA,MAAW;EAKX,QAAA,EAAA,OAAW;AAU5B;AAKY,UAtCK,mBAAA,SAA4B,iBAsCZ,CAAA;EAuBhB,IAAA,EA5DT,cAAA,CAAe,MA4DU;EACN,OAAA,CAAA,EAAA,MAAA;EAAf,QAAA,EAAA,OAAA;;AADwC,UAvDnC,oBAAA,SAA6B,iBAuDM,CAAA;EAIxC,IAAA,EA1DJ,cAAA,CAAe,OA0DA;EAAG,OAAA,CAAA,EAAA,OAAA;EAIlB,YAAA,CAAA,EAAA,MAAA;EACkB,kBAAA,CAAA,EAAA,OAAA;;AACT,KA1DL,aAAA,GACR,mBAyDa,GAxDb,mBAwDa,GAvDb,oBAuDa;AACU,UAtDV,WAAA,CAsDU;EAAf,KAAA,EAAA,MAAA,GAAA,IAAA;EAAM,QAAA,EAAA,MAAA,EAAA;AAGlB;AAAyC,UApDxB,WAAA,CAoDwB;EAAL,EAAA,EAAA,MAAA,GAAA,IAAA;EAET,IAAA,EAAA,MAAA;EAAf,KAAA,CAAA,EAAA,MAAA;EAAM,WAAA,CAAA,EAAA,MAAA;EAGD,KAAA,CAAA,EAAA,MAAQ,EAAA;EAMR,IAAA,EAzDT,WAyDsB;;;UArDb,YAAA,SAAqB;;SAE7B;;KAGG,qBAAA;;;;;;;;;;;;;;;;;;UAuBK,eAAA,SAAwB;YAC7B,eAAe;;KAGf,WAAA,GAAc;;;;QAIlB;WACG,eAAe;iBACT;YACL,eAAe;;KAGf,qBAAA,GAAwB,KAAK;;YAE7B,eAAe;;UAGV,QAAA;;;;;UAMA,aAAA;aACJ;YACD"}
1
+ {"version":3,"file":"command.d.cts","names":[],"sources":["../../src/types/command.ts"],"sourcesContent":[],"mappings":";;;;;UA4BiB,oBAAA;;AAAjB;AA+BA;EAeiB,IAAA,EAAA,MAAA;EAeA;AAmBjB;AAOA;EAOiB,IAAA,EAtFT,cAsFS;EAeL;;;EAGR,KAAA,EAAA,MAAA;EAAoB;AAExB;AAOA;EAOiB,WAAA,EAAA,MAAA;EAOL;;;EAGR,KAAA,EAAA,MAAA,EAAA;EAAsB;AAE1B;AAuCA;EAWY,GAAA,EAAA,MAAA,GAAW,KAAA;EAAG;;;EAoBb,QAAA,EAAA,OAAA;;AAQc,UA3LV,sBAAA,SAA+B,oBA2LrB,CAAA;EAAf;;;EAOA,IAAA,EA9LJ,cAAA,CAAe,MA8LY;EAEvB;AAEZ;;EAAoC,OAAA,CAAA,EAAA,MAAA;EAOV;;;EAYC,QAAA,EAAA,OAAA;;AAIZ,UA9ME,sBAAA,SAA+B,oBA8MjC,CAAA;EAAe;AAG9B;AA+BA;QA5OQ,cAAA,CAAe;;;;;;;;;;UAWN,uBAAA,SAAgC;;;;QAIzC,cAAA,CAAe;;;;;;;;;;;;;;UAeN,mBAAA,SAA4B;;;;eAI9B;;UAGE,mBAAA,SAA4B;;;;eAI9B;;UAGE,oBAAA,SAA6B;;;;eAI/B;;;;;;;;;;KAWH,aAAA,GACR,sBACA,sBACA;UAEa,qBAAA,SAA8B;;;;cAIjC;;UAGG,qBAAA,SAA8B;;;;cAIjC;;UAGG,sBAAA,SAA+B;;;;cAIlC;;KAGF,eAAA,GACR,wBACA,wBACA;UAEa,WAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAuCA,YAAA,SAAqB;;;;;;;;SAQ7B;;KAGG,WAAA,GAAc;;;;;;;;;;;;;;;;WAgBf,eAAe;;;;aAIb;;;;iBAII;;;;YAIL,eAAe;;;;cAIb;;KAGF,uBAAA,GAA0B,KAAK;KAE/B,yBAAA,GAA4B,KAAK;KAEjC,qBAAA,GAAwB,KAClC;;;;WAMS,eAAe;;;;aAIb;;;;;;;;YAQD,eAAe;;;;eAIZ;;UAGE,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;UA+BA,aAAA;aACJ;YACD"}