@shell-shock/core 0.5.1 → 0.7.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 (66) hide show
  1. package/README.md +1 -1
  2. package/dist/components/docs.d.cts +5 -5
  3. package/dist/components/docs.d.mts +5 -5
  4. package/dist/components/index.cjs +3 -1
  5. package/dist/components/index.d.cts +2 -2
  6. package/dist/components/index.d.mts +2 -2
  7. package/dist/components/index.mjs +2 -2
  8. package/dist/components/options-parser-logic.cjs +127 -31
  9. package/dist/components/options-parser-logic.cjs.map +1 -1
  10. package/dist/components/options-parser-logic.d.cts +37 -10
  11. package/dist/components/options-parser-logic.d.cts.map +1 -1
  12. package/dist/components/options-parser-logic.d.mts +31 -4
  13. package/dist/components/options-parser-logic.d.mts.map +1 -1
  14. package/dist/components/options-parser-logic.mjs +126 -32
  15. package/dist/components/options-parser-logic.mjs.map +1 -1
  16. package/dist/components/usage.cjs +6 -5
  17. package/dist/components/usage.cjs.map +1 -1
  18. package/dist/components/usage.d.cts +2 -4
  19. package/dist/components/usage.d.cts.map +1 -1
  20. package/dist/components/usage.d.mts +2 -4
  21. package/dist/components/usage.d.mts.map +1 -1
  22. package/dist/components/usage.mjs +7 -6
  23. package/dist/components/usage.mjs.map +1 -1
  24. package/dist/helpers/persistence.cjs +48 -3
  25. package/dist/helpers/persistence.cjs.map +1 -1
  26. package/dist/helpers/persistence.mjs +48 -3
  27. package/dist/helpers/persistence.mjs.map +1 -1
  28. package/dist/helpers/resolve-command.cjs +103 -53
  29. package/dist/helpers/resolve-command.cjs.map +1 -1
  30. package/dist/helpers/resolve-command.mjs +105 -55
  31. package/dist/helpers/resolve-command.mjs.map +1 -1
  32. package/dist/helpers/validations.cjs +20 -20
  33. package/dist/helpers/validations.cjs.map +1 -1
  34. package/dist/helpers/validations.mjs +21 -21
  35. package/dist/helpers/validations.mjs.map +1 -1
  36. package/dist/index.d.cts +2 -2
  37. package/dist/index.d.mts +2 -2
  38. package/dist/plugin-utils/context-helpers.cjs +105 -4
  39. package/dist/plugin-utils/context-helpers.cjs.map +1 -1
  40. package/dist/plugin-utils/context-helpers.d.cts +89 -3
  41. package/dist/plugin-utils/context-helpers.d.cts.map +1 -1
  42. package/dist/plugin-utils/context-helpers.d.mts +89 -3
  43. package/dist/plugin-utils/context-helpers.d.mts.map +1 -1
  44. package/dist/plugin-utils/context-helpers.mjs +99 -3
  45. package/dist/plugin-utils/context-helpers.mjs.map +1 -1
  46. package/dist/plugin-utils/get-command-tree.cjs +1 -1
  47. package/dist/plugin-utils/get-command-tree.cjs.map +1 -1
  48. package/dist/plugin-utils/get-command-tree.mjs +2 -2
  49. package/dist/plugin-utils/get-command-tree.mjs.map +1 -1
  50. package/dist/plugin-utils/index.cjs +7 -2
  51. package/dist/plugin-utils/index.d.cts +2 -2
  52. package/dist/plugin-utils/index.d.mts +2 -2
  53. package/dist/plugin-utils/index.mjs +2 -2
  54. package/dist/plugin.cjs +1 -1
  55. package/dist/plugin.cjs.map +1 -1
  56. package/dist/plugin.d.cts.map +1 -1
  57. package/dist/plugin.d.mts.map +1 -1
  58. package/dist/plugin.mjs +2 -2
  59. package/dist/plugin.mjs.map +1 -1
  60. package/dist/types/command.d.cts +291 -9
  61. package/dist/types/command.d.cts.map +1 -1
  62. package/dist/types/command.d.mts +291 -9
  63. package/dist/types/command.d.mts.map +1 -1
  64. package/dist/types/index.d.cts +2 -2
  65. package/dist/types/index.d.mts +2 -2
  66. package/package.json +3 -3
@@ -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","isPositionalCommandOption","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 isPositionalCommandOption\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 => !isPositionalCommandOption(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","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,77 +1,359 @@
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 BaseCommandArgument {
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 StringCommandArgument extends BaseCommandArgument {
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 NumberCommandArgument extends BaseCommandArgument {
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 BooleanCommandArgument extends BaseCommandArgument {
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 StringCommandArgument {
83
+ /**
84
+ * The property reflection.
85
+ */
86
+ reflection?: ReflectionProperty;
87
+ }
88
+ interface NumberCommandOption extends NumberCommandArgument {
89
+ /**
90
+ * The property reflection.
91
+ */
92
+ reflection?: ReflectionProperty;
93
+ }
94
+ interface BooleanCommandOption extends BooleanCommandArgument {
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;
109
+ interface StringCommandParameter extends StringCommandArgument {
110
+ /**
111
+ * The parameter reflection.
112
+ */
113
+ reflection: ReflectionParameter;
114
+ }
115
+ interface NumberCommandParameter extends NumberCommandArgument {
116
+ /**
117
+ * The parameter reflection.
118
+ */
119
+ reflection: ReflectionParameter;
120
+ }
121
+ interface BooleanCommandParameter extends BooleanCommandArgument {
122
+ /**
123
+ * The parameter reflection.
124
+ */
125
+ reflection: ReflectionParameter;
126
+ }
127
+ type CommandParameter = StringCommandParameter | NumberCommandParameter | BooleanCommandParameter;
32
128
  interface CommandPath {
129
+ /**
130
+ * The full path value.
131
+ */
33
132
  value: string | null;
133
+ /**
134
+ * The path segments.
135
+ */
34
136
  segments: string[];
35
137
  }
36
138
  interface CommandBase {
139
+ /**
140
+ * The command id.
141
+ */
37
142
  id: string | null;
143
+ /**
144
+ * The command name.
145
+ */
38
146
  name: string;
147
+ /**
148
+ * The display title.
149
+ */
39
150
  title?: string;
151
+ /**
152
+ * The command description.
153
+ */
40
154
  description?: string;
155
+ /**
156
+ * Alternative command names.
157
+ */
41
158
  alias?: string[];
159
+ /**
160
+ * The command icon.
161
+ */
162
+ icon?: string;
163
+ /**
164
+ * The command path.
165
+ */
42
166
  path: CommandPath;
167
+ /**
168
+ * Whether the command is virtual.
169
+ */
43
170
  isVirtual: boolean;
44
171
  }
45
172
  interface CommandInput extends CommandBase {
173
+ /**
174
+ * The command id.
175
+ */
46
176
  id: string;
177
+ /**
178
+ * The resolved entry definition.
179
+ */
47
180
  entry: ResolvedEntryTypeDefinition;
48
181
  }
49
- type CommandPositionalOption = StringCommandOption | NumberCommandOption;
182
+ /**
183
+ * Represents a dynamic command segment with metadata and matching behavior.
184
+ */
185
+ type CommandDynamicSegment = {
186
+ /**
187
+ * The parameter reflection.
188
+ */
189
+ reflection?: ReflectionParameter;
190
+ /**
191
+ * The segment value.
192
+ */
193
+ segment: string;
194
+ /**
195
+ * The segment name.
196
+ */
197
+ name: string;
198
+ /**
199
+ * The segment title.
200
+ */
201
+ title: string;
202
+ /**
203
+ * The segment description.
204
+ */
205
+ description: string;
206
+ /**
207
+ * Whether the segment is optional.
208
+ */
209
+ optional: boolean;
210
+ } & ({
211
+ /**
212
+ * The default value.
213
+ */
214
+ default?: string;
215
+ /**
216
+ * Whether the segment is a catch-all.
217
+ */
218
+ catchAll: false;
219
+ /**
220
+ * Whether the segment is variadic.
221
+ */
222
+ variadic: false;
223
+ } | {
224
+ /**
225
+ * The default value.
226
+ */
227
+ default?: string;
228
+ /**
229
+ * Whether the segment is a catch-all.
230
+ */
231
+ catchAll: true;
232
+ /**
233
+ * Whether the segment is variadic.
234
+ */
235
+ variadic: false;
236
+ } | {
237
+ /**
238
+ * The default values.
239
+ */
240
+ default?: string[];
241
+ /**
242
+ * Whether the segment is a catch-all.
243
+ */
244
+ catchAll: true;
245
+ /**
246
+ * Whether the segment is variadic.
247
+ */
248
+ variadic: true;
249
+ });
50
250
  interface CommandTreePath extends CommandPath {
51
- positional: Record<string, CommandPositionalOption>;
251
+ /**
252
+ * Dynamic segment definitions.
253
+ */
254
+ dynamics: Record<string, CommandDynamicSegment>;
52
255
  }
53
256
  type CommandTree = CommandInput & {
257
+ /**
258
+ * The display title.
259
+ */
54
260
  title: string;
261
+ /**
262
+ * The command description.
263
+ */
55
264
  description: string;
265
+ /**
266
+ * Alternative command names.
267
+ */
56
268
  alias: string[];
269
+ /**
270
+ * The command path with dynamics.
271
+ */
57
272
  path: CommandTreePath;
273
+ /**
274
+ * The command options.
275
+ */
58
276
  options: Record<string, CommandOption>;
277
+ /**
278
+ * The positional parameter options provided to the command.
279
+ */
280
+ params: CommandParameter[];
281
+ /**
282
+ * The parent command.
283
+ */
59
284
  parent: null | CommandTree;
285
+ /**
286
+ * Child commands.
287
+ */
60
288
  children: Record<string, CommandTree>;
289
+ /**
290
+ * The command handler reflection.
291
+ */
292
+ reflection: ReflectionFunction | null;
293
+ };
294
+ type SerializedCommandOption = Omit<CommandOption, "reflection">;
295
+ type SerializedCommandDynamicSegment = Omit<CommandDynamicSegment, "reflection">;
296
+ type SerializedCommandTreePath = Omit<CommandTreePath, "dynamics"> & {
297
+ dynamics: Record<string, SerializedCommandDynamicSegment>;
61
298
  };
62
- type SerializedCommandTree = Omit<CommandTree, "parent" | "children"> & {
299
+ type SerializedCommandParameter = Omit<CommandParameter, "reflection">;
300
+ type SerializedCommandTree = Omit<CommandTree, "options" | "path" | "params" | "parent" | "children" | "reflection"> & {
301
+ /**
302
+ * The command options.
303
+ */
304
+ options: Record<string, SerializedCommandOption>;
305
+ /**
306
+ * The command path with dynamics.
307
+ */
308
+ path: SerializedCommandTreePath;
309
+ /**
310
+ * The positional parameter options provided to the command.
311
+ */
312
+ params: SerializedCommandParameter[];
313
+ /**
314
+ * The parent command id.
315
+ */
63
316
  parent: null | string;
317
+ /**
318
+ * Serialized child commands.
319
+ */
64
320
  children: Record<string, SerializedCommandTree>;
321
+ /**
322
+ * The command handler reflection.
323
+ */
324
+ reflection?: SerializedTypes;
65
325
  };
66
326
  interface Metadata {
327
+ /**
328
+ * The display name of the command.
329
+ *
330
+ * @remarks
331
+ * 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.
332
+ */
67
333
  title?: string;
334
+ /**
335
+ * A brief description of what the command does.
336
+ *
337
+ * @remarks
338
+ * This value will be used in various displays of the user interface and documentation. If not provided, a default message may be shown.
339
+ */
68
340
  description?: string;
341
+ /**
342
+ * One or more alternative names for the command.
343
+ */
69
344
  alias?: string | string[];
345
+ /**
346
+ * An optional icon to visually represent the command in user interfaces.
347
+ *
348
+ * @remarks
349
+ * 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.
350
+ */
351
+ icon?: string;
70
352
  }
71
353
  interface CommandModule {
72
354
  metadata?: Metadata;
73
355
  default?: AnyFunction;
74
356
  }
75
357
  //#endregion
76
- export { BaseCommandOption, BooleanCommandOption, CommandBase, CommandInput, CommandModule, CommandOption, CommandPath, CommandPositionalOption, CommandTree, CommandTreePath, Metadata, NumberCommandOption, SerializedCommandTree, StringCommandOption };
358
+ export { BaseCommandArgument, BooleanCommandArgument, BooleanCommandOption, BooleanCommandParameter, CommandBase, CommandDynamicSegment, CommandInput, CommandModule, CommandOption, CommandParameter, CommandPath, CommandTree, CommandTreePath, Metadata, NumberCommandArgument, NumberCommandOption, NumberCommandParameter, SerializedCommandDynamicSegment, SerializedCommandOption, SerializedCommandParameter, SerializedCommandTree, SerializedCommandTreePath, StringCommandArgument, StringCommandOption, StringCommandParameter };
77
359
  //# 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,iBAsCP,CAAsB;EAE3C,IAAA,EAvCT,cAAA,CAAe,MAuCU;EACJ,OAAA,CAAA,EAAA,MAAA;EAAf,QAAA,EAAA,OAAA;;AADsC,UAlCnC,oBAAA,SAA6B,iBAkCM,CAAA;EAIxC,IAAA,EArCJ,cAAA,CAAe,OAqCA;EAAG,OAAA,CAAA,EAAA,OAAA;EAIlB,YAAA,CAAA,EAAA,MAAA;EACkB,kBAAA,CAAA,EAAA,OAAA;;AACT,KArCL,aAAA,GACR,mBAoCa,GAnCb,mBAmCa,GAlCb,oBAkCa;AACU,UAjCV,WAAA,CAiCU;EAAf,KAAA,EAAA,MAAA,GAAA,IAAA;EAAM,QAAA,EAAA,MAAA,EAAA;AAGlB;AAAyC,UA/BxB,WAAA,CA+BwB;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,EApCT,WAoCsB;;;UAhCb,YAAA,SAAqB;;SAE7B;;KAGG,uBAAA,GAA0B,sBAAsB;UAE3C,eAAA,SAAwB;cAC3B,eAAe;;KAGjB,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,mBAAA;;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;EAAuB;AAE3B;AAWA;EAmCiB,GAAA,EAAA,MAAA,GAAA,KAAa;EAclB;AAsEZ;;EAIY,QAAA,EAAA,OAAA;;AAJwC,UA/OnC,qBAAA,SAA8B,mBA+OK,CAAA;EAOxC;;;EAoBc,IAAA,EAtQlB,cAAA,CAAe,MAsQG;EAAf;;;EAYgB,OAAA,CAAA,EAAA,MAAA;EAAf;;;EAOA,QAAA,EAAA,OAAA;AAEZ;AAKY,UArRK,qBAAA,SAA8B,mBAqRV,CAAA;EAAQ;;;EACjC,IAAA,EAlRJ,cAAA,CAAe,MAkRX;EAAM;AAGlB;AAEA;EACE,OAAA,CAAA,EAAA,MAAA;EADkC;;;EAW5B,QAAA,EAAA,OAAA;;AAYmB,UAnSV,sBAAA,SAA+B,mBAmSrB,CAAA;EAAf;;;EAOK,IAAA,EAtST,cAAA,CAAe,OAsSE;EA+BR;;;;;;;;;;;;;UAtTA,mBAAA,SAA4B;;;;eAI9B;;UAGE,mBAAA,SAA4B;;;;eAI9B;;UAGE,oBAAA,SAA6B;;;;eAI/B;;;;;;;;;;KAWH,aAAA,GACR,sBACA,sBACA;UAEa,sBAAA,SAA+B;;;;cAIlC;;UAGG,sBAAA,SAA+B;;;;cAIlC;;UAGG,uBAAA,SAAgC;;;;cAInC;;KAGF,gBAAA,GACR,yBACA,yBACA;UAEa,WAAA;;;;;;;;;;UAWA,WAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA4BT;;;;;;UAOS,YAAA,SAAqB;;;;;;;;SAQ7B;;;;;KAMG,qBAAA;;;;eAIG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAkEE,eAAA,SAAwB;;;;YAI7B,eAAe;;KAGf,WAAA,GAAc;;;;;;;;;;;;;;;;QAgBlB;;;;WAIG,eAAe;;;;UAIhB;;;;iBAIO;;;;YAIL,eAAe;;;;cAIb;;KAGF,uBAAA,GAA0B,KAAK;KAE/B,+BAAA,GAAkC,KAC5C;KAIU,yBAAA,GAA4B,KAAK;YACjC,eAAe;;KAGf,0BAAA,GAA6B,KAAK;KAElC,qBAAA,GAAwB,KAClC;;;;WAMS,eAAe;;;;QAIlB;;;;UAIE;;;;;;;;YAQE,eAAe;;;;eAIZ;;UAGE,QAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;UA+BA,aAAA;aACJ;YACD"}