alepha 0.12.1 → 0.13.1

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 (198) hide show
  1. package/dist/api-notifications/index.d.ts +111 -111
  2. package/dist/api-users/index.d.ts +1240 -1240
  3. package/dist/api-verifications/index.d.ts +94 -94
  4. package/dist/cli/{dist-Sz2EXvQX.cjs → dist-Dl9Vl7Ur.js} +17 -13
  5. package/dist/cli/{dist-BBPjuQ56.js.map → dist-Dl9Vl7Ur.js.map} +1 -1
  6. package/dist/cli/index.d.ts +3 -11
  7. package/dist/cli/index.js +106 -74
  8. package/dist/cli/index.js.map +1 -1
  9. package/dist/email/index.js +71 -73
  10. package/dist/email/index.js.map +1 -1
  11. package/dist/orm/index.d.ts +1 -1
  12. package/dist/orm/index.js.map +1 -1
  13. package/dist/queue/index.d.ts +4 -4
  14. package/dist/redis/index.d.ts +10 -10
  15. package/dist/retry/index.d.ts +1 -1
  16. package/dist/retry/index.js +2 -2
  17. package/dist/retry/index.js.map +1 -1
  18. package/dist/scheduler/index.d.ts +6 -6
  19. package/dist/server/index.js +1 -1
  20. package/dist/server/index.js.map +1 -1
  21. package/dist/server-auth/index.d.ts +193 -193
  22. package/dist/server-health/index.d.ts +17 -17
  23. package/dist/server-links/index.d.ts +34 -34
  24. package/dist/server-metrics/index.js +170 -174
  25. package/dist/server-metrics/index.js.map +1 -1
  26. package/dist/server-security/index.d.ts +9 -9
  27. package/dist/vite/index.js +4 -5
  28. package/dist/vite/index.js.map +1 -1
  29. package/dist/websocket/index.d.ts +7 -7
  30. package/package.json +52 -103
  31. package/src/cli/apps/AlephaPackageBuilderCli.ts +7 -2
  32. package/src/cli/assets/appRouterTs.ts +9 -0
  33. package/src/cli/assets/indexHtml.ts +2 -1
  34. package/src/cli/assets/mainBrowserTs.ts +10 -0
  35. package/src/cli/commands/CoreCommands.ts +6 -5
  36. package/src/cli/commands/DrizzleCommands.ts +65 -57
  37. package/src/cli/commands/VerifyCommands.ts +1 -1
  38. package/src/cli/services/ProjectUtils.ts +44 -38
  39. package/src/orm/providers/DrizzleKitProvider.ts +1 -1
  40. package/src/retry/descriptors/$retry.ts +5 -3
  41. package/src/server/providers/NodeHttpServerProvider.ts +1 -1
  42. package/src/vite/helpers/boot.ts +3 -3
  43. package/dist/api-files/index.cjs +0 -1293
  44. package/dist/api-files/index.cjs.map +0 -1
  45. package/dist/api-files/index.d.cts +0 -829
  46. package/dist/api-jobs/index.cjs +0 -274
  47. package/dist/api-jobs/index.cjs.map +0 -1
  48. package/dist/api-jobs/index.d.cts +0 -654
  49. package/dist/api-notifications/index.cjs +0 -380
  50. package/dist/api-notifications/index.cjs.map +0 -1
  51. package/dist/api-notifications/index.d.cts +0 -289
  52. package/dist/api-parameters/index.cjs +0 -66
  53. package/dist/api-parameters/index.cjs.map +0 -1
  54. package/dist/api-parameters/index.d.cts +0 -84
  55. package/dist/api-users/index.cjs +0 -6009
  56. package/dist/api-users/index.cjs.map +0 -1
  57. package/dist/api-users/index.d.cts +0 -4740
  58. package/dist/api-verifications/index.cjs +0 -407
  59. package/dist/api-verifications/index.cjs.map +0 -1
  60. package/dist/api-verifications/index.d.cts +0 -207
  61. package/dist/batch/index.cjs +0 -408
  62. package/dist/batch/index.cjs.map +0 -1
  63. package/dist/batch/index.d.cts +0 -330
  64. package/dist/bin/index.cjs +0 -17
  65. package/dist/bin/index.cjs.map +0 -1
  66. package/dist/bin/index.d.cts +0 -1
  67. package/dist/bucket/index.cjs +0 -303
  68. package/dist/bucket/index.cjs.map +0 -1
  69. package/dist/bucket/index.d.cts +0 -355
  70. package/dist/cache/index.cjs +0 -241
  71. package/dist/cache/index.cjs.map +0 -1
  72. package/dist/cache/index.d.cts +0 -202
  73. package/dist/cache-redis/index.cjs +0 -84
  74. package/dist/cache-redis/index.cjs.map +0 -1
  75. package/dist/cache-redis/index.d.cts +0 -40
  76. package/dist/cli/chunk-DSlc6foC.cjs +0 -43
  77. package/dist/cli/dist-BBPjuQ56.js +0 -2778
  78. package/dist/cli/dist-Sz2EXvQX.cjs.map +0 -1
  79. package/dist/cli/index.cjs +0 -1241
  80. package/dist/cli/index.cjs.map +0 -1
  81. package/dist/cli/index.d.cts +0 -422
  82. package/dist/command/index.cjs +0 -693
  83. package/dist/command/index.cjs.map +0 -1
  84. package/dist/command/index.d.cts +0 -340
  85. package/dist/core/index.cjs +0 -2264
  86. package/dist/core/index.cjs.map +0 -1
  87. package/dist/core/index.d.cts +0 -1927
  88. package/dist/datetime/index.cjs +0 -318
  89. package/dist/datetime/index.cjs.map +0 -1
  90. package/dist/datetime/index.d.cts +0 -145
  91. package/dist/email/index.cjs +0 -10874
  92. package/dist/email/index.cjs.map +0 -1
  93. package/dist/email/index.d.cts +0 -186
  94. package/dist/fake/index.cjs +0 -34641
  95. package/dist/fake/index.cjs.map +0 -1
  96. package/dist/fake/index.d.cts +0 -74
  97. package/dist/file/index.cjs +0 -1212
  98. package/dist/file/index.cjs.map +0 -1
  99. package/dist/file/index.d.cts +0 -698
  100. package/dist/lock/index.cjs +0 -226
  101. package/dist/lock/index.cjs.map +0 -1
  102. package/dist/lock/index.d.cts +0 -361
  103. package/dist/lock-redis/index.cjs +0 -113
  104. package/dist/lock-redis/index.cjs.map +0 -1
  105. package/dist/lock-redis/index.d.cts +0 -24
  106. package/dist/logger/index.cjs +0 -521
  107. package/dist/logger/index.cjs.map +0 -1
  108. package/dist/logger/index.d.cts +0 -281
  109. package/dist/orm/index.cjs +0 -2986
  110. package/dist/orm/index.cjs.map +0 -1
  111. package/dist/orm/index.d.cts +0 -2213
  112. package/dist/queue/index.cjs +0 -1044
  113. package/dist/queue/index.cjs.map +0 -1
  114. package/dist/queue/index.d.cts +0 -1265
  115. package/dist/queue-redis/index.cjs +0 -873
  116. package/dist/queue-redis/index.cjs.map +0 -1
  117. package/dist/queue-redis/index.d.cts +0 -82
  118. package/dist/redis/index.cjs +0 -153
  119. package/dist/redis/index.cjs.map +0 -1
  120. package/dist/redis/index.d.cts +0 -82
  121. package/dist/retry/index.cjs +0 -146
  122. package/dist/retry/index.cjs.map +0 -1
  123. package/dist/retry/index.d.cts +0 -172
  124. package/dist/router/index.cjs +0 -111
  125. package/dist/router/index.cjs.map +0 -1
  126. package/dist/router/index.d.cts +0 -46
  127. package/dist/scheduler/index.cjs +0 -576
  128. package/dist/scheduler/index.cjs.map +0 -1
  129. package/dist/scheduler/index.d.cts +0 -145
  130. package/dist/security/index.cjs +0 -2402
  131. package/dist/security/index.cjs.map +0 -1
  132. package/dist/security/index.d.cts +0 -598
  133. package/dist/server/index.cjs +0 -1680
  134. package/dist/server/index.cjs.map +0 -1
  135. package/dist/server/index.d.cts +0 -810
  136. package/dist/server-auth/index.cjs +0 -3146
  137. package/dist/server-auth/index.cjs.map +0 -1
  138. package/dist/server-auth/index.d.cts +0 -1164
  139. package/dist/server-cache/index.cjs +0 -252
  140. package/dist/server-cache/index.cjs.map +0 -1
  141. package/dist/server-cache/index.d.cts +0 -164
  142. package/dist/server-compress/index.cjs +0 -141
  143. package/dist/server-compress/index.cjs.map +0 -1
  144. package/dist/server-compress/index.d.cts +0 -38
  145. package/dist/server-cookies/index.cjs +0 -234
  146. package/dist/server-cookies/index.cjs.map +0 -1
  147. package/dist/server-cookies/index.d.cts +0 -144
  148. package/dist/server-cors/index.cjs +0 -201
  149. package/dist/server-cors/index.cjs.map +0 -1
  150. package/dist/server-cors/index.d.cts +0 -140
  151. package/dist/server-health/index.cjs +0 -62
  152. package/dist/server-health/index.cjs.map +0 -1
  153. package/dist/server-health/index.d.cts +0 -58
  154. package/dist/server-helmet/index.cjs +0 -131
  155. package/dist/server-helmet/index.cjs.map +0 -1
  156. package/dist/server-helmet/index.d.cts +0 -97
  157. package/dist/server-links/index.cjs +0 -992
  158. package/dist/server-links/index.cjs.map +0 -1
  159. package/dist/server-links/index.d.cts +0 -513
  160. package/dist/server-metrics/index.cjs +0 -4535
  161. package/dist/server-metrics/index.cjs.map +0 -1
  162. package/dist/server-metrics/index.d.cts +0 -35
  163. package/dist/server-multipart/index.cjs +0 -237
  164. package/dist/server-multipart/index.cjs.map +0 -1
  165. package/dist/server-multipart/index.d.cts +0 -50
  166. package/dist/server-proxy/index.cjs +0 -186
  167. package/dist/server-proxy/index.cjs.map +0 -1
  168. package/dist/server-proxy/index.d.cts +0 -234
  169. package/dist/server-rate-limit/index.cjs +0 -241
  170. package/dist/server-rate-limit/index.cjs.map +0 -1
  171. package/dist/server-rate-limit/index.d.cts +0 -183
  172. package/dist/server-security/index.cjs +0 -316
  173. package/dist/server-security/index.cjs.map +0 -1
  174. package/dist/server-security/index.d.cts +0 -173
  175. package/dist/server-static/index.cjs +0 -170
  176. package/dist/server-static/index.cjs.map +0 -1
  177. package/dist/server-static/index.d.cts +0 -121
  178. package/dist/server-swagger/index.cjs +0 -1021
  179. package/dist/server-swagger/index.cjs.map +0 -1
  180. package/dist/server-swagger/index.d.cts +0 -382
  181. package/dist/sms/index.cjs +0 -221
  182. package/dist/sms/index.cjs.map +0 -1
  183. package/dist/sms/index.d.cts +0 -130
  184. package/dist/thread/index.cjs +0 -350
  185. package/dist/thread/index.cjs.map +0 -1
  186. package/dist/thread/index.d.cts +0 -260
  187. package/dist/topic/index.cjs +0 -282
  188. package/dist/topic/index.cjs.map +0 -1
  189. package/dist/topic/index.d.cts +0 -523
  190. package/dist/topic-redis/index.cjs +0 -71
  191. package/dist/topic-redis/index.cjs.map +0 -1
  192. package/dist/topic-redis/index.d.cts +0 -42
  193. package/dist/vite/index.cjs +0 -1077
  194. package/dist/vite/index.cjs.map +0 -1
  195. package/dist/vite/index.d.cts +0 -542
  196. package/dist/websocket/index.cjs +0 -1117
  197. package/dist/websocket/index.cjs.map +0 -1
  198. package/dist/websocket/index.d.cts +0 -861
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.cjs","names":["Descriptor","t","KIND","Alepha","askFn: AskMethod","value: any","AlephaError","DateTimeProvider","AlephaError","Alepha","runFn: RunnerMethod","t","t","Alepha","allGlobalFlags: Record<\n string,\n { aliases: string[]; description?: string; schema: TSchema }\n >","TypeBoxError","result: Record<string, any>","result: any[]","typeName","command"],"sources":["../../src/command/descriptors/$command.ts","../../src/command/helpers/Asker.ts","../../src/command/helpers/PrettyPrint.ts","../../src/command/errors/CommandError.ts","../../src/command/helpers/Runner.ts","../../src/command/providers/CliProvider.ts","../../src/command/index.ts"],"sourcesContent":["import type * as fs from \"node:fs/promises\";\nimport type { glob } from \"node:fs/promises\";\nimport {\n type Async,\n createDescriptor,\n Descriptor,\n KIND,\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 descriptor 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: CommandDescriptorOptions<T, A>,\n) => createDescriptor(CommandDescriptor<T, A>, options);\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface CommandDescriptorOptions<\n T extends TObject,\n A extends TSchema,\n> {\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 CommandDescriptor<\n T extends TObject = TObject,\n A extends TSchema = TSchema,\n> extends Descriptor<CommandDescriptorOptions<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] = CommandDescriptor;\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 { 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} 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\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 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 * 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 {\n $command,\n type CommandDescriptor,\n type CommandHandlerArgs,\n} from \"../descriptors/$command.ts\";\nimport { CommandError } from \"../errors/CommandError.ts\";\nimport { Asker } from \"../helpers/Asker.ts\";\nimport { Runner } from \"../helpers/Runner.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(): CommandDescriptor<any>[] {\n return this.alepha.descriptors($command);\n }\n\n protected findCommand(name: string): CommandDescriptor<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?: CommandDescriptor<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: CommandDescriptor[]): 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 { $command } from \"./descriptors/$command.ts\";\nimport { Asker } from \"./helpers/Asker.ts\";\nimport { PrettyPrint } from \"./helpers/PrettyPrint.ts\";\nimport { Runner } from \"./helpers/Runner.ts\";\nimport { CliProvider } from \"./providers/CliProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport * from \"./descriptors/$command.ts\";\nexport * from \"./errors/CommandError.ts\";\nexport * from \"./helpers/Asker.ts\";\nexport * from \"./helpers/PrettyPrint.ts\";\nexport * from \"./helpers/Runner.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 descriptors.\n *\n * It allows you to define commands using the `$command` descriptor.\n *\n * @see {@link $command}\n * @module alepha.command\n */\nexport const AlephaCommand = $module({\n name: \"alepha.command\",\n descriptors: [$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,340 +0,0 @@
1
- import * as alepha1 from "alepha";
2
- import { Alepha, AlephaError, Async, Descriptor, KIND, Static, TObject, TSchema, TString } from "alepha";
3
- import * as fs from "node:fs/promises";
4
- import { glob } from "node:fs/promises";
5
- import * as alepha_logger0 from "alepha/logger";
6
- import * as readline_promises0 from "readline/promises";
7
- import { DateTimeProvider, Interval } from "alepha/datetime";
8
-
9
- //#region src/command/helpers/Asker.d.ts
10
- interface AskOptions<T extends TSchema = TString> {
11
- /**
12
- * Response schema expected.
13
- *
14
- * Recommended schemas:
15
- * - t.text() - for free text input
16
- * - t.number() - for numeric input
17
- * - t.boolean() - for yes/no input (accepts "true", "false", "1", "0")
18
- * - t.enum(["option1", "option2"]) - for predefined options
19
- *
20
- * You can use schema.default to provide a default value.
21
- *
22
- * @example
23
- * ```ts
24
- * ask("What is your name?", { schema: t.text({ default: "John Doe" }) })
25
- * ```
26
- *
27
- * @default TString
28
- */
29
- schema?: T;
30
- /**
31
- * Custom validation function.
32
- * Throws an AlephaError in case of validation failure.
33
- */
34
- validate?: (value: Static<T>) => void;
35
- }
36
- interface AskMethod {
37
- <T extends TSchema = TString>(question: string, options?: AskOptions<T>): Promise<Static<T>>;
38
- }
39
- declare class Asker {
40
- protected readonly log: alepha_logger0.Logger;
41
- readonly ask: AskMethod;
42
- protected readonly alepha: Alepha;
43
- constructor();
44
- protected createAskMethod(): AskMethod;
45
- protected prompt<T extends TSchema = TString>(question: string, options: AskOptions<T>): Promise<Static<T>>;
46
- protected createPromptInterface(): readline_promises0.Interface;
47
- }
48
- //#endregion
49
- //#region src/command/helpers/PrettyPrint.d.ts
50
- declare class PrettyPrint {
51
- protected dateTimeProvider: DateTimeProvider;
52
- protected spinnerInterval?: Interval;
53
- protected readonly frames: string[];
54
- protected tasks: Map<string, {
55
- taskName: string;
56
- frameIndex: number;
57
- status: "running" | "success" | "error";
58
- duration?: string;
59
- }>;
60
- protected lastLineCount: number;
61
- protected header?: string;
62
- protected commandStartTime?: number;
63
- protected readonly colors: {
64
- reset: string;
65
- cyan: string;
66
- green: string;
67
- red: string;
68
- dim: string;
69
- };
70
- /**
71
- * Start a new command session with header
72
- */
73
- startCommand(cliName: string, commandName: string): void;
74
- /**
75
- * End the command session with footer
76
- */
77
- endCommand(): void;
78
- /**
79
- * Start an animated spinner with a task name
80
- */
81
- startSpinner(id: string, taskName: string): void;
82
- /**
83
- * Stop the spinner and show success with a tick
84
- */
85
- success(id: string, taskName?: string, duration?: string): void;
86
- /**
87
- * Stop the spinner and show error with a cross
88
- */
89
- error(id: string, taskName?: string): void;
90
- /**
91
- * Update the display for all tasks
92
- */
93
- protected updateDisplay(): void;
94
- /**
95
- * Check if all tasks are done and stop the interval
96
- */
97
- protected checkIfAllDone(): void;
98
- /**
99
- * Stop the spinner without showing any symbol
100
- */
101
- stopSpinner(): void;
102
- /**
103
- * Clear all tasks
104
- */
105
- clear(): void;
106
- }
107
- //#endregion
108
- //#region src/command/helpers/Runner.d.ts
109
- type Task = {
110
- name: string;
111
- handler: () => any;
112
- };
113
- interface Timer {
114
- name: string;
115
- duration: string;
116
- }
117
- interface RunOptions {
118
- /**
119
- * Rename the command for logging purposes.
120
- */
121
- alias?: string;
122
- }
123
- interface RunnerMethod {
124
- (cmd: string | Task | Array<string | Task>, options?: RunOptions | (() => any)): Promise<string>;
125
- rm: (glob: string | string[], options?: RunOptions) => Promise<string>;
126
- cp: (source: string, dest: string, options?: RunOptions) => Promise<string>;
127
- }
128
- declare class Runner {
129
- protected readonly log: alepha_logger0.Logger;
130
- protected readonly timers: Timer[];
131
- protected readonly startTime: number;
132
- protected readonly prettyPrint: PrettyPrint;
133
- protected readonly alepha: Alepha;
134
- readonly run: RunnerMethod;
135
- protected cliName: string;
136
- protected commandName: string;
137
- protected firstTaskStarted: boolean;
138
- constructor();
139
- protected get useDynamicLogger(): boolean;
140
- /**
141
- * Start a new command session with header (for pretty print mode)
142
- */
143
- startCommand(cliName: string, commandName: string): void;
144
- protected createRunMethod(): RunnerMethod;
145
- protected exec(cmd: string): Promise<string>;
146
- /**
147
- * Executes one or more tasks.
148
- *
149
- * @param task - A single task or an array of tasks to run in parallel.
150
- */
151
- protected execute(task: Task | Task[]): Promise<string>;
152
- /**
153
- * Prints a summary of all executed tasks and their durations.
154
- */
155
- summary(): void;
156
- protected executeTask(task: Task): Promise<string>;
157
- protected renderTable(data: string[][]): void;
158
- }
159
- //#endregion
160
- //#region src/command/descriptors/$command.d.ts
161
- /**
162
- * Declares a CLI command.
163
- *
164
- * This descriptor allows you to define a command, its flags, and its handler
165
- * within your Alepha application structure.
166
- */
167
- declare const $command: {
168
- <T extends TObject, A extends TSchema>(options: CommandDescriptorOptions<T, A>): CommandDescriptor<T, A>;
169
- [KIND]: typeof CommandDescriptor;
170
- };
171
- interface CommandDescriptorOptions<T extends TObject, A extends TSchema> {
172
- /**
173
- * The handler function to execute when the command is matched.
174
- */
175
- handler: (args: CommandHandlerArgs<T, A>) => Async<void>;
176
- /**
177
- * The name of the command. If omitted, the property key is used.
178
- *
179
- * An empty string "" denotes the root command.
180
- */
181
- name?: string;
182
- /**
183
- * A short description of the command, shown in the help message.
184
- */
185
- description?: string;
186
- /**
187
- * An array of alternative names for the command.
188
- */
189
- aliases?: string[];
190
- /**
191
- * A TypeBox object schema defining the flags for the command.
192
- */
193
- flags?: T;
194
- /**
195
- * An optional TypeBox schema defining the arguments for the command.
196
- *
197
- * @example
198
- * args: t.text()
199
- * my-cli command <arg1: string>
200
- *
201
- * args: t.optional(t.text())
202
- * my-cli command [arg1: string]
203
- *
204
- * args: t.tuple([t.text(), t.number()])
205
- * my-cli command <arg1: string> <arg2: number>
206
- *
207
- * args: t.tuple([t.text(), t.optional(t.number())])
208
- * my-cli command <arg1: string> [arg2: number]
209
- */
210
- args?: A;
211
- /**
212
- * If false, skip summary message at the end of the command execution.
213
- * Summary will display only if ({ run }) method calls were made.
214
- */
215
- summary?: boolean;
216
- /**
217
- * Marks this command as the root command.
218
- * Equivalent to setting name to an empty string "".
219
- */
220
- root?: boolean;
221
- }
222
- declare class CommandDescriptor<T extends TObject = TObject, A extends TSchema = TSchema> extends Descriptor<CommandDescriptorOptions<T, A>> {
223
- readonly flags: TObject<{}>;
224
- readonly aliases: string[];
225
- get name(): string;
226
- }
227
- interface CommandHandlerArgs<T extends TObject, A extends TSchema = TSchema> {
228
- flags: Static<T>;
229
- args: A extends TSchema ? Static<A> : Array<string>;
230
- run: RunnerMethod;
231
- ask: AskMethod;
232
- glob: typeof glob;
233
- fs: typeof fs;
234
- /**
235
- * The root directory where the command is executed.
236
- */
237
- root: string;
238
- }
239
- //#endregion
240
- //#region src/command/errors/CommandError.d.ts
241
- declare class CommandError extends AlephaError {
242
- readonly name = "CommandError";
243
- }
244
- //#endregion
245
- //#region src/command/providers/CliProvider.d.ts
246
- declare const envSchema: TObject<{
247
- CLI_NAME: alepha1.TString;
248
- CLI_DESCRIPTION: alepha1.TString;
249
- }>;
250
- declare module "alepha" {
251
- interface Env extends Partial<Static<typeof envSchema>> {}
252
- }
253
- /**
254
- * CLI provider configuration atom
255
- */
256
- declare const cliOptions: alepha1.Atom<TObject<{
257
- name: alepha1.TOptional<alepha1.TString>;
258
- description: alepha1.TOptional<alepha1.TString>;
259
- argv: alepha1.TOptional<alepha1.TArray<alepha1.TString>>;
260
- }>, "alepha.command.cli.options">;
261
- type CliProviderOptions = Static<typeof cliOptions.schema>;
262
- declare module "alepha" {
263
- interface State {
264
- [cliOptions.key]: CliProviderOptions;
265
- }
266
- }
267
- declare class CliProvider {
268
- protected readonly env: {
269
- CLI_NAME: string;
270
- CLI_DESCRIPTION: string;
271
- };
272
- protected readonly alepha: Alepha;
273
- protected readonly log: alepha_logger0.Logger;
274
- protected readonly runner: Runner;
275
- protected readonly asker: Asker;
276
- protected readonly options: Readonly<{
277
- description?: string | undefined;
278
- name?: string | undefined;
279
- argv?: string[] | undefined;
280
- }>;
281
- protected get name(): string;
282
- protected get description(): string;
283
- protected get argv(): string[];
284
- protected readonly globalFlags: {
285
- help: {
286
- aliases: string[];
287
- description: string;
288
- schema: alepha1.TBoolean;
289
- };
290
- };
291
- protected readonly onReady: alepha1.HookDescriptor<"ready">;
292
- get commands(): CommandDescriptor<any>[];
293
- protected findCommand(name: string): CommandDescriptor<TObject> | undefined;
294
- /**
295
- * Get all global flags including those from the root command (name === "")
296
- */
297
- protected getAllGlobalFlags(): Record<string, {
298
- aliases: string[];
299
- description?: string;
300
- schema: TSchema;
301
- }>;
302
- protected parseCommandFlags(argv: string[], schema: TObject): Record<string, any>;
303
- protected parseFlags(argv: string[], flagDefs: {
304
- key: string;
305
- aliases: string[];
306
- schema: TSchema;
307
- }[]): Record<string, any>;
308
- protected parseCommandArgs(argv: string[], schema?: TSchema): any;
309
- protected parseArgumentValue(value: string, schema: TSchema): any;
310
- protected generateArgsUsage(schema?: TSchema): string;
311
- protected getTypeName(schema: TSchema): string;
312
- printHelp(command?: CommandDescriptor<any>): void;
313
- private getMaxCmdLength;
314
- private getMaxFlagLength;
315
- }
316
- //#endregion
317
- //#region src/command/index.d.ts
318
- /**
319
- * This module provides a powerful way to build command-line interfaces
320
- * directly within your Alepha application, using declarative descriptors.
321
- *
322
- * It allows you to define commands using the `$command` descriptor.
323
- *
324
- * @see {@link $command}
325
- * @module alepha.command
326
- */
327
- declare const AlephaCommand: alepha1.Service<alepha1.Module>;
328
- declare module "typebox" {
329
- interface StringOptions {
330
- /**
331
- * Additional aliases for the flags.
332
- *
333
- * @module alepha.command
334
- */
335
- aliases?: string[];
336
- }
337
- }
338
- //#endregion
339
- export { $command, AlephaCommand, AskMethod, AskOptions, Asker, CliProvider, CliProviderOptions, CommandDescriptor, CommandDescriptorOptions, CommandError, CommandHandlerArgs, PrettyPrint, RunOptions, Runner, RunnerMethod, Task, cliOptions };
340
- //# sourceMappingURL=index.d.cts.map