@c9up/ream 0.1.25 → 0.1.27

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 (302) hide show
  1. package/README.md +65 -0
  2. package/dist/ConfigLoader.d.ts +46 -5
  3. package/dist/ConfigLoader.d.ts.map +1 -1
  4. package/dist/ConfigLoader.js +60 -9
  5. package/dist/ConfigLoader.js.map +1 -1
  6. package/dist/HttpKernel.d.ts.map +1 -1
  7. package/dist/HttpKernel.js +46 -6
  8. package/dist/HttpKernel.js.map +1 -1
  9. package/dist/Ignitor.d.ts +115 -7
  10. package/dist/Ignitor.d.ts.map +1 -1
  11. package/dist/Ignitor.js +254 -40
  12. package/dist/Ignitor.js.map +1 -1
  13. package/dist/console/BaseCommand.d.ts +217 -0
  14. package/dist/console/BaseCommand.d.ts.map +1 -0
  15. package/dist/console/BaseCommand.js +340 -0
  16. package/dist/console/BaseCommand.js.map +1 -0
  17. package/dist/console/Console.d.ts +86 -0
  18. package/dist/console/Console.d.ts.map +1 -0
  19. package/dist/console/Console.js +134 -0
  20. package/dist/console/Console.js.map +1 -0
  21. package/dist/console/ExceptionHandler.d.ts +28 -0
  22. package/dist/console/ExceptionHandler.d.ts.map +1 -0
  23. package/dist/console/ExceptionHandler.js +76 -0
  24. package/dist/console/ExceptionHandler.js.map +1 -0
  25. package/dist/console/HelpCommand.d.ts +16 -0
  26. package/dist/console/HelpCommand.d.ts.map +1 -0
  27. package/dist/console/HelpCommand.js +40 -0
  28. package/dist/console/HelpCommand.js.map +1 -0
  29. package/dist/console/IndexGenerator.d.ts +24 -0
  30. package/dist/console/IndexGenerator.d.ts.map +1 -0
  31. package/dist/console/IndexGenerator.js +65 -0
  32. package/dist/console/IndexGenerator.js.map +1 -0
  33. package/dist/console/Kernel.d.ts +298 -0
  34. package/dist/console/Kernel.d.ts.map +1 -0
  35. package/dist/console/Kernel.js +1120 -0
  36. package/dist/console/Kernel.js.map +1 -0
  37. package/dist/console/ListCommand.d.ts +18 -0
  38. package/dist/console/ListCommand.d.ts.map +1 -0
  39. package/dist/console/ListCommand.js +60 -0
  40. package/dist/console/ListCommand.js.map +1 -0
  41. package/dist/console/assertions.d.ts +20 -0
  42. package/dist/console/assertions.d.ts.map +1 -0
  43. package/dist/console/assertions.js +84 -0
  44. package/dist/console/assertions.js.map +1 -0
  45. package/dist/console/cliui.d.ts +248 -0
  46. package/dist/console/cliui.d.ts.map +1 -0
  47. package/dist/console/cliui.js +587 -0
  48. package/dist/console/cliui.js.map +1 -0
  49. package/dist/console/decorators.d.ts +90 -0
  50. package/dist/console/decorators.d.ts.map +1 -0
  51. package/dist/console/decorators.js +142 -0
  52. package/dist/console/decorators.js.map +1 -0
  53. package/dist/console/index.d.ts +32 -0
  54. package/dist/console/index.d.ts.map +1 -0
  55. package/dist/console/index.js +24 -0
  56. package/dist/console/index.js.map +1 -0
  57. package/dist/console/loaders.d.ts +52 -0
  58. package/dist/console/loaders.d.ts.map +1 -0
  59. package/dist/console/loaders.js +131 -0
  60. package/dist/console/loaders.js.map +1 -0
  61. package/dist/console/parser.d.ts +86 -0
  62. package/dist/console/parser.d.ts.map +1 -0
  63. package/dist/console/parser.js +440 -0
  64. package/dist/console/parser.js.map +1 -0
  65. package/dist/console/prompts.d.ts +124 -0
  66. package/dist/console/prompts.d.ts.map +1 -0
  67. package/dist/console/prompts.js +356 -0
  68. package/dist/console/prompts.js.map +1 -0
  69. package/dist/console/tracing.d.ts +17 -0
  70. package/dist/console/tracing.d.ts.map +1 -0
  71. package/dist/console/tracing.js +11 -0
  72. package/dist/console/tracing.js.map +1 -0
  73. package/dist/console/types.d.ts +255 -0
  74. package/dist/console/types.d.ts.map +1 -0
  75. package/dist/console/types.js +25 -0
  76. package/dist/console/types.js.map +1 -0
  77. package/dist/console/ui.d.ts +20 -0
  78. package/dist/console/ui.d.ts.map +1 -0
  79. package/dist/console/ui.js +31 -0
  80. package/dist/console/ui.js.map +1 -0
  81. package/dist/console/utils.d.ts +27 -0
  82. package/dist/console/utils.d.ts.map +1 -0
  83. package/dist/console/utils.js +56 -0
  84. package/dist/console/utils.js.map +1 -0
  85. package/dist/container/Container.d.ts +23 -3
  86. package/dist/container/Container.d.ts.map +1 -1
  87. package/dist/container/Container.js +177 -70
  88. package/dist/container/Container.js.map +1 -1
  89. package/dist/container/types.d.ts +14 -2
  90. package/dist/container/types.d.ts.map +1 -1
  91. package/dist/decorators/Service.d.ts +7 -0
  92. package/dist/decorators/Service.d.ts.map +1 -1
  93. package/dist/decorators/Service.js +23 -3
  94. package/dist/decorators/Service.js.map +1 -1
  95. package/dist/env/Env.d.ts +29 -4
  96. package/dist/env/Env.d.ts.map +1 -1
  97. package/dist/env/Env.js +27 -4
  98. package/dist/env/Env.js.map +1 -1
  99. package/dist/env/Secret.d.ts +11 -0
  100. package/dist/env/Secret.d.ts.map +1 -0
  101. package/dist/env/Secret.js +36 -0
  102. package/dist/env/Secret.js.map +1 -0
  103. package/dist/env/interpolate.d.ts +26 -0
  104. package/dist/env/interpolate.d.ts.map +1 -0
  105. package/dist/env/interpolate.js +48 -0
  106. package/dist/env/interpolate.js.map +1 -0
  107. package/dist/env/loadEnvFiles.d.ts.map +1 -1
  108. package/dist/env/loadEnvFiles.js +14 -4
  109. package/dist/env/loadEnvFiles.js.map +1 -1
  110. package/dist/env/schema.d.ts +23 -6
  111. package/dist/env/schema.d.ts.map +1 -1
  112. package/dist/env/schema.js +67 -33
  113. package/dist/env/schema.js.map +1 -1
  114. package/dist/errors/ReamError.d.ts +25 -0
  115. package/dist/errors/ReamError.d.ts.map +1 -1
  116. package/dist/errors/ReamError.js +5 -0
  117. package/dist/errors/ReamError.js.map +1 -1
  118. package/dist/errors/prettyPrintError.d.ts +9 -0
  119. package/dist/errors/prettyPrintError.d.ts.map +1 -0
  120. package/dist/errors/prettyPrintError.js +22 -0
  121. package/dist/errors/prettyPrintError.js.map +1 -0
  122. package/dist/events/Emitter.d.ts +1 -1
  123. package/dist/events/Emitter.d.ts.map +1 -1
  124. package/dist/events/Emitter.js +1 -1
  125. package/dist/events/Emitter.js.map +1 -1
  126. package/dist/events/EventsProvider.d.ts +2 -2
  127. package/dist/events/EventsProvider.d.ts.map +1 -1
  128. package/dist/events/EventsProvider.js +3 -3
  129. package/dist/events/EventsProvider.js.map +1 -1
  130. package/dist/graphql/GraphQLEngine.d.ts +1 -1
  131. package/dist/graphql/GraphQLEngine.d.ts.map +1 -1
  132. package/dist/graphql/GraphQLEngine.js +2 -2
  133. package/dist/graphql/GraphQLEngine.js.map +1 -1
  134. package/dist/graphql/GraphQLProvider.d.ts.map +1 -1
  135. package/dist/graphql/GraphQLProvider.js +7 -3
  136. package/dist/graphql/GraphQLProvider.js.map +1 -1
  137. package/dist/http/Exception.d.ts +63 -1
  138. package/dist/http/Exception.d.ts.map +1 -1
  139. package/dist/http/Exception.js +185 -48
  140. package/dist/http/Exception.js.map +1 -1
  141. package/dist/http/HttpContext.d.ts +53 -7
  142. package/dist/http/HttpContext.d.ts.map +1 -1
  143. package/dist/http/HttpContext.js +56 -15
  144. package/dist/http/HttpContext.js.map +1 -1
  145. package/dist/http/RedirectBuilder.d.ts.map +1 -1
  146. package/dist/http/RedirectBuilder.js +4 -1
  147. package/dist/http/RedirectBuilder.js.map +1 -1
  148. package/dist/http/Request.d.ts +141 -10
  149. package/dist/http/Request.d.ts.map +1 -1
  150. package/dist/http/Request.js +244 -34
  151. package/dist/http/Request.js.map +1 -1
  152. package/dist/http/Response.d.ts +176 -9
  153. package/dist/http/Response.d.ts.map +1 -1
  154. package/dist/http/Response.js +404 -16
  155. package/dist/http/Response.js.map +1 -1
  156. package/dist/index.d.ts +19 -8
  157. package/dist/index.d.ts.map +1 -1
  158. package/dist/index.js +20 -5
  159. package/dist/index.js.map +1 -1
  160. package/dist/middleware/Pipeline.d.ts +29 -8
  161. package/dist/middleware/Pipeline.d.ts.map +1 -1
  162. package/dist/middleware/Pipeline.js +40 -2
  163. package/dist/middleware/Pipeline.js.map +1 -1
  164. package/dist/openapi/OpenApiProvider.js +4 -4
  165. package/dist/openapi/OpenApiProvider.js.map +1 -1
  166. package/dist/router/Router.d.ts +223 -31
  167. package/dist/router/Router.d.ts.map +1 -1
  168. package/dist/router/Router.js +520 -102
  169. package/dist/router/Router.js.map +1 -1
  170. package/dist/rpc/RpcProvider.d.ts +1 -0
  171. package/dist/rpc/RpcProvider.d.ts.map +1 -1
  172. package/dist/rpc/RpcProvider.js +7 -3
  173. package/dist/rpc/RpcProvider.js.map +1 -1
  174. package/dist/rpc/RpcRouter.d.ts +2 -2
  175. package/dist/rpc/RpcRouter.d.ts.map +1 -1
  176. package/dist/rpc/RpcRouter.js +17 -5
  177. package/dist/rpc/RpcRouter.js.map +1 -1
  178. package/dist/scheduler/ScheduleProvider.d.ts.map +1 -1
  179. package/dist/scheduler/ScheduleProvider.js +7 -15
  180. package/dist/scheduler/ScheduleProvider.js.map +1 -1
  181. package/dist/server/Server.d.ts +17 -4
  182. package/dist/server/Server.d.ts.map +1 -1
  183. package/dist/server/Server.js +41 -7
  184. package/dist/server/Server.js.map +1 -1
  185. package/dist/services/app.d.ts +1 -1
  186. package/dist/services/app.js +1 -1
  187. package/dist/services/console.d.ts +21 -0
  188. package/dist/services/console.d.ts.map +1 -0
  189. package/dist/services/console.js +35 -0
  190. package/dist/services/console.js.map +1 -0
  191. package/dist/session/SessionMiddleware.js +3 -3
  192. package/dist/session/SessionMiddleware.js.map +1 -1
  193. package/dist/storage/StaticProvider.js +1 -1
  194. package/dist/storage/StaticProvider.js.map +1 -1
  195. package/dist/testing/ApiResponse.d.ts +218 -0
  196. package/dist/testing/ApiResponse.d.ts.map +1 -0
  197. package/dist/testing/ApiResponse.js +576 -0
  198. package/dist/testing/ApiResponse.js.map +1 -0
  199. package/dist/testing/RequestBuilder.d.ts +155 -35
  200. package/dist/testing/RequestBuilder.d.ts.map +1 -1
  201. package/dist/testing/RequestBuilder.js +455 -109
  202. package/dist/testing/RequestBuilder.js.map +1 -1
  203. package/dist/testing/TestClient.d.ts +53 -37
  204. package/dist/testing/TestClient.d.ts.map +1 -1
  205. package/dist/testing/TestClient.js +84 -52
  206. package/dist/testing/TestClient.js.map +1 -1
  207. package/dist/utils/Macroable.d.ts +30 -0
  208. package/dist/utils/Macroable.d.ts.map +1 -0
  209. package/dist/utils/Macroable.js +43 -0
  210. package/dist/utils/Macroable.js.map +1 -0
  211. package/dist/utils/inflect.d.ts +17 -0
  212. package/dist/utils/inflect.d.ts.map +1 -0
  213. package/dist/utils/inflect.js +32 -0
  214. package/dist/utils/inflect.js.map +1 -0
  215. package/dist/utils/objectPath.d.ts +57 -0
  216. package/dist/utils/objectPath.d.ts.map +1 -0
  217. package/dist/utils/objectPath.js +141 -0
  218. package/dist/utils/objectPath.js.map +1 -0
  219. package/events.darwin-arm64.node +0 -0
  220. package/events.darwin-x64.node +0 -0
  221. package/events.linux-arm64-gnu.node +0 -0
  222. package/events.linux-x64-gnu.node +0 -0
  223. package/events.win32-x64-msvc.node +0 -0
  224. package/index.darwin-arm64.node +0 -0
  225. package/index.darwin-x64.node +0 -0
  226. package/index.linux-arm64-gnu.node +0 -0
  227. package/index.linux-x64-gnu.node +0 -0
  228. package/index.win32-x64-msvc.node +0 -0
  229. package/package.json +20 -2
  230. package/scheduler.darwin-arm64.node +0 -0
  231. package/scheduler.darwin-x64.node +0 -0
  232. package/scheduler.linux-arm64-gnu.node +0 -0
  233. package/scheduler.linux-x64-gnu.node +0 -0
  234. package/scheduler.win32-x64-msvc.node +0 -0
  235. package/src/ConfigLoader.ts +72 -9
  236. package/src/HttpKernel.ts +53 -15
  237. package/src/Ignitor.ts +364 -45
  238. package/src/console/BaseCommand.ts +467 -0
  239. package/src/console/Console.ts +174 -0
  240. package/src/console/ExceptionHandler.ts +91 -0
  241. package/src/console/HelpCommand.ts +37 -0
  242. package/src/console/IndexGenerator.ts +79 -0
  243. package/src/console/Kernel.ts +1382 -0
  244. package/src/console/ListCommand.ts +55 -0
  245. package/src/console/assertions.ts +114 -0
  246. package/src/console/cliui.ts +756 -0
  247. package/src/console/decorators.ts +199 -0
  248. package/src/console/index.ts +67 -0
  249. package/src/console/loaders.ts +145 -0
  250. package/src/console/parser.ts +598 -0
  251. package/src/console/prompts.ts +548 -0
  252. package/src/console/tracing.ts +22 -0
  253. package/src/console/types.ts +280 -0
  254. package/src/console/ui.ts +37 -0
  255. package/src/console/utils.ts +69 -0
  256. package/src/container/Container.ts +198 -72
  257. package/src/container/types.ts +15 -2
  258. package/src/decorators/Service.ts +28 -3
  259. package/src/env/Env.ts +49 -5
  260. package/src/env/Secret.ts +41 -0
  261. package/src/env/interpolate.ts +54 -0
  262. package/src/env/loadEnvFiles.ts +12 -4
  263. package/src/env/schema.ts +109 -35
  264. package/src/errors/ReamError.ts +31 -0
  265. package/src/errors/prettyPrintError.ts +20 -0
  266. package/src/events/Emitter.ts +2 -2
  267. package/src/events/EventsProvider.ts +5 -5
  268. package/src/graphql/GraphQLEngine.ts +4 -4
  269. package/src/graphql/GraphQLProvider.ts +7 -3
  270. package/src/http/Exception.ts +214 -37
  271. package/src/http/HttpContext.ts +87 -18
  272. package/src/http/RedirectBuilder.ts +4 -1
  273. package/src/http/Request.ts +264 -34
  274. package/src/http/Response.ts +478 -27
  275. package/src/index.ts +41 -6
  276. package/src/middleware/Pipeline.ts +77 -6
  277. package/src/openapi/OpenApiProvider.ts +4 -4
  278. package/src/router/Router.ts +631 -113
  279. package/src/rpc/RpcProvider.ts +6 -2
  280. package/src/rpc/RpcRouter.ts +22 -7
  281. package/src/scheduler/ScheduleProvider.ts +7 -15
  282. package/src/server/Server.ts +49 -10
  283. package/src/services/app.ts +1 -1
  284. package/src/services/console.ts +42 -0
  285. package/src/session/SessionMiddleware.ts +4 -4
  286. package/src/storage/StaticProvider.ts +1 -1
  287. package/src/testing/ApiResponse.ts +691 -0
  288. package/src/testing/RequestBuilder.ts +577 -137
  289. package/src/testing/TestClient.ts +110 -77
  290. package/src/utils/Macroable.ts +54 -0
  291. package/src/utils/inflect.ts +29 -0
  292. package/src/utils/objectPath.ts +142 -0
  293. package/dist/console/CommandRunner.d.ts +0 -18
  294. package/dist/console/CommandRunner.d.ts.map +0 -1
  295. package/dist/console/CommandRunner.js +0 -65
  296. package/dist/console/CommandRunner.js.map +0 -1
  297. package/dist/decorators/Lazy.d.ts +0 -19
  298. package/dist/decorators/Lazy.d.ts.map +0 -1
  299. package/dist/decorators/Lazy.js +0 -53
  300. package/dist/decorators/Lazy.js.map +0 -1
  301. package/src/console/CommandRunner.ts +0 -82
  302. package/src/decorators/Lazy.ts +0 -57
@@ -0,0 +1,356 @@
1
+ /**
2
+ * Interactive prompts (Console / `@poppinss/prompts` surface).
3
+ *
4
+ * Dependency-free, which sets one deliberate boundary: selection prompts are
5
+ * answered by typing a number or a name, not by arrow-key navigation. Doing
6
+ * that properly means raw mode, cursor control and redraw handling — a terminal
7
+ * widget toolkit, which is what enquirer is. Everything else matches Console: the
8
+ * method names, the option bag (`validate` / `default` / `hint` / `name` /
9
+ * `result` / `format`), and the trap API that makes prompts testable.
10
+ */
11
+ import { stdin, stdout } from 'node:process';
12
+ import { createInterface } from 'node:readline';
13
+ import { ReamError } from '../errors/ReamError.js';
14
+ import { colourise } from './ui.js';
15
+ /**
16
+ * Scripted answer builder — Console's `prompt.trap(name)`.
17
+ *
18
+ * Without it a command that asks anything is untestable: the test would either
19
+ * hang on a prompt or need a fake terminal.
20
+ */
21
+ export class PromptTrap {
22
+ #install;
23
+ constructor(install) {
24
+ this.#install = install;
25
+ }
26
+ /** Answer a text/secure prompt with this value. */
27
+ replyWith(value) {
28
+ this.#install(value);
29
+ }
30
+ /** Answer a confirm/toggle prompt with yes. */
31
+ accept() {
32
+ this.#install(true);
33
+ }
34
+ /** Answer a confirm/toggle prompt with no. */
35
+ reject() {
36
+ this.#install(false);
37
+ }
38
+ /** Pick the option at this index (choice / autocomplete). */
39
+ chooseOption(index = 0) {
40
+ this.#install({ index });
41
+ }
42
+ /** Pick these indexes (multiple). */
43
+ chooseOptions(indexes) {
44
+ this.#install({ indexes: [...indexes] });
45
+ }
46
+ }
47
+ export class Prompt {
48
+ #traps = new Map();
49
+ /**
50
+ * Script the next answer for the prompt registered under `name`
51
+ * (`options.name`, defaulting to the message).
52
+ */
53
+ trap(name) {
54
+ return new PromptTrap((value) => {
55
+ this.#traps.set(name, value);
56
+ });
57
+ }
58
+ /** Traps that were installed but never reached — useful in assertions. */
59
+ get pendingTraps() {
60
+ return [...this.#traps.keys()];
61
+ }
62
+ async ask(message, options = {}) {
63
+ return this.#text(message, options, false);
64
+ }
65
+ /** Masked input, for passwords and tokens. */
66
+ async secure(message, options = {}) {
67
+ return this.#text(message, options, true);
68
+ }
69
+ async confirm(message, options = {}) {
70
+ return this.toggle(message, ['y', 'n'], options);
71
+ }
72
+ async toggle(message, labels = ['y', 'n'], options = {}) {
73
+ const trapped = this.#takeTrap(message, options.name);
74
+ if (trapped !== undefined) {
75
+ const value = Boolean(trapped);
76
+ await this.#assertTrapped(value, options);
77
+ return options.result === undefined ? value : options.result(value);
78
+ }
79
+ const fallback = options.default ?? false;
80
+ const yes = labels[0];
81
+ const no = labels[1];
82
+ const shown = fallback ? `${yes.toUpperCase()}/${no}` : `${yes}/${no.toUpperCase()}`;
83
+ for (;;) {
84
+ const answer = (await this.readLine(this.#label(message, options, `(${shown})`))).toLowerCase();
85
+ if (answer === '') {
86
+ const problem = await this.#check(fallback, options);
87
+ if (problem === undefined) {
88
+ return options.result === undefined ? fallback : options.result(fallback);
89
+ }
90
+ stdout.write(`${colourise(problem, 'yellow')}\n`);
91
+ continue;
92
+ }
93
+ const affirmative = answer === yes.toLowerCase() || answer === 'yes' || answer === 'true';
94
+ const negative = answer === no.toLowerCase() || answer === 'no' || answer === 'false';
95
+ if (!affirmative && !negative) {
96
+ stdout.write(`${colourise(`Answer ${yes} or ${no}.`, 'yellow')}\n`);
97
+ continue;
98
+ }
99
+ const problem = await this.#check(affirmative, options);
100
+ if (problem !== undefined) {
101
+ stdout.write(`${colourise(problem, 'yellow')}\n`);
102
+ continue;
103
+ }
104
+ return options.result === undefined ? affirmative : options.result(affirmative);
105
+ }
106
+ }
107
+ /** Pick one option (Console `choice`). */
108
+ async choice(message, choices, options = {}) {
109
+ const picked = await this.#select(message, choices, options, false);
110
+ return picked[0];
111
+ }
112
+ /** Pick several options (Console `multiple`). */
113
+ async multiple(message, choices, options = {}) {
114
+ const picked = await this.#select(message, choices, options, true);
115
+ return options.result ? options.result(picked.map(String)) : picked;
116
+ }
117
+ /**
118
+ * Pick one option by typing part of its name (Console `autocomplete`).
119
+ *
120
+ * Substring matching rather than fuzzy scoring — predictable, and enough for
121
+ * the "too many options to list" case it exists for.
122
+ */
123
+ async autocomplete(message, choices, options = {}) {
124
+ const trapped = this.#takeTrap(message, options.name);
125
+ if (trapped !== undefined) {
126
+ const picked = this.#fromTrap(trapped, choices, false);
127
+ // Same rule as every other prompt: a scripted answer is held to the
128
+ // command's own validation, or the test proves nothing.
129
+ await this.#validateSelection(picked, options, false);
130
+ return this.#applyResult(picked[0], options);
131
+ }
132
+ const limit = options.limit ?? 10;
133
+ for (;;) {
134
+ const typed = await this.readLine(this.#label(message, options, '(type to filter)'));
135
+ const matches = choices.filter((choice) => nameOf(choice).toLowerCase().includes(typed.toLowerCase()));
136
+ if (matches.length === 0) {
137
+ stdout.write(`${colourise('No match.', 'yellow')}\n`);
138
+ continue;
139
+ }
140
+ const first = matches[0];
141
+ if (matches.length === 1 && first !== undefined) {
142
+ return this.#finish(nameOf(first), options);
143
+ }
144
+ const picked = await this.#select(message, matches.slice(0, limit), { ...options, name: undefined }, false);
145
+ return picked[0];
146
+ }
147
+ }
148
+ // ─── internals ──────────────────────────────────────────────
149
+ async #text(message, options, masked) {
150
+ const trapped = this.#takeTrap(message, options.name);
151
+ if (trapped !== undefined)
152
+ return this.#finish(String(trapped), options);
153
+ for (;;) {
154
+ const raw = await this.readLine(this.#label(message, options), masked);
155
+ // `format` is display-only (Console): the returned value is what was typed,
156
+ // with the default filled in when the line was empty.
157
+ const value = raw === '' && options.default !== undefined ? options.default : raw;
158
+ const problem = await this.#check(value, options);
159
+ if (problem !== undefined) {
160
+ stdout.write(`${colourise(problem, 'yellow')}\n`);
161
+ continue;
162
+ }
163
+ return options.result ? options.result(value) : value;
164
+ }
165
+ }
166
+ async #select(message, choices, options, many) {
167
+ if (choices.length === 0) {
168
+ throw new ReamError('E_CONSOLE_EMPTY_CHOICES', `"${message}" was asked with no options.`);
169
+ }
170
+ const trapped = this.#takeTrap(message, options.name);
171
+ if (trapped !== undefined) {
172
+ const picked = this.#fromTrap(trapped, choices, many);
173
+ // Same reasoning as the text prompts: a scripted answer the real prompt
174
+ // would reject must fail the test, not sail through it.
175
+ await this.#validateSelection(picked, options, many);
176
+ return many ? picked : picked.map((value) => this.#applyResult(value, options));
177
+ }
178
+ const defaultLabel = options.default === undefined
179
+ ? undefined
180
+ : [options.default]
181
+ .flat()
182
+ .map((index) => {
183
+ const choice = choices[index];
184
+ return choice === undefined ? String(index) : displayOf(choice);
185
+ })
186
+ .join(', ');
187
+ for (;;) {
188
+ stdout.write(`${this.#label(message, { ...options, default: defaultLabel }).trimEnd()}\n`);
189
+ choices.forEach((choice, index) => {
190
+ const hint = typeof choice === 'string' ? undefined : choice.hint;
191
+ stdout.write(` ${colourise(String(index + 1), 'cyan')}) ${displayOf(choice)}` +
192
+ `${hint === undefined ? '' : colourise(` — ${hint}`, 'dim')}\n`);
193
+ });
194
+ const answer = await this.readLine(many ? `Select (e.g. 1,3) from 1-${choices.length}: ` : `Select (1-${choices.length}): `);
195
+ // An empty answer takes the default — which for a selection prompt is an
196
+ // index, as Adonis spells it. Without this the default was shown in the
197
+ // label and then rejected as an invalid selection.
198
+ const indexes = answer === '' && options.default !== undefined
199
+ ? [options.default]
200
+ .flat()
201
+ .filter((index) => Number.isInteger(index) && index >= 0 && index < choices.length)
202
+ : answer
203
+ .split(',')
204
+ .map((part) => Number(part.trim()) - 1)
205
+ .filter((index) => Number.isInteger(index) && index >= 0 && index < choices.length);
206
+ if (indexes.length === 0 || (!many && indexes.length !== 1)) {
207
+ stdout.write(`${colourise('Invalid selection.', 'yellow')}\n`);
208
+ continue;
209
+ }
210
+ const picked = indexes.map((index) => nameOf(choices[index]));
211
+ const problem = await this.#selectionProblem(picked, options, many);
212
+ if (problem !== undefined) {
213
+ stdout.write(`${colourise(problem, 'yellow')}\n`);
214
+ continue;
215
+ }
216
+ return many ? picked : picked.map((value) => this.#applyResult(value, options));
217
+ }
218
+ }
219
+ /** `result` for a single-value selection; `multiple` applies its own. */
220
+ #applyResult(value, options) {
221
+ return options.result === undefined
222
+ ? value
223
+ : Reflect.apply(options.result, undefined, [String(value)]);
224
+ }
225
+ /**
226
+ * Validation subject for a selection: the whole array for `multiple`, the
227
+ * single value otherwise — so an Console rule written `validate(values: string[])`
228
+ * behaves the same here.
229
+ */
230
+ async #selectionProblem(picked, options, many) {
231
+ if (options.validate === undefined)
232
+ return undefined;
233
+ const subject = many ? picked.map(String) : String(picked[0] ?? '');
234
+ const verdict = await Reflect.apply(options.validate, undefined, [subject]);
235
+ if (verdict === true)
236
+ return undefined;
237
+ return typeof verdict === 'string' ? verdict : 'Invalid value.';
238
+ }
239
+ async #validateSelection(picked, options, many) {
240
+ const problem = await this.#selectionProblem(picked, options, many);
241
+ if (problem === undefined)
242
+ return;
243
+ throw new ReamError('E_CONSOLE_INVALID_TRAP_VALUE', `A scripted answer was rejected by its own validation: ${problem}`, { hint: 'The trap supplies a value the real prompt would refuse — fix the test.' });
244
+ }
245
+ /**
246
+ * Apply `format`, `validate` and `result` to a value that came from a trap.
247
+ *
248
+ * Skipping `validate` here would let a test inject a value the real prompt
249
+ * would have rejected, and the command would pass — a test giving confidence
250
+ * in something that cannot happen. A trapped value that fails validation is a
251
+ * broken test, so it throws instead of re-asking: there is nobody to re-ask.
252
+ */
253
+ async #finish(value, options) {
254
+ await this.#assertTrapped(value, options);
255
+ return options.result ? options.result(value) : value;
256
+ }
257
+ // Only the validation hook, so `SelectPromptOptions` (whose `default` is an
258
+ // index, not a value) passes without a variance conflict.
259
+ async #assertTrapped(value, options) {
260
+ const problem = await this.#check(value, options);
261
+ if (problem === undefined)
262
+ return;
263
+ throw new ReamError('E_CONSOLE_INVALID_TRAP_VALUE', `A scripted answer was rejected by its own validation: ${problem}`, { hint: 'The trap supplies a value the real prompt would refuse — fix the test.' });
264
+ }
265
+ #fromTrap(trapped, choices, many) {
266
+ const read = (index) => {
267
+ const choice = choices[index];
268
+ if (choice === undefined) {
269
+ throw new ReamError('E_CONSOLE_TRAP_OUT_OF_RANGE', `A trap chose option ${index + 1}, but only ${choices.length} were offered.`);
270
+ }
271
+ return nameOf(choice);
272
+ };
273
+ if (typeof trapped === 'object' && trapped !== null) {
274
+ const indexes = Reflect.get(trapped, 'indexes');
275
+ if (Array.isArray(indexes))
276
+ return indexes.map((index) => read(Number(index)));
277
+ const index = Reflect.get(trapped, 'index');
278
+ if (typeof index === 'number')
279
+ return [read(index)];
280
+ }
281
+ // A trap that replied with a raw value: honour it as-is.
282
+ if (many)
283
+ return Array.isArray(trapped) ? trapped : [trapped];
284
+ return [trapped];
285
+ }
286
+ /** Consume a scripted answer, if one was installed for this prompt. */
287
+ #takeTrap(message, name) {
288
+ const key = name ?? message;
289
+ if (!this.#traps.has(key))
290
+ return undefined;
291
+ const value = this.#traps.get(key);
292
+ this.#traps.delete(key);
293
+ return value;
294
+ }
295
+ async #check(value, options) {
296
+ if (options.validate === undefined)
297
+ return undefined;
298
+ const verdict = await options.validate(value);
299
+ if (verdict === true)
300
+ return undefined;
301
+ return typeof verdict === 'string' ? verdict : 'Invalid value.';
302
+ }
303
+ // Only the display fields, so a `PromptOptions<boolean>` can be passed
304
+ // without tripping over the contravariance of `validate`.
305
+ #label(message, options, suffix) {
306
+ const hint = options.hint === undefined ? '' : colourise(` (${options.hint})`, 'dim');
307
+ // The one place `format` legitimately applies: what is shown, not what is
308
+ // returned.
309
+ const shownDefault = options.default !== undefined && options.format !== undefined
310
+ ? Reflect.apply(options.format, undefined, [options.default])
311
+ : options.default;
312
+ const shown = shownDefault === undefined ? '' : ` [${String(shownDefault)}]`;
313
+ const tail = suffix === undefined ? '' : ` ${suffix}`;
314
+ return `${message}${hint}${shown}${tail}: `;
315
+ }
316
+ /**
317
+ * Read one line from the terminal.
318
+ *
319
+ * `protected` on purpose: it is the single seam through which input enters,
320
+ * so a test (or a future non-readline frontend) can substitute it by
321
+ * subclassing instead of faking a TTY.
322
+ */
323
+ readLine(query, masked = false) {
324
+ if (!stdin.isTTY) {
325
+ return Promise.reject(new ReamError('E_CONSOLE_NOT_INTERACTIVE', `Cannot prompt for "${query.trim()}" — stdin is not interactive.`, {
326
+ hint: 'Pass the value as a flag, or script the answer in tests with prompt.trap(name).',
327
+ }));
328
+ }
329
+ const rl = createInterface({ input: stdin, output: stdout, terminal: true });
330
+ // readline echoes each keystroke through _writeToOutput; replacing it is
331
+ // the dependency-free way to hide what is typed.
332
+ if (masked && isEchoing(rl)) {
333
+ rl._writeToOutput = (text) => {
334
+ stdout.write(text.includes(query) ? query : '');
335
+ };
336
+ }
337
+ return new Promise((resolve) => {
338
+ rl.question(query, (answer) => {
339
+ if (masked)
340
+ stdout.write('\n');
341
+ rl.close();
342
+ resolve(answer.trim());
343
+ });
344
+ });
345
+ }
346
+ }
347
+ function isEchoing(value) {
348
+ return '_writeToOutput' in value && typeof Reflect.get(value, '_writeToOutput') === 'function';
349
+ }
350
+ function nameOf(choice) {
351
+ return typeof choice === 'string' ? choice : choice.name;
352
+ }
353
+ function displayOf(choice) {
354
+ return typeof choice === 'string' ? choice : (choice.message ?? choice.name);
355
+ }
356
+ //# sourceMappingURL=prompts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.js","sourceRoot":"","sources":["../../src/console/prompts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Diagnostics channels for the console (Console `tracingChannels`).
3
+ *
4
+ * `diagnostics_channel` is Node's built-in tracing hook: an APM agent, or a
5
+ * test, subscribes without the framework knowing about it and without paying
6
+ * anything when nobody listens.
7
+ */
8
+ import diagnosticsChannel from 'node:diagnostics_channel';
9
+ import type { CommandClass, CommandInstance } from './types.js';
10
+ export interface CommandExecTracingData {
11
+ command: CommandClass;
12
+ commandInstance: CommandInstance;
13
+ argv: readonly string[];
14
+ }
15
+ /** Traces every command run by the kernel — start, end, error and result. */
16
+ export declare const commandExec: diagnosticsChannel.TracingChannel<"ream.command.exec", CommandExecTracingData>;
17
+ //# sourceMappingURL=tracing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing.d.ts","sourceRoot":"","sources":["../../src/console/tracing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,kBAAkB,MAAM,0BAA0B,CAAA;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,YAAY,CAAA;AAE/D,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,YAAY,CAAA;IACrB,eAAe,EAAE,eAAe,CAAA;IAChC,IAAI,EAAE,SAAS,MAAM,EAAE,CAAA;CACxB;AAED,6EAA6E;AAC7E,eAAO,MAAM,WAAW,gFAGF,CAAA"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Diagnostics channels for the console (Console `tracingChannels`).
3
+ *
4
+ * `diagnostics_channel` is Node's built-in tracing hook: an APM agent, or a
5
+ * test, subscribes without the framework knowing about it and without paying
6
+ * anything when nobody listens.
7
+ */
8
+ import diagnosticsChannel from 'node:diagnostics_channel';
9
+ /** Traces every command run by the kernel — start, end, error and result. */
10
+ export const commandExec = diagnosticsChannel.tracingChannel('ream.command.exec');
11
+ //# sourceMappingURL=tracing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tracing.js","sourceRoot":"","sources":["../../src/console/tracing.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,kBAAkB,MAAM,0BAA0B,CAAA;AASzD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,WAAW,GAAG,kBAAkB,CAAC,cAAc,CAG1D,mBAAmB,CAAC,CAAA"}