alepha 0.13.4 → 0.13.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (132) hide show
  1. package/dist/api-files/index.browser.js +5 -5
  2. package/dist/api-files/index.d.ts +191 -191
  3. package/dist/api-files/index.js +9 -9
  4. package/dist/api-jobs/index.browser.js +5 -5
  5. package/dist/api-jobs/index.d.ts +173 -173
  6. package/dist/api-jobs/index.js +9 -9
  7. package/dist/api-notifications/index.browser.js +11 -11
  8. package/dist/api-notifications/index.d.ts +11 -11
  9. package/dist/api-notifications/index.js +11 -11
  10. package/dist/api-parameters/index.browser.js +2 -2
  11. package/dist/api-parameters/index.d.ts +3 -3
  12. package/dist/api-parameters/index.js +3 -3
  13. package/dist/api-users/index.browser.js +6 -6
  14. package/dist/api-users/index.d.ts +55 -55
  15. package/dist/api-users/index.js +36 -36
  16. package/dist/api-verifications/index.browser.js +5 -5
  17. package/dist/api-verifications/index.d.ts +21 -21
  18. package/dist/api-verifications/index.js +10 -10
  19. package/dist/batch/index.d.ts +3 -3
  20. package/dist/batch/index.js +3 -3
  21. package/dist/bin/index.js +1 -1
  22. package/dist/bucket/index.d.ts +6 -6
  23. package/dist/bucket/index.js +7 -7
  24. package/dist/cache/index.d.ts +4 -4
  25. package/dist/cache/index.js +5 -5
  26. package/dist/cache-redis/index.d.ts +2 -2
  27. package/dist/cache-redis/index.js +2 -2
  28. package/dist/cli/{dist-lGnqsKpu.js → dist-BlfFtOk2.js} +16 -16
  29. package/dist/cli/{dist-lGnqsKpu.js.map → dist-BlfFtOk2.js.map} +1 -1
  30. package/dist/cli/index.d.ts +31 -75
  31. package/dist/cli/index.js +94 -171
  32. package/dist/cli/index.js.map +1 -1
  33. package/dist/command/index.d.ts +8 -8
  34. package/dist/command/index.js +11 -10
  35. package/dist/command/index.js.map +1 -1
  36. package/dist/core/index.browser.js +35 -35
  37. package/dist/core/index.d.ts +39 -39
  38. package/dist/core/index.js +35 -35
  39. package/dist/core/index.native.js +35 -35
  40. package/dist/datetime/index.d.ts +3 -3
  41. package/dist/datetime/index.js +3 -3
  42. package/dist/email/index.d.ts +11 -11
  43. package/dist/email/index.js +42 -42
  44. package/dist/fake/index.d.ts +2 -2
  45. package/dist/fake/index.js +5 -5
  46. package/dist/file/index.d.ts +4 -4
  47. package/dist/file/index.js +4 -4
  48. package/dist/lock/index.d.ts +5 -5
  49. package/dist/lock/index.js +5 -5
  50. package/dist/lock-redis/index.d.ts +2 -2
  51. package/dist/lock-redis/index.js +2 -2
  52. package/dist/logger/index.d.ts +11 -11
  53. package/dist/logger/index.js +12 -12
  54. package/dist/orm/index.browser.js +12 -12
  55. package/dist/orm/index.d.ts +52 -52
  56. package/dist/orm/index.js +32 -32
  57. package/dist/queue/index.d.ts +7 -7
  58. package/dist/queue/index.js +6 -6
  59. package/dist/queue-redis/index.d.ts +2 -2
  60. package/dist/queue-redis/index.js +2 -2
  61. package/dist/redis/index.d.ts +13 -13
  62. package/dist/redis/index.js +3 -3
  63. package/dist/retry/index.d.ts +5 -5
  64. package/dist/retry/index.js +5 -5
  65. package/dist/router/index.d.ts +1 -1
  66. package/dist/router/index.js +1 -1
  67. package/dist/scheduler/index.d.ts +4 -4
  68. package/dist/scheduler/index.js +7 -7
  69. package/dist/security/index.browser.js +7 -7
  70. package/dist/security/index.d.ts +15 -15
  71. package/dist/security/index.js +46 -46
  72. package/dist/server/index.browser.js +14 -14
  73. package/dist/server/index.d.ts +26 -26
  74. package/dist/server/index.js +26 -26
  75. package/dist/server-auth/index.browser.js +6 -6
  76. package/dist/server-auth/index.d.ts +163 -163
  77. package/dist/server-auth/index.js +13 -13
  78. package/dist/server-cache/index.d.ts +2 -2
  79. package/dist/server-cache/index.js +2 -2
  80. package/dist/server-compress/index.d.ts +2 -2
  81. package/dist/server-compress/index.js +2 -2
  82. package/dist/server-cookies/index.browser.js +3 -3
  83. package/dist/server-cookies/index.d.ts +4 -4
  84. package/dist/server-cookies/index.js +4 -4
  85. package/dist/server-cors/index.d.ts +3 -3
  86. package/dist/server-cors/index.js +3 -3
  87. package/dist/server-health/index.d.ts +3 -3
  88. package/dist/server-health/index.js +3 -3
  89. package/dist/server-helmet/index.d.ts +2 -2
  90. package/dist/server-helmet/index.js +2 -2
  91. package/dist/server-links/index.browser.js +5 -5
  92. package/dist/server-links/index.d.ts +40 -40
  93. package/dist/server-links/index.js +7 -7
  94. package/dist/server-metrics/index.d.ts +2 -2
  95. package/dist/server-metrics/index.js +86 -86
  96. package/dist/server-multipart/index.d.ts +2 -2
  97. package/dist/server-multipart/index.js +2 -2
  98. package/dist/server-proxy/index.d.ts +3 -3
  99. package/dist/server-proxy/index.js +3 -3
  100. package/dist/server-rate-limit/index.d.ts +3 -3
  101. package/dist/server-rate-limit/index.js +3 -3
  102. package/dist/server-security/index.browser.js +1 -1
  103. package/dist/server-security/index.d.ts +13 -13
  104. package/dist/server-security/index.js +4 -4
  105. package/dist/server-static/index.d.ts +3 -3
  106. package/dist/server-static/index.js +3 -3
  107. package/dist/server-swagger/index.d.ts +3 -3
  108. package/dist/server-swagger/index.js +3 -3
  109. package/dist/sms/index.d.ts +6 -6
  110. package/dist/sms/index.js +6 -6
  111. package/dist/thread/index.d.ts +3 -3
  112. package/dist/thread/index.js +3 -3
  113. package/dist/topic/index.d.ts +6 -6
  114. package/dist/topic/index.js +6 -6
  115. package/dist/topic-redis/index.d.ts +2 -2
  116. package/dist/topic-redis/index.js +2 -2
  117. package/dist/vite/index.d.ts +17 -17
  118. package/dist/vite/index.js +20 -20
  119. package/dist/websocket/index.browser.js +9 -9
  120. package/dist/websocket/index.d.ts +17 -17
  121. package/dist/websocket/index.js +10 -10
  122. package/package.json +5 -4
  123. package/src/cli/apps/AlephaCli.ts +1 -2
  124. package/src/cli/commands/BiomeCommands.ts +4 -6
  125. package/src/cli/commands/CoreCommands.ts +2 -2
  126. package/src/cli/commands/DrizzleCommands.ts +76 -78
  127. package/src/cli/commands/VerifyCommands.ts +3 -5
  128. package/src/cli/commands/ViteCommands.ts +6 -8
  129. package/src/cli/index.ts +1 -1
  130. package/src/cli/services/{ProjectUtils.ts → AlephaCliUtils.ts} +101 -16
  131. package/src/command/providers/CliProvider.ts +12 -4
  132. package/src/cli/services/ProcessRunner.ts +0 -89
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["askFn: AskMethod","value: any","createPromptInterface","runFn: RunnerMethod","stdout","t","allGlobalFlags: Record<\n string,\n { aliases: string[]; description?: string; schema: TSchema }\n >","result: Record<string, any>","result: any[]","typeName","command"],"sources":["../../src/command/helpers/Asker.ts","../../src/command/helpers/PrettyPrint.ts","../../src/command/errors/CommandError.ts","../../src/command/helpers/Runner.ts","../../src/command/primitives/$command.ts","../../src/command/providers/CliProvider.ts","../../src/command/index.ts"],"sourcesContent":["import { stdin as input, stdout as output } from \"node:process\";\nimport { createInterface as createPromptInterface } from \"node:readline/promises\";\nimport {\n $inject,\n Alepha,\n AlephaError,\n type Static,\n type TSchema,\n type TString,\n t,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\n\nexport interface AskOptions<T extends TSchema = TString> {\n /**\n * Response schema expected.\n *\n * Recommended schemas:\n * - t.text() - for free text input\n * - t.number() - for numeric input\n * - t.boolean() - for yes/no input (accepts \"true\", \"false\", \"1\", \"0\")\n * - t.enum([\"option1\", \"option2\"]) - for predefined options\n *\n * You can use schema.default to provide a default value.\n *\n * @example\n * ```ts\n * ask(\"What is your name?\", { schema: t.text({ default: \"John Doe\" }) })\n * ```\n *\n * @default TString\n */\n schema?: T;\n\n /**\n * Custom validation function.\n * Throws an AlephaError in case of validation failure.\n */\n validate?: (value: Static<T>) => void;\n}\n\nexport interface AskMethod {\n // biome-ignore lint/style/useShorthandFunctionType: .\n <T extends TSchema = TString>(\n question: string,\n options?: AskOptions<T>,\n ): Promise<Static<T>>;\n\n permission: (question: string) => Promise<boolean>;\n}\n\nexport class Asker {\n protected readonly log = $logger();\n public readonly ask: AskMethod;\n protected readonly alepha = $inject(Alepha);\n\n constructor() {\n this.ask = this.createAskMethod();\n }\n\n protected createAskMethod(): AskMethod {\n const askFn: AskMethod = async <T extends TSchema = TString>(\n question: string,\n options: AskOptions<T> = {},\n ) => {\n return await this.prompt<T>(question, options);\n };\n\n askFn.permission = async (question: string) => {\n const response = await this.prompt(`${question} [Y/n]`, {\n schema: t.enum([\"Y\", \"y\", \"n\", \"no\", \"yes\"], { default: \"Y\" }),\n });\n return response.charAt(0).toLowerCase() === \"y\";\n };\n\n return askFn;\n }\n\n protected async prompt<T extends TSchema = TString>(\n question: string,\n options: AskOptions<T>,\n ): Promise<Static<T>> {\n const rl = this.createPromptInterface();\n let value: any;\n try {\n do {\n try {\n const answer = await rl.question(`${question}\\n> `);\n if (options.schema) {\n value = this.alepha.codec.decode(\n options.schema,\n answer ? answer.trim() : undefined,\n );\n } else {\n value = String(answer.trim());\n }\n if (options.validate) {\n options.validate(value);\n }\n } catch (error) {\n if (error instanceof AlephaError) {\n this.log.error(`${error.message}\\n`);\n value = undefined;\n } else {\n throw error;\n }\n }\n } while (value === undefined);\n } finally {\n rl.close();\n }\n\n return value;\n }\n\n protected createPromptInterface() {\n return createPromptInterface({ input, output });\n }\n}\n","import { $inject } from \"alepha\";\nimport { DateTimeProvider, type Interval } from \"alepha/datetime\";\n\nexport class PrettyPrint {\n protected dateTimeProvider = $inject(DateTimeProvider);\n protected spinnerInterval?: Interval;\n protected readonly frames = [\n \"⠋\",\n \"⠙\",\n \"⠹\",\n \"⠸\",\n \"⠼\",\n \"⠴\",\n \"⠦\",\n \"⠧\",\n \"⠇\",\n \"⠏\",\n ];\n protected tasks = new Map<\n string,\n {\n taskName: string;\n frameIndex: number;\n status: \"running\" | \"success\" | \"error\";\n duration?: string;\n }\n >();\n protected lastLineCount = 0;\n protected header?: string;\n protected commandStartTime?: number;\n\n // ANSI color codes\n protected readonly colors = {\n reset: \"\\x1b[0m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n dim: \"\\x1b[2m\",\n };\n\n /**\n * Start a new command session with header\n */\n public startCommand(cliName: string, commandName: string): void {\n this.header = commandName ? `${cliName} ${commandName}` : cliName;\n this.commandStartTime = Date.now();\n this.tasks.clear();\n this.lastLineCount = 0;\n process.stdout.write(`┌─ ${this.header}\\n`);\n }\n\n /**\n * End the command session with footer\n */\n public endCommand(): void {\n if (this.commandStartTime) {\n const totalDuration = (\n (Date.now() - this.commandStartTime) /\n 1000\n ).toFixed(1);\n process.stdout.write(`└─ Done in ${totalDuration}s\\n`);\n }\n this.header = undefined;\n this.commandStartTime = undefined;\n }\n\n /**\n * Start an animated spinner with a task name\n */\n public startSpinner(id: string, taskName: string): void {\n this.tasks.set(id, {\n taskName,\n frameIndex: 0,\n status: \"running\",\n });\n\n // Start interval if not already running\n if (!this.spinnerInterval) {\n this.spinnerInterval = this.dateTimeProvider.createInterval(\n () => this.updateDisplay(),\n 80,\n true,\n );\n }\n\n this.updateDisplay();\n }\n\n /**\n * Stop the spinner and show success with a tick\n */\n public success(id: string, taskName?: string, duration?: string): void {\n const task = this.tasks.get(id);\n if (task) {\n task.status = \"success\";\n if (taskName) task.taskName = taskName;\n if (duration) task.duration = duration;\n this.updateDisplay();\n }\n\n this.checkIfAllDone();\n }\n\n /**\n * Stop the spinner and show error with a cross\n */\n public error(id: string, taskName?: string): void {\n const task = this.tasks.get(id);\n if (task) {\n task.status = \"error\";\n if (taskName) task.taskName = taskName;\n this.updateDisplay();\n }\n\n this.checkIfAllDone();\n }\n\n /**\n * Update the display for all tasks\n */\n protected updateDisplay(): void {\n // Clear previous lines\n if (this.lastLineCount > 0) {\n // Move cursor up and clear each line\n for (let i = 0; i < this.lastLineCount; i++) {\n process.stdout.write(\"\\x1b[1A\\x1b[2K\");\n }\n }\n\n // Render all tasks\n const taskArray = Array.from(this.tasks.values());\n const prefix = this.header ? \"│ \" : \"\";\n\n for (const task of taskArray) {\n let line = prefix;\n\n if (task.status === \"running\") {\n const frame = this.frames[task.frameIndex];\n line += `${this.colors.cyan}${frame}${this.colors.reset} ${this.colors.dim}${task.taskName}${this.colors.reset}`;\n task.frameIndex = (task.frameIndex + 1) % this.frames.length;\n } else if (task.status === \"success\") {\n const durationStr = task.duration\n ? ` ${this.colors.dim}${task.duration}${this.colors.reset}`\n : \"\";\n line += `${this.colors.green}✓${this.colors.reset} ${task.taskName}${durationStr}`;\n } else if (task.status === \"error\") {\n line += `${this.colors.red}✗${this.colors.reset} ${task.taskName}`;\n }\n\n process.stdout.write(`${line}\\n`);\n }\n\n this.lastLineCount = taskArray.length;\n }\n\n /**\n * Check if all tasks are done and stop the interval\n */\n protected checkIfAllDone(): void {\n const hasRunningTasks = Array.from(this.tasks.values()).some(\n (task) => task.status === \"running\",\n );\n\n if (!hasRunningTasks && this.spinnerInterval) {\n this.dateTimeProvider.clearInterval(this.spinnerInterval);\n this.spinnerInterval = undefined;\n }\n }\n\n /**\n * Stop the spinner without showing any symbol\n */\n public stopSpinner(): void {\n if (this.spinnerInterval) {\n this.dateTimeProvider.clearInterval(this.spinnerInterval);\n this.spinnerInterval = undefined;\n }\n }\n\n /**\n * Clear all tasks\n */\n public clear(): void {\n this.tasks.clear();\n this.stopSpinner();\n this.lastLineCount = 0;\n }\n}\n","import { AlephaError } from \"alepha\";\n\nexport class CommandError extends AlephaError {\n readonly name = \"CommandError\";\n}\n","import { exec } from \"node:child_process\";\nimport { cp, glob, rm } from \"node:fs/promises\";\nimport { $inject, Alepha } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { CommandError } from \"../errors/CommandError.ts\";\nimport { PrettyPrint } from \"./PrettyPrint.ts\";\n\nexport type Task = {\n name: string;\n handler: () => any;\n};\n\ninterface Timer {\n name: string;\n duration: string;\n}\n\nexport interface RunOptions {\n /**\n * Rename the command for logging purposes.\n */\n alias?: string;\n}\n\nexport interface RunnerMethod {\n (\n cmd: string | Task | Array<string | Task>,\n options?: RunOptions | (() => any),\n ): Promise<string>;\n rm: (glob: string | string[], options?: RunOptions) => Promise<string>;\n cp: (source: string, dest: string, options?: RunOptions) => Promise<string>;\n}\n\nexport class Runner {\n protected readonly log = $logger();\n protected readonly timers: Timer[] = [];\n protected readonly startTime: number = Date.now();\n protected readonly prettyPrint = $inject(PrettyPrint);\n protected readonly alepha = $inject(Alepha);\n public readonly run: RunnerMethod;\n protected cliName = \"\";\n protected commandName = \"\";\n protected firstTaskStarted = false;\n\n constructor() {\n this.run = this.createRunMethod();\n }\n\n protected get useDynamicLogger() {\n if (this.alepha.isCI()) {\n return false;\n }\n\n return this.alepha.env.LOG_FORMAT === \"raw\";\n }\n\n /**\n * Start a new command session with header (for pretty print mode)\n */\n public startCommand(cliName: string, commandName: string): void {\n this.cliName = cliName;\n this.commandName = commandName;\n }\n\n protected createRunMethod() {\n const runFn: RunnerMethod = async (\n cmd: string | Task | Array<string | Task>,\n options?: RunOptions | (() => any),\n ) => {\n if (this.useDynamicLogger && !this.firstTaskStarted) {\n this.prettyPrint.startCommand(this.cliName, this.commandName);\n }\n\n this.firstTaskStarted = true;\n\n if (Array.isArray(cmd)) {\n return await this.execute(\n cmd.map((it) =>\n typeof it === \"string\"\n ? { name: it, handler: () => this.exec(it) }\n : it,\n ),\n );\n }\n\n const alias = typeof options === \"object\" ? options.alias : undefined;\n const name = alias ?? (typeof cmd === \"string\" ? cmd : cmd.name);\n const handler =\n typeof options === \"function\"\n ? options\n : typeof cmd === \"string\"\n ? () => this.exec(cmd)\n : cmd.handler;\n\n return await this.execute({\n name,\n handler,\n });\n };\n\n runFn.rm = async (\n files: string | string[],\n options: RunOptions = {},\n ): Promise<string> => {\n if (Array.isArray(files) || files.includes(\"*\")) {\n return runFn({\n name:\n options.alias ??\n `rm -rf ${Array.isArray(files) ? files.join(\" \") : files}`,\n handler: async () => {\n for await (const file of glob(files)) {\n this.log.trace(`Removing ${file}`);\n await rm(file, { recursive: true, force: true });\n }\n },\n });\n }\n this.log.trace(`Removing ${files}`);\n return runFn({\n name: options.alias ?? `rm -rf ${files}`,\n handler: () => rm(files, { recursive: true, force: true }),\n });\n };\n\n runFn.cp = async (\n source: string,\n dist: string,\n options: RunOptions = {},\n ): Promise<string> => {\n this.log.trace(`Copying ${source} to ${dist}`);\n return runFn(\n {\n name: options.alias ?? `cp -r ${source} ${dist}`,\n handler: () => cp(source, dist, { recursive: true }),\n },\n options,\n );\n };\n\n return runFn;\n }\n\n protected async exec(cmd: string): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n exec(\n cmd,\n {\n env: {\n ...process.env,\n LOG_FORMAT: \"pretty\",\n },\n },\n (err, stdout) => {\n if (err) {\n err.stdout = stdout;\n reject(err);\n } else {\n resolve(stdout);\n }\n },\n );\n });\n }\n\n /**\n * Executes one or more tasks.\n *\n * @param task - A single task or an array of tasks to run in parallel.\n */\n protected async execute(task: Task | Task[]): Promise<string> {\n if (Array.isArray(task)) {\n await Promise.all(task.map((t) => this.executeTask(t)));\n return \"\"; // not supported for now\n } else {\n return await this.executeTask(task);\n }\n }\n\n /**\n * Prints a summary of all executed tasks and their durations.\n */\n public summary(): void {\n if (this.useDynamicLogger && this.firstTaskStarted) {\n this.prettyPrint.endCommand();\n return;\n }\n\n // Non-dynamic mode: use logging\n if (this.timers.length === 0) return;\n\n this.log.info(\"\");\n const totalTime = ((Date.now() - this.startTime) / 1000).toFixed(1);\n this.log.info(`Total time: ${totalTime}s`);\n this.log.info(``);\n }\n\n protected async executeTask(task: Task): Promise<string> {\n const now = Date.now();\n const taskId = task.name; // Use task name as unique ID\n\n // Setup dynamic logger\n if (this.useDynamicLogger) {\n this.prettyPrint.startSpinner(taskId, task.name);\n } else {\n this.log.info(`Starting '${task.name}' ...`);\n }\n\n let stdout = \"\";\n\n try {\n stdout = String((await task.handler()) ?? \"\");\n } catch (error) {\n // Clear spinner and show error\n if (this.useDynamicLogger) {\n this.prettyPrint.error(taskId, task.name);\n }\n if (error instanceof Error && \"stdout\" in error) {\n this.log.info(`\\n\\n${error.stdout}`);\n }\n throw new CommandError(`Task '${task.name}' failed`, { cause: error });\n }\n\n if (stdout) this.log.trace(stdout);\n\n const duration = ((Date.now() - now) / 1000).toFixed(1);\n\n // Clear spinner and show completion\n if (this.useDynamicLogger) {\n this.prettyPrint.success(taskId, task.name, `${duration}s`);\n } else {\n this.log.info(`Finished '${task.name}' after ${duration}s`);\n }\n\n this.timers.push({\n name: task.name,\n duration: `${duration}s`,\n });\n\n return stdout;\n }\n\n protected renderTable(data: string[][]): void {\n if (data.length === 0) return;\n\n const col1Width = Math.max(...data.map(([col1]) => col1.length), 7);\n const col2Width = Math.max(...data.map(([, col2]) => col2.length), 8);\n\n const divider = `+${\"-\".repeat(col1Width + 2)}+${\"-\".repeat(\n col2Width + 2,\n )}+`;\n this.log.info(divider);\n this.log.info(\n `| ${\"Command\".padEnd(col1Width)} | ${\"Duration\".padEnd(col2Width)} |`,\n );\n this.log.info(divider);\n for (const [col1, col2] of data) {\n this.log.info(\n `| ${col1.padEnd(col1Width)} | ${col2.padEnd(col2Width)} |`,\n );\n }\n this.log.info(divider);\n }\n}\n","import type * as fs from \"node:fs/promises\";\nimport type { glob } from \"node:fs/promises\";\nimport {\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type TObject,\n type TSchema,\n t,\n} from \"alepha\";\nimport type { AskMethod } from \"../helpers/Asker.ts\";\nimport type { RunnerMethod } from \"../helpers/Runner.ts\";\n\n/**\n * Declares a CLI command.\n *\n * This primitive allows you to define a command, its flags, and its handler\n * within your Alepha application structure.\n */\nexport const $command = <T extends TObject, A extends TSchema>(\n options: CommandPrimitiveOptions<T, A>,\n) => createPrimitive(CommandPrimitive<T, A>, options);\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CommandPrimitiveOptions<T extends TObject, A extends TSchema> {\n /**\n * The handler function to execute when the command is matched.\n */\n handler: (args: CommandHandlerArgs<T, A>) => Async<void>;\n\n /**\n * The name of the command. If omitted, the property key is used.\n *\n * An empty string \"\" denotes the root command.\n */\n name?: string;\n\n /**\n * A short description of the command, shown in the help message.\n */\n description?: string;\n\n /**\n * An array of alternative names for the command.\n */\n aliases?: string[];\n\n /**\n * A TypeBox object schema defining the flags for the command.\n */\n flags?: T;\n\n /**\n * An optional TypeBox schema defining the arguments for the command.\n *\n * @example\n * args: t.text()\n * my-cli command <arg1: string>\n *\n * args: t.optional(t.text())\n * my-cli command [arg1: string]\n *\n * args: t.tuple([t.text(), t.number()])\n * my-cli command <arg1: string> <arg2: number>\n *\n * args: t.tuple([t.text(), t.optional(t.number())])\n * my-cli command <arg1: string> [arg2: number]\n */\n args?: A;\n\n /**\n * If false, skip summary message at the end of the command execution.\n * Summary will display only if ({ run }) method calls were made.\n */\n summary?: boolean;\n\n /**\n * Marks this command as the root command.\n * Equivalent to setting name to an empty string \"\".\n */\n root?: boolean;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class CommandPrimitive<\n T extends TObject = TObject,\n A extends TSchema = TSchema,\n> extends Primitive<CommandPrimitiveOptions<T, A>> {\n public readonly flags = this.options.flags ?? t.object({});\n public readonly aliases = this.options.aliases ?? [];\n\n public get name(): string {\n if (this.options.root) {\n return \"\";\n }\n return this.options.name ?? `${this.config.propertyKey}`;\n }\n}\n\n$command[KIND] = CommandPrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CommandHandlerArgs<\n T extends TObject,\n A extends TSchema = TSchema,\n> {\n flags: Static<T>;\n args: A extends TSchema ? Static<A> : Array<string>;\n run: RunnerMethod;\n ask: AskMethod;\n glob: typeof glob;\n fs: typeof fs;\n\n /**\n * The root directory where the command is executed.\n */\n root: string;\n}\n","import * as fs from \"node:fs/promises\";\nimport { glob } from \"node:fs/promises\";\nimport {\n $atom,\n $env,\n $hook,\n $inject,\n $use,\n Alepha,\n type Static,\n type TObject,\n type TSchema,\n TypeBoxError,\n t,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { CommandError } from \"../errors/CommandError.ts\";\nimport { Asker } from \"../helpers/Asker.ts\";\nimport { Runner } from \"../helpers/Runner.ts\";\nimport {\n $command,\n type CommandHandlerArgs,\n type CommandPrimitive,\n} from \"../primitives/$command.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n CLI_NAME: t.text({\n default: \"cli\",\n description: \"Name of the CLI application.\",\n }),\n CLI_DESCRIPTION: t.text({\n default: \"\",\n description: \"Description of the CLI application.\",\n }),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\n/**\n * CLI provider configuration atom\n */\nexport const cliOptions = $atom({\n name: \"alepha.command.cli.options\",\n schema: t.object({\n name: t.optional(\n t.string({\n description: \"Name of the CLI application.\",\n }),\n ),\n description: t.optional(\n t.string({\n description: \"Description of the CLI application.\",\n }),\n ),\n argv: t.optional(\n t.array(t.string(), {\n description: \"Command line arguments to parse.\",\n }),\n ),\n }),\n default: {},\n});\n\nexport type CliProviderOptions = Static<typeof cliOptions.schema>;\n\ndeclare module \"alepha\" {\n interface State {\n [cliOptions.key]: CliProviderOptions;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class CliProvider {\n protected readonly env = $env(envSchema);\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected readonly runner = $inject(Runner);\n protected readonly asker = $inject(Asker);\n\n protected readonly options = $use(cliOptions);\n\n protected get name(): string {\n return this.options.name || this.env.CLI_NAME;\n }\n\n protected get description(): string {\n return this.options.description || this.env.CLI_DESCRIPTION;\n }\n\n protected get argv(): string[] {\n return (\n this.options.argv ||\n (typeof process !== \"undefined\" ? process.argv.slice(2) : [])\n );\n }\n\n protected readonly globalFlags = {\n help: {\n aliases: [\"h\", \"help\"],\n description: \"Show this help message\",\n schema: t.boolean(),\n },\n };\n\n protected readonly onReady = $hook({\n on: \"ready\",\n handler: async () => {\n const argv = [...this.argv];\n const commandName = argv.find((arg) => !arg.startsWith(\"-\")) ?? \"\";\n let command = this.findCommand(commandName);\n\n const globalFlags = this.parseFlags(\n argv,\n Object.entries(this.getAllGlobalFlags()).map(([key, value]) => ({\n key,\n ...value,\n })),\n );\n\n if (globalFlags.help) {\n this.printHelp(command);\n return;\n }\n\n if (!command) {\n // check if one command is the root command (name === \"\") and has 'args'\n const rootCommand = this.findCommand(\"\");\n if (rootCommand?.options.args) {\n command = rootCommand;\n } else {\n if (commandName !== \"\") {\n this.log.error(`Unknown command: '${commandName}'`);\n this.printHelp();\n }\n return;\n }\n }\n\n const commandFlags = this.parseCommandFlags(argv, command.flags);\n const commandArgs = this.parseCommandArgs(argv, command.options.args);\n\n await this.alepha.context.run(async () => {\n this.log.debug(`Executing command '${command.name}'...`, {\n flags: commandFlags,\n args: commandArgs,\n });\n\n const runner = this.runner;\n\n // Start command session for pretty print\n runner.startCommand(this.name, command.name);\n\n const args = {\n flags: commandFlags,\n args: commandArgs,\n run: runner.run,\n ask: this.asker.ask,\n fs,\n glob,\n root: process.cwd(),\n };\n\n await command.options.handler(args as CommandHandlerArgs<TObject>);\n\n if (command.options.summary !== false) {\n runner.summary();\n }\n\n this.log.debug(`Command '${command.name}' executed successfully.`);\n });\n },\n });\n\n public get commands(): CommandPrimitive<any>[] {\n return this.alepha.primitives($command);\n }\n\n protected findCommand(name: string): CommandPrimitive<TObject> | undefined {\n return this.commands.find(\n (command) => command.name === name || command.aliases.includes(name),\n );\n }\n\n /**\n * Get all global flags including those from the root command (name === \"\")\n */\n protected getAllGlobalFlags(): Record<\n string,\n { aliases: string[]; description?: string; schema: TSchema }\n > {\n const rootCommand = this.commands.find((cmd) => cmd.name === \"\");\n const allGlobalFlags: Record<\n string,\n { aliases: string[]; description?: string; schema: TSchema }\n > = { ...this.globalFlags };\n\n if (rootCommand) {\n // Add root command flags to global flags\n for (const [key, value] of Object.entries(rootCommand.flags.properties)) {\n allGlobalFlags[key] = {\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : undefined) ??\n []),\n ],\n description: (value as any).description,\n schema: value as TSchema,\n };\n }\n }\n\n return allGlobalFlags;\n }\n\n protected parseCommandFlags(\n argv: string[],\n schema: TObject,\n ): Record<string, any> {\n const flagDefs = Object.entries(schema.properties).map(([key, value]) => ({\n key,\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : undefined) ??\n []),\n ],\n description: (value as any).description,\n schema: value,\n }));\n\n const parsed = this.parseFlags(argv, flagDefs);\n\n // apply manually defaults for optional properties that have defaults\n for (const [key, value] of Object.entries(schema.properties)) {\n if (!(key in parsed) && t.schema.isOptional(value)) {\n const innerSchema = value;\n if (innerSchema && \"default\" in innerSchema) {\n parsed[key] = innerSchema.default;\n }\n }\n }\n\n try {\n return this.alepha.codec.decode(schema, parsed);\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(\n `Invalid flag: ${error.cause.instancePath || \"command\"} ${error.cause.message}`,\n );\n }\n throw error;\n }\n }\n\n protected parseFlags(\n argv: string[],\n flagDefs: { key: string; aliases: string[]; schema: TSchema }[],\n ): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const arg of argv.filter((a) => a.startsWith(\"-\"))) {\n const [rawKey, ...valueParts] = arg.replace(/^-{1,2}/, \"\").split(\"=\");\n const value = valueParts.join(\"=\");\n\n const def = flagDefs.find((d) => d.aliases.includes(rawKey));\n if (!def) continue;\n\n if (t.schema.isBoolean(def.schema)) {\n result[def.key] = true;\n } else if (value) {\n try {\n if (t.schema.isObject(def.schema) || t.schema.isArray(def.schema)) {\n result[def.key] = JSON.parse(value);\n } else {\n result[def.key] = value;\n }\n } catch {\n throw new CommandError(`Invalid JSON value for flag --${rawKey}`);\n }\n } else {\n throw new CommandError(`Flag --${rawKey} requires a value.`);\n }\n }\n\n return result;\n }\n\n protected parseCommandArgs(argv: string[], schema?: TSchema): any {\n if (!schema) {\n return undefined;\n }\n\n // Extract positional arguments (non-flag arguments)\n const positionalArgs = argv.filter((arg) => !arg.startsWith(\"-\"));\n // Remove the command name from the positional args\n const argsOnly = positionalArgs.slice(1);\n\n try {\n if (t.schema.isOptional(schema)) {\n // Handle optional args: t.optional(t.text())\n if (argsOnly.length === 0) {\n return undefined;\n }\n return this.parseArgumentValue(argsOnly[0], schema);\n } else if (t.schema.isTuple(schema) && schema.items) {\n // Handle tuple args: t.tuple([t.text(), t.number()])\n const result: any[] = [];\n const items = schema.items;\n for (let i = 0; i < items.length; i++) {\n const itemSchema = items[i];\n if (i < argsOnly.length) {\n result.push(this.parseArgumentValue(argsOnly[i], itemSchema));\n } else if (t.schema.isOptional(itemSchema)) {\n result.push(undefined);\n } else {\n throw new CommandError(\n `Missing required argument at position ${i + 1}`,\n );\n }\n }\n return result;\n } else {\n // Handle single arg: t.text(), t.number(), etc.\n if (argsOnly.length === 0) {\n throw new CommandError(\"Missing required argument\");\n }\n return this.parseArgumentValue(argsOnly[0], schema);\n }\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(`Invalid argument: ${error.value.message}`);\n }\n throw error;\n }\n }\n\n protected parseArgumentValue(value: string, schema: TSchema): any {\n if (t.schema.isString(schema)) {\n return value;\n }\n\n if (t.schema.isNumber(schema) || t.schema.isInteger(schema)) {\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new CommandError(`Expected number, got \"${value}\"`);\n }\n if (t.schema.isInteger(schema) && !Number.isInteger(num)) {\n throw new CommandError(`Expected integer, got \"${value}\"`);\n }\n return num;\n }\n\n if (t.schema.isBoolean(schema)) {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"1\") return true;\n if (lower === \"false\" || lower === \"0\") return false;\n throw new CommandError(`Expected boolean, got \"${value}\"`);\n }\n\n // For other types, return the string value and let TypeBox validate it\n return value;\n }\n\n protected generateArgsUsage(schema?: TSchema): string {\n if (!schema) {\n return \"\";\n }\n\n if (t.schema.isOptional(schema)) {\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` [${key}${typeName}]`;\n }\n\n if (t.schema.isTuple(schema) && schema.items) {\n const items = schema.items;\n const args = items.map((item, index) => {\n const argName = `arg${index + 1}`;\n const typeName = this.getTypeName(item);\n if (t.schema.isOptional(item)) {\n return `[${argName}${typeName}]`;\n }\n return `<${argName}${typeName}>`;\n });\n return ` ${args.join(\" \")}`;\n }\n\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` <${key}${typeName}>`;\n }\n\n protected getTypeName(schema: TSchema): string {\n if (!schema) return \"\";\n\n // Check TypeBox type guards first\n if (t.schema.isString(schema)) return \"\";\n if (t.schema.isNumber(schema)) return \": number\";\n if (t.schema.isInteger(schema)) return \": integer\";\n if (t.schema.isBoolean(schema)) return \": boolean\";\n\n return \"\";\n }\n\n public printHelp(command?: CommandPrimitive<any>): void {\n const cliName = this.name || \"cli\";\n this.log.info(\"\"); // Newline\n\n if (command?.name) {\n // Command-specific help\n const argsUsage = this.generateArgsUsage(command.options.args);\n const usage = `${cliName} ${command.name}${argsUsage}`.trim();\n this.log.info(`Usage: \\`${usage}\\``);\n\n if (command.options.description) {\n this.log.info(``);\n this.log.info(`\\t${command.options.description}`);\n }\n\n this.log.info(\"\");\n this.log.info(\"Flags:\");\n\n const flags = [\n ...Object.entries(command.flags.properties).map(([key, value]) => ({\n key,\n schema: value,\n aliases: (value as any).alias ?? [key],\n description: (value as any).description,\n })),\n ...Object.entries(this.getAllGlobalFlags()).map(([key, value]) => ({\n key,\n ...value,\n })),\n ];\n\n const maxFlagLength = this.getMaxFlagLength(flags);\n for (const { aliases, description } of flags) {\n const flagStr = (Array.isArray(aliases) ? aliases : [aliases])\n .map((a: string) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \");\n this.log.info(\n ` ${flagStr.padEnd(maxFlagLength)} # ${description ?? \"\"}`,\n );\n }\n } else {\n // general help\n this.log.info(this.description || \"Available commands:\");\n this.log.info(\"\");\n this.log.info(\"Commands:\");\n const maxCmdLength = this.getMaxCmdLength(this.commands);\n\n for (const command of this.commands) {\n // skip root command in list\n if (command.name === \"\") {\n continue;\n }\n\n const cmdStr = [command.name, ...command.aliases].join(\", \");\n const argsUsage = this.generateArgsUsage(command.options.args);\n const fullCmdStr = `${cmdStr}${argsUsage}`;\n this.log.info(\n ` ${cliName} ${fullCmdStr.padEnd(maxCmdLength)} # ${command.options.description ?? \"\"}`,\n );\n }\n\n this.log.info(\"\");\n this.log.info(\"Flags:\");\n const globalFlags = Object.values(this.getAllGlobalFlags());\n const maxFlagLength = this.getMaxFlagLength(globalFlags);\n for (const { aliases, description } of globalFlags) {\n const flagStr = aliases\n .map((a) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \");\n this.log.info(\n ` ${flagStr.padEnd(maxFlagLength)} # ${description ?? \"\"}`,\n );\n }\n }\n this.log.info(\"\"); // Newline\n }\n\n private getMaxCmdLength(commands: CommandPrimitive[]): number {\n return Math.max(\n ...commands.map((c) => {\n const cmdStr = [c.name, ...c.aliases].join(\", \");\n const argsUsage = this.generateArgsUsage(c.options.args);\n return `${cmdStr}${argsUsage}`.length;\n }),\n );\n }\n\n private getMaxFlagLength(flags: { aliases: string[] }[]): number {\n return Math.max(\n ...flags.map((f) => {\n const aliases = Array.isArray(f.aliases) ? f.aliases : [f.aliases];\n return aliases\n .map((a) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \").length;\n }),\n );\n }\n}\n","import { $module } from \"alepha\";\nimport { Asker } from \"./helpers/Asker.ts\";\nimport { PrettyPrint } from \"./helpers/PrettyPrint.ts\";\nimport { Runner } from \"./helpers/Runner.ts\";\nimport { $command } from \"./primitives/$command.ts\";\nimport { CliProvider } from \"./providers/CliProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./errors/CommandError.ts\";\nexport * from \"./helpers/Asker.ts\";\nexport * from \"./helpers/PrettyPrint.ts\";\nexport * from \"./helpers/Runner.ts\";\nexport * from \"./primitives/$command.ts\";\nexport * from \"./providers/CliProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * This module provides a powerful way to build command-line interfaces\n * directly within your Alepha application, using declarative primitives.\n *\n * It allows you to define commands using the `$command` primitive.\n *\n * @see {@link $command}\n * @module alepha.command\n */\nexport const AlephaCommand = $module({\n name: \"alepha.command\",\n primitives: [$command],\n services: [CliProvider, Runner, Asker, PrettyPrint],\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"typebox\" {\n interface StringOptions {\n /**\n * Additional aliases for the flags.\n *\n * @module alepha.command\n */\n aliases?: string[];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["askFn: AskMethod","value: any","createPromptInterface","runFn: RunnerMethod","stdout","t","allGlobalFlags: Record<\n string,\n { aliases: string[]; description?: string; schema: TSchema }\n >","result: Record<string, any>","result: any[]","typeName","command"],"sources":["../../src/command/helpers/Asker.ts","../../src/command/helpers/PrettyPrint.ts","../../src/command/errors/CommandError.ts","../../src/command/helpers/Runner.ts","../../src/command/primitives/$command.ts","../../src/command/providers/CliProvider.ts","../../src/command/index.ts"],"sourcesContent":["import { stdin as input, stdout as output } from \"node:process\";\nimport { createInterface as createPromptInterface } from \"node:readline/promises\";\nimport {\n $inject,\n Alepha,\n AlephaError,\n type Static,\n type TSchema,\n type TString,\n t,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\n\nexport interface AskOptions<T extends TSchema = TString> {\n /**\n * Response schema expected.\n *\n * Recommended schemas:\n * - t.text() - for free text input\n * - t.number() - for numeric input\n * - t.boolean() - for yes/no input (accepts \"true\", \"false\", \"1\", \"0\")\n * - t.enum([\"option1\", \"option2\"]) - for predefined options\n *\n * You can use schema.default to provide a default value.\n *\n * @example\n * ```ts\n * ask(\"What is your name?\", { schema: t.text({ default: \"John Doe\" }) })\n * ```\n *\n * @default TString\n */\n schema?: T;\n\n /**\n * Custom validation function.\n * Throws an AlephaError in case of validation failure.\n */\n validate?: (value: Static<T>) => void;\n}\n\nexport interface AskMethod {\n // biome-ignore lint/style/useShorthandFunctionType: .\n <T extends TSchema = TString>(\n question: string,\n options?: AskOptions<T>,\n ): Promise<Static<T>>;\n\n permission: (question: string) => Promise<boolean>;\n}\n\nexport class Asker {\n protected readonly log = $logger();\n public readonly ask: AskMethod;\n protected readonly alepha = $inject(Alepha);\n\n constructor() {\n this.ask = this.createAskMethod();\n }\n\n protected createAskMethod(): AskMethod {\n const askFn: AskMethod = async <T extends TSchema = TString>(\n question: string,\n options: AskOptions<T> = {},\n ) => {\n return await this.prompt<T>(question, options);\n };\n\n askFn.permission = async (question: string) => {\n const response = await this.prompt(`${question} [Y/n]`, {\n schema: t.enum([\"Y\", \"y\", \"n\", \"no\", \"yes\"], { default: \"Y\" }),\n });\n return response.charAt(0).toLowerCase() === \"y\";\n };\n\n return askFn;\n }\n\n protected async prompt<T extends TSchema = TString>(\n question: string,\n options: AskOptions<T>,\n ): Promise<Static<T>> {\n const rl = this.createPromptInterface();\n let value: any;\n try {\n do {\n try {\n const answer = await rl.question(`${question}\\n> `);\n if (options.schema) {\n value = this.alepha.codec.decode(\n options.schema,\n answer ? answer.trim() : undefined,\n );\n } else {\n value = String(answer.trim());\n }\n if (options.validate) {\n options.validate(value);\n }\n } catch (error) {\n if (error instanceof AlephaError) {\n this.log.error(`${error.message}\\n`);\n value = undefined;\n } else {\n throw error;\n }\n }\n } while (value === undefined);\n } finally {\n rl.close();\n }\n\n return value;\n }\n\n protected createPromptInterface() {\n return createPromptInterface({ input, output });\n }\n}\n","import { $inject } from \"alepha\";\nimport { DateTimeProvider, type Interval } from \"alepha/datetime\";\n\nexport class PrettyPrint {\n protected dateTimeProvider = $inject(DateTimeProvider);\n protected spinnerInterval?: Interval;\n protected readonly frames = [\n \"⠋\",\n \"⠙\",\n \"⠹\",\n \"⠸\",\n \"⠼\",\n \"⠴\",\n \"⠦\",\n \"⠧\",\n \"⠇\",\n \"⠏\",\n ];\n protected tasks = new Map<\n string,\n {\n taskName: string;\n frameIndex: number;\n status: \"running\" | \"success\" | \"error\";\n duration?: string;\n }\n >();\n protected lastLineCount = 0;\n protected header?: string;\n protected commandStartTime?: number;\n\n // ANSI color codes\n protected readonly colors = {\n reset: \"\\x1b[0m\",\n cyan: \"\\x1b[36m\",\n green: \"\\x1b[32m\",\n red: \"\\x1b[31m\",\n dim: \"\\x1b[2m\",\n };\n\n /**\n * Start a new command session with header\n */\n public startCommand(cliName: string, commandName: string): void {\n this.header = commandName ? `${cliName} ${commandName}` : cliName;\n this.commandStartTime = Date.now();\n this.tasks.clear();\n this.lastLineCount = 0;\n process.stdout.write(`┌─ ${this.header}\\n`);\n }\n\n /**\n * End the command session with footer\n */\n public endCommand(): void {\n if (this.commandStartTime) {\n const totalDuration = (\n (Date.now() - this.commandStartTime) /\n 1000\n ).toFixed(1);\n process.stdout.write(`└─ Done in ${totalDuration}s\\n`);\n }\n this.header = undefined;\n this.commandStartTime = undefined;\n }\n\n /**\n * Start an animated spinner with a task name\n */\n public startSpinner(id: string, taskName: string): void {\n this.tasks.set(id, {\n taskName,\n frameIndex: 0,\n status: \"running\",\n });\n\n // Start interval if not already running\n if (!this.spinnerInterval) {\n this.spinnerInterval = this.dateTimeProvider.createInterval(\n () => this.updateDisplay(),\n 80,\n true,\n );\n }\n\n this.updateDisplay();\n }\n\n /**\n * Stop the spinner and show success with a tick\n */\n public success(id: string, taskName?: string, duration?: string): void {\n const task = this.tasks.get(id);\n if (task) {\n task.status = \"success\";\n if (taskName) task.taskName = taskName;\n if (duration) task.duration = duration;\n this.updateDisplay();\n }\n\n this.checkIfAllDone();\n }\n\n /**\n * Stop the spinner and show error with a cross\n */\n public error(id: string, taskName?: string): void {\n const task = this.tasks.get(id);\n if (task) {\n task.status = \"error\";\n if (taskName) task.taskName = taskName;\n this.updateDisplay();\n }\n\n this.checkIfAllDone();\n }\n\n /**\n * Update the display for all tasks\n */\n protected updateDisplay(): void {\n // Clear previous lines\n if (this.lastLineCount > 0) {\n // Move cursor up and clear each line\n for (let i = 0; i < this.lastLineCount; i++) {\n process.stdout.write(\"\\x1b[1A\\x1b[2K\");\n }\n }\n\n // Render all tasks\n const taskArray = Array.from(this.tasks.values());\n const prefix = this.header ? \"│ \" : \"\";\n\n for (const task of taskArray) {\n let line = prefix;\n\n if (task.status === \"running\") {\n const frame = this.frames[task.frameIndex];\n line += `${this.colors.cyan}${frame}${this.colors.reset} ${this.colors.dim}${task.taskName}${this.colors.reset}`;\n task.frameIndex = (task.frameIndex + 1) % this.frames.length;\n } else if (task.status === \"success\") {\n const durationStr = task.duration\n ? ` ${this.colors.dim}${task.duration}${this.colors.reset}`\n : \"\";\n line += `${this.colors.green}✓${this.colors.reset} ${task.taskName}${durationStr}`;\n } else if (task.status === \"error\") {\n line += `${this.colors.red}✗${this.colors.reset} ${task.taskName}`;\n }\n\n process.stdout.write(`${line}\\n`);\n }\n\n this.lastLineCount = taskArray.length;\n }\n\n /**\n * Check if all tasks are done and stop the interval\n */\n protected checkIfAllDone(): void {\n const hasRunningTasks = Array.from(this.tasks.values()).some(\n (task) => task.status === \"running\",\n );\n\n if (!hasRunningTasks && this.spinnerInterval) {\n this.dateTimeProvider.clearInterval(this.spinnerInterval);\n this.spinnerInterval = undefined;\n }\n }\n\n /**\n * Stop the spinner without showing any symbol\n */\n public stopSpinner(): void {\n if (this.spinnerInterval) {\n this.dateTimeProvider.clearInterval(this.spinnerInterval);\n this.spinnerInterval = undefined;\n }\n }\n\n /**\n * Clear all tasks\n */\n public clear(): void {\n this.tasks.clear();\n this.stopSpinner();\n this.lastLineCount = 0;\n }\n}\n","import { AlephaError } from \"alepha\";\n\nexport class CommandError extends AlephaError {\n readonly name = \"CommandError\";\n}\n","import { exec } from \"node:child_process\";\nimport { cp, glob, rm } from \"node:fs/promises\";\nimport { $inject, Alepha } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { CommandError } from \"../errors/CommandError.ts\";\nimport { PrettyPrint } from \"./PrettyPrint.ts\";\n\nexport type Task = {\n name: string;\n handler: () => any;\n};\n\ninterface Timer {\n name: string;\n duration: string;\n}\n\nexport interface RunOptions {\n /**\n * Rename the command for logging purposes.\n */\n alias?: string;\n}\n\nexport interface RunnerMethod {\n (\n cmd: string | Task | Array<string | Task>,\n options?: RunOptions | (() => any),\n ): Promise<string>;\n rm: (glob: string | string[], options?: RunOptions) => Promise<string>;\n cp: (source: string, dest: string, options?: RunOptions) => Promise<string>;\n}\n\nexport class Runner {\n protected readonly log = $logger();\n protected readonly timers: Timer[] = [];\n protected readonly startTime: number = Date.now();\n protected readonly prettyPrint = $inject(PrettyPrint);\n protected readonly alepha = $inject(Alepha);\n public readonly run: RunnerMethod;\n protected cliName = \"\";\n protected commandName = \"\";\n protected firstTaskStarted = false;\n\n constructor() {\n this.run = this.createRunMethod();\n }\n\n protected get useDynamicLogger() {\n if (this.alepha.isCI()) {\n return false;\n }\n\n return this.alepha.env.LOG_FORMAT === \"raw\";\n }\n\n /**\n * Start a new command session with header (for pretty print mode)\n */\n public startCommand(cliName: string, commandName: string): void {\n this.cliName = cliName;\n this.commandName = commandName;\n }\n\n protected createRunMethod() {\n const runFn: RunnerMethod = async (\n cmd: string | Task | Array<string | Task>,\n options?: RunOptions | (() => any),\n ) => {\n if (this.useDynamicLogger && !this.firstTaskStarted) {\n this.prettyPrint.startCommand(this.cliName, this.commandName);\n }\n\n this.firstTaskStarted = true;\n\n if (Array.isArray(cmd)) {\n return await this.execute(\n cmd.map((it) =>\n typeof it === \"string\"\n ? { name: it, handler: () => this.exec(it) }\n : it,\n ),\n );\n }\n\n const alias = typeof options === \"object\" ? options.alias : undefined;\n const name = alias ?? (typeof cmd === \"string\" ? cmd : cmd.name);\n const handler =\n typeof options === \"function\"\n ? options\n : typeof cmd === \"string\"\n ? () => this.exec(cmd)\n : cmd.handler;\n\n return await this.execute({\n name,\n handler,\n });\n };\n\n runFn.rm = async (\n files: string | string[],\n options: RunOptions = {},\n ): Promise<string> => {\n if (Array.isArray(files) || files.includes(\"*\")) {\n return runFn({\n name:\n options.alias ??\n `rm -rf ${Array.isArray(files) ? files.join(\" \") : files}`,\n handler: async () => {\n for await (const file of glob(files)) {\n this.log.trace(`Removing ${file}`);\n await rm(file, { recursive: true, force: true });\n }\n },\n });\n }\n this.log.trace(`Removing ${files}`);\n return runFn({\n name: options.alias ?? `rm -rf ${files}`,\n handler: () => rm(files, { recursive: true, force: true }),\n });\n };\n\n runFn.cp = async (\n source: string,\n dist: string,\n options: RunOptions = {},\n ): Promise<string> => {\n this.log.trace(`Copying ${source} to ${dist}`);\n return runFn(\n {\n name: options.alias ?? `cp -r ${source} ${dist}`,\n handler: () => cp(source, dist, { recursive: true }),\n },\n options,\n );\n };\n\n return runFn;\n }\n\n protected async exec(cmd: string): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n exec(\n cmd,\n {\n env: {\n ...process.env,\n LOG_FORMAT: \"pretty\",\n },\n },\n (err, stdout) => {\n if (err) {\n err.stdout = stdout;\n reject(err);\n } else {\n resolve(stdout);\n }\n },\n );\n });\n }\n\n /**\n * Executes one or more tasks.\n *\n * @param task - A single task or an array of tasks to run in parallel.\n */\n protected async execute(task: Task | Task[]): Promise<string> {\n if (Array.isArray(task)) {\n await Promise.all(task.map((t) => this.executeTask(t)));\n return \"\"; // not supported for now\n } else {\n return await this.executeTask(task);\n }\n }\n\n /**\n * Prints a summary of all executed tasks and their durations.\n */\n public summary(): void {\n if (this.useDynamicLogger && this.firstTaskStarted) {\n this.prettyPrint.endCommand();\n return;\n }\n\n // Non-dynamic mode: use logging\n if (this.timers.length === 0) return;\n\n this.log.info(\"\");\n const totalTime = ((Date.now() - this.startTime) / 1000).toFixed(1);\n this.log.info(`Total time: ${totalTime}s`);\n this.log.info(``);\n }\n\n protected async executeTask(task: Task): Promise<string> {\n const now = Date.now();\n const taskId = task.name; // Use task name as unique ID\n\n // Setup dynamic logger\n if (this.useDynamicLogger) {\n this.prettyPrint.startSpinner(taskId, task.name);\n } else {\n this.log.info(`Starting '${task.name}' ...`);\n }\n\n let stdout = \"\";\n\n try {\n stdout = String((await task.handler()) ?? \"\");\n } catch (error) {\n // Clear spinner and show error\n if (this.useDynamicLogger) {\n this.prettyPrint.error(taskId, task.name);\n }\n if (error instanceof Error && \"stdout\" in error) {\n this.log.info(`\\n\\n${error.stdout}`);\n }\n throw new CommandError(`Task '${task.name}' failed`, { cause: error });\n }\n\n if (stdout) this.log.trace(stdout);\n\n const duration = ((Date.now() - now) / 1000).toFixed(1);\n\n // Clear spinner and show completion\n if (this.useDynamicLogger) {\n this.prettyPrint.success(taskId, task.name, `${duration}s`);\n } else {\n this.log.info(`Finished '${task.name}' after ${duration}s`);\n }\n\n this.timers.push({\n name: task.name,\n duration: `${duration}s`,\n });\n\n return stdout;\n }\n\n protected renderTable(data: string[][]): void {\n if (data.length === 0) return;\n\n const col1Width = Math.max(...data.map(([col1]) => col1.length), 7);\n const col2Width = Math.max(...data.map(([, col2]) => col2.length), 8);\n\n const divider = `+${\"-\".repeat(col1Width + 2)}+${\"-\".repeat(\n col2Width + 2,\n )}+`;\n this.log.info(divider);\n this.log.info(\n `| ${\"Command\".padEnd(col1Width)} | ${\"Duration\".padEnd(col2Width)} |`,\n );\n this.log.info(divider);\n for (const [col1, col2] of data) {\n this.log.info(\n `| ${col1.padEnd(col1Width)} | ${col2.padEnd(col2Width)} |`,\n );\n }\n this.log.info(divider);\n }\n}\n","import type * as fs from \"node:fs/promises\";\nimport type { glob } from \"node:fs/promises\";\nimport {\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type TObject,\n type TSchema,\n t,\n} from \"alepha\";\nimport type { AskMethod } from \"../helpers/Asker.ts\";\nimport type { RunnerMethod } from \"../helpers/Runner.ts\";\n\n/**\n * Declares a CLI command.\n *\n * This primitive allows you to define a command, its flags, and its handler\n * within your Alepha application structure.\n */\nexport const $command = <T extends TObject, A extends TSchema>(\n options: CommandPrimitiveOptions<T, A>,\n) => createPrimitive(CommandPrimitive<T, A>, options);\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CommandPrimitiveOptions<T extends TObject, A extends TSchema> {\n /**\n * The handler function to execute when the command is matched.\n */\n handler: (args: CommandHandlerArgs<T, A>) => Async<void>;\n\n /**\n * The name of the command. If omitted, the property key is used.\n *\n * An empty string \"\" denotes the root command.\n */\n name?: string;\n\n /**\n * A short description of the command, shown in the help message.\n */\n description?: string;\n\n /**\n * An array of alternative names for the command.\n */\n aliases?: string[];\n\n /**\n * A TypeBox object schema defining the flags for the command.\n */\n flags?: T;\n\n /**\n * An optional TypeBox schema defining the arguments for the command.\n *\n * @example\n * args: t.text()\n * my-cli command <arg1: string>\n *\n * args: t.optional(t.text())\n * my-cli command [arg1: string]\n *\n * args: t.tuple([t.text(), t.number()])\n * my-cli command <arg1: string> <arg2: number>\n *\n * args: t.tuple([t.text(), t.optional(t.number())])\n * my-cli command <arg1: string> [arg2: number]\n */\n args?: A;\n\n /**\n * If false, skip summary message at the end of the command execution.\n * Summary will display only if ({ run }) method calls were made.\n */\n summary?: boolean;\n\n /**\n * Marks this command as the root command.\n * Equivalent to setting name to an empty string \"\".\n */\n root?: boolean;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class CommandPrimitive<\n T extends TObject = TObject,\n A extends TSchema = TSchema,\n> extends Primitive<CommandPrimitiveOptions<T, A>> {\n public readonly flags = this.options.flags ?? t.object({});\n public readonly aliases = this.options.aliases ?? [];\n\n public get name(): string {\n if (this.options.root) {\n return \"\";\n }\n return this.options.name ?? `${this.config.propertyKey}`;\n }\n}\n\n$command[KIND] = CommandPrimitive;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CommandHandlerArgs<\n T extends TObject,\n A extends TSchema = TSchema,\n> {\n flags: Static<T>;\n args: A extends TSchema ? Static<A> : Array<string>;\n run: RunnerMethod;\n ask: AskMethod;\n glob: typeof glob;\n fs: typeof fs;\n\n /**\n * The root directory where the command is executed.\n */\n root: string;\n}\n","import * as fs from \"node:fs/promises\";\nimport { glob } from \"node:fs/promises\";\nimport {\n $atom,\n $env,\n $hook,\n $inject,\n $use,\n Alepha,\n type Static,\n type TObject,\n type TSchema,\n TypeBoxError,\n t,\n} from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { CommandError } from \"../errors/CommandError.ts\";\nimport { Asker } from \"../helpers/Asker.ts\";\nimport { Runner } from \"../helpers/Runner.ts\";\nimport {\n $command,\n type CommandHandlerArgs,\n type CommandPrimitive,\n} from \"../primitives/$command.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nconst envSchema = t.object({\n CLI_NAME: t.text({\n default: \"cli\",\n description: \"Name of the CLI application.\",\n }),\n CLI_DESCRIPTION: t.text({\n default: \"\",\n description: \"Description of the CLI application.\",\n }),\n});\n\ndeclare module \"alepha\" {\n interface Env extends Partial<Static<typeof envSchema>> {}\n}\n\n/**\n * CLI provider configuration atom\n */\nexport const cliOptions = $atom({\n name: \"alepha.command.cli.options\",\n schema: t.object({\n name: t.optional(\n t.string({\n description: \"Name of the CLI application.\",\n }),\n ),\n description: t.optional(\n t.string({\n description: \"Description of the CLI application.\",\n }),\n ),\n argv: t.optional(\n t.array(t.string(), {\n description: \"Command line arguments to parse.\",\n }),\n ),\n }),\n default: {},\n});\n\nexport type CliProviderOptions = Static<typeof cliOptions.schema>;\n\ndeclare module \"alepha\" {\n interface State {\n [cliOptions.key]: CliProviderOptions;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class CliProvider {\n protected readonly env = $env(envSchema);\n protected readonly alepha = $inject(Alepha);\n protected readonly log = $logger();\n protected readonly runner = $inject(Runner);\n protected readonly asker = $inject(Asker);\n\n protected readonly options = $use(cliOptions);\n\n protected get name(): string {\n return this.options.name || this.env.CLI_NAME;\n }\n\n protected get description(): string {\n return this.options.description || this.env.CLI_DESCRIPTION;\n }\n\n protected get argv(): string[] {\n return (\n this.options.argv ||\n (typeof process !== \"undefined\" ? process.argv.slice(2) : [])\n );\n }\n\n protected readonly globalFlags = {\n help: {\n aliases: [\"h\", \"help\"],\n description: \"Show this help message\",\n schema: t.boolean(),\n },\n };\n\n protected readonly onReady = $hook({\n on: \"ready\",\n handler: async () => {\n const argv = [...this.argv];\n const commandName = argv.find((arg) => !arg.startsWith(\"-\")) ?? \"\";\n let command = this.findCommand(commandName);\n\n const globalFlags = this.parseFlags(\n argv,\n Object.entries(this.getAllGlobalFlags()).map(([key, value]) => ({\n key,\n ...value,\n })),\n );\n\n if (globalFlags.help) {\n this.printHelp(command);\n return;\n }\n\n if (!command) {\n // check if one command is the root command (name === \"\") and has 'args'\n const rootCommand = this.findCommand(\"\");\n if (rootCommand?.options.args) {\n command = rootCommand;\n } else {\n if (commandName !== \"\") {\n this.log.error(`Unknown command: '${commandName}'`);\n this.printHelp();\n }\n return;\n }\n }\n\n const commandFlags = this.parseCommandFlags(argv, command.flags);\n const commandArgs = this.parseCommandArgs(\n argv,\n command.options.args,\n command.name === \"\",\n );\n\n await this.alepha.context.run(async () => {\n this.log.debug(`Executing command '${command.name}'...`, {\n flags: commandFlags,\n args: commandArgs,\n });\n\n const runner = this.runner;\n\n // Start command session for pretty print\n runner.startCommand(this.name, command.name);\n\n const args = {\n flags: commandFlags,\n args: commandArgs,\n run: runner.run,\n ask: this.asker.ask,\n fs,\n glob,\n root: process.cwd(),\n };\n\n await command.options.handler(args as CommandHandlerArgs<TObject>);\n\n if (command.options.summary !== false) {\n runner.summary();\n }\n\n this.log.debug(`Command '${command.name}' executed successfully.`);\n });\n },\n });\n\n public get commands(): CommandPrimitive<any>[] {\n return this.alepha.primitives($command);\n }\n\n protected findCommand(name: string): CommandPrimitive<TObject> | undefined {\n return this.commands.find(\n (command) => command.name === name || command.aliases.includes(name),\n );\n }\n\n /**\n * Get all global flags including those from the root command (name === \"\")\n */\n protected getAllGlobalFlags(): Record<\n string,\n { aliases: string[]; description?: string; schema: TSchema }\n > {\n const rootCommand = this.commands.find((cmd) => cmd.name === \"\");\n const allGlobalFlags: Record<\n string,\n { aliases: string[]; description?: string; schema: TSchema }\n > = { ...this.globalFlags };\n\n if (rootCommand) {\n // Add root command flags to global flags\n for (const [key, value] of Object.entries(rootCommand.flags.properties)) {\n allGlobalFlags[key] = {\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : undefined) ??\n []),\n ],\n description: (value as any).description,\n schema: value as TSchema,\n };\n }\n }\n\n return allGlobalFlags;\n }\n\n protected parseCommandFlags(\n argv: string[],\n schema: TObject,\n ): Record<string, any> {\n const flagDefs = Object.entries(schema.properties).map(([key, value]) => ({\n key,\n aliases: [\n key,\n ...((value as any).aliases ??\n ((value as any).alias ? [(value as any).alias] : undefined) ??\n []),\n ],\n description: (value as any).description,\n schema: value,\n }));\n\n const parsed = this.parseFlags(argv, flagDefs);\n\n // apply manually defaults for optional properties that have defaults\n for (const [key, value] of Object.entries(schema.properties)) {\n if (!(key in parsed) && t.schema.isOptional(value)) {\n const innerSchema = value;\n if (innerSchema && \"default\" in innerSchema) {\n parsed[key] = innerSchema.default;\n }\n }\n }\n\n try {\n return this.alepha.codec.decode(schema, parsed);\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(\n `Invalid flag: ${error.cause.instancePath || \"command\"} ${error.cause.message}`,\n );\n }\n throw error;\n }\n }\n\n protected parseFlags(\n argv: string[],\n flagDefs: { key: string; aliases: string[]; schema: TSchema }[],\n ): Record<string, any> {\n const result: Record<string, any> = {};\n\n for (const arg of argv.filter((a) => a.startsWith(\"-\"))) {\n const [rawKey, ...valueParts] = arg.replace(/^-{1,2}/, \"\").split(\"=\");\n const value = valueParts.join(\"=\");\n\n const def = flagDefs.find((d) => d.aliases.includes(rawKey));\n if (!def) continue;\n\n if (t.schema.isBoolean(def.schema)) {\n result[def.key] = true;\n } else if (value) {\n try {\n if (t.schema.isObject(def.schema) || t.schema.isArray(def.schema)) {\n result[def.key] = JSON.parse(value);\n } else {\n result[def.key] = value;\n }\n } catch {\n throw new CommandError(`Invalid JSON value for flag --${rawKey}`);\n }\n } else {\n throw new CommandError(`Flag --${rawKey} requires a value.`);\n }\n }\n\n return result;\n }\n\n protected parseCommandArgs(\n argv: string[],\n schema?: TSchema,\n isRootCommand = false,\n ): any {\n if (!schema) {\n return undefined;\n }\n\n // Extract positional arguments (non-flag arguments)\n const positionalArgs = argv.filter((arg) => !arg.startsWith(\"-\"));\n // For root commands, there's no command name to remove; otherwise slice off the command name\n const argsOnly = isRootCommand ? positionalArgs : positionalArgs.slice(1);\n\n try {\n if (t.schema.isOptional(schema)) {\n // Handle optional args: t.optional(t.text())\n if (argsOnly.length === 0) {\n return undefined;\n }\n return this.parseArgumentValue(argsOnly[0], schema);\n } else if (t.schema.isTuple(schema) && schema.items) {\n // Handle tuple args: t.tuple([t.text(), t.number()])\n const result: any[] = [];\n const items = schema.items;\n for (let i = 0; i < items.length; i++) {\n const itemSchema = items[i];\n if (i < argsOnly.length) {\n result.push(this.parseArgumentValue(argsOnly[i], itemSchema));\n } else if (t.schema.isOptional(itemSchema)) {\n result.push(undefined);\n } else {\n throw new CommandError(\n `Missing required argument at position ${i + 1}`,\n );\n }\n }\n return result;\n } else {\n // Handle single arg: t.text(), t.number(), etc.\n if (argsOnly.length === 0) {\n throw new CommandError(\"Missing required argument\");\n }\n return this.parseArgumentValue(argsOnly[0], schema);\n }\n } catch (error) {\n if (error instanceof TypeBoxError) {\n throw new CommandError(`Invalid argument: ${error.value.message}`);\n }\n throw error;\n }\n }\n\n protected parseArgumentValue(value: string, schema: TSchema): any {\n if (t.schema.isString(schema)) {\n return value;\n }\n\n if (t.schema.isNumber(schema) || t.schema.isInteger(schema)) {\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new CommandError(`Expected number, got \"${value}\"`);\n }\n if (t.schema.isInteger(schema) && !Number.isInteger(num)) {\n throw new CommandError(`Expected integer, got \"${value}\"`);\n }\n return num;\n }\n\n if (t.schema.isBoolean(schema)) {\n const lower = value.toLowerCase();\n if (lower === \"true\" || lower === \"1\") return true;\n if (lower === \"false\" || lower === \"0\") return false;\n throw new CommandError(`Expected boolean, got \"${value}\"`);\n }\n\n // For other types, return the string value and let TypeBox validate it\n return value;\n }\n\n protected generateArgsUsage(schema?: TSchema): string {\n if (!schema) {\n return \"\";\n }\n\n if (t.schema.isOptional(schema)) {\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` [${key}${typeName}]`;\n }\n\n if (t.schema.isTuple(schema) && schema.items) {\n const items = schema.items;\n const args = items.map((item, index) => {\n const argName = `arg${index + 1}`;\n const typeName = this.getTypeName(item);\n if (t.schema.isOptional(item)) {\n return `[${argName}${typeName}]`;\n }\n return `<${argName}${typeName}>`;\n });\n return ` ${args.join(\" \")}`;\n }\n\n const typeName = this.getTypeName(schema);\n const key = \"title\" in schema ? (schema as any).title : \"arg1\";\n return ` <${key}${typeName}>`;\n }\n\n protected getTypeName(schema: TSchema): string {\n if (!schema) return \"\";\n\n // Check TypeBox type guards first\n if (t.schema.isString(schema)) return \"\";\n if (t.schema.isNumber(schema)) return \": number\";\n if (t.schema.isInteger(schema)) return \": integer\";\n if (t.schema.isBoolean(schema)) return \": boolean\";\n\n return \"\";\n }\n\n public printHelp(command?: CommandPrimitive<any>): void {\n const cliName = this.name || \"cli\";\n this.log.info(\"\"); // Newline\n\n if (command?.name) {\n // Command-specific help\n const argsUsage = this.generateArgsUsage(command.options.args);\n const usage = `${cliName} ${command.name}${argsUsage}`.trim();\n this.log.info(`Usage: \\`${usage}\\``);\n\n if (command.options.description) {\n this.log.info(``);\n this.log.info(`\\t${command.options.description}`);\n }\n\n this.log.info(\"\");\n this.log.info(\"Flags:\");\n\n const flags = [\n ...Object.entries(command.flags.properties).map(([key, value]) => ({\n key,\n schema: value,\n aliases: (value as any).alias ?? [key],\n description: (value as any).description,\n })),\n ...Object.entries(this.getAllGlobalFlags()).map(([key, value]) => ({\n key,\n ...value,\n })),\n ];\n\n const maxFlagLength = this.getMaxFlagLength(flags);\n for (const { aliases, description } of flags) {\n const flagStr = (Array.isArray(aliases) ? aliases : [aliases])\n .map((a: string) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \");\n this.log.info(\n ` ${flagStr.padEnd(maxFlagLength)} # ${description ?? \"\"}`,\n );\n }\n } else {\n // general help\n this.log.info(this.description || \"Available commands:\");\n this.log.info(\"\");\n this.log.info(\"Commands:\");\n const maxCmdLength = this.getMaxCmdLength(this.commands);\n\n for (const command of this.commands) {\n // skip root command in list\n if (command.name === \"\") {\n continue;\n }\n\n const cmdStr = [command.name, ...command.aliases].join(\", \");\n const argsUsage = this.generateArgsUsage(command.options.args);\n const fullCmdStr = `${cmdStr}${argsUsage}`;\n this.log.info(\n ` ${cliName} ${fullCmdStr.padEnd(maxCmdLength)} # ${command.options.description ?? \"\"}`,\n );\n }\n\n this.log.info(\"\");\n this.log.info(\"Flags:\");\n const globalFlags = Object.values(this.getAllGlobalFlags());\n const maxFlagLength = this.getMaxFlagLength(globalFlags);\n for (const { aliases, description } of globalFlags) {\n const flagStr = aliases\n .map((a) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \");\n this.log.info(\n ` ${flagStr.padEnd(maxFlagLength)} # ${description ?? \"\"}`,\n );\n }\n }\n this.log.info(\"\"); // Newline\n }\n\n private getMaxCmdLength(commands: CommandPrimitive[]): number {\n return Math.max(\n ...commands.map((c) => {\n const cmdStr = [c.name, ...c.aliases].join(\", \");\n const argsUsage = this.generateArgsUsage(c.options.args);\n return `${cmdStr}${argsUsage}`.length;\n }),\n );\n }\n\n private getMaxFlagLength(flags: { aliases: string[] }[]): number {\n return Math.max(\n ...flags.map((f) => {\n const aliases = Array.isArray(f.aliases) ? f.aliases : [f.aliases];\n return aliases\n .map((a) => (a.length === 1 ? `-${a}` : `--${a}`))\n .join(\", \").length;\n }),\n );\n }\n}\n","import { $module } from \"alepha\";\nimport { Asker } from \"./helpers/Asker.ts\";\nimport { PrettyPrint } from \"./helpers/PrettyPrint.ts\";\nimport { Runner } from \"./helpers/Runner.ts\";\nimport { $command } from \"./primitives/$command.ts\";\nimport { CliProvider } from \"./providers/CliProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./errors/CommandError.ts\";\nexport * from \"./helpers/Asker.ts\";\nexport * from \"./helpers/PrettyPrint.ts\";\nexport * from \"./helpers/Runner.ts\";\nexport * from \"./primitives/$command.ts\";\nexport * from \"./providers/CliProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * This module provides a powerful way to build command-line interfaces\n * directly within your Alepha application, using declarative primitives.\n *\n * It allows you to define commands using the `$command` primitive.\n *\n * @see {@link $command}\n * @module alepha.command\n */\nexport const AlephaCommand = $module({\n name: \"alepha.command\",\n primitives: [$command],\n services: [CliProvider, Runner, Asker, PrettyPrint],\n});\n\n// ---------------------------------------------------------------------------------------------------------------------\n\ndeclare module \"typebox\" {\n interface StringOptions {\n /**\n * Additional aliases for the flags.\n *\n * @module alepha.command\n */\n aliases?: string[];\n }\n}\n"],"mappings":"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"}
@@ -5,7 +5,7 @@ import TypeBoxFormat from "typebox/format";
5
5
  import { Locale } from "typebox/system";
6
6
  import * as TypeBoxValue from "typebox/value";
7
7
 
8
- //#region src/core/constants/KIND.ts
8
+ //#region ../../src/core/constants/KIND.ts
9
9
  /**
10
10
  * Used for identifying primitives.
11
11
  *
@@ -14,7 +14,7 @@ import * as TypeBoxValue from "typebox/value";
14
14
  const KIND = Symbol.for("Alepha.Kind");
15
15
 
16
16
  //#endregion
17
- //#region src/core/constants/MODULE.ts
17
+ //#region ../../src/core/constants/MODULE.ts
18
18
  /**
19
19
  * Used for identifying modules.
20
20
  *
@@ -23,7 +23,7 @@ const KIND = Symbol.for("Alepha.Kind");
23
23
  const MODULE = Symbol.for("Alepha.Module");
24
24
 
25
25
  //#endregion
26
- //#region src/core/constants/OPTIONS.ts
26
+ //#region ../../src/core/constants/OPTIONS.ts
27
27
  /**
28
28
  * Used for primitives options.
29
29
  *
@@ -32,7 +32,7 @@ const MODULE = Symbol.for("Alepha.Module");
32
32
  const OPTIONS = Symbol.for("Alepha.Options");
33
33
 
34
34
  //#endregion
35
- //#region src/core/errors/AlephaError.ts
35
+ //#region ../../src/core/errors/AlephaError.ts
36
36
  /**
37
37
  * Default error class for Alepha.
38
38
  */
@@ -41,7 +41,7 @@ var AlephaError = class extends Error {
41
41
  };
42
42
 
43
43
  //#endregion
44
- //#region src/core/errors/CircularDependencyError.ts
44
+ //#region ../../src/core/errors/CircularDependencyError.ts
45
45
  var CircularDependencyError = class extends AlephaError {
46
46
  name = "CircularDependencyError";
47
47
  constructor(provider, parents) {
@@ -50,7 +50,7 @@ var CircularDependencyError = class extends AlephaError {
50
50
  };
51
51
 
52
52
  //#endregion
53
- //#region src/core/errors/ContainerLockedError.ts
53
+ //#region ../../src/core/errors/ContainerLockedError.ts
54
54
  var ContainerLockedError = class extends AlephaError {
55
55
  name = "ContainerLockedError";
56
56
  constructor(message = "Container is locked. No more providers can be added.") {
@@ -59,7 +59,7 @@ var ContainerLockedError = class extends AlephaError {
59
59
  };
60
60
 
61
61
  //#endregion
62
- //#region src/core/errors/TooLateSubstitutionError.ts
62
+ //#region ../../src/core/errors/TooLateSubstitutionError.ts
63
63
  var TooLateSubstitutionError = class extends AlephaError {
64
64
  name = "TooLateSubstitutionError";
65
65
  constructor(original, substitution) {
@@ -68,7 +68,7 @@ var TooLateSubstitutionError = class extends AlephaError {
68
68
  };
69
69
 
70
70
  //#endregion
71
- //#region src/core/errors/MissingContextError.ts
71
+ //#region ../../src/core/errors/MissingContextError.ts
72
72
  var MissingContextError = class extends AlephaError {
73
73
  name = "MissingContextError";
74
74
  constructor() {
@@ -78,7 +78,7 @@ var MissingContextError = class extends AlephaError {
78
78
  };
79
79
 
80
80
  //#endregion
81
- //#region src/core/helpers/ref.ts
81
+ //#region ../../src/core/helpers/ref.ts
82
82
  /**
83
83
  * Store the current context and definition during injection phase.
84
84
  *
@@ -127,7 +127,7 @@ const __alephaRef = {};
127
127
  */
128
128
 
129
129
  //#endregion
130
- //#region src/core/primitives/$context.ts
130
+ //#region ../../src/core/primitives/$context.ts
131
131
  /**
132
132
  * Get Alepha instance and current service from the current context.
133
133
  *
@@ -165,7 +165,7 @@ const $context = () => {
165
165
  };
166
166
 
167
167
  //#endregion
168
- //#region src/core/helpers/primitive.ts
168
+ //#region ../../src/core/helpers/primitive.ts
169
169
  var Primitive = class {
170
170
  alepha;
171
171
  options;
@@ -198,7 +198,7 @@ const createPrimitive = (primitive, options) => {
198
198
  };
199
199
 
200
200
  //#endregion
201
- //#region src/core/interfaces/Service.ts
201
+ //#region ../../src/core/interfaces/Service.ts
202
202
  function isClass(func) {
203
203
  if (typeof func !== "function") return false;
204
204
  const descriptor = Object.getOwnPropertyDescriptor(func, "prototype");
@@ -206,7 +206,7 @@ function isClass(func) {
206
206
  }
207
207
 
208
208
  //#endregion
209
- //#region src/core/primitives/$module.ts
209
+ //#region ../../src/core/primitives/$module.ts
210
210
  /**
211
211
  * Wrap Services and Primitives into a Module.
212
212
  *
@@ -298,7 +298,7 @@ var Module = class Module {
298
298
  };
299
299
 
300
300
  //#endregion
301
- //#region src/core/providers/AlsProvider.ts
301
+ //#region ../../src/core/providers/AlsProvider.ts
302
302
  var AlsProvider = class AlsProvider {
303
303
  static create = () => {};
304
304
  als;
@@ -330,7 +330,7 @@ var AlsProvider = class AlsProvider {
330
330
  };
331
331
 
332
332
  //#endregion
333
- //#region src/core/primitives/$inject.ts
333
+ //#region ../../src/core/primitives/$inject.ts
334
334
  /**
335
335
  * Get the instance of the specified type from the context.
336
336
  *
@@ -352,7 +352,7 @@ const $inject = (type, opts = {}) => {
352
352
  var InjectPrimitive = class extends Primitive {};
353
353
 
354
354
  //#endregion
355
- //#region src/core/providers/Json.ts
355
+ //#region ../../src/core/providers/Json.ts
356
356
  /**
357
357
  * Mimics the JSON global object with stringify and parse methods.
358
358
  *
@@ -368,11 +368,11 @@ var Json = class {
368
368
  };
369
369
 
370
370
  //#endregion
371
- //#region src/core/providers/SchemaCodec.ts
371
+ //#region ../../src/core/providers/SchemaCodec.ts
372
372
  var SchemaCodec = class {};
373
373
 
374
374
  //#endregion
375
- //#region src/core/providers/JsonSchemaCodec.ts
375
+ //#region ../../src/core/providers/JsonSchemaCodec.ts
376
376
  var JsonSchemaCodec = class extends SchemaCodec {
377
377
  json = $inject(Json);
378
378
  encoder = new TextEncoder();
@@ -398,7 +398,7 @@ var JsonSchemaCodec = class extends SchemaCodec {
398
398
  };
399
399
 
400
400
  //#endregion
401
- //#region src/core/errors/TypeBoxError.ts
401
+ //#region ../../src/core/errors/TypeBoxError.ts
402
402
  var TypeBoxError = class extends AlephaError {
403
403
  name = "TypeBoxError";
404
404
  cause;
@@ -419,7 +419,7 @@ var TypeBoxError = class extends AlephaError {
419
419
  };
420
420
 
421
421
  //#endregion
422
- //#region src/core/providers/SchemaValidator.ts
422
+ //#region ../../src/core/providers/SchemaValidator.ts
423
423
  var SchemaValidator = class {
424
424
  cache = /* @__PURE__ */ new Map();
425
425
  /**
@@ -488,7 +488,7 @@ var SchemaValidator = class {
488
488
  };
489
489
 
490
490
  //#endregion
491
- //#region src/core/providers/CodecManager.ts
491
+ //#region ../../src/core/providers/CodecManager.ts
492
492
  /**
493
493
  * CodecManager manages multiple codec formats and provides a unified interface
494
494
  * for encoding and decoding data with different formats.
@@ -553,7 +553,7 @@ var CodecManager = class {
553
553
  };
554
554
 
555
555
  //#endregion
556
- //#region src/core/providers/EventManager.ts
556
+ //#region ../../src/core/providers/EventManager.ts
557
557
  var EventManager = class {
558
558
  logFn;
559
559
  /**
@@ -617,7 +617,7 @@ var EventManager = class {
617
617
  };
618
618
 
619
619
  //#endregion
620
- //#region src/core/primitives/$atom.ts
620
+ //#region ../../src/core/primitives/$atom.ts
621
621
  /**
622
622
  * Define an atom for state management.
623
623
  *
@@ -668,7 +668,7 @@ var Atom = class {
668
668
  $atom[KIND] = "atom";
669
669
 
670
670
  //#endregion
671
- //#region src/core/providers/StateManager.ts
671
+ //#region ../../src/core/providers/StateManager.ts
672
672
  var StateManager = class {
673
673
  als = $inject(AlsProvider);
674
674
  events = $inject(EventManager);
@@ -762,7 +762,7 @@ var StateManager = class {
762
762
  };
763
763
 
764
764
  //#endregion
765
- //#region src/core/Alepha.ts
765
+ //#region ../../src/core/Alepha.ts
766
766
  /**
767
767
  * Core container of the Alepha framework.
768
768
  *
@@ -1366,7 +1366,7 @@ var Alepha = class Alepha {
1366
1366
  };
1367
1367
 
1368
1368
  //#endregion
1369
- //#region src/core/errors/AppNotStartedError.ts
1369
+ //#region ../../src/core/errors/AppNotStartedError.ts
1370
1370
  var AppNotStartedError = class extends AlephaError {
1371
1371
  name = "AppNotStartedError";
1372
1372
  constructor() {
@@ -1375,7 +1375,7 @@ var AppNotStartedError = class extends AlephaError {
1375
1375
  };
1376
1376
 
1377
1377
  //#endregion
1378
- //#region src/core/helpers/createPagination.ts
1378
+ //#region ../../src/core/helpers/createPagination.ts
1379
1379
  /**
1380
1380
  * Create a pagination object from an array of entities.
1381
1381
  *
@@ -1446,7 +1446,7 @@ function createPagination(entities, limit = 10, offset = 0, sort) {
1446
1446
  }
1447
1447
 
1448
1448
  //#endregion
1449
- //#region src/core/helpers/FileLike.ts
1449
+ //#region ../../src/core/helpers/FileLike.ts
1450
1450
  const isTypeFile = (value) => {
1451
1451
  return value && typeof value === "object" && "format" in value && value.format === "binary";
1452
1452
  };
@@ -1455,7 +1455,7 @@ const isFileLike = (value) => {
1455
1455
  };
1456
1456
 
1457
1457
  //#endregion
1458
- //#region src/core/providers/TypeProvider.ts
1458
+ //#region ../../src/core/providers/TypeProvider.ts
1459
1459
  const isUUID = TypeBoxFormat.IsUuid;
1460
1460
  const isEmail = TypeBoxFormat.IsEmail;
1461
1461
  const isURL = TypeBoxFormat.IsUrl;
@@ -1900,7 +1900,7 @@ var TypeProvider = class TypeProvider {
1900
1900
  const t = new TypeProvider();
1901
1901
 
1902
1902
  //#endregion
1903
- //#region src/core/primitives/$env.ts
1903
+ //#region ../../src/core/primitives/$env.ts
1904
1904
  /**
1905
1905
  * Get typed values from environment variables.
1906
1906
  *
@@ -1934,7 +1934,7 @@ const $env = (type) => {
1934
1934
  };
1935
1935
 
1936
1936
  //#endregion
1937
- //#region src/core/primitives/$hook.ts
1937
+ //#region ../../src/core/primitives/$hook.ts
1938
1938
  /**
1939
1939
  * Registers a new hook.
1940
1940
  *
@@ -1991,7 +1991,7 @@ var HookPrimitive = class extends Primitive {
1991
1991
  $hook[KIND] = HookPrimitive;
1992
1992
 
1993
1993
  //#endregion
1994
- //#region src/core/primitives/$use.ts
1994
+ //#region ../../src/core/primitives/$use.ts
1995
1995
  /**
1996
1996
  * Subscribes to an atom's state and returns its current value for use in components.
1997
1997
  *
@@ -2025,7 +2025,7 @@ const $use = (atom) => {
2025
2025
  };
2026
2026
 
2027
2027
  //#endregion
2028
- //#region src/core/schemas/pageQuerySchema.ts
2028
+ //#region ../../src/core/schemas/pageQuerySchema.ts
2029
2029
  const pageQuerySchema = t.object({
2030
2030
  page: t.optional(t.integer({
2031
2031
  description: "The page number to retrieve.",
@@ -2042,7 +2042,7 @@ const pageQuerySchema = t.object({
2042
2042
  });
2043
2043
 
2044
2044
  //#endregion
2045
- //#region src/core/schemas/pageSchema.ts
2045
+ //#region ../../src/core/schemas/pageSchema.ts
2046
2046
  const pageMetadataSchema = t.object({
2047
2047
  number: t.integer({ description: "Page number, starting from 0" }),
2048
2048
  size: t.integer({ description: "Number of items per page (requested page size)" }),
@@ -2090,7 +2090,7 @@ const pageSchema = (objectSchema, options) => t.object({
2090
2090
  TypeProvider.prototype.page = (itemSchema) => pageSchema(itemSchema);
2091
2091
 
2092
2092
  //#endregion
2093
- //#region src/core/index.browser.ts
2093
+ //#region ../../src/core/index.browser.ts
2094
2094
  const run = (entry, opts) => {
2095
2095
  const alepha = entry instanceof Alepha ? entry : Alepha.create({ env: { ...opts?.env } });
2096
2096
  if (!(entry instanceof Alepha)) {