@shell-shock/core 0.8.3 → 0.8.4

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.
@@ -1 +1 @@
1
- {"version":3,"file":"options-parser-logic.mjs","names":["code","computed","For","Show","ElseClause","ElseIfClause","IfStatement","InterfaceDeclaration","InterfaceMember","VarDeclaration","ReflectionKind","camelCase","constantCase","pascalCase","isSetString","computedOptions","getDynamicPathSegmentName","isDynamicPathSegment","BooleanInputParserLogic","DynamicSegmentsParserLogic","props","command","_$createComponent","each","segments","children","segment","index","when","name","type","_$createIntrinsic","condition","ArgumentsParserLogic","envPrefix","isCaseSensitive","arguments","length","initializer","Object","values","options","map","option","toLowerCase","replaceAll","alias","a","join","hardline","arg","kind","boolean","number","string","variadic","optional","env","String","default","undefined","fallback","_$memo","OptionsMember","doc","description","title","Boolean","OptionsMemberParserLogic","equalsRegex","includes","isNegativeOf","OptionsMemberParserCondition","aliasProp","OptionsInterfaceDeclaration","value","OptionsParserLogic","entries","JSON","stringify","filter","i","CommandParserLogic"],"sources":["../../src/components/options-parser-logic.tsx"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Shell Shock\n\n This code was released as part of the Shell Shock project. Shell Shock\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/shell-shock.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/shell-shock\n Documentation: https://docs.stormsoftware.com/projects/shell-shock\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { code, computed, For, Show } from \"@alloy-js/core\";\nimport {\n ElseClause,\n ElseIfClause,\n IfStatement,\n InterfaceDeclaration,\n InterfaceMember,\n VarDeclaration\n} from \"@alloy-js/typescript\";\nimport { ReflectionKind } from \"@powerlines/deepkit/vendor/type\";\nimport { camelCase } from \"@stryke/string-format/camel-case\";\nimport { constantCase } from \"@stryke/string-format/constant-case\";\nimport { pascalCase } from \"@stryke/string-format/pascal-case\";\nimport { isSetString } from \"@stryke/type-checks/is-set-string\";\nimport { computedOptions } from \"../contexts/options\";\nimport {\n getDynamicPathSegmentName,\n isDynamicPathSegment\n} from \"../plugin-utils/context-helpers\";\nimport type {\n BooleanCommandOption,\n CommandOption,\n CommandTree,\n NumberCommandOption,\n StringCommandOption\n} from \"../types/command\";\nimport { BooleanInputParserLogic } from \"./helpers\";\n\nexport interface DynamicSegmentsParserLogicProps {\n /**\n * The command to generate the dynamic path segments parser logic for. This is used to access the command options and parameters when generating the parser logic for dynamic path segments.\n */\n command: CommandTree;\n\n /**\n * Whether the command options should be parsed in a case-sensitive manner. This will affect how the generated code compares command-line arguments to option names and aliases.\n */\n isCaseSensitive: boolean;\n}\n\nexport function DynamicSegmentsParserLogic(\n props: DynamicSegmentsParserLogicProps\n) {\n const { command } = props;\n\n return (\n <For each={command.segments ?? []}>\n {(segment, index) => (\n <Show when={isDynamicPathSegment(segment)}>\n <VarDeclaration\n let\n name={camelCase(getDynamicPathSegmentName(segment))}\n type=\"string\"\n />\n <hbr />\n <IfStatement\n condition={code`args.length > ${2 + index} && args[${2 + index}]`}>\n {code`${camelCase(\n getDynamicPathSegmentName(segment)\n )} = args[${2 + index}];`}\n </IfStatement>\n <hbr />\n <hbr />\n </Show>\n )}\n </For>\n );\n}\n\nexport interface ArgumentsParserLogicProps {\n /**\n * The command to generate the positional parameters parser logic for.\n */\n command: CommandTree;\n\n /**\n * The environment variable prefix to use for options that have an associated environment variable. This prefix will be used in the generated code to access the environment variables (e.g., `env.${envPrefix}_OPTION_NAME`).\n */\n envPrefix: string;\n\n /**\n * Whether the command options should be parsed in a case-sensitive manner. This will affect how the generated code compares command-line arguments to option names and aliases.\n */\n isCaseSensitive: boolean;\n}\n\nexport function ArgumentsParserLogic(props: ArgumentsParserLogicProps) {\n const { command, envPrefix, isCaseSensitive } = props;\n\n return (\n <Show when={command.arguments && command.arguments.length > 0}>\n <VarDeclaration\n let\n name=\"optionsIndex\"\n type=\"number\"\n initializer={code`Math.max(0, args.slice(${command.segments.length + 1}).findIndex(arg => arg.startsWith(\"-\") && /^(${Object.values(\n command.options ?? {}\n )\n .map(\n option =>\n `${\n isCaseSensitive || option.name.length === 1\n ? option.name\n : option.name\n .toLowerCase()\n .replaceAll(\"-\", \"\")\n .replaceAll(\"_\", \"\")\n }${option.alias && option.alias.length > 0 ? \"|\" : \"\"}${option.alias\n ?.map(a =>\n (isCaseSensitive || option.name.length === 1\n ? a\n : a\n .toLowerCase()\n .replaceAll(\"-\", \"\")\n .replaceAll(\"_\", \"\")) === \"?\"\n ? \"\\\\?\"\n : isCaseSensitive || option.name.length === 1\n ? a\n : a.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n )\n .join(\"|\")}`\n )\n .join(\"|\")})=?.*$/.test(arg${\n isCaseSensitive\n ? \"\"\n : '.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n }))) + ${command.segments.length + 1};`}\n />\n <hbr />\n <hbr />\n <VarDeclaration\n let\n name=\"argsIndex\"\n type=\"number\"\n initializer={code`optionsIndex > ${\n command.segments.length + 1\n } ? ${command.segments.length + 1} : (Math.max(0, args.slice(optionsIndex).findLastIndex(arg => arg.startsWith(\"-\") && /^(${Object.values(\n command.options ?? {}\n )\n .map(\n option =>\n `${\n isCaseSensitive || option.name.length === 1\n ? option.name\n : option.name\n .toLowerCase()\n .replaceAll(\"-\", \"\")\n .replaceAll(\"_\", \"\")\n }${option.alias && option.alias.length > 0 ? \"|\" : \"\"}${option.alias\n ?.map(a =>\n (isCaseSensitive || option.name.length === 1\n ? a\n : a\n .toLowerCase()\n .replaceAll(\"-\", \"\")\n .replaceAll(\"_\", \"\")) === \"?\"\n ? \"\\\\?\"\n : isCaseSensitive || option.name.length === 1\n ? a\n : a.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n )\n .join(\"|\")}`\n )\n .join(\"|\")})=?.*$/.test(arg${\n isCaseSensitive\n ? \"\"\n : '.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n }))) + ${command.segments.length + 1});`}\n />\n <hbr />\n <hbr />\n <For each={command.arguments ?? []} hardline>\n {(arg, index) => (\n <>\n <VarDeclaration\n let\n name={camelCase(arg.name)}\n type={`${\n arg.kind === ReflectionKind.boolean\n ? \"boolean\"\n : arg.kind === ReflectionKind.number\n ? \"number\"\n : \"string\"\n }${\n (arg.kind === ReflectionKind.string ||\n arg.kind === ReflectionKind.number) &&\n arg.variadic\n ? \"[]\"\n : \"\"\n }${arg.optional ? \" | undefined\" : \"\"}`}\n initializer={\n <>\n <Show when={isSetString(arg.env)}>\n {code`env.${envPrefix}_${constantCase(String(arg.env))} ?? `}\n </Show>\n <Show\n when={arg.default !== undefined}\n fallback={\n (arg.kind === ReflectionKind.string ||\n arg.kind === ReflectionKind.number) &&\n arg.variadic\n ? code`[]`\n : code`undefined;`\n }>\n {arg.kind === ReflectionKind.string\n ? code`\"${arg.default}\"`\n : code`${arg.default}`}\n </Show>\n </>\n }\n />\n <hbr />\n <hbr />\n <IfStatement\n condition={code`argsIndex + ${index} < args.length && argsIndex + ${index} !== optionsIndex`}>\n {code`${camelCase(arg.name)} = `}\n <Show\n when={\n arg.kind === ReflectionKind.string ||\n arg.kind === ReflectionKind.number\n }\n fallback={\n <BooleanInputParserLogic\n name={`args[argsIndex + ${index}] `}\n />\n }>\n <Show\n when={\n (arg.kind === ReflectionKind.string ||\n arg.kind === ReflectionKind.number) &&\n arg.variadic\n }\n fallback={\n <Show\n when={arg.kind === ReflectionKind.number}\n fallback={code`args[argsIndex + ${index}]; `}>\n {code`Number(args[argsIndex + ${index}]); `}\n </Show>\n }>\n {code`args.slice(argsIndex + ${\n index\n }, (optionsIndex > argsIndex ? optionsIndex : args.length) - ${\n command.arguments.length - index\n }).join(\" \").split(\",\").map(item => item.trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\")).filter(Boolean)`}\n </Show>\n </Show>\n </IfStatement>\n <hbr />\n <hbr />\n </>\n )}\n </For>\n </Show>\n );\n}\n\n/**\n * The command option interface property.\n */\nexport function OptionsMember({ option }: { option: CommandOption }) {\n const doc = option.description || `The ${option.title} command option.`;\n\n return (\n <>\n <Show when={Boolean(option.name)}>\n <Show when={option.kind === ReflectionKind.string}>\n <InterfaceMember\n name={option.name}\n doc={doc}\n type={\n (option as StringCommandOption).variadic ? \"string[]\" : \"string\"\n }\n optional={option.optional}\n />\n </Show>\n <Show when={option.kind === ReflectionKind.number}>\n <InterfaceMember\n name={option.name}\n doc={doc}\n type={\n (option as NumberCommandOption).variadic ? \"number[]\" : \"number\"\n }\n optional={option.optional}\n />\n </Show>\n <Show when={option.kind === ReflectionKind.boolean}>\n <InterfaceMember\n name={option.name}\n doc={doc}\n type=\"boolean\"\n optional={option.optional}\n />\n </Show>\n </Show>\n </>\n );\n}\n\nexport interface OptionsMemberParserLogicProps {\n /**\n * The option name to generate the parser logic for.\n */\n name: string;\n\n /**\n * The command option to generate the parser logic for.\n */\n option: CommandOption;\n\n /**\n * Whether the command options should be parsed in a case-sensitive manner. This will affect how the generated code compares command-line arguments to option names and aliases.\n *\n * @defaultValue false\n */\n isCaseSensitive: boolean;\n}\n\n/**\n * The command option property parser logic.\n */\nexport function OptionsMemberParserLogic(props: OptionsMemberParserLogicProps) {\n const { name, option, isCaseSensitive } = props;\n\n const equalsRegex = `/^--?(${\n isCaseSensitive || name.length === 1\n ? name\n : name.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n }${option.alias && option.alias.length > 0 ? \"|\" : \"\"}${option.alias\n ?.map(a =>\n (isCaseSensitive || name.length === 1\n ? a\n : a.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")) === \"?\"\n ? \"\\\\?\"\n : isCaseSensitive || name.length === 1\n ? a\n : a.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n )\n .join(\"|\")})=/`;\n\n return (\n <>\n <Show\n when={\n option.kind === ReflectionKind.string ||\n option.kind === ReflectionKind.number\n }>\n <Show\n when={(option as StringCommandOption | NumberCommandOption).variadic}>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name} ??= []; `}>\n {code`options[\"${name}\"] ??= []; `}\n </Show>\n <hbr />\n <IfStatement\n condition={`${equalsRegex}.test(${\n isCaseSensitive\n ? \"arg\"\n : '\"-\" + arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n })`}>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name}.push(`}>\n {code`options[\"${name}\"].push(`}\n </Show>\n <Show when={option.kind === ReflectionKind.string}>\n {code`...arg.replace(${equalsRegex}, \"\").split(\",\").map(item => item.trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\")).filter(Boolean) `}\n </Show>\n <Show when={option.kind === ReflectionKind.number}>\n {code`...arg.replace(${equalsRegex}, \"\").split(\",\").map(item => item.trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\")).filter(Boolean).map(Number).filter(value => !Number.isNaN(value)) `}\n </Show>\n {code`); `}\n </IfStatement>\n <ElseIfClause condition={`args.length > i + 1`}>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name}.push(`}>\n {code`options[\"${name}\"].push(`}\n </Show>\n <Show when={option.kind === ReflectionKind.string}>\n {code`...args[++i].split(\",\").map(item => item.trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\")).filter(Boolean) `}\n </Show>\n <Show when={option.kind === ReflectionKind.number}>\n {code`...args[++i].split(\",\").map(item => item.trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\")).filter(Boolean).map(Number).filter(value => !Number.isNaN(value)) `}\n </Show>\n {code`); `}\n </ElseIfClause>\n </Show>\n <Show\n when={\n !(option as StringCommandOption | NumberCommandOption).variadic\n }>\n <IfStatement\n condition={`${equalsRegex}.test(${isCaseSensitive ? \"arg\" : '\"-\" + arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'})`}>\n <Show when={option.kind === ReflectionKind.string}>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name}`}>\n {code`options[\"${name}\"]`}\n </Show>\n {code` = arg.replace(${equalsRegex}, \"\").trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\"); `}\n </Show>\n <Show when={option.kind === ReflectionKind.number}>\n <VarDeclaration\n const\n name=\"value\"\n initializer={code` Number(arg.replace(${equalsRegex}, \"\").trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\")); `}\n />\n <hbr />\n <IfStatement condition={`!Number.isNaN(value)`}>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name}`}>\n {code`options[\"${name}\"]`}\n </Show>\n {code` = value; `}\n </IfStatement>\n </Show>\n </IfStatement>\n <ElseIfClause condition={`args.length > i + 1`}>\n <Show when={option.kind === ReflectionKind.string}>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name}`}>\n {code`options[\"${name}\"]`}\n </Show>\n {code` = args[++i].trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\"); `}\n </Show>\n <Show when={option.kind === ReflectionKind.number}>\n <VarDeclaration\n const\n name=\"value\"\n initializer={code` Number(args[++i].trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\")); `}\n />\n <hbr />\n <IfStatement condition={`!Number.isNaN(value)`}>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name}`}>\n {code`options[\"${name}\"]`}\n </Show>\n {code` = value; `}\n </IfStatement>\n </Show>\n </ElseIfClause>\n <hbr />\n </Show>\n </Show>\n <Show when={option.kind === ReflectionKind.boolean}>\n <IfStatement\n condition={`${equalsRegex}.test(${isCaseSensitive ? \"arg\" : '\"-\" + arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'})`}>\n <VarDeclaration\n const\n name=\"value\"\n initializer={code` arg.replace(${equalsRegex}, \"\").trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\").toLowerCase(); `}\n />\n <hbr />\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name} = `}>\n {code`options[\"${name}\"] = `}\n </Show>\n <BooleanInputParserLogic name=\"value\" />\n </IfStatement>\n <ElseClause>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name} = true; `}>\n {code`options[\"${name}\"] = true; `}\n </Show>\n </ElseClause>\n <Show when={Boolean((option as BooleanCommandOption).isNegativeOf)}>\n <hbr />\n <Show\n when={\n (option as BooleanCommandOption).isNegativeOf!.includes(\"?\") ||\n (option as BooleanCommandOption).isNegativeOf!.includes(\"-\")\n }\n fallback={code`options.${(option as BooleanCommandOption).isNegativeOf} = false; `}>\n {code`options[\"${(option as BooleanCommandOption).isNegativeOf}\"] = false; `}\n </Show>\n </Show>\n </Show>\n </>\n );\n}\n\nexport interface OptionsMemberParserConditionProps {\n /**\n * The option name to generate the parser logic for.\n */\n name: string;\n\n /**\n * Aliases for the option, which will also be parsed in the generated code. This will affect how the generated code compares command line arguments to option names and aliases.\n */\n alias?: string[];\n\n /**\n * Whether the command options should be parsed in a case-sensitive manner. This will affect how the generated code compares command line arguments to option names and aliases.\n *\n * @defaultValue false\n */\n isCaseSensitive: boolean;\n}\n\nexport function OptionsMemberParserCondition(\n props: OptionsMemberParserConditionProps\n) {\n const { name, alias: aliasProp, isCaseSensitive } = props;\n\n return (\n <>\n {code`${\n isCaseSensitive\n ? 'arg.startsWith(\"--'\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\").startsWith(\"'\n }${isCaseSensitive ? name : name.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")}=\") || ${\n isCaseSensitive\n ? \"arg\"\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n } === \"${\n isCaseSensitive\n ? name\n : name.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n }\" || ${\n isCaseSensitive\n ? 'arg.startsWith(\"-'\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\").startsWith(\"'\n }${isCaseSensitive ? name : name.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")}=\") || ${\n isCaseSensitive\n ? \"arg\"\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n } === \"${\n isCaseSensitive\n ? name\n : name.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n }\"`}\n <Show when={aliasProp && aliasProp.length > 0}>\n <For each={aliasProp ?? []}>\n {alias =>\n code` || ${\n isCaseSensitive || alias.length === 1\n ? 'arg.startsWith(\"--'\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\").startsWith(\"'\n }${isCaseSensitive || alias.length === 1 ? alias : alias.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")}=\") || ${\n isCaseSensitive || alias.length === 1\n ? \"arg\"\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n } === \"${\n isCaseSensitive || alias.length === 1\n ? alias\n : alias.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n }\" || ${\n isCaseSensitive || alias.length === 1\n ? 'arg.startsWith(\"-'\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\").startsWith(\"'\n }${isCaseSensitive || alias.length === 1 ? alias : alias.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")}=\") || ${\n isCaseSensitive || alias.length === 1\n ? \"arg\"\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n } === \"${\n isCaseSensitive || alias.length === 1\n ? alias\n : alias.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n }\"`\n }\n </For>\n </Show>\n </>\n );\n}\n\nexport function OptionsInterfaceDeclaration(props: { command: CommandTree }) {\n const { command } = props;\n\n const options = computed(() => computedOptions(command));\n\n return (\n <InterfaceDeclaration export name={`${pascalCase(command.name)}Options`}>\n <For each={Object.values(options.value)} hardline>\n {option => <OptionsMember option={option} />}\n </For>\n </InterfaceDeclaration>\n );\n}\n\nexport interface OptionsParserLogicProps {\n /**\n * The command to generate the options parser logic for.\n */\n command: CommandTree;\n\n /**\n * The environment variable prefix to use for options that have an associated environment variable. This prefix will be used in the generated code to access the environment variables (e.g., `env.${envPrefix}_OPTION_NAME`).\n */\n envPrefix: string;\n\n /**\n * Whether the command options should be parsed in a case-sensitive manner. This will affect how the generated code compares command-line arguments to option names and aliases.\n *\n * @defaultValue false\n */\n isCaseSensitive?: boolean;\n}\n\n/**\n * The command options parser logic.\n */\nexport function OptionsParserLogic(props: OptionsParserLogicProps) {\n const { command, envPrefix, isCaseSensitive = false } = props;\n\n const options = computed(() => computedOptions(command));\n\n return (\n <>\n <VarDeclaration\n const\n name=\"options\"\n initializer={code` {\n ${Object.entries(options.value)\n .map(([name, option]) => {\n if (option.kind === ReflectionKind.string) {\n return ` ${name.includes(\"?\") || name.includes(\"-\") ? `\"${name}\"` : `${name}`}: ${\n option.env ? `env.${envPrefix}_${option.env}` : \"\"\n }${\n option.variadic\n ? option.default !== undefined\n ? `${\n option.env ? \" ?? \" : \"\"\n }${JSON.stringify(option.default)}`\n : option.env\n ? \" ?? []\"\n : \"\"\n : option.default !== undefined\n ? `${option.env ? \" ?? \" : \"\"}\"${option.default}\"`\n : \"\"\n }, `;\n } else if (option.kind === ReflectionKind.number) {\n return ` ${name.includes(\"?\") || name.includes(\"-\") ? `\"${name}\"` : `${name}`}: ${\n option.env ? `env.${envPrefix}_${option.env}` : \"\"\n }${\n option.variadic\n ? option.default !== undefined\n ? `${\n option.env ? \" ?? \" : \"\"\n }${JSON.stringify(option.default)}`\n : option.env\n ? \" ?? []\"\n : \"\"\n : option.default !== undefined\n ? `${option.env ? \" ?? \" : \"\"}${option.default}`\n : \"\"\n }, `;\n } else if (option.kind === ReflectionKind.boolean) {\n return ` ${name.includes(\"?\") || name.includes(\"-\") ? `\"${name}\"` : `${name}`}: ${\n option.env ? `env.${envPrefix}_${option.env} ?? ` : \"\"\n }${option.default ? \"true\" : \"false\"},`;\n }\n\n return \"\";\n })\n .join(\"\")}\n } as ${pascalCase(command.name)}Options;`}\n />\n <hbr />\n <hbr />\n {code`for (let i = 0; i < args.slice(${\n command.segments.filter(segment => isDynamicPathSegment(segment)).length\n }).length; i++) { `}\n <hbr />\n <VarDeclaration\n const\n name=\"arg\"\n type=\"string\"\n initializer={code` args[i].length > 3 && args[i].startsWith(\"--\")\n ? \\`--\\${args[i].slice(2).replaceAll(\"-\", \"\")${\n isCaseSensitive\n ? \"\"\n : '.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n }}\\`\n : args[i].length > 2 && args[i].startsWith(\"-\")\n ? \\`-\\${args[i].slice(1).replaceAll(\"-\", \"\")}\\`\n : args[i]; `}\n />\n <hbr />\n\n <For each={Object.entries(options.value)} hardline>\n {([name, option], i) => (\n <Show\n when={i === 0}\n fallback={\n <ElseIfClause\n condition={\n <>\n <OptionsMemberParserCondition\n name={name}\n alias={option.alias}\n isCaseSensitive={isCaseSensitive}\n />\n </>\n }>\n <OptionsMemberParserLogic\n name={name}\n option={option}\n isCaseSensitive={isCaseSensitive}\n />\n </ElseIfClause>\n }>\n <IfStatement\n condition={\n <OptionsMemberParserCondition\n name={name}\n alias={option.alias}\n isCaseSensitive={isCaseSensitive}\n />\n }>\n <OptionsMemberParserLogic\n name={name}\n option={option}\n isCaseSensitive={isCaseSensitive}\n />\n </IfStatement>\n </Show>\n )}\n </For>\n\n <hbr />\n {code` } `}\n <hbr />\n </>\n );\n}\n\nexport interface CommandParserLogicProps {\n /**\n * The command to generate the parser logic for.\n */\n command: CommandTree;\n\n /**\n * The environment variable prefix to use for options that have an associated environment variable. This prefix will be used in the generated code to access the environment variables (e.g., `env.${envPrefix}_OPTION_NAME`).\n */\n envPrefix: string;\n\n /**\n * Whether the command options should be parsed in a case-sensitive manner. This will affect how the generated code compares command-line arguments to option names and aliases.\n *\n * @defaultValue false\n */\n isCaseSensitive?: boolean;\n}\n\n/**\n * The command parser logic, which includes parsing dynamic path segments, positional parameters, and options.\n */\nexport function CommandParserLogic(props: CommandParserLogicProps) {\n const { command, envPrefix, isCaseSensitive = false } = props;\n\n return (\n <>\n <DynamicSegmentsParserLogic\n command={command}\n isCaseSensitive={isCaseSensitive}\n />\n <hbr />\n <hbr />\n <OptionsParserLogic\n command={command}\n envPrefix={envPrefix}\n isCaseSensitive={isCaseSensitive}\n />\n <hbr />\n <hbr />\n <ArgumentsParserLogic\n command={command}\n envPrefix={envPrefix}\n isCaseSensitive={isCaseSensitive}\n />\n <hbr />\n <hbr />\n </>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"options-parser-logic.mjs","names":["code","computed","For","Show","ElseClause","ElseIfClause","IfStatement","InterfaceDeclaration","InterfaceMember","VarDeclaration","ReflectionKind","camelCase","constantCase","pascalCase","isSetString","computedOptions","getDynamicPathSegmentName","isDynamicPathSegment","BooleanInputParserLogic","DynamicSegmentsParserLogic","props","command","_$createComponent","each","segments","children","segment","index","when","name","type","_$createIntrinsic","condition","ArgumentsParserLogic","envPrefix","isCaseSensitive","arguments","length","initializer","Object","values","options","map","option","toLowerCase","replaceAll","alias","a","join","hardline","arg","kind","boolean","number","string","variadic","optional","env","String","default","undefined","fallback","_$memo","OptionsMember","doc","description","title","Boolean","OptionsMemberParserLogic","equalsRegex","includes","isNegativeOf","OptionsMemberParserCondition","aliasProp","OptionsInterfaceDeclaration","value","OptionsParserLogic","entries","JSON","stringify","filter","i","CommandParserLogic"],"sources":["../../src/components/options-parser-logic.tsx"],"sourcesContent":["/* -------------------------------------------------------------------\n\n ⚡ Storm Software - Shell Shock\n\n This code was released as part of the Shell Shock project. Shell Shock\n is maintained by Storm Software under the Apache-2.0 license, and is\n free for commercial and private use. For more information, please visit\n our licensing page at https://stormsoftware.com/licenses/projects/shell-shock.\n\n Website: https://stormsoftware.com\n Repository: https://github.com/storm-software/shell-shock\n Documentation: https://docs.stormsoftware.com/projects/shell-shock\n Contact: https://stormsoftware.com/contact\n\n SPDX-License-Identifier: Apache-2.0\n\n ------------------------------------------------------------------- */\n\nimport { code, computed, For, Show } from \"@alloy-js/core\";\nimport {\n ElseClause,\n ElseIfClause,\n IfStatement,\n InterfaceDeclaration,\n InterfaceMember,\n VarDeclaration\n} from \"@alloy-js/typescript\";\nimport { ReflectionKind } from \"@powerlines/deepkit/vendor/type\";\nimport { camelCase } from \"@stryke/string-format/camel-case\";\nimport { constantCase } from \"@stryke/string-format/constant-case\";\nimport { pascalCase } from \"@stryke/string-format/pascal-case\";\nimport { isSetString } from \"@stryke/type-checks/is-set-string\";\nimport { computedOptions } from \"../contexts/options\";\nimport {\n getDynamicPathSegmentName,\n isDynamicPathSegment\n} from \"../plugin-utils/context-helpers\";\nimport type {\n BooleanCommandOption,\n CommandOption,\n CommandTree,\n NumberCommandOption,\n StringCommandOption\n} from \"../types/command\";\nimport { BooleanInputParserLogic } from \"./helpers\";\n\nexport interface DynamicSegmentsParserLogicProps {\n /**\n * The command to generate the dynamic path segments parser logic for. This is used to access the command options and parameters when generating the parser logic for dynamic path segments.\n */\n command: CommandTree;\n\n /**\n * Whether the command options should be parsed in a case-sensitive manner. This will affect how the generated code compares command-line arguments to option names and aliases.\n */\n isCaseSensitive: boolean;\n}\n\nexport function DynamicSegmentsParserLogic(\n props: DynamicSegmentsParserLogicProps\n) {\n const { command } = props;\n\n return (\n <For each={command.segments ?? []}>\n {(segment, index) => (\n <Show when={isDynamicPathSegment(segment)}>\n <VarDeclaration\n let\n name={camelCase(getDynamicPathSegmentName(segment))}\n type=\"string | undefined\"\n />\n <hbr />\n <IfStatement\n condition={code`args.length > ${2 + index} && args[${2 + index}]`}>\n {code`${camelCase(\n getDynamicPathSegmentName(segment)\n )} = args[${2 + index}];`}\n </IfStatement>\n <hbr />\n <hbr />\n </Show>\n )}\n </For>\n );\n}\n\nexport interface ArgumentsParserLogicProps {\n /**\n * The command to generate the positional parameters parser logic for.\n */\n command: CommandTree;\n\n /**\n * The environment variable prefix to use for options that have an associated environment variable. This prefix will be used in the generated code to access the environment variables (e.g., `env.${envPrefix}_OPTION_NAME`).\n */\n envPrefix: string;\n\n /**\n * Whether the command options should be parsed in a case-sensitive manner. This will affect how the generated code compares command-line arguments to option names and aliases.\n */\n isCaseSensitive: boolean;\n}\n\nexport function ArgumentsParserLogic(props: ArgumentsParserLogicProps) {\n const { command, envPrefix, isCaseSensitive } = props;\n\n return (\n <Show when={command.arguments && command.arguments.length > 0}>\n <VarDeclaration\n let\n name=\"optionsIndex\"\n type=\"number\"\n initializer={code`Math.max(0, args.slice(${command.segments.length + 1}).findIndex(arg => arg.startsWith(\"-\") && /^(${Object.values(\n command.options ?? {}\n )\n .map(\n option =>\n `${\n isCaseSensitive || option.name.length === 1\n ? option.name\n : option.name\n .toLowerCase()\n .replaceAll(\"-\", \"\")\n .replaceAll(\"_\", \"\")\n }${option.alias && option.alias.length > 0 ? \"|\" : \"\"}${option.alias\n ?.map(a =>\n (isCaseSensitive || option.name.length === 1\n ? a\n : a\n .toLowerCase()\n .replaceAll(\"-\", \"\")\n .replaceAll(\"_\", \"\")) === \"?\"\n ? \"\\\\?\"\n : isCaseSensitive || option.name.length === 1\n ? a\n : a.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n )\n .join(\"|\")}`\n )\n .join(\"|\")})=?.*$/.test(arg${\n isCaseSensitive\n ? \"\"\n : '.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n }))) + ${command.segments.length + 1};`}\n />\n <hbr />\n <hbr />\n <VarDeclaration\n let\n name=\"argsIndex\"\n type=\"number\"\n initializer={code`optionsIndex > ${\n command.segments.length + 1\n } ? ${command.segments.length + 1} : (Math.max(0, args.slice(optionsIndex).findLastIndex(arg => arg.startsWith(\"-\") && /^(${Object.values(\n command.options ?? {}\n )\n .map(\n option =>\n `${\n isCaseSensitive || option.name.length === 1\n ? option.name\n : option.name\n .toLowerCase()\n .replaceAll(\"-\", \"\")\n .replaceAll(\"_\", \"\")\n }${option.alias && option.alias.length > 0 ? \"|\" : \"\"}${option.alias\n ?.map(a =>\n (isCaseSensitive || option.name.length === 1\n ? a\n : a\n .toLowerCase()\n .replaceAll(\"-\", \"\")\n .replaceAll(\"_\", \"\")) === \"?\"\n ? \"\\\\?\"\n : isCaseSensitive || option.name.length === 1\n ? a\n : a.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n )\n .join(\"|\")}`\n )\n .join(\"|\")})=?.*$/.test(arg${\n isCaseSensitive\n ? \"\"\n : '.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n }))) + ${command.segments.length + 1});`}\n />\n <hbr />\n <hbr />\n <For each={command.arguments ?? []} hardline>\n {(arg, index) => (\n <>\n <VarDeclaration\n let\n name={camelCase(arg.name)}\n type={`${\n arg.kind === ReflectionKind.boolean\n ? \"boolean\"\n : arg.kind === ReflectionKind.number\n ? \"number\"\n : \"string\"\n }${\n (arg.kind === ReflectionKind.string ||\n arg.kind === ReflectionKind.number) &&\n arg.variadic\n ? \"[]\"\n : \"\"\n }${arg.optional ? \" | undefined\" : \"\"}`}\n initializer={\n <>\n <Show when={isSetString(arg.env)}>\n {code`env.${envPrefix}_${constantCase(String(arg.env))} ?? `}\n </Show>\n <Show\n when={arg.default !== undefined}\n fallback={\n (arg.kind === ReflectionKind.string ||\n arg.kind === ReflectionKind.number) &&\n arg.variadic\n ? code`[]`\n : code`undefined;`\n }>\n {arg.kind === ReflectionKind.string\n ? code`\"${arg.default}\"`\n : code`${arg.default}`}\n </Show>\n </>\n }\n />\n <hbr />\n <hbr />\n <IfStatement\n condition={code`argsIndex + ${index} < args.length && argsIndex + ${index} !== optionsIndex`}>\n {code`${camelCase(arg.name)} = `}\n <Show\n when={\n arg.kind === ReflectionKind.string ||\n arg.kind === ReflectionKind.number\n }\n fallback={\n <BooleanInputParserLogic\n name={`args[argsIndex + ${index}] `}\n />\n }>\n <Show\n when={\n (arg.kind === ReflectionKind.string ||\n arg.kind === ReflectionKind.number) &&\n arg.variadic\n }\n fallback={\n <Show\n when={arg.kind === ReflectionKind.number}\n fallback={code`args[argsIndex + ${index}]; `}>\n {code`Number(args[argsIndex + ${index}]); `}\n </Show>\n }>\n {code`args.slice(argsIndex + ${\n index\n }, (optionsIndex > argsIndex ? optionsIndex : args.length) - ${\n command.arguments.length - index\n }).join(\" \").split(\",\").map(item => item.trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\")).filter(Boolean)`}\n </Show>\n </Show>\n </IfStatement>\n <hbr />\n <hbr />\n </>\n )}\n </For>\n </Show>\n );\n}\n\n/**\n * The command option interface property.\n */\nexport function OptionsMember({ option }: { option: CommandOption }) {\n const doc = option.description || `The ${option.title} command option.`;\n\n return (\n <>\n <Show when={Boolean(option.name)}>\n <Show when={option.kind === ReflectionKind.string}>\n <InterfaceMember\n name={option.name}\n doc={doc}\n type={\n (option as StringCommandOption).variadic ? \"string[]\" : \"string\"\n }\n optional={option.optional}\n />\n </Show>\n <Show when={option.kind === ReflectionKind.number}>\n <InterfaceMember\n name={option.name}\n doc={doc}\n type={\n (option as NumberCommandOption).variadic ? \"number[]\" : \"number\"\n }\n optional={option.optional}\n />\n </Show>\n <Show when={option.kind === ReflectionKind.boolean}>\n <InterfaceMember\n name={option.name}\n doc={doc}\n type=\"boolean\"\n optional={option.optional}\n />\n </Show>\n </Show>\n </>\n );\n}\n\nexport interface OptionsMemberParserLogicProps {\n /**\n * The option name to generate the parser logic for.\n */\n name: string;\n\n /**\n * The command option to generate the parser logic for.\n */\n option: CommandOption;\n\n /**\n * Whether the command options should be parsed in a case-sensitive manner. This will affect how the generated code compares command-line arguments to option names and aliases.\n *\n * @defaultValue false\n */\n isCaseSensitive: boolean;\n}\n\n/**\n * The command option property parser logic.\n */\nexport function OptionsMemberParserLogic(props: OptionsMemberParserLogicProps) {\n const { name, option, isCaseSensitive } = props;\n\n const equalsRegex = `/^--?(${\n isCaseSensitive || name.length === 1\n ? name\n : name.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n }${option.alias && option.alias.length > 0 ? \"|\" : \"\"}${option.alias\n ?.map(a =>\n (isCaseSensitive || name.length === 1\n ? a\n : a.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")) === \"?\"\n ? \"\\\\?\"\n : isCaseSensitive || name.length === 1\n ? a\n : a.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n )\n .join(\"|\")})=/`;\n\n return (\n <>\n <Show\n when={\n option.kind === ReflectionKind.string ||\n option.kind === ReflectionKind.number\n }>\n <Show\n when={(option as StringCommandOption | NumberCommandOption).variadic}>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name} ??= []; `}>\n {code`options[\"${name}\"] ??= []; `}\n </Show>\n <hbr />\n <IfStatement\n condition={`${equalsRegex}.test(${\n isCaseSensitive\n ? \"arg\"\n : '\"-\" + arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n })`}>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name}.push(`}>\n {code`options[\"${name}\"].push(`}\n </Show>\n <Show when={option.kind === ReflectionKind.string}>\n {code`...arg.replace(${equalsRegex}, \"\").split(\",\").map(item => item.trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\")).filter(Boolean) `}\n </Show>\n <Show when={option.kind === ReflectionKind.number}>\n {code`...arg.replace(${equalsRegex}, \"\").split(\",\").map(item => item.trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\")).filter(Boolean).map(Number).filter(value => !Number.isNaN(value)) `}\n </Show>\n {code`); `}\n </IfStatement>\n <ElseIfClause condition={`args.length > i + 1`}>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name}.push(`}>\n {code`options[\"${name}\"].push(`}\n </Show>\n <Show when={option.kind === ReflectionKind.string}>\n {code`...args[++i].split(\",\").map(item => item.trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\")).filter(Boolean) `}\n </Show>\n <Show when={option.kind === ReflectionKind.number}>\n {code`...args[++i].split(\",\").map(item => item.trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\")).filter(Boolean).map(Number).filter(value => !Number.isNaN(value)) `}\n </Show>\n {code`); `}\n </ElseIfClause>\n </Show>\n <Show\n when={\n !(option as StringCommandOption | NumberCommandOption).variadic\n }>\n <IfStatement\n condition={`${equalsRegex}.test(${isCaseSensitive ? \"arg\" : '\"-\" + arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'})`}>\n <Show when={option.kind === ReflectionKind.string}>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name}`}>\n {code`options[\"${name}\"]`}\n </Show>\n {code` = arg.replace(${equalsRegex}, \"\").trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\"); `}\n </Show>\n <Show when={option.kind === ReflectionKind.number}>\n <VarDeclaration\n const\n name=\"value\"\n initializer={code` Number(arg.replace(${equalsRegex}, \"\").trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\")); `}\n />\n <hbr />\n <IfStatement condition={`!Number.isNaN(value)`}>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name}`}>\n {code`options[\"${name}\"]`}\n </Show>\n {code` = value; `}\n </IfStatement>\n </Show>\n </IfStatement>\n <ElseIfClause condition={`args.length > i + 1`}>\n <Show when={option.kind === ReflectionKind.string}>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name}`}>\n {code`options[\"${name}\"]`}\n </Show>\n {code` = args[++i].trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\"); `}\n </Show>\n <Show when={option.kind === ReflectionKind.number}>\n <VarDeclaration\n const\n name=\"value\"\n initializer={code` Number(args[++i].trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\")); `}\n />\n <hbr />\n <IfStatement condition={`!Number.isNaN(value)`}>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name}`}>\n {code`options[\"${name}\"]`}\n </Show>\n {code` = value; `}\n </IfStatement>\n </Show>\n </ElseIfClause>\n <hbr />\n </Show>\n </Show>\n <Show when={option.kind === ReflectionKind.boolean}>\n <IfStatement\n condition={`${equalsRegex}.test(${isCaseSensitive ? \"arg\" : '\"-\" + arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'})`}>\n <VarDeclaration\n const\n name=\"value\"\n initializer={code` arg.replace(${equalsRegex}, \"\").trim().replace(/^(\"|')/, \"\").replace(/(\"|')$/, \"\").toLowerCase(); `}\n />\n <hbr />\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name} = `}>\n {code`options[\"${name}\"] = `}\n </Show>\n <BooleanInputParserLogic name=\"value\" />\n </IfStatement>\n <ElseClause>\n <Show\n when={name.includes(\"?\") || name.includes(\"-\")}\n fallback={code`options.${name} = true; `}>\n {code`options[\"${name}\"] = true; `}\n </Show>\n </ElseClause>\n <Show when={Boolean((option as BooleanCommandOption).isNegativeOf)}>\n <hbr />\n <Show\n when={\n (option as BooleanCommandOption).isNegativeOf!.includes(\"?\") ||\n (option as BooleanCommandOption).isNegativeOf!.includes(\"-\")\n }\n fallback={code`options.${(option as BooleanCommandOption).isNegativeOf} = false; `}>\n {code`options[\"${(option as BooleanCommandOption).isNegativeOf}\"] = false; `}\n </Show>\n </Show>\n </Show>\n </>\n );\n}\n\nexport interface OptionsMemberParserConditionProps {\n /**\n * The option name to generate the parser logic for.\n */\n name: string;\n\n /**\n * Aliases for the option, which will also be parsed in the generated code. This will affect how the generated code compares command line arguments to option names and aliases.\n */\n alias?: string[];\n\n /**\n * Whether the command options should be parsed in a case-sensitive manner. This will affect how the generated code compares command line arguments to option names and aliases.\n *\n * @defaultValue false\n */\n isCaseSensitive: boolean;\n}\n\nexport function OptionsMemberParserCondition(\n props: OptionsMemberParserConditionProps\n) {\n const { name, alias: aliasProp, isCaseSensitive } = props;\n\n return (\n <>\n {code`${\n isCaseSensitive\n ? 'arg.startsWith(\"--'\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\").startsWith(\"'\n }${isCaseSensitive ? name : name.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")}=\") || ${\n isCaseSensitive\n ? \"arg\"\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n } === \"${\n isCaseSensitive\n ? name\n : name.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n }\" || ${\n isCaseSensitive\n ? 'arg.startsWith(\"-'\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\").startsWith(\"'\n }${isCaseSensitive ? name : name.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")}=\") || ${\n isCaseSensitive\n ? \"arg\"\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n } === \"${\n isCaseSensitive\n ? name\n : name.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n }\"`}\n <Show when={aliasProp && aliasProp.length > 0}>\n <For each={aliasProp ?? []}>\n {alias =>\n code` || ${\n isCaseSensitive || alias.length === 1\n ? 'arg.startsWith(\"--'\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\").startsWith(\"'\n }${isCaseSensitive || alias.length === 1 ? alias : alias.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")}=\") || ${\n isCaseSensitive || alias.length === 1\n ? \"arg\"\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n } === \"${\n isCaseSensitive || alias.length === 1\n ? alias\n : alias.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n }\" || ${\n isCaseSensitive || alias.length === 1\n ? 'arg.startsWith(\"-'\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\").startsWith(\"'\n }${isCaseSensitive || alias.length === 1 ? alias : alias.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")}=\") || ${\n isCaseSensitive || alias.length === 1\n ? \"arg\"\n : 'arg.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n } === \"${\n isCaseSensitive || alias.length === 1\n ? alias\n : alias.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")\n }\"`\n }\n </For>\n </Show>\n </>\n );\n}\n\nexport function OptionsInterfaceDeclaration(props: { command: CommandTree }) {\n const { command } = props;\n\n const options = computed(() => computedOptions(command));\n\n return (\n <InterfaceDeclaration export name={`${pascalCase(command.name)}Options`}>\n <For each={Object.values(options.value)} hardline>\n {option => <OptionsMember option={option} />}\n </For>\n </InterfaceDeclaration>\n );\n}\n\nexport interface OptionsParserLogicProps {\n /**\n * The command to generate the options parser logic for.\n */\n command: CommandTree;\n\n /**\n * The environment variable prefix to use for options that have an associated environment variable. This prefix will be used in the generated code to access the environment variables (e.g., `env.${envPrefix}_OPTION_NAME`).\n */\n envPrefix: string;\n\n /**\n * Whether the command options should be parsed in a case-sensitive manner. This will affect how the generated code compares command-line arguments to option names and aliases.\n *\n * @defaultValue false\n */\n isCaseSensitive?: boolean;\n}\n\n/**\n * The command options parser logic.\n */\nexport function OptionsParserLogic(props: OptionsParserLogicProps) {\n const { command, envPrefix, isCaseSensitive = false } = props;\n\n const options = computed(() => computedOptions(command));\n\n return (\n <>\n <VarDeclaration\n const\n name=\"options\"\n initializer={code` {\n ${Object.entries(options.value)\n .map(([name, option]) => {\n if (option.kind === ReflectionKind.string) {\n return ` ${name.includes(\"?\") || name.includes(\"-\") ? `\"${name}\"` : `${name}`}: ${\n option.env ? `env.${envPrefix}_${option.env}` : \"\"\n }${\n option.variadic\n ? option.default !== undefined\n ? `${\n option.env ? \" ?? \" : \"\"\n }${JSON.stringify(option.default)}`\n : option.env\n ? \" ?? []\"\n : \"\"\n : option.default !== undefined\n ? `${option.env ? \" ?? \" : \"\"}\"${option.default}\"`\n : \"\"\n }, `;\n } else if (option.kind === ReflectionKind.number) {\n return ` ${name.includes(\"?\") || name.includes(\"-\") ? `\"${name}\"` : `${name}`}: ${\n option.env ? `env.${envPrefix}_${option.env}` : \"\"\n }${\n option.variadic\n ? option.default !== undefined\n ? `${\n option.env ? \" ?? \" : \"\"\n }${JSON.stringify(option.default)}`\n : option.env\n ? \" ?? []\"\n : \"\"\n : option.default !== undefined\n ? `${option.env ? \" ?? \" : \"\"}${option.default}`\n : \"\"\n }, `;\n } else if (option.kind === ReflectionKind.boolean) {\n return ` ${name.includes(\"?\") || name.includes(\"-\") ? `\"${name}\"` : `${name}`}: ${\n option.env ? `env.${envPrefix}_${option.env} ?? ` : \"\"\n }${option.default ? \"true\" : \"false\"},`;\n }\n\n return \"\";\n })\n .join(\"\")}\n } as ${pascalCase(command.name)}Options;`}\n />\n <hbr />\n <hbr />\n {code`for (let i = 0; i < args.slice(${\n command.segments.filter(segment => isDynamicPathSegment(segment)).length\n }).length; i++) { `}\n <hbr />\n <VarDeclaration\n const\n name=\"arg\"\n type=\"string\"\n initializer={code` args[i].length > 3 && args[i].startsWith(\"--\")\n ? \\`--\\${args[i].slice(2).replaceAll(\"-\", \"\")${\n isCaseSensitive\n ? \"\"\n : '.toLowerCase().replaceAll(\"-\", \"\").replaceAll(\"_\", \"\")'\n }}\\`\n : args[i].length > 2 && args[i].startsWith(\"-\")\n ? \\`-\\${args[i].slice(1).replaceAll(\"-\", \"\")}\\`\n : args[i]; `}\n />\n <hbr />\n\n <For each={Object.entries(options.value)} hardline>\n {([name, option], i) => (\n <Show\n when={i === 0}\n fallback={\n <ElseIfClause\n condition={\n <>\n <OptionsMemberParserCondition\n name={name}\n alias={option.alias}\n isCaseSensitive={isCaseSensitive}\n />\n </>\n }>\n <OptionsMemberParserLogic\n name={name}\n option={option}\n isCaseSensitive={isCaseSensitive}\n />\n </ElseIfClause>\n }>\n <IfStatement\n condition={\n <OptionsMemberParserCondition\n name={name}\n alias={option.alias}\n isCaseSensitive={isCaseSensitive}\n />\n }>\n <OptionsMemberParserLogic\n name={name}\n option={option}\n isCaseSensitive={isCaseSensitive}\n />\n </IfStatement>\n </Show>\n )}\n </For>\n\n <hbr />\n {code` } `}\n <hbr />\n </>\n );\n}\n\nexport interface CommandParserLogicProps {\n /**\n * The command to generate the parser logic for.\n */\n command: CommandTree;\n\n /**\n * The environment variable prefix to use for options that have an associated environment variable. This prefix will be used in the generated code to access the environment variables (e.g., `env.${envPrefix}_OPTION_NAME`).\n */\n envPrefix: string;\n\n /**\n * Whether the command options should be parsed in a case-sensitive manner. This will affect how the generated code compares command-line arguments to option names and aliases.\n *\n * @defaultValue false\n */\n isCaseSensitive?: boolean;\n}\n\n/**\n * The command parser logic, which includes parsing dynamic path segments, positional parameters, and options.\n */\nexport function CommandParserLogic(props: CommandParserLogicProps) {\n const { command, envPrefix, isCaseSensitive = false } = props;\n\n return (\n <>\n <DynamicSegmentsParserLogic\n command={command}\n isCaseSensitive={isCaseSensitive}\n />\n <hbr />\n <hbr />\n <OptionsParserLogic\n command={command}\n envPrefix={envPrefix}\n isCaseSensitive={isCaseSensitive}\n />\n <hbr />\n <hbr />\n <ArgumentsParserLogic\n command={command}\n envPrefix={envPrefix}\n isCaseSensitive={isCaseSensitive}\n />\n <hbr />\n <hbr />\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;AA0DA,SAAgBmB,2BACdC,OACA;CACA,MAAM,EAAEC,YAAYD;AAEpB,QAAAE,gBACGpB,KAAG;EAAA,IAACqB,OAAI;AAAA,UAAEF,QAAQG,YAAY,EAAE;;EAAAC,WAC7BC,SAASC,UAAKL,gBACbnB,MAAI;GAAA,IAACyB,OAAI;AAAA,WAAEX,qBAAqBS,QAAQ;;GAAA,IAAAD,WAAA;AAAA,WAAA;KAAAH,gBACtCb,gBAAc;MAAA,OAAA;MAAA,IAEboB,OAAI;AAAA,cAAElB,UAAUK,0BAA0BU,QAAQ,CAAC;;MACnDI,MAAI;MAAA,CAAA;KAAAC,gBAAA,OAAA,EAAA,CAAA;KAAAT,gBAGLhB,aAAW;MACV0B,WAAWhC,IAAI,iBAAiB,IAAI2B,MAAK,WAAY,IAAIA,MAAK;MAAG,IAAAF,WAAA;AAAA,cAChEzB,IAAI,GAAGW,UACNK,0BAA0BU,QAC5B,CAAC,CAAA,UAAW,IAAIC,MAAK;;MAAI,CAAA;KAAAI,gBAAA,OAAA,EAAA,CAAA;KAAAA,gBAAA,OAAA,EAAA,CAAA;KAAA;;GAAA,CAAA;EAK9B,CAAA;;AAsBP,SAAgBE,qBAAqBb,OAAkC;CACrE,MAAM,EAAEC,SAASa,WAAWC,oBAAoBf;AAEhD,QAAAE,gBACGnB,MAAI;EAAA,IAACyB,OAAI;AAAA,UAAEP,QAAQe,aAAaf,QAAQe,UAAUC,SAAS;;EAAC,IAAAZ,WAAA;AAAA,UAAA;IAAAH,gBAC1Db,gBAAc;KAAA,OAAA;KAEboB,MAAI;KACJC,MAAI;KAAA,IACJQ,cAAW;AAAA,aAAEtC,IAAI,0BAA0BqB,QAAQG,SAASa,SAAS,EAAC,+CAAgDE,OAAOC,OAC3HnB,QAAQoB,WAAW,EACrB,CAAC,CACEC,KACCC,WACE,GACER,mBAAmBQ,OAAOd,KAAKQ,WAAW,IACtCM,OAAOd,OACPc,OAAOd,KACJe,aAAa,CACbC,WAAW,KAAK,GAAG,CACnBA,WAAW,KAAK,GAAG,GACzBF,OAAOG,SAASH,OAAOG,MAAMT,SAAS,IAAI,MAAM,KAAKM,OAAOG,OAC3DJ,KAAIK,OACHZ,mBAAmBQ,OAAOd,KAAKQ,WAAW,IACvCU,IACAA,EACGH,aAAa,CACbC,WAAW,KAAK,GAAG,CACnBA,WAAW,KAAK,GAAG,MAAM,MAC5B,QACAV,mBAAmBQ,OAAOd,KAAKQ,WAAW,IACxCU,IACAA,EAAEH,aAAa,CAACC,WAAW,KAAK,GAAG,CAACA,WAAW,KAAK,GAC5D,CAAC,CACAG,KAAK,IAAI,GACf,CACAA,KAAK,IAAI,CAAA,kBACVb,kBACI,KACA,iEAAwD,QACrDd,QAAQG,SAASa,SAAS,EAAC;;KAAG,CAAA;IAAAN,gBAAA,OAAA,EAAA,CAAA;IAAAA,gBAAA,OAAA,EAAA,CAAA;IAAAT,gBAIxCb,gBAAc;KAAA,OAAA;KAEboB,MAAI;KACJC,MAAI;KAAA,IACJQ,cAAW;AAAA,aAAEtC,IAAI,kBACfqB,QAAQG,SAASa,SAAS,EAAC,KACvBhB,QAAQG,SAASa,SAAS,EAAC,0FAA2FE,OAAOC,OACjInB,QAAQoB,WAAW,EACrB,CAAC,CACEC,KACCC,WACE,GACER,mBAAmBQ,OAAOd,KAAKQ,WAAW,IACtCM,OAAOd,OACPc,OAAOd,KACJe,aAAa,CACbC,WAAW,KAAK,GAAG,CACnBA,WAAW,KAAK,GAAG,GACzBF,OAAOG,SAASH,OAAOG,MAAMT,SAAS,IAAI,MAAM,KAAKM,OAAOG,OAC3DJ,KAAIK,OACHZ,mBAAmBQ,OAAOd,KAAKQ,WAAW,IACvCU,IACAA,EACGH,aAAa,CACbC,WAAW,KAAK,GAAG,CACnBA,WAAW,KAAK,GAAG,MAAM,MAC5B,QACAV,mBAAmBQ,OAAOd,KAAKQ,WAAW,IACxCU,IACAA,EAAEH,aAAa,CAACC,WAAW,KAAK,GAAG,CAACA,WAAW,KAAK,GAC5D,CAAC,CACAG,KAAK,IAAI,GACf,CACAA,KAAK,IAAI,CAAA,kBACVb,kBACI,KACA,iEAAwD,QACrDd,QAAQG,SAASa,SAAS,EAAC;;KAAI,CAAA;IAAAN,gBAAA,OAAA,EAAA,CAAA;IAAAA,gBAAA,OAAA,EAAA,CAAA;IAAAT,gBAIzCpB,KAAG;KAAA,IAACqB,OAAI;AAAA,aAAEF,QAAQe,aAAa,EAAE;;KAAEa,UAAQ;KAAAxB,WACxCyB,KAAKvB,UAAK;MAAAL,gBAEPb,gBAAc;OAAA,OAAA;OAAA,IAEboB,OAAI;AAAA,eAAElB,UAAUuC,IAAIrB,KAAK;;OAAA,IACzBC,OAAI;AAAA,eAAE,GACJoB,IAAIC,SAASzC,eAAe0C,UACxB,YACAF,IAAIC,SAASzC,eAAe2C,SAC1B,WACA,YAELH,IAAIC,SAASzC,eAAe4C,UAC3BJ,IAAIC,SAASzC,eAAe2C,WAC9BH,IAAIK,WACA,OACA,KACHL,IAAIM,WAAW,iBAAiB;;OAAI,IACvClB,cAAW;AAAA,eAAA,CAAAhB,gBAENnB,MAAI;SAAA,IAACyB,OAAI;AAAA,iBAAEd,YAAYoC,IAAIO,IAAI;;SAAA,IAAAhC,WAAA;AAAA,iBAC7BzB,IAAI,OAAOkC,UAAS,GAAItB,aAAa8C,OAAOR,IAAIO,IAAI,CAAC,CAAA;;SAAM,CAAA,EAAAnC,gBAE7DnB,MAAI;SAAA,IACHyB,OAAI;AAAA,iBAAEsB,IAAIS,YAAYC;;SAAS,IAC/BC,WAAQ;AAAA,kBACLX,IAAIC,SAASzC,eAAe4C,UAC3BJ,IAAIC,SAASzC,eAAe2C,WAC9BH,IAAIK,WACAvD,IAAI,OACJA,IAAI;;SAAY,IAAAyB,WAAA;AAAA,iBAErByB,IAAIC,SAASzC,eAAe4C,SACzBtD,IAAI,IAAIkD,IAAIS,QAAO,KACnB3D,IAAI,GAAGkD,IAAIS;;SAAS,CAAA,CAAA;;OAAA,CAAA;MAAA5B,gBAAA,OAAA,EAAA,CAAA;MAAAA,gBAAA,OAAA,EAAA,CAAA;MAAAT,gBAO/BhB,aAAW;OACV0B,WAAWhC,IAAI,eAAe2B,MAAK,gCAAiCA,MAAK;OAAmB,IAAAF,WAAA;AAAA,eAAA,CAAAqC,WAC3F9D,IAAI,GAAGW,UAAUuC,IAAIrB,KAAK,CAAA,KAAK,EAAAP,gBAC/BnB,MAAI;SAAA,IACHyB,OAAI;AAAA,iBACFsB,IAAIC,SAASzC,eAAe4C,UAC5BJ,IAAIC,SAASzC,eAAe2C;;SAAM,IAEpCQ,WAAQ;AAAA,iBAAAvC,gBACLJ,yBAAuB,EACtBW,MAAM,oBAAoBF,MAAK,KAAI,CAAA;;SAAA,IAAAF,WAAA;AAAA,iBAAAH,gBAGtCnB,MAAI;WAAA,IACHyB,OAAI;AAAA,oBACDsB,IAAIC,SAASzC,eAAe4C,UAC3BJ,IAAIC,SAASzC,eAAe2C,WAC9BH,IAAIK;;WAAQ,IAEdM,WAAQ;AAAA,mBAAAvC,gBACLnB,MAAI;aAAA,IACHyB,OAAI;AAAA,qBAAEsB,IAAIC,SAASzC,eAAe2C;;aAClCQ,UAAU7D,IAAI,oBAAoB2B,MAAK;aAAKF,UAC3CzB,IAAI,2BAA2B2B,MAAK;aAAM,CAAA;;WAAA,IAAAF,WAAA;AAAA,mBAG9CzB,IAAI,0BACH2B,MAAK,8DAELN,QAAQe,UAAUC,SAASV,MAAK;;WAC2E,CAAA;;SAAA,CAAA,CAAA;;OAAA,CAAA;MAAAI,gBAAA,OAAA,EAAA,CAAA;MAAAA,gBAAA,OAAA,EAAA,CAAA;MAAA;KAOtH,CAAA;IAAA;;EAAA,CAAA;;;;;AAST,SAAgBgC,cAAc,EAAEpB,UAAqC;CACnE,MAAMqB,MAAMrB,OAAOsB,eAAe,OAAOtB,OAAOuB,MAAK;AAErD,QAAA,CAAA5C,gBAEKnB,MAAI;EAAA,IAACyB,OAAI;AAAA,UAAEuC,QAAQxB,OAAOd,KAAK;;EAAA,IAAAJ,WAAA;AAAA,UAAA;IAAAH,gBAC7BnB,MAAI;KAAA,IAACyB,OAAI;AAAA,aAAEe,OAAOQ,SAASzC,eAAe4C;;KAAM,IAAA7B,WAAA;AAAA,aAAAH,gBAC9Cd,iBAAe;OAAA,IACdqB,OAAI;AAAA,eAAEc,OAAOd;;OACRmC;OAAG,IACRlC,OAAI;AAAA,eACDa,OAA+BY,WAAW,aAAa;;OAAQ,IAElEC,WAAQ;AAAA,eAAEb,OAAOa;;OAAQ,CAAA;;KAAA,CAAA;IAAAlC,gBAG5BnB,MAAI;KAAA,IAACyB,OAAI;AAAA,aAAEe,OAAOQ,SAASzC,eAAe2C;;KAAM,IAAA5B,WAAA;AAAA,aAAAH,gBAC9Cd,iBAAe;OAAA,IACdqB,OAAI;AAAA,eAAEc,OAAOd;;OACRmC;OAAG,IACRlC,OAAI;AAAA,eACDa,OAA+BY,WAAW,aAAa;;OAAQ,IAElEC,WAAQ;AAAA,eAAEb,OAAOa;;OAAQ,CAAA;;KAAA,CAAA;IAAAlC,gBAG5BnB,MAAI;KAAA,IAACyB,OAAI;AAAA,aAAEe,OAAOQ,SAASzC,eAAe0C;;KAAO,IAAA3B,WAAA;AAAA,aAAAH,gBAC/Cd,iBAAe;OAAA,IACdqB,OAAI;AAAA,eAAEc,OAAOd;;OACRmC;OACLlC,MAAI;OAAA,IACJ0B,WAAQ;AAAA,eAAEb,OAAOa;;OAAQ,CAAA;;KAAA,CAAA;IAAA;;EAAA,CAAA,CAAA;;;;;AA8BrC,SAAgBY,yBAAyBhD,OAAsC;CAC7E,MAAM,EAAES,MAAMc,QAAQR,oBAAoBf;CAE1C,MAAMiD,cAAc,SAClBlC,mBAAmBN,KAAKQ,WAAW,IAC/BR,OACAA,KAAKe,aAAa,CAACC,WAAW,KAAK,GAAG,CAACA,WAAW,KAAK,GAAG,GAC7DF,OAAOG,SAASH,OAAOG,MAAMT,SAAS,IAAI,MAAM,KAAKM,OAAOG,OAC3DJ,KAAIK,OACHZ,mBAAmBN,KAAKQ,WAAW,IAChCU,IACAA,EAAEH,aAAa,CAACC,WAAW,KAAK,GAAG,CAACA,WAAW,KAAK,GAAG,MAAM,MAC7D,QACAV,mBAAmBN,KAAKQ,WAAW,IACjCU,IACAA,EAAEH,aAAa,CAACC,WAAW,KAAK,GAAG,CAACA,WAAW,KAAK,GAC5D,CAAC,CACAG,KAAK,IAAI,CAAA;AAEZ,QAAA,CAAA1B,gBAEKnB,MAAI;EAAA,IACHyB,OAAI;AAAA,UACFe,OAAOQ,SAASzC,eAAe4C,UAC/BX,OAAOQ,SAASzC,eAAe2C;;EAAM,IAAA5B,WAAA;AAAA,UAAA,CAAAH,gBAEtCnB,MAAI;IAAA,IACHyB,OAAI;AAAA,YAAGe,OAAqDY;;IAAQ,IAAA9B,WAAA;AAAA,YAAA;MAAAH,gBACnEnB,MAAI;OAAA,IACHyB,OAAI;AAAA,eAAEC,KAAKyC,SAAS,IAAI,IAAIzC,KAAKyC,SAAS,IAAI;;OAC9CT,UAAU7D,IAAI,WAAW6B,KAAI;OAAWJ,UACvCzB,IAAI,YAAY6B,KAAI;OAAa,CAAA;MAAAE,gBAAA,OAAA,EAAA,CAAA;MAAAT,gBAGnChB,aAAW;OACV0B,WAAW,GAAGqC,YAAW,QACvBlC,kBACI,QACA,4EAAiE;OACpE,IAAAV,WAAA;AAAA,eAAA;SAAAH,gBACFnB,MAAI;UAAA,IACHyB,OAAI;AAAA,kBAAEC,KAAKyC,SAAS,IAAI,IAAIzC,KAAKyC,SAAS,IAAI;;UAC9CT,UAAU7D,IAAI,WAAW6B,KAAI;UAAQJ,UACpCzB,IAAI,YAAY6B,KAAI;UAAU,CAAA;SAAAP,gBAEhCnB,MAAI;UAAA,IAACyB,OAAI;AAAA,kBAAEe,OAAOQ,SAASzC,eAAe4C;;UAAM7B,UAC9CzB,IAAI,kBAAkBqE,YAAW;UAAwG,CAAA;SAAA/C,gBAE3InB,MAAI;UAAA,IAACyB,OAAI;AAAA,kBAAEe,OAAOQ,SAASzC,eAAe2C;;UAAM5B,UAC9CzB,IAAI,kBAAkBqE,YAAW;UAA0J,CAAA;SAE7LrE,IAAI;SAAK;;OAAA,CAAA;MAAAsB,gBAEXjB,cAAY;OAAC2B,WAAW;OAAqB,IAAAP,WAAA;AAAA,eAAA;SAAAH,gBAC3CnB,MAAI;UAAA,IACHyB,OAAI;AAAA,kBAAEC,KAAKyC,SAAS,IAAI,IAAIzC,KAAKyC,SAAS,IAAI;;UAC9CT,UAAU7D,IAAI,WAAW6B,KAAI;UAAQJ,UACpCzB,IAAI,YAAY6B,KAAI;UAAU,CAAA;SAAAP,gBAEhCnB,MAAI;UAAA,IAACyB,OAAI;AAAA,kBAAEe,OAAOQ,SAASzC,eAAe4C;;UAAM7B,UAC9CzB,IAAI;UAA+G,CAAA;SAAAsB,gBAErHnB,MAAI;UAAA,IAACyB,OAAI;AAAA,kBAAEe,OAAOQ,SAASzC,eAAe2C;;UAAM5B,UAC9CzB,IAAI;UAAiK,CAAA;SAEvKA,IAAI;SAAK;;OAAA,CAAA;MAAA;;IAAA,CAAA,EAAAsB,gBAGbnB,MAAI;IAAA,IACHyB,OAAI;AAAA,YACF,CAAEe,OAAqDY;;IAAQ,IAAA9B,WAAA;AAAA,YAAA;MAAAH,gBAEhEhB,aAAW;OACV0B,WAAW,GAAGqC,YAAW,QAASlC,kBAAkB,QAAQ,4EAAiE;OAAG,IAAAV,WAAA;AAAA,eAAA,CAAAH,gBAC/HnB,MAAI;SAAA,IAACyB,OAAI;AAAA,iBAAEe,OAAOQ,SAASzC,eAAe4C;;SAAM,IAAA7B,WAAA;AAAA,iBAAA,CAAAH,gBAC9CnB,MAAI;WAAA,IACHyB,OAAI;AAAA,mBAAEC,KAAKyC,SAAS,IAAI,IAAIzC,KAAKyC,SAAS,IAAI;;WAC9CT,UAAU7D,IAAI,WAAW6B;WAAMJ,UAC9BzB,IAAI,YAAY6B,KAAI;WAAI,CAAA,EAE1B7B,IAAI,kBAAkBqE,YAAW,4DAA4D;;SAAA,CAAA,EAAA/C,gBAE/FnB,MAAI;SAAA,IAACyB,OAAI;AAAA,iBAAEe,OAAOQ,SAASzC,eAAe2C;;SAAM,IAAA5B,WAAA;AAAA,iBAAA;WAAAH,gBAC9Cb,gBAAc;YAAA,SAAA;YAEboB,MAAI;YACJS,aAAatC,IAAI,uBAAuBqE,YAAW;YAA6D,CAAA;WAAAtC,gBAAA,OAAA,EAAA,CAAA;WAAAT,gBAGjHhB,aAAW;YAAC0B,WAAW;YAAsB,IAAAP,WAAA;AAAA,oBAAA,CAAAH,gBAC3CnB,MAAI;cAAA,IACHyB,OAAI;AAAA,sBAAEC,KAAKyC,SAAS,IAAI,IAAIzC,KAAKyC,SAAS,IAAI;;cAC9CT,UAAU7D,IAAI,WAAW6B;cAAMJ,UAC9BzB,IAAI,YAAY6B,KAAI;cAAI,CAAA,EAE1B7B,IAAI,aAAY;;YAAA,CAAA;WAAA;;SAAA,CAAA,CAAA;;OAAA,CAAA;MAAAsB,gBAItBjB,cAAY;OAAC2B,WAAW;OAAqB,IAAAP,WAAA;AAAA,eAAA,CAAAH,gBAC3CnB,MAAI;SAAA,IAACyB,OAAI;AAAA,iBAAEe,OAAOQ,SAASzC,eAAe4C;;SAAM,IAAA7B,WAAA;AAAA,iBAAA,CAAAH,gBAC9CnB,MAAI;WAAA,IACHyB,OAAI;AAAA,mBAAEC,KAAKyC,SAAS,IAAI,IAAIzC,KAAKyC,SAAS,IAAI;;WAC9CT,UAAU7D,IAAI,WAAW6B;WAAMJ,UAC9BzB,IAAI,YAAY6B,KAAI;WAAI,CAAA,EAE1B7B,IAAI,oEAAmE;;SAAA,CAAA,EAAAsB,gBAEzEnB,MAAI;SAAA,IAACyB,OAAI;AAAA,iBAAEe,OAAOQ,SAASzC,eAAe2C;;SAAM,IAAA5B,WAAA;AAAA,iBAAA;WAAAH,gBAC9Cb,gBAAc;YAAA,SAAA;YAEboB,MAAI;YACJS,aAAatC,IAAI;YAAyE,CAAA;WAAA+B,gBAAA,OAAA,EAAA,CAAA;WAAAT,gBAG3FhB,aAAW;YAAC0B,WAAW;YAAsB,IAAAP,WAAA;AAAA,oBAAA,CAAAH,gBAC3CnB,MAAI;cAAA,IACHyB,OAAI;AAAA,sBAAEC,KAAKyC,SAAS,IAAI,IAAIzC,KAAKyC,SAAS,IAAI;;cAC9CT,UAAU7D,IAAI,WAAW6B;cAAMJ,UAC9BzB,IAAI,YAAY6B,KAAI;cAAI,CAAA,EAE1B7B,IAAI,aAAY;;YAAA,CAAA;WAAA;;SAAA,CAAA,CAAA;;OAAA,CAAA;MAAA+B,gBAAA,OAAA,EAAA,CAAA;MAAA;;IAAA,CAAA,CAAA;;EAAA,CAAA,EAAAT,gBAO1BnB,MAAI;EAAA,IAACyB,OAAI;AAAA,UAAEe,OAAOQ,SAASzC,eAAe0C;;EAAO,IAAA3B,WAAA;AAAA,UAAA;IAAAH,gBAC/ChB,aAAW;KACV0B,WAAW,GAAGqC,YAAW,QAASlC,kBAAkB,QAAQ,4EAAiE;KAAG,IAAAV,WAAA;AAAA,aAAA;OAAAH,gBAC/Hb,gBAAc;QAAA,SAAA;QAEboB,MAAI;QACJS,aAAatC,IAAI,gBAAgBqE,YAAW;QAA0E,CAAA;OAAAtC,gBAAA,OAAA,EAAA,CAAA;OAAAT,gBAGvHnB,MAAI;QAAA,IACHyB,OAAI;AAAA,gBAAEC,KAAKyC,SAAS,IAAI,IAAIzC,KAAKyC,SAAS,IAAI;;QAC9CT,UAAU7D,IAAI,WAAW6B,KAAI;QAAKJ,UACjCzB,IAAI,YAAY6B,KAAI;QAAO,CAAA;OAAAP,gBAE7BJ,yBAAuB,EAACW,MAAI,SAAA,CAAA;OAAA;;KAAA,CAAA;IAAAP,gBAE9BlB,YAAU,EAAA,IAAAqB,WAAA;AAAA,YAAAH,gBACRnB,MAAI;MAAA,IACHyB,OAAI;AAAA,cAAEC,KAAKyC,SAAS,IAAI,IAAIzC,KAAKyC,SAAS,IAAI;;MAC9CT,UAAU7D,IAAI,WAAW6B,KAAI;MAAWJ,UACvCzB,IAAI,YAAY6B,KAAI;MAAa,CAAA;OAAA,CAAA;IAAAP,gBAGrCnB,MAAI;KAAA,IAACyB,OAAI;AAAA,aAAEuC,QAASxB,OAAgC4B,aAAa;;KAAA,IAAA9C,WAAA;AAAA,aAAA,CAAAM,gBAAA,OAAA,EAAA,CAAA,EAAAT,gBAE/DnB,MAAI;OAAA,IACHyB,OAAI;AAAA,eACDe,OAAgC4B,aAAcD,SAAS,IAAI,IAC3D3B,OAAgC4B,aAAcD,SAAS,IAAI;;OAAA,IAE9DT,WAAQ;AAAA,eAAE7D,IAAI,WAAY2C,OAAgC4B,aAAY;;OAAY,IAAA9C,WAAA;AAAA,eACjFzB,IAAI,YAAa2C,OAAgC4B,aAAY;;OAAc,CAAA,CAAA;;KAAA,CAAA;IAAA;;EAAA,CAAA,CAAA;;AA2BxF,SAAgBC,6BACdpD,OACA;CACA,MAAM,EAAES,MAAMiB,OAAO2B,WAAWtC,oBAAoBf;AAEpD,QAAA,CAAA0C,WAEK9D,IAAI,GACHmC,kBACI,wBACA,oFACHA,kBAAkBN,OAAOA,KAAKe,aAAa,CAACC,WAAW,KAAK,GAAG,CAACA,WAAW,KAAK,GAAG,CAAA,SACpFV,kBACI,QACA,oEAA2D,QAE/DA,kBACIN,OACAA,KAAKe,aAAa,CAACC,WAAW,KAAK,GAAG,CAACA,WAAW,KAAK,GAAG,CAAA,OAE9DV,kBACI,uBACA,oFACHA,kBAAkBN,OAAOA,KAAKe,aAAa,CAACC,WAAW,KAAK,GAAG,CAACA,WAAW,KAAK,GAAG,CAAA,SACpFV,kBACI,QACA,oEAA2D,QAE/DA,kBACIN,OACAA,KAAKe,aAAa,CAACC,WAAW,KAAK,GAAG,CAACA,WAAW,KAAK,GAAG,CAAA,GAC7D,EAAAvB,gBACFnB,MAAI;EAAA,IAACyB,OAAI;AAAA,UAAE6C,aAAaA,UAAUpC,SAAS;;EAAC,IAAAZ,WAAA;AAAA,UAAAH,gBAC1CpB,KAAG;IAACqB,MAAMkD,aAAa,EAAE;IAAAhD,WACvBqB,UACC9C,IAAI,OACFmC,mBAAmBW,MAAMT,WAAW,IAChC,wBACA,oFACHF,mBAAmBW,MAAMT,WAAW,IAAIS,QAAQA,MAAMF,aAAa,CAACC,WAAW,KAAK,GAAG,CAACA,WAAW,KAAK,GAAG,CAAA,SAC5GV,mBAAmBW,MAAMT,WAAW,IAChC,QACA,oEAA2D,QAE/DF,mBAAmBW,MAAMT,WAAW,IAChCS,QACAA,MAAMF,aAAa,CAACC,WAAW,KAAK,GAAG,CAACA,WAAW,KAAK,GAAG,CAAA,OAE/DV,mBAAmBW,MAAMT,WAAW,IAChC,uBACA,oFACHF,mBAAmBW,MAAMT,WAAW,IAAIS,QAAQA,MAAMF,aAAa,CAACC,WAAW,KAAK,GAAG,CAACA,WAAW,KAAK,GAAG,CAAA,SAC5GV,mBAAmBW,MAAMT,WAAW,IAChC,QACA,oEAA2D,QAE/DF,mBAAmBW,MAAMT,WAAW,IAChCS,QACAA,MAAMF,aAAa,CAACC,WAAW,KAAK,GAAG,CAACA,WAAW,KAAK,GAAG,CAAA;IAC9D,CAAA;;EAAA,CAAA,CAAA;;AAQf,SAAgB6B,4BAA4BtD,OAAiC;CAC3E,MAAM,EAAEC,YAAYD;CAEpB,MAAMqB,UAAUxC,eAAec,gBAAgBM,QAAQ,CAAC;AAExD,QAAAC,gBACGf,sBAAoB;EAAA,UAAA;EAAA,IAAQsB,OAAI;AAAA,UAAE,GAAGhB,WAAWQ,QAAQQ,KAAK,CAAA;;EAAS,IAAAJ,WAAA;AAAA,UAAAH,gBACpEpB,KAAG;IAAA,IAACqB,OAAI;AAAA,YAAEgB,OAAOC,OAAOC,QAAQkC,MAAM;;IAAE1B,UAAQ;IAAAxB,WAC9CkB,WAAMrB,gBAAKyC,eAAa,EAASpB,QAAM,CAAA;IAAI,CAAA;;EAAA,CAAA;;;;;AA4BpD,SAAgBiC,mBAAmBxD,OAAgC;CACjE,MAAM,EAAEC,SAASa,WAAWC,kBAAkB,UAAUf;CAExD,MAAMqB,UAAUxC,eAAec,gBAAgBM,QAAQ,CAAC;AAExD,QAAA;EAAAC,gBAEKb,gBAAc;GAAA,SAAA;GAEboB,MAAI;GAAA,IACJS,cAAW;AAAA,WAAEtC,IAAI;YACbuC,OAAOsC,QAAQpC,QAAQkC,MAAM,CAC5BjC,KAAK,CAACb,MAAMc,YAAY;AACvB,SAAIA,OAAOQ,SAASzC,eAAe4C,OACjC,QAAO,IAAIzB,KAAKyC,SAAS,IAAI,IAAIzC,KAAKyC,SAAS,IAAI,GAAG,IAAIzC,KAAI,KAAM,GAAGA,OAAM,IAC3Ec,OAAOc,MAAM,OAAOvB,UAAS,GAAIS,OAAOc,QAAQ,KAEhDd,OAAOY,WACHZ,OAAOgB,YAAYC,SACjB,GACEjB,OAAOc,MAAM,SAAS,KACrBqB,KAAKC,UAAUpC,OAAOgB,QAAQ,KACjChB,OAAOc,MACL,WACA,KACJd,OAAOgB,YAAYC,SACjB,GAAGjB,OAAOc,MAAM,SAAS,GAAE,GAAId,OAAOgB,QAAO,KAC7C,GAAE;cAEDhB,OAAOQ,SAASzC,eAAe2C,OACxC,QAAO,IAAIxB,KAAKyC,SAAS,IAAI,IAAIzC,KAAKyC,SAAS,IAAI,GAAG,IAAIzC,KAAI,KAAM,GAAGA,OAAM,IAC3Ec,OAAOc,MAAM,OAAOvB,UAAS,GAAIS,OAAOc,QAAQ,KAEhDd,OAAOY,WACHZ,OAAOgB,YAAYC,SACjB,GACEjB,OAAOc,MAAM,SAAS,KACrBqB,KAAKC,UAAUpC,OAAOgB,QAAQ,KACjChB,OAAOc,MACL,WACA,KACJd,OAAOgB,YAAYC,SACjB,GAAGjB,OAAOc,MAAM,SAAS,KAAKd,OAAOgB,YACrC,GAAE;cAEDhB,OAAOQ,SAASzC,eAAe0C,QACxC,QAAO,IAAIvB,KAAKyC,SAAS,IAAI,IAAIzC,KAAKyC,SAAS,IAAI,GAAG,IAAIzC,KAAI,KAAM,GAAGA,OAAM,IAC3Ec,OAAOc,MAAM,OAAOvB,UAAS,GAAIS,OAAOc,IAAG,QAAS,KACnDd,OAAOgB,UAAU,SAAS,QAAO;AAGtC,YAAO;MACP,CACDX,KAAK,GAAG,CAAA;iBACJnC,WAAWQ,QAAQQ,KAAK,CAAA;;GAAU,CAAA;EAAAE,gBAAA,OAAA,EAAA,CAAA;EAAAA,gBAAA,OAAA,EAAA,CAAA;EAAA+B,WAI5C9D,IAAI,kCACHqB,QAAQG,SAASwD,QAAOtD,YAAWT,qBAAqBS,QAAQ,CAAC,CAACW,OAAM,mBACvD;EAAAN,gBAAA,OAAA,EAAA,CAAA;EAAAT,gBAElBb,gBAAc;GAAA,SAAA;GAEboB,MAAI;GACJC,MAAI;GACJQ,aAAatC,IAAI;yDAEbmC,kBACI,KACA,iEAAwD;;;;GAIlD,CAAA;EAAAJ,gBAAA,OAAA,EAAA,CAAA;EAAAT,gBAIfpB,KAAG;GAAA,IAACqB,OAAI;AAAA,WAAEgB,OAAOsC,QAAQpC,QAAQkC,MAAM;;GAAE1B,UAAQ;GAAAxB,WAC9C,CAACI,MAAMc,SAASsC,MAAC3D,gBAChBnB,MAAI;IACHyB,MAAMqD,MAAM;IAAC,IACbpB,WAAQ;AAAA,YAAAvC,gBACLjB,cAAY;MAAA,IACX2B,YAAS;AAAA,cAAA,CAAAV,gBAEJkD,8BAA4B;QACrB3C;QAAI,IACViB,QAAK;AAAA,gBAAEH,OAAOG;;QACGX;QAAe,CAAA,CAAA;;MAAA,IAAAV,WAAA;AAAA,cAAAH,gBAIrC8C,0BAAwB;QACjBvC;QACEc;QACSR;QAAe,CAAA;;MAAA,CAAA;;IAAA,IAAAV,WAAA;AAAA,YAAAH,gBAIrChB,aAAW;MAAA,IACV0B,YAAS;AAAA,cAAAV,gBACNkD,8BAA4B;QACrB3C;QAAI,IACViB,QAAK;AAAA,gBAAEH,OAAOG;;QACGX;QAAe,CAAA;;MAAA,IAAAV,WAAA;AAAA,cAAAH,gBAGnC8C,0BAAwB;QACjBvC;QACEc;QACSR;QAAe,CAAA;;MAAA,CAAA;;IAAA,CAAA;GAIvC,CAAA;EAAAJ,gBAAA,OAAA,EAAA,CAAA;EAIF/B,IAAI;EAAK+B,gBAAA,OAAA,EAAA,CAAA;EAAA;;;;;AA4BhB,SAAgBmD,mBAAmB9D,OAAgC;CACjE,MAAM,EAAEC,SAASa,WAAWC,kBAAkB,UAAUf;AAExD,QAAA;EAAAE,gBAEKH,4BAA0B;GAChBE;GACQc;GAAe,CAAA;EAAAJ,gBAAA,OAAA,EAAA,CAAA;EAAAA,gBAAA,OAAA,EAAA,CAAA;EAAAT,gBAIjCsD,oBAAkB;GACRvD;GACEa;GACMC;GAAe,CAAA;EAAAJ,gBAAA,OAAA,EAAA,CAAA;EAAAA,gBAAA,OAAA,EAAA,CAAA;EAAAT,gBAIjCW,sBAAoB;GACVZ;GACEa;GACMC;GAAe,CAAA;EAAAJ,gBAAA,OAAA,EAAA,CAAA;EAAAA,gBAAA,OAAA,EAAA,CAAA;EAAA"}
@@ -1,5 +1,5 @@
1
1
  import { CommandTree } from "../types/command.cjs";
2
- import * as _alloy_js_core11 from "@alloy-js/core";
2
+ import * as _alloy_js_core4 from "@alloy-js/core";
3
3
 
4
4
  //#region src/components/usage.d.ts
5
5
  interface UsageProps {
@@ -22,7 +22,7 @@ interface UsageProps {
22
22
  /**
23
23
  * A component that generates the usage display for a command.
24
24
  */
25
- declare function Usage(props: UsageProps): _alloy_js_core11.Children;
25
+ declare function Usage(props: UsageProps): _alloy_js_core4.Children;
26
26
  //#endregion
27
27
  export { Usage, UsageProps };
28
28
  //# sourceMappingURL=usage.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"usage.d.cts","names":[],"sources":["../../src/components/usage.tsx"],"sourcesContent":[],"mappings":";;;;UA2BiB,UAAA;;;AAAjB;EAuBgB,OAAA,EAnBL,WAmBkB;;;;;;;;;;;;;;;;iBAAb,KAAA,QAAa,aAAU,gBAAA,CAAA"}
1
+ {"version":3,"file":"usage.d.cts","names":[],"sources":["../../src/components/usage.tsx"],"sourcesContent":[],"mappings":";;;;UA2BiB,UAAA;;;AAAjB;EAuBgB,OAAA,EAnBL,WAmBkB;;;;;;;;;;;;;;;;iBAAb,KAAA,QAAa,aAAU,eAAA,CAAA"}
@@ -20,28 +20,30 @@ let powerlines_lib_utilities_resolve = require("powerlines/lib/utilities/resolve
20
20
  /**
21
21
  * Resolves the description for a command option based on its reflection.
22
22
  *
23
+ * @param name - The name of the command option.
23
24
  * @param kind - The reflection kind of the command option.
24
25
  * @param optional - Whether the command option is optional.
25
- * @param name - The name of the command option.
26
+ * @param variadic - Whether the command option is variadic (i.e., an array).
26
27
  * @param title - The title of the command option, if any.
27
28
  * @param defaultValue - The default value of the command option, if any.
28
29
  * @returns The resolved description for the command option.
29
30
  */
30
- function resolveCommandOptionDescription(kind, optional, name, title, defaultValue) {
31
- return `A${optional && !defaultValue ? "n optional" : ""} ${kind === __powerlines_deepkit_vendor_type.ReflectionKind.boolean ? "flag provided via the command-line" : "command-line option"} that allows the user to ${kind === __powerlines_deepkit_vendor_type.ReflectionKind.boolean ? "set the" : kind === __powerlines_deepkit_vendor_type.ReflectionKind.array ? "specify custom" : "specify a custom"} ${title?.trim() || (0, __stryke_string_format_title_case.titleCase)(name)} ${kind === __powerlines_deepkit_vendor_type.ReflectionKind.boolean ? "indicator" : `${kind === __powerlines_deepkit_vendor_type.ReflectionKind.number ? "numeric" : "string"} value${kind === __powerlines_deepkit_vendor_type.ReflectionKind.array ? "s" : ""}`} that will be used in the application.`;
31
+ function resolveCommandOptionDescription(name, kind, optional = false, variadic = false, title, defaultValue) {
32
+ return `A${optional && !defaultValue ? "n optional" : ""} command line ${kind === __powerlines_deepkit_vendor_type.ReflectionKind.boolean ? "flag" : "option"} that allows the user to ${kind === __powerlines_deepkit_vendor_type.ReflectionKind.boolean ? "set the" : variadic ? "specify custom" : "specify a custom"} ${title?.trim() || (0, __stryke_string_format_title_case.titleCase)(name)} ${kind === __powerlines_deepkit_vendor_type.ReflectionKind.boolean ? "indicator" : `${kind === __powerlines_deepkit_vendor_type.ReflectionKind.number ? "numeric" : "string"} value${variadic ? "s" : ""}`}.`;
32
33
  }
33
34
  /**
34
- * Resolves the description for a command parameter based on its reflection.
35
+ * Resolves the description for a command argument based on its reflection.
35
36
  *
36
- * @param kind - The reflection kind of the command parameter.
37
- * @param optional - Whether the command parameter is optional.
38
- * @param name - The name of the command parameter.
39
- * @param title - The title of the command parameter, if any.
40
- * @param defaultValue - The default value of the command parameter, if any.
41
- * @returns The resolved description for the command parameter.
37
+ * @param name - The name of the command argument.
38
+ * @param kind - The reflection kind of the command argument.
39
+ * @param optional - Whether the command argument is optional.
40
+ * @param variadic - Whether the command argument is variadic (i.e., an array).
41
+ * @param title - The title of the command argument, if any.
42
+ * @param defaultValue - The default value of the command argument, if any.
43
+ * @returns The resolved description for the command argument.
42
44
  */
43
- function resolveCommandParameterDescription(kind, optional, name, title, defaultValue) {
44
- return `A${optional && !defaultValue ? "n optional" : ""} command-line positional parameter that allows the user to ${kind === __powerlines_deepkit_vendor_type.ReflectionKind.boolean ? "set the" : kind === __powerlines_deepkit_vendor_type.ReflectionKind.array ? "specify custom" : "specify a custom"} ${title?.trim() || (0, __stryke_string_format_title_case.titleCase)(name)} ${kind === __powerlines_deepkit_vendor_type.ReflectionKind.boolean ? "indicator" : `${kind === __powerlines_deepkit_vendor_type.ReflectionKind.number ? "numeric" : "string"} value${kind === __powerlines_deepkit_vendor_type.ReflectionKind.array ? "s" : ""}`} that will be used in the application.`;
45
+ function resolveCommandArgumentDescription(name, kind, optional = false, variadic = false, title, defaultValue) {
46
+ return `An${optional && !defaultValue ? " optional" : ""} argument that allows the user to ${kind === __powerlines_deepkit_vendor_type.ReflectionKind.boolean ? "set the" : variadic ? "specify custom" : "specify a custom"} ${title?.trim() || (0, __stryke_string_format_title_case.titleCase)(name)} ${kind === __powerlines_deepkit_vendor_type.ReflectionKind.boolean ? "indicator" : `${kind === __powerlines_deepkit_vendor_type.ReflectionKind.number ? "numeric" : "string"} value${variadic ? "s" : ""}`}.`;
45
47
  }
46
48
  function resolveCommandId(context, file) {
47
49
  return (0, __stryke_path_replace.replacePath)((0, __stryke_path_file_path_fns.findFilePath)(file), context.commandsPath).split("/").filter((p) => Boolean(p) && !require_plugin_utils_context_helpers.isDynamicPathSegment(p)).join("/").replaceAll(/^\/+/g, "").replaceAll(/\/+$/g, "").replaceAll("/", "-");
@@ -83,7 +85,7 @@ function extractCommandOption(command, reflection) {
83
85
  name: reflection.getNameAsString(),
84
86
  alias: reflection.getTags().alias ?? [],
85
87
  title: reflection.getTags().title?.trim() || (0, __stryke_string_format_title_case.titleCase)(reflection.getNameAsString()),
86
- description: reflection.getDescription() || resolveCommandOptionDescription(reflection.getKind(), reflection.isOptional(), reflection.getNameAsString(), reflection.getTags().title, reflection.getDefaultValue()),
88
+ description: reflection.getDescription() || resolveCommandOptionDescription(reflection.getNameAsString(), reflection.getKind(), reflection.isOptional(), reflection.isArray(), reflection.getTags().title, reflection.getDefaultValue()),
87
89
  env: (0, __stryke_string_format_constant_case.constantCase)(reflection.getNameAsString()),
88
90
  kind: type.kind,
89
91
  optional: reflection.isOptional(),
@@ -107,23 +109,24 @@ function extractCommandOption(command, reflection) {
107
109
  */
108
110
  function extractCommandArgument(command, reflection) {
109
111
  const type = reflection.getType();
110
- if (type.kind !== __powerlines_deepkit_vendor_type.ReflectionKind.string && type.kind !== __powerlines_deepkit_vendor_type.ReflectionKind.number && type.kind !== __powerlines_deepkit_vendor_type.ReflectionKind.boolean && !(type.kind === __powerlines_deepkit_vendor_type.ReflectionKind.array && (type.type.kind === __powerlines_deepkit_vendor_type.ReflectionKind.string || type.type.kind === __powerlines_deepkit_vendor_type.ReflectionKind.number))) throw new Error(`Unsupported type for positional parameter "${reflection.getName()}" in command "${command.name}". Only string types (or an array of strings) are supported, received ${(0, __powerlines_deepkit_vendor_type.stringifyType)(type).trim().replaceAll(" | ", ", or ")}.`);
111
- const option = {
112
+ if (type.kind !== __powerlines_deepkit_vendor_type.ReflectionKind.string && type.kind !== __powerlines_deepkit_vendor_type.ReflectionKind.number && type.kind !== __powerlines_deepkit_vendor_type.ReflectionKind.boolean && !(type.kind === __powerlines_deepkit_vendor_type.ReflectionKind.array && (type.type.kind === __powerlines_deepkit_vendor_type.ReflectionKind.string || type.type.kind === __powerlines_deepkit_vendor_type.ReflectionKind.number))) throw new Error(`Unsupported type for argument "${reflection.getName()}" in command "${command.name}". Only string types (or an array of strings) are supported, received ${(0, __powerlines_deepkit_vendor_type.stringifyType)(type).trim().replaceAll(" | ", ", or ")}.`);
113
+ const argument = {
112
114
  name: reflection.getName(),
115
+ alias: reflection.getAlias(),
113
116
  kind: type.kind,
114
117
  title: (0, __stryke_string_format_title_case.titleCase)(reflection.getName()),
115
- description: reflection.parameter.description || resolveCommandParameterDescription(type.kind, !!reflection.isOptional(), reflection.getName(), (0, __stryke_string_format_title_case.titleCase)(reflection.getName()), reflection.getDefaultValue()),
118
+ description: reflection.parameter.description || resolveCommandArgumentDescription(reflection.getName(), type.kind === __powerlines_deepkit_vendor_type.ReflectionKind.array ? type.type.kind : type.kind, reflection.isOptional(), type.kind === __powerlines_deepkit_vendor_type.ReflectionKind.array, (0, __stryke_string_format_title_case.titleCase)(reflection.getName()), reflection.getDefaultValue()),
116
119
  env: (0, __stryke_string_format_constant_case.constantCase)(reflection.getName()),
117
120
  optional: reflection.isOptional(),
118
121
  default: reflection.getDefaultValue(),
119
122
  reflection
120
123
  };
121
124
  if (type.kind === __powerlines_deepkit_vendor_type.ReflectionKind.array) if (type.type.kind === __powerlines_deepkit_vendor_type.ReflectionKind.string || type.type.kind === __powerlines_deepkit_vendor_type.ReflectionKind.number) {
122
- option.variadic = true;
123
- option.kind = type.type.kind;
124
- } else throw new Error(`Unsupported array type for positional parameter "${reflection.getName()}" in command "${command.name}". Only string[] and number[] are supported, received ${(0, __powerlines_deepkit_vendor_type.stringifyType)(type).trim().replaceAll(" | ", ", or ")}.`);
125
- else if (type.kind !== __powerlines_deepkit_vendor_type.ReflectionKind.boolean && type.kind !== __powerlines_deepkit_vendor_type.ReflectionKind.string && type.kind !== __powerlines_deepkit_vendor_type.ReflectionKind.number) throw new Error(`Unsupported type for positional parameter "${reflection.getName()}" in command "${command.name}". Only string, number, boolean, string[] and number[] are supported, received ${(0, __powerlines_deepkit_vendor_type.stringifyType)(type).trim().replaceAll(" | ", ", or ")}.`);
126
- return option;
125
+ argument.variadic = true;
126
+ argument.kind = type.type.kind;
127
+ } else throw new Error(`Unsupported array type for argument "${reflection.getName()}" in command "${command.name}". Only string[] and number[] are supported, received ${(0, __powerlines_deepkit_vendor_type.stringifyType)(type).trim().replaceAll(" | ", ", or ")}.`);
128
+ else if (type.kind !== __powerlines_deepkit_vendor_type.ReflectionKind.boolean && type.kind !== __powerlines_deepkit_vendor_type.ReflectionKind.string && type.kind !== __powerlines_deepkit_vendor_type.ReflectionKind.number) throw new Error(`Unsupported type for argument "${reflection.getName()}" in command "${command.name}". Only string, number, boolean, string[] and number[] are supported, received ${(0, __powerlines_deepkit_vendor_type.stringifyType)(type).trim().replaceAll(" | ", ", or ")}.`);
129
+ return argument;
127
130
  }
128
131
  /**
129
132
  * Reflects the command tree for a given command input.
@@ -134,7 +137,7 @@ function extractCommandArgument(command, reflection) {
134
137
  * @returns The reflected command tree.
135
138
  */
136
139
  async function reflectCommandTree(context, command, parent) {
137
- const title = command.title || `${parent?.title ? `${parent.isVirtual ? parent.title.replace(/ Commands$/, "") : parent.title} - ` : ""}${(0, __stryke_string_format_title_case.titleCase)(command.name)}${command.isVirtual ? " Commands" : ""}`;
140
+ const title = command.title || `${parent?.title ? `${parent.isVirtual ? parent.title.replace(/(?:c|C)ommands?$/, "").trim() : parent.title} - ` : ""}${(0, __stryke_string_format_title_case.titleCase)(command.name)}${command.isVirtual ? " Commands" : ""}`;
138
141
  const tree = {
139
142
  alias: [],
140
143
  icon: parent?.icon,
@@ -161,7 +164,7 @@ async function reflectCommandTree(context, command, parent) {
161
164
  const type = (0, __powerlines_deepkit_vendor_type.reflect)(resolved);
162
165
  if (type.kind !== __powerlines_deepkit_vendor_type.ReflectionKind.function) throw new Error(`The command entry file "${command.entry.input.file}" does not export a valid function.`);
163
166
  tree.reflection = new __powerlines_deepkit_vendor_type.ReflectionFunction(type);
164
- tree.description ??= command.description || type.description || `The ${tree.title} executable command line interface.`;
167
+ tree.description ??= command.description || type.description || `The ${tree.title.replace(/(?:c|C)ommands?$/, "").trim()} executable command line interface.`;
165
168
  const parameters = tree.reflection.getParameters();
166
169
  if (parameters.length > 0 && parameters[0]) {
167
170
  if (parameters[0].type.kind === __powerlines_deepkit_vendor_type.ReflectionKind.objectLiteral || parameters[0].type.kind === __powerlines_deepkit_vendor_type.ReflectionKind.class) {
@@ -169,8 +172,15 @@ async function reflectCommandTree(context, command, parent) {
169
172
  for (const propertyReflection of optionsReflection.getProperties()) tree.options[propertyReflection.getNameAsString()] = extractCommandOption(command, propertyReflection);
170
173
  } else throw new Error(`The first parameter of the command handler function in "${command.entry.input.file}" must be an object literal or class type representing the command options.`);
171
174
  tree.arguments = parameters.slice(1).map((arg) => extractCommandArgument(command, arg));
175
+ tree.arguments.forEach((argument, index) => {
176
+ const found = tree.arguments.findIndex((arg) => arg.name === argument.name);
177
+ if (found !== -1 && found !== index || tree.segments.some((segment) => require_plugin_utils_context_helpers.isDynamicPathSegment(segment) && require_plugin_utils_context_helpers.getDynamicPathSegmentName(segment) === argument.name)) {
178
+ argument.name += `_${tree.segments.filter((segment) => require_plugin_utils_context_helpers.isDynamicPathSegment(segment) && require_plugin_utils_context_helpers.getDynamicPathSegmentName(segment).replace(/_\d+$/, "") === argument.name).length + tree.arguments.filter((arg) => arg.name.replace(/_\d+$/, "") === argument.name).length}`;
179
+ argument.env = (0, __stryke_string_format_constant_case.constantCase)(argument.name);
180
+ }
181
+ });
172
182
  }
173
- } else tree.description ??= `A collection of available ${tree.title || (0, __stryke_string_format_title_case.titleCase)(tree.name)} commands that are included in the ${require_plugin_utils_context_helpers.getAppTitle(context)} command line application.`;
183
+ } else tree.description ??= `A collection of available ${tree.title.replace(/(?:c|C)ommands?$/, "").trim() || (0, __stryke_string_format_title_case.titleCase)(tree.name)} commands that are included in the ${require_plugin_utils_context_helpers.getAppTitle(context)} command line application.`;
174
184
  if (context.env) {
175
185
  if ((0, __stryke_type_checks_is_set_object.isSetObject)(tree.options)) Object.values(tree.options).filter((option) => option.env !== false).forEach((option) => {
176
186
  context.env.types.env.addProperty({
@@ -186,13 +196,13 @@ async function reflectCommandTree(context, command, parent) {
186
196
  tags: {
187
197
  ...option.reflection?.getTags(),
188
198
  title: option.title,
189
- alias: option.alias.filter((alias) => alias.length > 0).map((alias) => (0, __stryke_string_format_constant_case.constantCase)(alias)),
199
+ alias: option.alias.filter((alias) => alias.length > 1).map((alias) => (0, __stryke_string_format_constant_case.constantCase)(alias)),
190
200
  domain: "cli"
191
201
  }
192
202
  });
193
203
  });
194
- Object.values(tree.arguments).filter((arg) => arg.env !== false).forEach((arg) => context.env.types.env.addProperty({
195
- name: (0, __stryke_string_format_constant_case.constantCase)(arg.name),
204
+ tree.arguments.filter((arg) => arg.env !== false).forEach((arg) => context.env.types.env.addProperty({
205
+ name: arg.env,
196
206
  optional: arg.optional ? true : void 0,
197
207
  description: arg.description,
198
208
  visibility: __powerlines_deepkit_vendor_type.ReflectionVisibility.public,
@@ -200,6 +210,7 @@ async function reflectCommandTree(context, command, parent) {
200
210
  default: arg.default,
201
211
  tags: {
202
212
  ...arg.reflection.getTags(),
213
+ alias: arg.alias.filter((alias) => alias.length > 1).map((alias) => (0, __stryke_string_format_constant_case.constantCase)(alias)),
203
214
  domain: "cli"
204
215
  }
205
216
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"resolve-command.cjs","names":["esbuildPlugin","reflect","ReflectionClass","ReflectionFunction","ReflectionKind","ReflectionVisibility","stringifyType","toArray","appendPath","commonPath","findFilePath","findFolderName","stripStars","replacePath","resolveParentPath","constantCase","titleCase","isSetObject","isSetString","resolveModule","getAppTitle","getDynamicPathSegmentName","isDynamicPathSegment","isPathSegmentGroup","getDefaultOptions","resolveCommandOptionDescription","kind","optional","name","title","defaultValue","boolean","array","trim","number","resolveCommandParameterDescription","resolveCommandId","context","file","commandsPath","split","filter","p","Boolean","join","replaceAll","resolveCommandName","path","requireExtension","resolveCommandPath","resolveCommandDynamicPathSegments","map","findCommandsRoot","config","entry","projectRoot","workspaceConfig","workspaceRoot","Array","isArray","length","sourceRoot","extractCommandOption","command","reflection","type","getType","option","getNameAsString","alias","getTags","description","getDescription","getKind","isOptional","getDefaultValue","env","default","variadic","string","Error","extractCommandArgument","getName","parameter","reflectCommandTree","parent","isVirtual","replace","tree","icon","options","arguments","children","input","fs","existsSync","debug","id","resolved","plugins","reflectionLevel","metadata","function","parameters","getParameters","objectLiteral","class","optionsReflection","from","propertyReflection","getProperties","slice","arg","Object","values","forEach","types","addProperty","undefined","visibility","public","tags","domain","inputs","segments","segment","every","value","index"],"sources":["../../src/helpers/resolve-command.ts"],"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 { esbuildPlugin } from \"@powerlines/deepkit/esbuild-plugin\";\nimport type {\n ReflectionParameter,\n ReflectionProperty,\n TypeArray\n} from \"@powerlines/deepkit/vendor/type\";\nimport {\n reflect,\n ReflectionClass,\n ReflectionFunction,\n ReflectionKind,\n ReflectionVisibility,\n stringifyType\n} from \"@powerlines/deepkit/vendor/type\";\nimport { toArray } from \"@stryke/convert/to-array\";\nimport { appendPath } from \"@stryke/path/append\";\nimport { commonPath } from \"@stryke/path/common\";\nimport { findFilePath, findFolderName } from \"@stryke/path/file-path-fns\";\nimport { stripStars } from \"@stryke/path/normalize\";\nimport { replacePath } from \"@stryke/path/replace\";\nimport { resolveParentPath } from \"@stryke/path/resolve-parent-path\";\nimport { constantCase } from \"@stryke/string-format/constant-case\";\nimport { titleCase } from \"@stryke/string-format/title-case\";\nimport { isSetObject } from \"@stryke/type-checks/is-set-object\";\nimport { isSetString } from \"@stryke/type-checks/is-set-string\";\nimport { resolveModule } from \"powerlines/lib/utilities/resolve\";\nimport {\n getAppTitle,\n getDynamicPathSegmentName,\n isDynamicPathSegment,\n isPathSegmentGroup\n} from \"../plugin-utils/context-helpers\";\nimport type {\n CommandArgument,\n CommandInput,\n CommandModule,\n CommandOption,\n CommandTree,\n NumberCommandArgument,\n NumberCommandOption,\n StringCommandArgument,\n StringCommandOption\n} from \"../types/command\";\nimport type { Context } from \"../types/context\";\nimport { getDefaultOptions } from \"./utilities\";\n\n/**\n * Resolves the description for a command option based on its reflection.\n *\n * @param kind - The reflection kind of the command option.\n * @param optional - Whether the command option is optional.\n * @param name - The name of the command option.\n * @param title - The title of the command option, if any.\n * @param defaultValue - The default value of the command option, if any.\n * @returns The resolved description for the command option.\n */\nexport function resolveCommandOptionDescription(\n kind: ReflectionKind,\n optional: boolean,\n name: string,\n title?: string,\n defaultValue?: any\n): string {\n return `A${optional && !defaultValue ? \"n optional\" : \"\"} ${\n kind === ReflectionKind.boolean\n ? \"flag provided via the command-line\"\n : \"command-line option\"\n } that allows the user to ${\n kind === ReflectionKind.boolean\n ? \"set the\"\n : kind === ReflectionKind.array\n ? \"specify custom\"\n : \"specify a custom\"\n } ${title?.trim() || titleCase(name)} ${\n kind === ReflectionKind.boolean\n ? \"indicator\"\n : `${kind === ReflectionKind.number ? \"numeric\" : \"string\"} value${\n kind === ReflectionKind.array ? \"s\" : \"\"\n }`\n } that will be used in the application.`;\n}\n\n/**\n * Resolves the description for a command parameter based on its reflection.\n *\n * @param kind - The reflection kind of the command parameter.\n * @param optional - Whether the command parameter is optional.\n * @param name - The name of the command parameter.\n * @param title - The title of the command parameter, if any.\n * @param defaultValue - The default value of the command parameter, if any.\n * @returns The resolved description for the command parameter.\n */\nexport function resolveCommandParameterDescription(\n kind: ReflectionKind,\n optional: boolean,\n name: string,\n title?: string,\n defaultValue?: any\n): string {\n return `A${optional && !defaultValue ? \"n optional\" : \"\"} command-line positional parameter that allows the user to ${\n kind === ReflectionKind.boolean\n ? \"set the\"\n : kind === ReflectionKind.array\n ? \"specify custom\"\n : \"specify a custom\"\n } ${title?.trim() || titleCase(name)} ${\n kind === ReflectionKind.boolean\n ? \"indicator\"\n : `${kind === ReflectionKind.number ? \"numeric\" : \"string\"} value${\n kind === ReflectionKind.array ? \"s\" : \"\"\n }`\n } that will be used in the application.`;\n}\n\nexport function resolveCommandId(context: Context, file: string): string {\n return replacePath(findFilePath(file), context.commandsPath)\n .split(\"/\")\n .filter(p => Boolean(p) && !isDynamicPathSegment(p))\n .join(\"/\")\n .replaceAll(/^\\/+/g, \"\")\n .replaceAll(/\\/+$/g, \"\")\n .replaceAll(\"/\", \"-\");\n}\n\n/**\n * Finds the command name from the given file path.\n *\n * @param file - The file path to extract the command name from.\n * @returns The command name.\n */\nexport function resolveCommandName(file: string) {\n let path = findFilePath(file);\n let name = findFolderName(file, {\n requireExtension: true\n });\n\n while (isDynamicPathSegment(name)) {\n path = resolveParentPath(path);\n name = findFolderName(path, {\n requireExtension: true\n });\n }\n\n return name;\n}\n\nexport function resolveCommandPath(context: Context, file: string): string {\n return replacePath(findFilePath(file), context.commandsPath)\n .replaceAll(/^\\/+/g, \"\")\n .replaceAll(/\\/+$/g, \"\")\n .split(\"/\")\n .filter(path => path && !isPathSegmentGroup(path))\n .join(\"/\");\n}\n\nexport function resolveCommandDynamicPathSegments(\n context: Context,\n file: string\n): string[] {\n return replacePath(findFilePath(file), context.commandsPath)\n .split(\"/\")\n .filter(path => Boolean(path) && isDynamicPathSegment(path))\n .map(path => getDynamicPathSegmentName(path));\n}\n\nexport function findCommandsRoot(context: Context): string {\n if (isSetString(context.config.entry)) {\n return appendPath(\n appendPath(stripStars(context.config.entry), context.config.projectRoot),\n context.workspaceConfig.workspaceRoot\n );\n } else if (\n isSetObject(context.config.entry) &&\n \"file\" in context.config.entry\n ) {\n return appendPath(\n appendPath(\n stripStars(context.config.entry.file),\n context.config.projectRoot\n ),\n context.workspaceConfig.workspaceRoot\n );\n } else if (\n Array.isArray(context.config.entry) &&\n context.config.entry.length > 0\n ) {\n return commonPath(\n context.config.entry.map(entry =>\n appendPath(\n appendPath(\n stripStars(isSetString(entry) ? entry : entry.file),\n context.config.projectRoot\n ),\n context.workspaceConfig.workspaceRoot\n )\n )\n );\n }\n\n return appendPath(\n context.config.sourceRoot || context.config.projectRoot,\n context.workspaceConfig.workspaceRoot\n );\n}\n\n/**\n * Extracts command parameter information from a type parameter reflection.\n *\n * @param command - The command tree to which the parameter belongs.\n * @param reflection - The type parameter reflection to extract information from.\n * @returns The extracted command option information.\n */\nexport function extractCommandOption(\n command: CommandInput,\n reflection: ReflectionProperty\n): CommandOption {\n const type = reflection.getType();\n\n const option = {\n name: reflection.getNameAsString(),\n alias: reflection.getTags().alias ?? [],\n title:\n reflection.getTags().title?.trim() ||\n titleCase(reflection.getNameAsString()),\n description:\n reflection.getDescription() ||\n resolveCommandOptionDescription(\n reflection.getKind(),\n reflection.isOptional(),\n reflection.getNameAsString(),\n reflection.getTags().title,\n reflection.getDefaultValue()\n ),\n env: constantCase(reflection.getNameAsString()),\n kind: type.kind as\n | ReflectionKind.string\n | ReflectionKind.number\n | ReflectionKind.boolean,\n optional: reflection.isOptional(),\n default: reflection.getDefaultValue(),\n variadic: reflection.isArray(),\n reflection\n } as CommandOption;\n\n if (reflection.isArray()) {\n if (\n (type as TypeArray).type.kind === ReflectionKind.string ||\n (type as TypeArray).type.kind === ReflectionKind.number\n ) {\n (option as StringCommandOption | NumberCommandOption).variadic = true;\n (option as StringCommandOption | NumberCommandOption).kind = (\n type as TypeArray\n ).type.kind as ReflectionKind.string | ReflectionKind.number;\n } else {\n throw new Error(\n `Unsupported array type for option \"${reflection.getNameAsString()}\" in command \"${\n command.name\n }\". Only string[] and number[] are supported, received ${stringifyType(\n type\n )\n .trim()\n .replaceAll(\" | \", \", or \")}.`\n );\n }\n } else if (\n type.kind !== ReflectionKind.boolean &&\n type.kind !== ReflectionKind.string &&\n type.kind !== ReflectionKind.number\n ) {\n throw new Error(\n `Unsupported type for option \"${reflection.getNameAsString()}\" in command \"${\n command.name\n }\". Only string, number, boolean, string[] and number[] are supported, received ${stringifyType(\n type\n )\n .trim()\n .replaceAll(\" | \", \", or \")}.`\n );\n }\n\n return option;\n}\n\n/**\n * Extracts command positional argument information from a type parameter reflection.\n *\n * @param command - The command tree to which the parameter belongs.\n * @param reflection - The type parameter reflection to extract information from.\n * @returns The extracted command positional argument information.\n */\nexport function extractCommandArgument(\n command: CommandInput,\n reflection: ReflectionParameter\n): CommandArgument {\n const type = reflection.getType();\n\n if (\n type.kind !== ReflectionKind.string &&\n type.kind !== ReflectionKind.number &&\n type.kind !== ReflectionKind.boolean &&\n !(\n type.kind === ReflectionKind.array &&\n (type.type.kind === ReflectionKind.string ||\n type.type.kind === ReflectionKind.number)\n )\n ) {\n throw new Error(\n `Unsupported type for positional parameter \"${reflection.getName()}\" in command \"${\n command.name\n }\". Only string types (or an array of strings) are supported, received ${stringifyType(\n type\n )\n .trim()\n .replaceAll(\" | \", \", or \")}.`\n );\n }\n\n const option = {\n name: reflection.getName(),\n kind: type.kind,\n title: titleCase(reflection.getName()),\n description:\n reflection.parameter.description ||\n resolveCommandParameterDescription(\n type.kind,\n !!reflection.isOptional(),\n reflection.getName(),\n titleCase(reflection.getName()),\n reflection.getDefaultValue()\n ),\n env: constantCase(reflection.getName()),\n optional: reflection.isOptional(),\n default: reflection.getDefaultValue(),\n reflection\n } as CommandArgument;\n\n if (type.kind === ReflectionKind.array) {\n if (\n type.type.kind === ReflectionKind.string ||\n type.type.kind === ReflectionKind.number\n ) {\n (option as StringCommandArgument | NumberCommandArgument).variadic = true;\n (option as StringCommandArgument | NumberCommandArgument).kind =\n type.type.kind;\n } else {\n throw new Error(\n `Unsupported array type for positional parameter \"${reflection.getName()}\" in command \"${\n command.name\n }\". Only string[] and number[] are supported, received ${stringifyType(\n type\n )\n .trim()\n .replaceAll(\" | \", \", or \")}.`\n );\n }\n } else if (\n type.kind !== ReflectionKind.boolean &&\n type.kind !== ReflectionKind.string &&\n type.kind !== ReflectionKind.number\n ) {\n throw new Error(\n `Unsupported type for positional parameter \"${reflection.getName()}\" in command \"${\n command.name\n }\". Only string, number, boolean, string[] and number[] are supported, received ${stringifyType(\n type\n )\n .trim()\n .replaceAll(\" | \", \", or \")}.`\n );\n }\n\n return option;\n}\n\n/**\n * Reflects the command tree for a given command input.\n *\n * @param context - The context in which the command is being reflected.\n * @param command - The command input to reflect.\n * @param parent - The parent command tree, if any.\n * @returns The reflected command tree.\n */\nexport async function reflectCommandTree<TContext extends Context = Context>(\n context: TContext,\n command: CommandInput,\n parent?: CommandTree\n): Promise<CommandTree> {\n const title =\n command.title ||\n `${\n parent?.title\n ? `${\n parent.isVirtual\n ? parent.title.replace(/ Commands$/, \"\")\n : parent.title\n } - `\n : \"\"\n }${titleCase(command.name)}${command.isVirtual ? \" Commands\" : \"\"}`;\n\n const tree = {\n alias: [],\n icon: parent?.icon,\n ...command,\n title,\n options: getDefaultOptions(context, command),\n arguments: [],\n parent: parent ?? null,\n children: {},\n reflection: null\n } as CommandTree;\n\n if (!command.isVirtual) {\n if (\n !command.entry.input?.file ||\n !context.fs.existsSync(command.entry.input.file)\n ) {\n throw new Error(\n `${\n !command.entry.input?.file ? \"Missing\" : \"Non-existent\"\n } command entry file for \"${command.name}\"`\n );\n }\n\n context.debug(\n `Adding reflection for user-defined command: ${command.id} (file: ${\n command.entry.input.file\n })`\n );\n\n const resolved = await resolveModule<CommandModule>(\n context,\n command.entry.input,\n {\n plugins: [\n esbuildPlugin(context, {\n reflection: \"default\",\n reflectionLevel: \"verbose\"\n })\n ]\n }\n );\n\n const metadata = resolved.metadata ?? {};\n if (isSetString(metadata.title)) {\n tree.title = metadata.title;\n }\n if (isSetString(metadata.description)) {\n tree.description = metadata.description;\n }\n if (\n isSetString(metadata.alias) ||\n (Array.isArray(metadata.alias) && metadata.alias.length > 0)\n ) {\n tree.alias = toArray(metadata.alias);\n }\n if (isSetString(metadata.icon)) {\n tree.icon = metadata.icon;\n }\n\n const type = reflect(resolved);\n if (type.kind !== ReflectionKind.function) {\n throw new Error(\n `The command entry file \"${command.entry.input.file}\" does not export a valid function.`\n );\n }\n\n tree.reflection = new ReflectionFunction(type);\n tree.description ??=\n command.description ||\n type.description ||\n `The ${tree.title} executable command line interface.`;\n\n const parameters = tree.reflection.getParameters();\n if (parameters.length > 0 && parameters[0]) {\n if (\n parameters[0].type.kind === ReflectionKind.objectLiteral ||\n parameters[0].type.kind === ReflectionKind.class\n ) {\n const optionsReflection = ReflectionClass.from(parameters[0].type);\n for (const propertyReflection of optionsReflection.getProperties()) {\n tree.options[propertyReflection.getNameAsString()] =\n extractCommandOption(command, propertyReflection);\n }\n } else {\n throw new Error(\n `The first parameter of the command handler function in \"${\n command.entry.input.file\n }\" must be an object literal or class type representing the command options.`\n );\n }\n\n tree.arguments = parameters\n .slice(1)\n .map(arg => extractCommandArgument(command, arg));\n }\n } else {\n tree.description ??= `A collection of available ${\n tree.title || titleCase(tree.name)\n } commands that are included in the ${getAppTitle(\n context\n )} command line application.`;\n }\n\n if (context.env) {\n if (isSetObject(tree.options)) {\n Object.values(tree.options)\n .filter(option => option.env !== false)\n .forEach(option => {\n context.env.types.env.addProperty({\n name: option.env as string,\n optional: option.optional ? true : undefined,\n description: option.description,\n visibility: ReflectionVisibility.public,\n type:\n option.reflection?.getType() ??\n ((option as StringCommandOption | NumberCommandOption).variadic\n ? { kind: ReflectionKind.array, type: { kind: option.kind } }\n : { kind: option.kind }),\n default: option.default,\n tags: {\n ...option.reflection?.getTags(),\n title: option.title,\n alias: option.alias\n .filter(alias => alias.length > 0)\n .map(alias => constantCase(alias)),\n domain: \"cli\"\n }\n });\n });\n }\n\n Object.values(tree.arguments)\n .filter(arg => arg.env !== false)\n .forEach(arg =>\n context.env.types.env.addProperty({\n name: constantCase(arg.name),\n optional: arg.optional ? true : undefined,\n description: arg.description,\n visibility: ReflectionVisibility.public,\n type: arg.reflection.getType(),\n default: arg.default,\n tags: {\n ...arg.reflection.getTags(),\n domain: \"cli\"\n }\n })\n );\n }\n\n for (const input of context.inputs.filter(\n input =>\n input.segments.filter(segment => !isDynamicPathSegment(segment))\n .length ===\n command.segments.filter(segment => !isDynamicPathSegment(segment))\n .length +\n 1 &&\n input.segments\n .slice(0, command.segments.length)\n .every((value, index) => value === command.segments[index])\n )) {\n tree.children[input.name] = await reflectCommandTree(context, input, tree);\n }\n\n return tree;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"resolve-command.cjs","names":["esbuildPlugin","reflect","ReflectionClass","ReflectionFunction","ReflectionKind","ReflectionVisibility","stringifyType","toArray","appendPath","commonPath","findFilePath","findFolderName","stripStars","replacePath","resolveParentPath","constantCase","titleCase","isSetObject","isSetString","resolveModule","getAppTitle","getDynamicPathSegmentName","isDynamicPathSegment","isPathSegmentGroup","getDefaultOptions","resolveCommandOptionDescription","name","kind","optional","variadic","title","defaultValue","boolean","trim","number","resolveCommandArgumentDescription","resolveCommandId","context","file","commandsPath","split","filter","p","Boolean","join","replaceAll","resolveCommandName","path","requireExtension","resolveCommandPath","resolveCommandDynamicPathSegments","map","findCommandsRoot","config","entry","projectRoot","workspaceConfig","workspaceRoot","Array","isArray","length","sourceRoot","extractCommandOption","command","reflection","type","getType","option","getNameAsString","alias","getTags","description","getDescription","getKind","isOptional","getDefaultValue","env","default","string","Error","extractCommandArgument","array","getName","argument","getAlias","parameter","reflectCommandTree","parent","isVirtual","replace","tree","icon","options","arguments","children","input","fs","existsSync","debug","id","resolved","plugins","reflectionLevel","metadata","function","parameters","getParameters","objectLiteral","class","optionsReflection","from","propertyReflection","getProperties","slice","arg","forEach","index","found","findIndex","segments","some","segment","Object","values","types","addProperty","undefined","visibility","public","tags","domain","inputs","every","value"],"sources":["../../src/helpers/resolve-command.ts"],"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 { esbuildPlugin } from \"@powerlines/deepkit/esbuild-plugin\";\nimport type {\n ReflectionParameter,\n ReflectionProperty,\n TypeArray\n} from \"@powerlines/deepkit/vendor/type\";\nimport {\n reflect,\n ReflectionClass,\n ReflectionFunction,\n ReflectionKind,\n ReflectionVisibility,\n stringifyType\n} from \"@powerlines/deepkit/vendor/type\";\nimport { toArray } from \"@stryke/convert/to-array\";\nimport { appendPath } from \"@stryke/path/append\";\nimport { commonPath } from \"@stryke/path/common\";\nimport { findFilePath, findFolderName } from \"@stryke/path/file-path-fns\";\nimport { stripStars } from \"@stryke/path/normalize\";\nimport { replacePath } from \"@stryke/path/replace\";\nimport { resolveParentPath } from \"@stryke/path/resolve-parent-path\";\nimport { constantCase } from \"@stryke/string-format/constant-case\";\nimport { titleCase } from \"@stryke/string-format/title-case\";\nimport { isSetObject } from \"@stryke/type-checks/is-set-object\";\nimport { isSetString } from \"@stryke/type-checks/is-set-string\";\nimport { resolveModule } from \"powerlines/lib/utilities/resolve\";\nimport {\n getAppTitle,\n getDynamicPathSegmentName,\n isDynamicPathSegment,\n isPathSegmentGroup\n} from \"../plugin-utils/context-helpers\";\nimport type {\n CommandArgument,\n CommandInput,\n CommandModule,\n CommandOption,\n CommandTree,\n NumberCommandArgument,\n NumberCommandOption,\n StringCommandArgument,\n StringCommandOption\n} from \"../types/command\";\nimport type { Context } from \"../types/context\";\nimport { getDefaultOptions } from \"./utilities\";\n\n/**\n * Resolves the description for a command option based on its reflection.\n *\n * @param name - The name of the command option.\n * @param kind - The reflection kind of the command option.\n * @param optional - Whether the command option is optional.\n * @param variadic - Whether the command option is variadic (i.e., an array).\n * @param title - The title of the command option, if any.\n * @param defaultValue - The default value of the command option, if any.\n * @returns The resolved description for the command option.\n */\nexport function resolveCommandOptionDescription(\n name: string,\n kind: ReflectionKind,\n optional = false,\n variadic = false,\n title?: string,\n defaultValue?: any\n): string {\n return `A${optional && !defaultValue ? \"n optional\" : \"\"} command line ${\n kind === ReflectionKind.boolean ? \"flag\" : \"option\"\n } that allows the user to ${\n kind === ReflectionKind.boolean\n ? \"set the\"\n : variadic\n ? \"specify custom\"\n : \"specify a custom\"\n } ${title?.trim() || titleCase(name)} ${\n kind === ReflectionKind.boolean\n ? \"indicator\"\n : `${kind === ReflectionKind.number ? \"numeric\" : \"string\"} value${\n variadic ? \"s\" : \"\"\n }`\n }.`;\n}\n\n/**\n * Resolves the description for a command argument based on its reflection.\n *\n * @param name - The name of the command argument.\n * @param kind - The reflection kind of the command argument.\n * @param optional - Whether the command argument is optional.\n * @param variadic - Whether the command argument is variadic (i.e., an array).\n * @param title - The title of the command argument, if any.\n * @param defaultValue - The default value of the command argument, if any.\n * @returns The resolved description for the command argument.\n */\nexport function resolveCommandArgumentDescription(\n name: string,\n kind: ReflectionKind,\n optional = false,\n variadic = false,\n title?: string,\n defaultValue?: any\n): string {\n return `An${\n optional && !defaultValue ? \" optional\" : \"\"\n } argument that allows the user to ${\n kind === ReflectionKind.boolean\n ? \"set the\"\n : variadic\n ? \"specify custom\"\n : \"specify a custom\"\n } ${title?.trim() || titleCase(name)} ${\n kind === ReflectionKind.boolean\n ? \"indicator\"\n : `${kind === ReflectionKind.number ? \"numeric\" : \"string\"} value${\n variadic ? \"s\" : \"\"\n }`\n }.`;\n}\n\nexport function resolveCommandId(context: Context, file: string): string {\n return replacePath(findFilePath(file), context.commandsPath)\n .split(\"/\")\n .filter(p => Boolean(p) && !isDynamicPathSegment(p))\n .join(\"/\")\n .replaceAll(/^\\/+/g, \"\")\n .replaceAll(/\\/+$/g, \"\")\n .replaceAll(\"/\", \"-\");\n}\n\n/**\n * Finds the command name from the given file path.\n *\n * @param file - The file path to extract the command name from.\n * @returns The command name.\n */\nexport function resolveCommandName(file: string) {\n let path = findFilePath(file);\n let name = findFolderName(file, {\n requireExtension: true\n });\n\n while (isDynamicPathSegment(name)) {\n path = resolveParentPath(path);\n name = findFolderName(path, {\n requireExtension: true\n });\n }\n\n return name;\n}\n\nexport function resolveCommandPath(context: Context, file: string): string {\n return replacePath(findFilePath(file), context.commandsPath)\n .replaceAll(/^\\/+/g, \"\")\n .replaceAll(/\\/+$/g, \"\")\n .split(\"/\")\n .filter(path => path && !isPathSegmentGroup(path))\n .join(\"/\");\n}\n\nexport function resolveCommandDynamicPathSegments(\n context: Context,\n file: string\n): string[] {\n return replacePath(findFilePath(file), context.commandsPath)\n .split(\"/\")\n .filter(path => Boolean(path) && isDynamicPathSegment(path))\n .map(path => getDynamicPathSegmentName(path));\n}\n\nexport function findCommandsRoot(context: Context): string {\n if (isSetString(context.config.entry)) {\n return appendPath(\n appendPath(stripStars(context.config.entry), context.config.projectRoot),\n context.workspaceConfig.workspaceRoot\n );\n } else if (\n isSetObject(context.config.entry) &&\n \"file\" in context.config.entry\n ) {\n return appendPath(\n appendPath(\n stripStars(context.config.entry.file),\n context.config.projectRoot\n ),\n context.workspaceConfig.workspaceRoot\n );\n } else if (\n Array.isArray(context.config.entry) &&\n context.config.entry.length > 0\n ) {\n return commonPath(\n context.config.entry.map(entry =>\n appendPath(\n appendPath(\n stripStars(isSetString(entry) ? entry : entry.file),\n context.config.projectRoot\n ),\n context.workspaceConfig.workspaceRoot\n )\n )\n );\n }\n\n return appendPath(\n context.config.sourceRoot || context.config.projectRoot,\n context.workspaceConfig.workspaceRoot\n );\n}\n\n/**\n * Extracts command parameter information from a type parameter reflection.\n *\n * @param command - The command tree to which the parameter belongs.\n * @param reflection - The type parameter reflection to extract information from.\n * @returns The extracted command option information.\n */\nexport function extractCommandOption(\n command: CommandInput,\n reflection: ReflectionProperty\n): CommandOption {\n const type = reflection.getType();\n\n const option = {\n name: reflection.getNameAsString(),\n alias: reflection.getTags().alias ?? [],\n title:\n reflection.getTags().title?.trim() ||\n titleCase(reflection.getNameAsString()),\n description:\n reflection.getDescription() ||\n resolveCommandOptionDescription(\n reflection.getNameAsString(),\n reflection.getKind(),\n reflection.isOptional(),\n reflection.isArray(),\n reflection.getTags().title,\n reflection.getDefaultValue()\n ),\n env: constantCase(reflection.getNameAsString()),\n kind: type.kind as\n | ReflectionKind.string\n | ReflectionKind.number\n | ReflectionKind.boolean,\n optional: reflection.isOptional(),\n default: reflection.getDefaultValue(),\n variadic: reflection.isArray(),\n reflection\n } as CommandOption;\n\n if (reflection.isArray()) {\n if (\n (type as TypeArray).type.kind === ReflectionKind.string ||\n (type as TypeArray).type.kind === ReflectionKind.number\n ) {\n (option as StringCommandOption | NumberCommandOption).variadic = true;\n (option as StringCommandOption | NumberCommandOption).kind = (\n type as TypeArray\n ).type.kind as ReflectionKind.string | ReflectionKind.number;\n } else {\n throw new Error(\n `Unsupported array type for option \"${reflection.getNameAsString()}\" in command \"${\n command.name\n }\". Only string[] and number[] are supported, received ${stringifyType(\n type\n )\n .trim()\n .replaceAll(\" | \", \", or \")}.`\n );\n }\n } else if (\n type.kind !== ReflectionKind.boolean &&\n type.kind !== ReflectionKind.string &&\n type.kind !== ReflectionKind.number\n ) {\n throw new Error(\n `Unsupported type for option \"${reflection.getNameAsString()}\" in command \"${\n command.name\n }\". Only string, number, boolean, string[] and number[] are supported, received ${stringifyType(\n type\n )\n .trim()\n .replaceAll(\" | \", \", or \")}.`\n );\n }\n\n return option;\n}\n\n/**\n * Extracts command positional argument information from a type parameter reflection.\n *\n * @param command - The command tree to which the parameter belongs.\n * @param reflection - The type parameter reflection to extract information from.\n * @returns The extracted command positional argument information.\n */\nexport function extractCommandArgument(\n command: CommandInput,\n reflection: ReflectionParameter\n): CommandArgument {\n const type = reflection.getType();\n\n if (\n type.kind !== ReflectionKind.string &&\n type.kind !== ReflectionKind.number &&\n type.kind !== ReflectionKind.boolean &&\n !(\n type.kind === ReflectionKind.array &&\n (type.type.kind === ReflectionKind.string ||\n type.type.kind === ReflectionKind.number)\n )\n ) {\n throw new Error(\n `Unsupported type for argument \"${reflection.getName()}\" in command \"${\n command.name\n }\". Only string types (or an array of strings) are supported, received ${stringifyType(\n type\n )\n .trim()\n .replaceAll(\" | \", \", or \")}.`\n );\n }\n\n const argument = {\n name: reflection.getName(),\n alias: reflection.getAlias(),\n kind: type.kind,\n title: titleCase(reflection.getName()),\n description:\n reflection.parameter.description ||\n resolveCommandArgumentDescription(\n reflection.getName(),\n type.kind === ReflectionKind.array ? type.type.kind : type.kind,\n reflection.isOptional(),\n type.kind === ReflectionKind.array,\n titleCase(reflection.getName()),\n reflection.getDefaultValue()\n ),\n env: constantCase(reflection.getName()),\n optional: reflection.isOptional(),\n default: reflection.getDefaultValue(),\n reflection\n } as CommandArgument;\n\n if (type.kind === ReflectionKind.array) {\n if (\n type.type.kind === ReflectionKind.string ||\n type.type.kind === ReflectionKind.number\n ) {\n (argument as StringCommandArgument | NumberCommandArgument).variadic =\n true;\n (argument as StringCommandArgument | NumberCommandArgument).kind =\n type.type.kind;\n } else {\n throw new Error(\n `Unsupported array type for argument \"${reflection.getName()}\" in command \"${\n command.name\n }\". Only string[] and number[] are supported, received ${stringifyType(\n type\n )\n .trim()\n .replaceAll(\" | \", \", or \")}.`\n );\n }\n } else if (\n type.kind !== ReflectionKind.boolean &&\n type.kind !== ReflectionKind.string &&\n type.kind !== ReflectionKind.number\n ) {\n throw new Error(\n `Unsupported type for argument \"${reflection.getName()}\" in command \"${\n command.name\n }\". Only string, number, boolean, string[] and number[] are supported, received ${stringifyType(\n type\n )\n .trim()\n .replaceAll(\" | \", \", or \")}.`\n );\n }\n\n return argument;\n}\n\n/**\n * Reflects the command tree for a given command input.\n *\n * @param context - The context in which the command is being reflected.\n * @param command - The command input to reflect.\n * @param parent - The parent command tree, if any.\n * @returns The reflected command tree.\n */\nexport async function reflectCommandTree<TContext extends Context = Context>(\n context: TContext,\n command: CommandInput,\n parent?: CommandTree\n): Promise<CommandTree> {\n const title =\n command.title ||\n `${\n parent?.title\n ? `${\n parent.isVirtual\n ? parent.title.replace(/(?:c|C)ommands?$/, \"\").trim()\n : parent.title\n } - `\n : \"\"\n }${titleCase(command.name)}${command.isVirtual ? \" Commands\" : \"\"}`;\n\n const tree = {\n alias: [],\n icon: parent?.icon,\n ...command,\n title,\n options: getDefaultOptions(context, command),\n arguments: [],\n parent: parent ?? null,\n children: {},\n reflection: null\n } as CommandTree;\n\n if (!command.isVirtual) {\n if (\n !command.entry.input?.file ||\n !context.fs.existsSync(command.entry.input.file)\n ) {\n throw new Error(\n `${\n !command.entry.input?.file ? \"Missing\" : \"Non-existent\"\n } command entry file for \"${command.name}\"`\n );\n }\n\n context.debug(\n `Adding reflection for user-defined command: ${command.id} (file: ${\n command.entry.input.file\n })`\n );\n\n const resolved = await resolveModule<CommandModule>(\n context,\n command.entry.input,\n {\n plugins: [\n esbuildPlugin(context, {\n reflection: \"default\",\n reflectionLevel: \"verbose\"\n })\n ]\n }\n );\n\n const metadata = resolved.metadata ?? {};\n if (isSetString(metadata.title)) {\n tree.title = metadata.title;\n }\n if (isSetString(metadata.description)) {\n tree.description = metadata.description;\n }\n if (\n isSetString(metadata.alias) ||\n (Array.isArray(metadata.alias) && metadata.alias.length > 0)\n ) {\n tree.alias = toArray(metadata.alias);\n }\n if (isSetString(metadata.icon)) {\n tree.icon = metadata.icon;\n }\n\n const type = reflect(resolved);\n if (type.kind !== ReflectionKind.function) {\n throw new Error(\n `The command entry file \"${command.entry.input.file}\" does not export a valid function.`\n );\n }\n\n tree.reflection = new ReflectionFunction(type);\n tree.description ??=\n command.description ||\n type.description ||\n `The ${tree.title.replace(/(?:c|C)ommands?$/, \"\").trim()} executable command line interface.`;\n\n const parameters = tree.reflection.getParameters();\n if (parameters.length > 0 && parameters[0]) {\n if (\n parameters[0].type.kind === ReflectionKind.objectLiteral ||\n parameters[0].type.kind === ReflectionKind.class\n ) {\n const optionsReflection = ReflectionClass.from(parameters[0].type);\n for (const propertyReflection of optionsReflection.getProperties()) {\n tree.options[propertyReflection.getNameAsString()] =\n extractCommandOption(command, propertyReflection);\n }\n } else {\n throw new Error(\n `The first parameter of the command handler function in \"${\n command.entry.input.file\n }\" must be an object literal or class type representing the command options.`\n );\n }\n\n tree.arguments = parameters\n .slice(1)\n .map(arg => extractCommandArgument(command, arg));\n\n // Ensure unique argument names by appending an index suffix to duplicates\n tree.arguments.forEach((argument, index) => {\n const found = tree.arguments.findIndex(\n arg => arg.name === argument.name\n );\n if (\n (found !== -1 && found !== index) ||\n tree.segments.some(\n segment =>\n isDynamicPathSegment(segment) &&\n getDynamicPathSegmentName(segment) === argument.name\n )\n ) {\n argument.name += `_${\n tree.segments.filter(\n segment =>\n isDynamicPathSegment(segment) &&\n getDynamicPathSegmentName(segment).replace(/_\\d+$/, \"\") ===\n argument.name\n ).length +\n tree.arguments.filter(\n arg => arg.name.replace(/_\\d+$/, \"\") === argument.name\n ).length\n }`;\n argument.env = constantCase(argument.name);\n }\n });\n }\n } else {\n tree.description ??= `A collection of available ${\n tree.title.replace(/(?:c|C)ommands?$/, \"\").trim() || titleCase(tree.name)\n } commands that are included in the ${getAppTitle(\n context\n )} command line application.`;\n }\n\n if (context.env) {\n if (isSetObject(tree.options)) {\n Object.values(tree.options)\n .filter(option => option.env !== false)\n .forEach(option => {\n context.env.types.env.addProperty({\n name: option.env as string,\n optional: option.optional ? true : undefined,\n description: option.description,\n visibility: ReflectionVisibility.public,\n type:\n option.reflection?.getType() ??\n ((option as StringCommandOption | NumberCommandOption).variadic\n ? { kind: ReflectionKind.array, type: { kind: option.kind } }\n : { kind: option.kind }),\n default: option.default,\n tags: {\n ...option.reflection?.getTags(),\n title: option.title,\n alias: option.alias\n .filter(alias => alias.length > 1)\n .map(alias => constantCase(alias)),\n domain: \"cli\"\n }\n });\n });\n }\n\n tree.arguments\n .filter(arg => arg.env !== false)\n .forEach(arg =>\n context.env.types.env.addProperty({\n name: arg.env as string,\n optional: arg.optional ? true : undefined,\n description: arg.description,\n visibility: ReflectionVisibility.public,\n type: arg.reflection.getType(),\n default: arg.default,\n tags: {\n ...arg.reflection.getTags(),\n alias: arg.alias\n .filter(alias => alias.length > 1)\n .map(alias => constantCase(alias)),\n domain: \"cli\"\n }\n })\n );\n }\n\n for (const input of context.inputs.filter(\n input =>\n input.segments.filter(segment => !isDynamicPathSegment(segment))\n .length ===\n command.segments.filter(segment => !isDynamicPathSegment(segment))\n .length +\n 1 &&\n input.segments\n .slice(0, command.segments.length)\n .every((value, index) => value === command.segments[index])\n )) {\n tree.children[input.name] = await reflectCommandTree(context, input, tree);\n }\n\n return tree;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2EA,SAAgByB,gCACdC,MACAC,MACAC,WAAW,OACXC,WAAW,OACXC,OACAC,cACQ;AACR,QAAO,IAAIH,YAAY,CAACG,eAAe,eAAe,GAAE,gBACtDJ,SAASvB,gDAAe4B,UAAU,SAAS,SAAQ,2BAEnDL,SAASvB,gDAAe4B,UACpB,YACAH,WACE,mBACA,mBAAkB,GACtBC,OAAOG,MAAM,qDAAcP,KAAK,CAAA,GAClCC,SAASvB,gDAAe4B,UACpB,cACA,GAAGL,SAASvB,gDAAe8B,SAAS,YAAY,SAAQ,QACtDL,WAAW,MAAM,KACjB;;;;;;;;;;;;;AAeV,SAAgBM,kCACdT,MACAC,MACAC,WAAW,OACXC,WAAW,OACXC,OACAC,cACQ;AACR,QAAO,KACLH,YAAY,CAACG,eAAe,cAAc,GAAE,oCAE5CJ,SAASvB,gDAAe4B,UACpB,YACAH,WACE,mBACA,mBAAkB,GACtBC,OAAOG,MAAM,qDAAcP,KAAK,CAAA,GAClCC,SAASvB,gDAAe4B,UACpB,cACA,GAAGL,SAASvB,gDAAe8B,SAAS,YAAY,SAAQ,QACtDL,WAAW,MAAM,KACjB;;AAIV,SAAgBO,iBAAiBC,SAAkBC,MAAsB;AACvE,6FAAgCA,KAAK,EAAED,QAAQE,aAAa,CACzDC,MAAM,IAAI,CACVC,QAAOC,MAAKC,QAAQD,EAAE,IAAI,CAACpB,0DAAqBoB,EAAE,CAAC,CACnDE,KAAK,IAAI,CACTC,WAAW,SAAS,GAAG,CACvBA,WAAW,SAAS,GAAG,CACvBA,WAAW,KAAK,IAAI;;;;;;;;AASzB,SAAgBC,mBAAmBR,MAAc;CAC/C,IAAIS,qDAAoBT,KAAK;CAC7B,IAAIZ,uDAAsBY,MAAM,EAC9BU,kBAAkB,MACnB,CAAC;AAEF,QAAO1B,0DAAqBI,KAAK,EAAE;AACjCqB,kEAAyBA,KAAK;AAC9BrB,yDAAsBqB,MAAM,EAC1BC,kBAAkB,MACnB,CAAC;;AAGJ,QAAOtB;;AAGT,SAAgBuB,mBAAmBZ,SAAkBC,MAAsB;AACzE,6FAAgCA,KAAK,EAAED,QAAQE,aAAa,CACzDM,WAAW,SAAS,GAAG,CACvBA,WAAW,SAAS,GAAG,CACvBL,MAAM,IAAI,CACVC,QAAOM,SAAQA,QAAQ,CAACxB,wDAAmBwB,KAAK,CAAC,CACjDH,KAAK,IAAI;;AAad,SAAgBQ,iBAAiBf,SAA0B;AACzD,yDAAgBA,QAAQgB,OAAOC,MAAM,CACnC,0HACwBjB,QAAQgB,OAAOC,MAAM,EAAEjB,QAAQgB,OAAOE,YAAY,EACxElB,QAAQmB,gBAAgBC,cACzB;8DAEWpB,QAAQgB,OAAOC,MAAM,IACjC,UAAUjB,QAAQgB,OAAOC,MAEzB,0HAEejB,QAAQgB,OAAOC,MAAMhB,KAAK,EACrCD,QAAQgB,OAAOE,YAChB,EACDlB,QAAQmB,gBAAgBC,cACzB;UAEDC,MAAMC,QAAQtB,QAAQgB,OAAOC,MAAM,IACnCjB,QAAQgB,OAAOC,MAAMM,SAAS,EAE9B,6CACEvB,QAAQgB,OAAOC,MAAMH,KAAIG,gLAGIA,MAAM,GAAGA,QAAQA,MAAMhB,KAAK,EACnDD,QAAQgB,OAAOE,YAChB,EACDlB,QAAQmB,gBAAgBC,cAE5B,CACF,CAAC;AAGH,6CACEpB,QAAQgB,OAAOQ,cAAcxB,QAAQgB,OAAOE,aAC5ClB,QAAQmB,gBAAgBC,cACzB;;;;;;;;;AAUH,SAAgBK,qBACdC,SACAC,YACe;CACf,MAAMC,OAAOD,WAAWE,SAAS;CAEjC,MAAMC,SAAS;EACbzC,MAAMsC,WAAWI,iBAAiB;EAClCC,OAAOL,WAAWM,SAAS,CAACD,SAAS,EAAE;EACvCvC,OACEkC,WAAWM,SAAS,CAACxC,OAAOG,MAAM,qDACxB+B,WAAWI,iBAAiB,CAAC;EACzCG,aACEP,WAAWQ,gBAAgB,IAC3B/C,gCACEuC,WAAWI,iBAAiB,EAC5BJ,WAAWS,SAAS,EACpBT,WAAWU,YAAY,EACvBV,WAAWL,SAAS,EACpBK,WAAWM,SAAS,CAACxC,OACrBkC,WAAWW,iBACb,CAAC;EACHC,4DAAkBZ,WAAWI,iBAAiB,CAAC;EAC/CzC,MAAMsC,KAAKtC;EAIXC,UAAUoC,WAAWU,YAAY;EACjCG,SAASb,WAAWW,iBAAiB;EACrC9C,UAAUmC,WAAWL,SAAS;EAC9BK;EACgB;AAElB,KAAIA,WAAWL,SAAS,CACtB,KACGM,KAAmBA,KAAKtC,SAASvB,gDAAe0E,UAChDb,KAAmBA,KAAKtC,SAASvB,gDAAe8B,QACjD;AACCiC,SAAqDtC,WAAW;AAChEsC,SAAqDxC,OACpDsC,KACAA,KAAKtC;OAEP,OAAM,IAAIoD,MACR,sCAAsCf,WAAWI,iBAAiB,CAAA,gBAChEL,QAAQrC,KAAI,4GAEZuC,KACD,CACEhC,MAAM,CACNY,WAAW,OAAO,QAAQ,CAAA,GAC9B;UAGHoB,KAAKtC,SAASvB,gDAAe4B,WAC7BiC,KAAKtC,SAASvB,gDAAe0E,UAC7Bb,KAAKtC,SAASvB,gDAAe8B,OAE7B,OAAM,IAAI6C,MACR,gCAAgCf,WAAWI,iBAAiB,CAAA,gBAC1DL,QAAQrC,KAAI,qIAEZuC,KACD,CACEhC,MAAM,CACNY,WAAW,OAAO,QAAQ,CAAA,GAC9B;AAGH,QAAOsB;;;;;;;;;AAUT,SAAgBa,uBACdjB,SACAC,YACiB;CACjB,MAAMC,OAAOD,WAAWE,SAAS;AAEjC,KACED,KAAKtC,SAASvB,gDAAe0E,UAC7Bb,KAAKtC,SAASvB,gDAAe8B,UAC7B+B,KAAKtC,SAASvB,gDAAe4B,WAC7B,EACEiC,KAAKtC,SAASvB,gDAAe6E,UAC5BhB,KAAKA,KAAKtC,SAASvB,gDAAe0E,UACjCb,KAAKA,KAAKtC,SAASvB,gDAAe8B,SAGtC,OAAM,IAAI6C,MACR,kCAAkCf,WAAWkB,SAAS,CAAA,gBACpDnB,QAAQrC,KAAI,4HAEZuC,KACD,CACEhC,MAAM,CACNY,WAAW,OAAO,QAAQ,CAAA,GAC9B;CAGH,MAAMsC,WAAW;EACfzD,MAAMsC,WAAWkB,SAAS;EAC1Bb,OAAOL,WAAWoB,UAAU;EAC5BzD,MAAMsC,KAAKtC;EACXG,wDAAiBkC,WAAWkB,SAAS,CAAC;EACtCX,aACEP,WAAWqB,UAAUd,eACrBpC,kCACE6B,WAAWkB,SAAS,EACpBjB,KAAKtC,SAASvB,gDAAe6E,QAAQhB,KAAKA,KAAKtC,OAAOsC,KAAKtC,MAC3DqC,WAAWU,YAAY,EACvBT,KAAKtC,SAASvB,gDAAe6E,wDACnBjB,WAAWkB,SAAS,CAAC,EAC/BlB,WAAWW,iBACb,CAAC;EACHC,4DAAkBZ,WAAWkB,SAAS,CAAC;EACvCtD,UAAUoC,WAAWU,YAAY;EACjCG,SAASb,WAAWW,iBAAiB;EACrCX;EACkB;AAEpB,KAAIC,KAAKtC,SAASvB,gDAAe6E,MAC/B,KACEhB,KAAKA,KAAKtC,SAASvB,gDAAe0E,UAClCb,KAAKA,KAAKtC,SAASvB,gDAAe8B,QAClC;AACCiD,WAA2DtD,WAC1D;AACDsD,WAA2DxD,OAC1DsC,KAAKA,KAAKtC;OAEZ,OAAM,IAAIoD,MACR,wCAAwCf,WAAWkB,SAAS,CAAA,gBAC1DnB,QAAQrC,KAAI,4GAEZuC,KACD,CACEhC,MAAM,CACNY,WAAW,OAAO,QAAQ,CAAA,GAC9B;UAGHoB,KAAKtC,SAASvB,gDAAe4B,WAC7BiC,KAAKtC,SAASvB,gDAAe0E,UAC7Bb,KAAKtC,SAASvB,gDAAe8B,OAE7B,OAAM,IAAI6C,MACR,kCAAkCf,WAAWkB,SAAS,CAAA,gBACpDnB,QAAQrC,KAAI,qIAEZuC,KACD,CACEhC,MAAM,CACNY,WAAW,OAAO,QAAQ,CAAA,GAC9B;AAGH,QAAOsC;;;;;;;;;;AAWT,eAAsBG,mBACpBjD,SACA0B,SACAwB,QACsB;CACtB,MAAMzD,QACJiC,QAAQjC,SACR,GACEyD,QAAQzD,QACJ,GACEyD,OAAOC,YACHD,OAAOzD,MAAM2D,QAAQ,oBAAoB,GAAG,CAACxD,MAAM,GACnDsD,OAAOzD,MAAK,OAElB,sDACOiC,QAAQrC,KAAK,GAAGqC,QAAQyB,YAAY,cAAc;CAEjE,MAAME,OAAO;EACXrB,OAAO,EAAE;EACTsB,MAAMJ,QAAQI;EACd,GAAG5B;EACHjC;EACA8D,SAASpE,oCAAkBa,SAAS0B,QAAQ;EAC5C8B,WAAW,EAAE;EACbN,QAAQA,UAAU;EAClBO,UAAU,EAAE;EACZ9B,YAAY;EACE;AAEhB,KAAI,CAACD,QAAQyB,WAAW;AACtB,MACE,CAACzB,QAAQT,MAAMyC,OAAOzD,QACtB,CAACD,QAAQ2D,GAAGC,WAAWlC,QAAQT,MAAMyC,MAAMzD,KAAK,CAEhD,OAAM,IAAIyC,MACR,GACE,CAAChB,QAAQT,MAAMyC,OAAOzD,OAAO,YAAY,eAAc,2BAC7ByB,QAAQrC,KAAI,GACzC;AAGHW,UAAQ6D,MACN,+CAA+CnC,QAAQoC,GAAE,UACvDpC,QAAQT,MAAMyC,MAAMzD,KAAI,GAE3B;EAED,MAAM8D,WAAW,0DACf/D,SACA0B,QAAQT,MAAMyC,OACd,EACEM,SAAS,wDACOhE,SAAS;GACrB2B,YAAY;GACZsC,iBAAiB;GAClB,CAAC,CAAA,EAGR,CAAC;EAED,MAAMC,WAAWH,SAASG,YAAY,EAAE;AACxC,0DAAgBA,SAASzE,MAAM,CAC7B4D,MAAK5D,QAAQyE,SAASzE;AAExB,0DAAgByE,SAAShC,YAAY,CACnCmB,MAAKnB,cAAcgC,SAAShC;AAE9B,0DACcgC,SAASlC,MAAM,IAC1BX,MAAMC,QAAQ4C,SAASlC,MAAM,IAAIkC,SAASlC,MAAMT,SAAS,EAE1D8B,MAAKrB,+CAAgBkC,SAASlC,MAAM;AAEtC,0DAAgBkC,SAASZ,KAAK,CAC5BD,MAAKC,OAAOY,SAASZ;EAGvB,MAAM1B,qDAAemC,SAAS;AAC9B,MAAInC,KAAKtC,SAASvB,gDAAeoG,SAC/B,OAAM,IAAIzB,MACR,2BAA2BhB,QAAQT,MAAMyC,MAAMzD,KAAI,qCACpD;AAGHoD,OAAK1B,aAAa,IAAI7D,oDAAmB8D,KAAK;AAC9CyB,OAAKnB,gBACHR,QAAQQ,eACRN,KAAKM,eACL,OAAOmB,KAAK5D,MAAM2D,QAAQ,oBAAoB,GAAG,CAACxD,MAAM,CAAA;EAE1D,MAAMwE,aAAaf,KAAK1B,WAAW0C,eAAe;AAClD,MAAID,WAAW7C,SAAS,KAAK6C,WAAW,IAAI;AAC1C,OACEA,WAAW,GAAGxC,KAAKtC,SAASvB,gDAAeuG,iBAC3CF,WAAW,GAAGxC,KAAKtC,SAASvB,gDAAewG,OAC3C;IACA,MAAMC,oBAAoB3G,iDAAgB4G,KAAKL,WAAW,GAAGxC,KAAK;AAClE,SAAK,MAAM8C,sBAAsBF,kBAAkBG,eAAe,CAChEtB,MAAKE,QAAQmB,mBAAmB3C,iBAAiB,IAC/CN,qBAAqBC,SAASgD,mBAAmB;SAGrD,OAAM,IAAIhC,MACR,2DACEhB,QAAQT,MAAMyC,MAAMzD,KAAI,6EAE3B;AAGHoD,QAAKG,YAAYY,WACdQ,MAAM,EAAE,CACR9D,KAAI+D,QAAOlC,uBAAuBjB,SAASmD,IAAI,CAAC;AAGnDxB,QAAKG,UAAUsB,SAAShC,UAAUiC,UAAU;IAC1C,MAAMC,QAAQ3B,KAAKG,UAAUyB,WAC3BJ,QAAOA,IAAIxF,SAASyD,SAASzD,KAC9B;AACD,QACG2F,UAAU,MAAMA,UAAUD,SAC3B1B,KAAK6B,SAASC,MACZC,YACEnG,0DAAqBmG,QAAQ,IAC7BpG,+DAA0BoG,QAAQ,KAAKtC,SAASzD,KACnD,EACD;AACAyD,cAASzD,QAAQ,IACfgE,KAAK6B,SAAS9E,QACZgF,YACEnG,0DAAqBmG,QAAQ,IAC7BpG,+DAA0BoG,QAAQ,CAAChC,QAAQ,SAAS,GAAG,KACrDN,SAASzD,KACd,CAACkC,SACF8B,KAAKG,UAAUpD,QACbyE,QAAOA,IAAIxF,KAAK+D,QAAQ,SAAS,GAAG,KAAKN,SAASzD,KACnD,CAACkC;AAEJuB,cAASP,6DAAmBO,SAASzD,KAAK;;KAE5C;;OAGJgE,MAAKnB,gBAAgB,6BACnBmB,KAAK5D,MAAM2D,QAAQ,oBAAoB,GAAG,CAACxD,MAAM,qDAAcyD,KAAKhE,KAAK,CAAA,qCACrCN,iDACpCiB,QACD,CAAA;AAGH,KAAIA,QAAQuC,KAAK;AACf,0DAAgBc,KAAKE,QAAQ,CAC3B8B,QAAOC,OAAOjC,KAAKE,QAAQ,CACxBnD,QAAO0B,WAAUA,OAAOS,QAAQ,MAAM,CACtCuC,SAAQhD,WAAU;AACjB9B,WAAQuC,IAAIgD,MAAMhD,IAAIiD,YAAY;IAChCnG,MAAMyC,OAAOS;IACbhD,UAAUuC,OAAOvC,WAAW,OAAOkG;IACnCvD,aAAaJ,OAAOI;IACpBwD,YAAY1H,sDAAqB2H;IACjC/D,MACEE,OAAOH,YAAYE,SAAS,KAC1BC,OAAqDtC,WACnD;KAAEF,MAAMvB,gDAAe6E;KAAOhB,MAAM,EAAEtC,MAAMwC,OAAOxC,MAAK;KAAG,GAC3D,EAAEA,MAAMwC,OAAOxC,MAAM;IAC3BkD,SAASV,OAAOU;IAChBoD,MAAM;KACJ,GAAG9D,OAAOH,YAAYM,SAAS;KAC/BxC,OAAOqC,OAAOrC;KACduC,OAAOF,OAAOE,MACX5B,QAAO4B,UAASA,MAAMT,SAAS,EAAE,CACjCT,KAAIkB,iEAAsBA,MAAM,CAAC;KACpC6D,QAAQ;KACV;IACD,CAAC;IACF;AAGNxC,OAAKG,UACFpD,QAAOyE,QAAOA,IAAItC,QAAQ,MAAM,CAChCuC,SAAQD,QACP7E,QAAQuC,IAAIgD,MAAMhD,IAAIiD,YAAY;GAChCnG,MAAMwF,IAAItC;GACVhD,UAAUsF,IAAItF,WAAW,OAAOkG;GAChCvD,aAAa2C,IAAI3C;GACjBwD,YAAY1H,sDAAqB2H;GACjC/D,MAAMiD,IAAIlD,WAAWE,SAAS;GAC9BW,SAASqC,IAAIrC;GACboD,MAAM;IACJ,GAAGf,IAAIlD,WAAWM,SAAS;IAC3BD,OAAO6C,IAAI7C,MACR5B,QAAO4B,UAASA,MAAMT,SAAS,EAAE,CACjCT,KAAIkB,iEAAsBA,MAAM,CAAC;IACpC6D,QAAQ;IACV;GACD,CACH,CAAC;;AAGL,MAAK,MAAMnC,SAAS1D,QAAQ8F,OAAO1F,QACjCsD,YACEA,QAAMwB,SAAS9E,QAAOgF,YAAW,CAACnG,0DAAqBmG,QAAQ,CAAC,CAC7D7D,WACDG,QAAQwD,SAAS9E,QAAOgF,YAAW,CAACnG,0DAAqBmG,QAAQ,CAAC,CAC/D7D,SACD,KACJmC,QAAMwB,SACHN,MAAM,GAAGlD,QAAQwD,SAAS3D,OAAO,CACjCwE,OAAOC,OAAOjB,UAAUiB,UAAUtE,QAAQwD,SAASH,OAC1D,CAAC,CACC1B,MAAKI,SAASC,MAAMrE,QAAQ,MAAM4D,mBAAmBjD,SAAS0D,OAAOL,KAAK;AAG5E,QAAOA"}