@superlayer/cli 1.0.67

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 (329) hide show
  1. package/LICENSE.md +202 -0
  2. package/NOTICE +4 -0
  3. package/README.md +67 -0
  4. package/bin/index.js +3 -0
  5. package/dist/auth/index.d.ts +4 -0
  6. package/dist/auth/index.d.ts.map +1 -0
  7. package/dist/auth/index.js +103 -0
  8. package/dist/auth/index.js.map +1 -0
  9. package/dist/commands/app/delete.d.ts +7 -0
  10. package/dist/commands/app/delete.d.ts.map +1 -0
  11. package/dist/commands/app/delete.js +57 -0
  12. package/dist/commands/app/delete.js.map +1 -0
  13. package/dist/commands/app/list.d.ts +6 -0
  14. package/dist/commands/app/list.d.ts.map +1 -0
  15. package/dist/commands/app/list.js +29 -0
  16. package/dist/commands/app/list.js.map +1 -0
  17. package/dist/commands/auth/client/add.d.ts +9 -0
  18. package/dist/commands/auth/client/add.d.ts.map +1 -0
  19. package/dist/commands/auth/client/add.js +409 -0
  20. package/dist/commands/auth/client/add.js.map +1 -0
  21. package/dist/commands/auth/client/delete.d.ts +11 -0
  22. package/dist/commands/auth/client/delete.d.ts.map +1 -0
  23. package/dist/commands/auth/client/delete.js +48 -0
  24. package/dist/commands/auth/client/delete.js.map +1 -0
  25. package/dist/commands/auth/client/list.d.ts +6 -0
  26. package/dist/commands/auth/client/list.d.ts.map +1 -0
  27. package/dist/commands/auth/client/list.js +38 -0
  28. package/dist/commands/auth/client/list.js.map +1 -0
  29. package/dist/commands/auth/client/shared.d.ts +70 -0
  30. package/dist/commands/auth/client/shared.d.ts.map +1 -0
  31. package/dist/commands/auth/client/shared.js +140 -0
  32. package/dist/commands/auth/client/shared.js.map +1 -0
  33. package/dist/commands/auth/client/update.d.ts +8 -0
  34. package/dist/commands/auth/client/update.d.ts.map +1 -0
  35. package/dist/commands/auth/client/update.js +445 -0
  36. package/dist/commands/auth/client/update.js.map +1 -0
  37. package/dist/commands/auth/email/pull.d.ts +24 -0
  38. package/dist/commands/auth/email/pull.d.ts.map +1 -0
  39. package/dist/commands/auth/email/pull.js +100 -0
  40. package/dist/commands/auth/email/pull.js.map +1 -0
  41. package/dist/commands/auth/email/push.d.ts +8 -0
  42. package/dist/commands/auth/email/push.d.ts.map +1 -0
  43. package/dist/commands/auth/email/push.js +58 -0
  44. package/dist/commands/auth/email/push.js.map +1 -0
  45. package/dist/commands/auth/email/resend.d.ts +3 -0
  46. package/dist/commands/auth/email/resend.d.ts.map +1 -0
  47. package/dist/commands/auth/email/resend.js +7 -0
  48. package/dist/commands/auth/email/resend.js.map +1 -0
  49. package/dist/commands/auth/email/reset.d.ts +5 -0
  50. package/dist/commands/auth/email/reset.d.ts.map +1 -0
  51. package/dist/commands/auth/email/reset.js +25 -0
  52. package/dist/commands/auth/email/reset.js.map +1 -0
  53. package/dist/commands/auth/email/status.d.ts +57 -0
  54. package/dist/commands/auth/email/status.d.ts.map +1 -0
  55. package/dist/commands/auth/email/status.js +96 -0
  56. package/dist/commands/auth/email/status.js.map +1 -0
  57. package/dist/commands/auth/email/verify.d.ts +5 -0
  58. package/dist/commands/auth/email/verify.d.ts.map +1 -0
  59. package/dist/commands/auth/email/verify.js +12 -0
  60. package/dist/commands/auth/email/verify.js.map +1 -0
  61. package/dist/commands/auth/origin/add.d.ts +12 -0
  62. package/dist/commands/auth/origin/add.d.ts.map +1 -0
  63. package/dist/commands/auth/origin/add.js +153 -0
  64. package/dist/commands/auth/origin/add.js.map +1 -0
  65. package/dist/commands/auth/origin/delete.d.ts +8 -0
  66. package/dist/commands/auth/origin/delete.d.ts.map +1 -0
  67. package/dist/commands/auth/origin/delete.js +38 -0
  68. package/dist/commands/auth/origin/delete.js.map +1 -0
  69. package/dist/commands/auth/origin/list.d.ts +9 -0
  70. package/dist/commands/auth/origin/list.d.ts.map +1 -0
  71. package/dist/commands/auth/origin/list.js +52 -0
  72. package/dist/commands/auth/origin/list.js.map +1 -0
  73. package/dist/commands/backup/download.d.ts +10 -0
  74. package/dist/commands/backup/download.d.ts.map +1 -0
  75. package/dist/commands/backup/download.js +174 -0
  76. package/dist/commands/backup/download.js.map +1 -0
  77. package/dist/commands/backup/list.d.ts +11 -0
  78. package/dist/commands/backup/list.d.ts.map +1 -0
  79. package/dist/commands/backup/list.js +74 -0
  80. package/dist/commands/backup/list.js.map +1 -0
  81. package/dist/commands/claim.d.ts +6 -0
  82. package/dist/commands/claim.d.ts.map +1 -0
  83. package/dist/commands/claim.js +22 -0
  84. package/dist/commands/claim.js.map +1 -0
  85. package/dist/commands/explorer.d.ts +6 -0
  86. package/dist/commands/explorer.d.ts.map +1 -0
  87. package/dist/commands/explorer.js +13 -0
  88. package/dist/commands/explorer.js.map +1 -0
  89. package/dist/commands/info.d.ts +9 -0
  90. package/dist/commands/info.d.ts.map +1 -0
  91. package/dist/commands/info.js +41 -0
  92. package/dist/commands/info.js.map +1 -0
  93. package/dist/commands/init.d.ts +5 -0
  94. package/dist/commands/init.d.ts.map +1 -0
  95. package/dist/commands/init.js +41 -0
  96. package/dist/commands/init.js.map +1 -0
  97. package/dist/commands/initWithoutFiles.d.ts +6 -0
  98. package/dist/commands/initWithoutFiles.d.ts.map +1 -0
  99. package/dist/commands/initWithoutFiles.js +64 -0
  100. package/dist/commands/initWithoutFiles.js.map +1 -0
  101. package/dist/commands/login.d.ts +9 -0
  102. package/dist/commands/login.d.ts.map +1 -0
  103. package/dist/commands/login.js +44 -0
  104. package/dist/commands/login.js.map +1 -0
  105. package/dist/commands/logout.d.ts +3 -0
  106. package/dist/commands/logout.d.ts.map +1 -0
  107. package/dist/commands/logout.js +14 -0
  108. package/dist/commands/logout.js.map +1 -0
  109. package/dist/commands/pull.d.ts +5 -0
  110. package/dist/commands/pull.d.ts.map +1 -0
  111. package/dist/commands/pull.js +15 -0
  112. package/dist/commands/pull.js.map +1 -0
  113. package/dist/commands/push.d.ts +6 -0
  114. package/dist/commands/push.d.ts.map +1 -0
  115. package/dist/commands/push.js +20 -0
  116. package/dist/commands/push.js.map +1 -0
  117. package/dist/commands/query.d.ts +7 -0
  118. package/dist/commands/query.d.ts.map +1 -0
  119. package/dist/commands/query.js +52 -0
  120. package/dist/commands/query.js.map +1 -0
  121. package/dist/commands/webhooks/add.d.ts +9 -0
  122. package/dist/commands/webhooks/add.d.ts.map +1 -0
  123. package/dist/commands/webhooks/add.js +75 -0
  124. package/dist/commands/webhooks/add.js.map +1 -0
  125. package/dist/commands/webhooks/delete.d.ts +6 -0
  126. package/dist/commands/webhooks/delete.d.ts.map +1 -0
  127. package/dist/commands/webhooks/delete.js +17 -0
  128. package/dist/commands/webhooks/delete.js.map +1 -0
  129. package/dist/commands/webhooks/disable.d.ts +7 -0
  130. package/dist/commands/webhooks/disable.d.ts.map +1 -0
  131. package/dist/commands/webhooks/disable.js +18 -0
  132. package/dist/commands/webhooks/disable.js.map +1 -0
  133. package/dist/commands/webhooks/enable.d.ts +6 -0
  134. package/dist/commands/webhooks/enable.d.ts.map +1 -0
  135. package/dist/commands/webhooks/enable.js +18 -0
  136. package/dist/commands/webhooks/enable.js.map +1 -0
  137. package/dist/commands/webhooks/events/list.d.ts +7 -0
  138. package/dist/commands/webhooks/events/list.d.ts.map +1 -0
  139. package/dist/commands/webhooks/events/list.js +31 -0
  140. package/dist/commands/webhooks/events/list.js.map +1 -0
  141. package/dist/commands/webhooks/events/payload.d.ts +8 -0
  142. package/dist/commands/webhooks/events/payload.d.ts.map +1 -0
  143. package/dist/commands/webhooks/events/payload.js +39 -0
  144. package/dist/commands/webhooks/events/payload.js.map +1 -0
  145. package/dist/commands/webhooks/events/resend.d.ts +8 -0
  146. package/dist/commands/webhooks/events/resend.d.ts.map +1 -0
  147. package/dist/commands/webhooks/events/resend.js +43 -0
  148. package/dist/commands/webhooks/events/resend.js.map +1 -0
  149. package/dist/commands/webhooks/list.d.ts +8 -0
  150. package/dist/commands/webhooks/list.d.ts.map +1 -0
  151. package/dist/commands/webhooks/list.js +29 -0
  152. package/dist/commands/webhooks/list.js.map +1 -0
  153. package/dist/commands/webhooks/shared.d.ts +40 -0
  154. package/dist/commands/webhooks/shared.d.ts.map +1 -0
  155. package/dist/commands/webhooks/shared.js +248 -0
  156. package/dist/commands/webhooks/shared.js.map +1 -0
  157. package/dist/commands/webhooks/update.d.ts +10 -0
  158. package/dist/commands/webhooks/update.d.ts.map +1 -0
  159. package/dist/commands/webhooks/update.js +189 -0
  160. package/dist/commands/webhooks/update.js.map +1 -0
  161. package/dist/context/authToken.d.ts +29 -0
  162. package/dist/context/authToken.d.ts.map +1 -0
  163. package/dist/context/authToken.js +73 -0
  164. package/dist/context/authToken.js.map +1 -0
  165. package/dist/context/currentApp.d.ts +38 -0
  166. package/dist/context/currentApp.d.ts.map +1 -0
  167. package/dist/context/currentApp.js +222 -0
  168. package/dist/context/currentApp.js.map +1 -0
  169. package/dist/context/globalOpts.d.ts +11 -0
  170. package/dist/context/globalOpts.d.ts.map +1 -0
  171. package/dist/context/globalOpts.js +13 -0
  172. package/dist/context/globalOpts.js.map +1 -0
  173. package/dist/context/platformApi.d.ts +19 -0
  174. package/dist/context/platformApi.d.ts.map +1 -0
  175. package/dist/context/platformApi.js +24 -0
  176. package/dist/context/platformApi.js.map +1 -0
  177. package/dist/context/projectInfo.d.ts +30 -0
  178. package/dist/context/projectInfo.d.ts.map +1 -0
  179. package/dist/context/projectInfo.js +152 -0
  180. package/dist/context/projectInfo.js.map +1 -0
  181. package/dist/errors.d.ts +10 -0
  182. package/dist/errors.d.ts.map +1 -0
  183. package/dist/errors.js +6 -0
  184. package/dist/errors.js.map +1 -0
  185. package/dist/index.d.ts +159 -0
  186. package/dist/index.d.ts.map +1 -0
  187. package/dist/index.js +714 -0
  188. package/dist/index.js.map +1 -0
  189. package/dist/layer.d.ts +25 -0
  190. package/dist/layer.d.ts.map +1 -0
  191. package/dist/layer.js +119 -0
  192. package/dist/layer.js.map +1 -0
  193. package/dist/lib/args.d.ts +212 -0
  194. package/dist/lib/args.d.ts.map +1 -0
  195. package/dist/lib/args.js +313 -0
  196. package/dist/lib/args.js.map +1 -0
  197. package/dist/lib/backupDownload.d.ts +21 -0
  198. package/dist/lib/backupDownload.d.ts.map +1 -0
  199. package/dist/lib/backupDownload.js +151 -0
  200. package/dist/lib/backupDownload.js.map +1 -0
  201. package/dist/lib/backups.d.ts +12 -0
  202. package/dist/lib/backups.d.ts.map +1 -0
  203. package/dist/lib/backups.js +26 -0
  204. package/dist/lib/backups.js.map +1 -0
  205. package/dist/lib/config.d.ts +6 -0
  206. package/dist/lib/config.d.ts.map +1 -0
  207. package/dist/lib/config.js +39 -0
  208. package/dist/lib/config.js.map +1 -0
  209. package/dist/lib/createApp.d.ts +12 -0
  210. package/dist/lib/createApp.d.ts.map +1 -0
  211. package/dist/lib/createApp.js +15 -0
  212. package/dist/lib/createApp.js.map +1 -0
  213. package/dist/lib/email.d.ts +47 -0
  214. package/dist/lib/email.d.ts.map +1 -0
  215. package/dist/lib/email.js +71 -0
  216. package/dist/lib/email.js.map +1 -0
  217. package/dist/lib/handleEnv.d.ts +7 -0
  218. package/dist/lib/handleEnv.d.ts.map +1 -0
  219. package/dist/lib/handleEnv.js +99 -0
  220. package/dist/lib/handleEnv.js.map +1 -0
  221. package/dist/lib/http.d.ts +30 -0
  222. package/dist/lib/http.d.ts.map +1 -0
  223. package/dist/lib/http.js +55 -0
  224. package/dist/lib/http.js.map +1 -0
  225. package/dist/lib/login.d.ts +12 -0
  226. package/dist/lib/login.d.ts.map +1 -0
  227. package/dist/lib/login.js +38 -0
  228. package/dist/lib/login.js.map +1 -0
  229. package/dist/lib/oauth.d.ts +306 -0
  230. package/dist/lib/oauth.d.ts.map +1 -0
  231. package/dist/lib/oauth.js +195 -0
  232. package/dist/lib/oauth.js.map +1 -0
  233. package/dist/lib/platformApi.d.ts +5 -0
  234. package/dist/lib/platformApi.d.ts.map +1 -0
  235. package/dist/lib/platformApi.js +11 -0
  236. package/dist/lib/platformApi.js.map +1 -0
  237. package/dist/lib/pullPerms.d.ts +7 -0
  238. package/dist/lib/pullPerms.d.ts.map +1 -0
  239. package/dist/lib/pullPerms.js +41 -0
  240. package/dist/lib/pullPerms.js.map +1 -0
  241. package/dist/lib/pullSchema.d.ts +12 -0
  242. package/dist/lib/pullSchema.d.ts.map +1 -0
  243. package/dist/lib/pullSchema.js +62 -0
  244. package/dist/lib/pullSchema.js.map +1 -0
  245. package/dist/lib/pushPerms.d.ts +13 -0
  246. package/dist/lib/pushPerms.d.ts.map +1 -0
  247. package/dist/lib/pushPerms.js +54 -0
  248. package/dist/lib/pushPerms.js.map +1 -0
  249. package/dist/lib/pushSchema.d.ts +53 -0
  250. package/dist/lib/pushSchema.d.ts.map +1 -0
  251. package/dist/lib/pushSchema.js +165 -0
  252. package/dist/lib/pushSchema.js.map +1 -0
  253. package/dist/lib/ui.d.ts +18 -0
  254. package/dist/lib/ui.d.ts.map +1 -0
  255. package/dist/lib/ui.js +32 -0
  256. package/dist/lib/ui.js.map +1 -0
  257. package/dist/lib/webhooks.d.ts +27 -0
  258. package/dist/lib/webhooks.d.ts.map +1 -0
  259. package/dist/lib/webhooks.js +95 -0
  260. package/dist/lib/webhooks.js.map +1 -0
  261. package/dist/logging.d.ts +5 -0
  262. package/dist/logging.d.ts.map +1 -0
  263. package/dist/logging.js +25 -0
  264. package/dist/logging.js.map +1 -0
  265. package/dist/old.d.ts +17 -0
  266. package/dist/old.d.ts.map +1 -0
  267. package/dist/old.js +410 -0
  268. package/dist/old.js.map +1 -0
  269. package/dist/program.d.ts +3 -0
  270. package/dist/program.d.ts.map +1 -0
  271. package/dist/program.js +3 -0
  272. package/dist/program.js.map +1 -0
  273. package/dist/renderSchemaPlan.d.ts +19 -0
  274. package/dist/renderSchemaPlan.d.ts.map +1 -0
  275. package/dist/renderSchemaPlan.js +220 -0
  276. package/dist/renderSchemaPlan.js.map +1 -0
  277. package/dist/ui/index.d.ts +292 -0
  278. package/dist/ui/index.d.ts.map +1 -0
  279. package/dist/ui/index.js +1296 -0
  280. package/dist/ui/index.js.map +1 -0
  281. package/dist/ui/lib.d.ts +124 -0
  282. package/dist/ui/lib.d.ts.map +1 -0
  283. package/dist/ui/lib.js +333 -0
  284. package/dist/ui/lib.js.map +1 -0
  285. package/dist/util/findConfigCandidates.d.ts +13 -0
  286. package/dist/util/findConfigCandidates.d.ts.map +1 -0
  287. package/dist/util/findConfigCandidates.js +211 -0
  288. package/dist/util/findConfigCandidates.js.map +1 -0
  289. package/dist/util/fs.d.ts +4 -0
  290. package/dist/util/fs.d.ts.map +1 -0
  291. package/dist/util/fs.js +22 -0
  292. package/dist/util/fs.js.map +1 -0
  293. package/dist/util/getAppName.d.ts +5 -0
  294. package/dist/util/getAppName.d.ts.map +1 -0
  295. package/dist/util/getAppName.js +14 -0
  296. package/dist/util/getAppName.js.map +1 -0
  297. package/dist/util/instantConfig.d.ts +9 -0
  298. package/dist/util/instantConfig.d.ts.map +1 -0
  299. package/dist/util/instantConfig.js +13 -0
  300. package/dist/util/instantConfig.js.map +1 -0
  301. package/dist/util/isHeadlessEnvironment.d.ts +4 -0
  302. package/dist/util/isHeadlessEnvironment.d.ts.map +1 -0
  303. package/dist/util/isHeadlessEnvironment.js +11 -0
  304. package/dist/util/isHeadlessEnvironment.js.map +1 -0
  305. package/dist/util/loadConfig.d.ts +3 -0
  306. package/dist/util/loadConfig.d.ts.map +1 -0
  307. package/dist/util/loadConfig.js +72 -0
  308. package/dist/util/loadConfig.js.map +1 -0
  309. package/dist/util/loadEnv.d.ts +2 -0
  310. package/dist/util/loadEnv.d.ts.map +1 -0
  311. package/dist/util/loadEnv.js +10 -0
  312. package/dist/util/loadEnv.js.map +1 -0
  313. package/dist/util/mergeSchema.d.ts +10 -0
  314. package/dist/util/mergeSchema.d.ts.map +1 -0
  315. package/dist/util/mergeSchema.js +338 -0
  316. package/dist/util/mergeSchema.js.map +1 -0
  317. package/dist/util/projectDir.d.ts +7 -0
  318. package/dist/util/projectDir.d.ts.map +1 -0
  319. package/dist/util/projectDir.js +43 -0
  320. package/dist/util/projectDir.js.map +1 -0
  321. package/dist/util/renamePrompt.d.ts +15 -0
  322. package/dist/util/renamePrompt.d.ts.map +1 -0
  323. package/dist/util/renamePrompt.js +57 -0
  324. package/dist/util/renamePrompt.js.map +1 -0
  325. package/dist/version.d.ts +3 -0
  326. package/dist/version.d.ts.map +1 -0
  327. package/dist/version.js +3 -0
  328. package/dist/version.js.map +1 -0
  329. package/package.json +96 -0
package/dist/ui/lib.js ADDED
@@ -0,0 +1,333 @@
1
+ import { ReadStream, WriteStream } from 'node:tty';
2
+ import { cursor, erase } from 'sisteransi';
3
+ import throttle from 'lodash.throttle';
4
+ import readline from 'node:readline';
5
+ const isWindows = process.platform === 'win32';
6
+ /**
7
+ * Set terminal raw mode on stdin, with a Windows workaround.
8
+ *
9
+ * Raw mode (true):
10
+ * - Input available character-by-character (not line-buffered)
11
+ * - No echo of typed characters
12
+ * - Ctrl+C doesn't send SIGINT (must handle manually)
13
+ * - Required to capture arrow keys and other special keys
14
+ *
15
+ * Normal mode (false):
16
+ * - Input is line-buffered (available after Enter)
17
+ * - Typed characters are echoed
18
+ * - Ctrl+C sends SIGINT as normal
19
+ *
20
+ * Windows workaround: We skip disabling raw mode on Windows because
21
+ * toggling it between prompts causes a race condition that breaks
22
+ * subsequent keypress events. Raw mode is automatically reset when
23
+ * the process exits, so this is safe.
24
+ *
25
+ * See: https://github.com/bombshell-dev/clack/issues/176
26
+ */
27
+ export function setRawModeWindowsFriendly(input, value) {
28
+ if (!value && isWindows)
29
+ return;
30
+ input.setRawMode(value);
31
+ }
32
+ export class Prompt {
33
+ terminal;
34
+ attachCallbacks = [];
35
+ detachCallbacks = [];
36
+ inputCallbacks = [];
37
+ modifier = undefined;
38
+ requestLayout() {
39
+ if (this.terminal) {
40
+ this.terminal.requestLayout();
41
+ }
42
+ }
43
+ constructor(modifier) {
44
+ this.modifier = modifier;
45
+ }
46
+ on(type, callback) {
47
+ if (type === 'attach') {
48
+ this.attachCallbacks.push(callback);
49
+ }
50
+ else if (type === 'detach') {
51
+ this.detachCallbacks.push(callback);
52
+ }
53
+ else if (type === 'input') {
54
+ this.inputCallbacks.push(callback);
55
+ }
56
+ }
57
+ attach(terminal) {
58
+ this.terminal = terminal;
59
+ this.attachCallbacks.forEach((it) => it(terminal));
60
+ }
61
+ detach(terminal) {
62
+ this.detachCallbacks.forEach((it) => it(terminal));
63
+ this.terminal = undefined;
64
+ }
65
+ input(str, key) {
66
+ this.inputCallbacks.forEach((it) => it(str, key));
67
+ }
68
+ fullRender(status) {
69
+ if (this.modifier) {
70
+ return this.modifier(this.render(status), status);
71
+ }
72
+ return this.render(status);
73
+ }
74
+ }
75
+ export class SelectState {
76
+ items;
77
+ selectedIdx = 0;
78
+ constructor(items) {
79
+ this.items = items;
80
+ }
81
+ bind(prompt) {
82
+ prompt.on('input', (str, key) => {
83
+ const invalidate = this.consume(str, key);
84
+ if (invalidate)
85
+ prompt.requestLayout();
86
+ });
87
+ }
88
+ consume(str, key) {
89
+ if (!key)
90
+ return false;
91
+ if (key.name === 'down') {
92
+ this.selectedIdx = (this.selectedIdx + 1) % this.items.length;
93
+ return true;
94
+ }
95
+ if (key.name === 'up') {
96
+ this.selectedIdx -= 1;
97
+ this.selectedIdx =
98
+ this.selectedIdx < 0 ? this.items.length - 1 : this.selectedIdx;
99
+ return true;
100
+ }
101
+ return false;
102
+ }
103
+ }
104
+ export const deferred = () => {
105
+ let resolve;
106
+ let reject;
107
+ const promise = new Promise((res, rej) => {
108
+ resolve = res;
109
+ reject = rej;
110
+ });
111
+ return {
112
+ resolve,
113
+ reject,
114
+ promise,
115
+ };
116
+ };
117
+ /**
118
+ * Module-level counter that tracks the cumulative line count of submitted
119
+ * prompts. A command opts in to "erase the trail at the very end" by calling
120
+ * {@link clearPromptTrail} right before printing its final summary.
121
+ */
122
+ let promptTrailLineCount = 0;
123
+ /**
124
+ * Walk the cursor up by however many lines submitted prompts have written, and
125
+ * erase from there to the end of the screen. Resets the counter. No-op on a
126
+ * non-TTY stdout (e.g. when output is piped). Vanished prompts don't
127
+ * contribute, so calling this only erases the dimmed trail.
128
+ */
129
+ export function clearPromptTrail() {
130
+ if (process.stdout.isTTY && promptTrailLineCount > 0) {
131
+ process.stdout.write(cursor.up(promptTrailLineCount) + erase.down());
132
+ }
133
+ promptTrailLineCount = 0;
134
+ }
135
+ export class Terminal {
136
+ view;
137
+ stdin;
138
+ stdout;
139
+ closable;
140
+ text = '';
141
+ status = 'idle';
142
+ _resolve;
143
+ promise;
144
+ renderFunc;
145
+ allowInteraction = true;
146
+ resolve;
147
+ setAllowInteraction(value) {
148
+ this.allowInteraction = value;
149
+ }
150
+ constructor(view, stdin, stdout, closable) {
151
+ this.view = view;
152
+ this.stdin = stdin;
153
+ this.stdout = stdout;
154
+ this.closable = closable;
155
+ if (this.stdin.isTTY)
156
+ setRawModeWindowsFriendly(this.stdin, true);
157
+ const keypress = (str, key) => {
158
+ if (key.name === 'c' && key.ctrl === true) {
159
+ this.requestLayout();
160
+ this.view.detach(this);
161
+ this.tearDown(keypress);
162
+ if (terminateHandler) {
163
+ terminateHandler(this.stdin, this.stdout);
164
+ return;
165
+ }
166
+ this.stdout.write(`\n^C\n`);
167
+ process.exit(1);
168
+ }
169
+ if (this.allowInteraction) {
170
+ if (key.name === 'escape') {
171
+ this.status = 'aborted';
172
+ this.requestLayout();
173
+ this.view.detach(this);
174
+ this.tearDown(keypress);
175
+ this._resolve({ status: 'aborted', data: undefined });
176
+ return;
177
+ }
178
+ if (key.name === 'return') {
179
+ this.status = 'submitted';
180
+ this.requestLayout();
181
+ this.view.detach(this);
182
+ this.tearDown(keypress);
183
+ this._resolve({ status: 'submitted', data: this.view.result() });
184
+ return;
185
+ }
186
+ }
187
+ view.input(str, key);
188
+ };
189
+ this.stdin.on('keypress', keypress);
190
+ this.view.attach(this);
191
+ const { resolve, promise } = deferred();
192
+ this._resolve = resolve;
193
+ this.resolve = (value) => {
194
+ this.status = 'submitted';
195
+ this.requestLayout();
196
+ this.view.detach(this);
197
+ this.tearDown(keypress);
198
+ this._resolve(value);
199
+ };
200
+ this.promise = promise;
201
+ this.renderFunc = throttle((str) => {
202
+ this.stdout.write(str);
203
+ });
204
+ }
205
+ tearDown(keypress) {
206
+ this.stdout.write(cursor.show);
207
+ this.stdin.removeListener('keypress', keypress);
208
+ if (this.stdin.isTTY)
209
+ setRawModeWindowsFriendly(this.stdin, false);
210
+ this.closable.close();
211
+ // Track rows the cursor advanced past so a command can erase the whole
212
+ // prompt trail at the end. Counts each \n plus wraps for lines wider than
213
+ // the terminal — mirrors `clear()`'s formula so wrapped output is still
214
+ // fully cleared. Skip vanished output (whitespace-only after the modifier
215
+ // ran).
216
+ if (this.status === 'submitted' && this.text.trim().length > 0) {
217
+ const cols = this.stdout.columns || 0;
218
+ const lines = this.text.split(/\r?\n/);
219
+ let rows = lines.length - 1; // one cursor-down per newline
220
+ if (cols > 0) {
221
+ for (const line of lines) {
222
+ const w = stringWidth(line);
223
+ if (w > 0)
224
+ rows += Math.floor((w - 1) / cols);
225
+ }
226
+ }
227
+ promptTrailLineCount += rows;
228
+ }
229
+ }
230
+ result() {
231
+ return this.promise;
232
+ }
233
+ toggleCursor(state) {
234
+ if (state === 'hide') {
235
+ this.stdout.write(cursor.hide);
236
+ }
237
+ else {
238
+ this.stdout.write(cursor.show);
239
+ }
240
+ }
241
+ requestLayout() {
242
+ const string = this.view.fullRender(this.status);
243
+ let realString = string;
244
+ // Only ensure a trailing newline when there's content. Vanished renders
245
+ // (empty string after modifyOutput) would otherwise inject a phantom line
246
+ // that pushes the next prompt down on each iteration.
247
+ if (realString.length > 0 && !realString.endsWith('\n')) {
248
+ realString += '\n';
249
+ }
250
+ const realText = this.text.endsWith('\n') ? this.text : `${this.text}\n`;
251
+ const clearPrefix = this.text ? clear(realText, this.stdout.columns) : '';
252
+ this.text = realString;
253
+ this.renderFunc(`${clearPrefix}${realString}`);
254
+ }
255
+ }
256
+ export function render(view) {
257
+ const { stdin, stdout, closable } = prepareReadLine();
258
+ if (view instanceof Prompt) {
259
+ const terminal = new Terminal(view, stdin, stdout, closable);
260
+ terminal.requestLayout();
261
+ return terminal.result();
262
+ }
263
+ stdout.write(`${view}\n`);
264
+ closable.close();
265
+ return;
266
+ }
267
+ export class CancelledPromptError extends Error {
268
+ constructor(message) {
269
+ super(message);
270
+ this.name = 'CancelledPromptError';
271
+ }
272
+ }
273
+ /**
274
+ * Renders a prompt object and throws if the Prompt was "cancelled"
275
+ * If using the standard render function you must check if the result ended in a cancellation before accessing the data.
276
+ * Cancellations are rare so this is more of a future proof for future components
277
+ * where cancelling may make more sense.
278
+ */
279
+ export async function renderUnwrap(view) {
280
+ const { stdin, stdout, closable } = prepareReadLine();
281
+ const terminal = new Terminal(view, stdin, stdout, closable);
282
+ terminal.requestLayout();
283
+ const result = (await terminal.result());
284
+ if (result.status === 'aborted') {
285
+ throw new CancelledPromptError('Prompt was aborted');
286
+ }
287
+ else {
288
+ // Prompt.result may throw an error but it is swallowed by the use of
289
+ // Terminal. Terminal.result() just returns the prompt's internal promise
290
+ if (result.data instanceof Error) {
291
+ throw result.data;
292
+ }
293
+ return result.data;
294
+ }
295
+ }
296
+ let terminateHandler;
297
+ export function onTerminate(callback) {
298
+ terminateHandler = callback;
299
+ }
300
+ export const prepareReadLine = () => {
301
+ const stdin = process.stdin;
302
+ const stdout = process.stdout;
303
+ const rl = readline.createInterface({
304
+ input: stdin,
305
+ escapeCodeTimeout: 50,
306
+ });
307
+ readline.emitKeypressEvents(stdin, rl);
308
+ return {
309
+ stdin,
310
+ stdout,
311
+ closable: rl,
312
+ };
313
+ };
314
+ const strip = (str) => {
315
+ const pattern = [
316
+ '[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)',
317
+ '(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))',
318
+ ].join('|');
319
+ const RGX = new RegExp(pattern, 'g');
320
+ return typeof str === 'string' ? str.replace(RGX, '') : str;
321
+ };
322
+ const stringWidth = (str) => [...strip(str)].length;
323
+ export const clear = function (prompt, perLine) {
324
+ if (!perLine)
325
+ return erase.line + cursor.to(0);
326
+ let rows = 0;
327
+ const lines = prompt.split(/\r?\n/);
328
+ for (let line of lines) {
329
+ rows += 1 + Math.floor(Math.max(stringWidth(line) - 1, 0) / perLine);
330
+ }
331
+ return erase.lines(rows);
332
+ };
333
+ //# sourceMappingURL=lib.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/ui/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,QAAQ,MAAM,iBAAiB,CAAC;AACvC,OAAO,QAAQ,MAAM,eAAe,CAAC;AAErC,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAiB,EAAE,KAAc;IACzE,IAAI,CAAC,KAAK,IAAI,SAAS;QAAE,OAAO;IAChC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;AAC1B,CAAC;AAWD,MAAM,OAAgB,MAAM;IAChB,QAAQ,CAAwB;IAClC,eAAe,GAAsC,EAAE,CAAC;IACxD,eAAe,GAAsC,EAAE,CAAC;IACxD,cAAc,GACpB,EAAE,CAAC;IAEE,QAAQ,GAA+B,SAAS,CAAC;IAExD,aAAa;QACX,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,QAAS,CAAC,aAAa,EAAE,CAAC;QACjC,CAAC;IACH,CAAC;IAED,YAAY,QAAyB;QACnC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAQD,EAAE,CAAC,IAAmC,EAAE,QAAa;QACnD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;aAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;YAC5B,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IAED,MAAM,CAAC,QAAmB;QACxB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,CAAC,QAAmB;QACxB,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;IAC5B,CAAC;IAED,KAAK,CAAC,GAAuB,EAAE,GAAW;QACxC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;IAID,UAAU,CAAC,MAAwC;QACjD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QACpD,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,MAAM,OAAO,WAAW;IAEM;IADrB,WAAW,GAAG,CAAC,CAAC;IACvB,YAA4B,KAAU;QAAV,UAAK,GAAL,KAAK,CAAK;IAAG,CAAC;IAE1C,IAAI,CAAC,MAAmB;QACtB,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAC1C,IAAI,UAAU;gBAAE,MAAM,CAAC,aAAa,EAAE,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,OAAO,CAAC,GAAuB,EAAE,GAAW;QAClD,IAAI,CAAC,GAAG;YAAE,OAAO,KAAK,CAAC;QAEvB,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACxB,IAAI,CAAC,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAC9D,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACtB,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;YACtB,IAAI,CAAC,WAAW;gBACd,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC;YAClE,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAED,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAM,EAAE;IAC9B,IAAI,OAA6C,CAAC;IAClD,IAAI,MAA+B,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC1C,OAAO,GAAG,GAAG,CAAC;QACd,MAAM,GAAG,GAAG,CAAC;IACf,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,OAAO;QACP,MAAM;QACN,OAAO;KACR,CAAC;AACJ,CAAC,CAAC;AA2BF;;;;GAIG;AACH,IAAI,oBAAoB,GAAG,CAAC,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,oBAAoB,GAAG,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,oBAAoB,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,OAAO,QAAQ;IAgBA;IACA;IACA;IACA;IAlBX,IAAI,GAAG,EAAE,CAAC;IACV,MAAM,GAAqC,MAAM,CAAC;IAClD,QAAQ,CAAgC;IACxC,OAAO,CAAwB;IAC/B,UAAU,CAAwB;IAElC,gBAAgB,GAAG,IAAI,CAAC;IAEzB,OAAO,CAAgC;IAEvC,mBAAmB,CAAC,KAAc;QACvC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;IAChC,CAAC;IAED,YACmB,IAAiB,EACjB,KAAiB,EACjB,MAAmB,EACnB,QAAkB;QAHlB,SAAI,GAAJ,IAAI,CAAa;QACjB,UAAK,GAAL,KAAK,CAAY;QACjB,WAAM,GAAN,MAAM,CAAa;QACnB,aAAQ,GAAR,QAAQ,CAAU;QAEnC,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,yBAAyB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAElE,MAAM,QAAQ,GAAG,CAAC,GAAuB,EAAE,GAAW,EAAE,EAAE;YACxD,IAAI,GAAG,CAAC,IAAI,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC1C,IAAI,CAAC,aAAa,EAAE,CAAC;gBACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACvB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;gBACxB,IAAI,gBAAgB,EAAE,CAAC;oBACrB,gBAAgB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;oBAC1C,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC5B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC1B,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC1B,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;oBACxB,IAAI,CAAC,aAAa,EAAE,CAAC;oBACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBACvB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACxB,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAC;oBACtD,OAAO;gBACT,CAAC;gBAED,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC1B,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;oBAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;oBACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;oBACvB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;oBACxB,IAAI,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBACjE,OAAO;gBACT,CAAC;YACH,CAAC;YAED,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACvB,CAAC,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAEvB,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,QAAQ,EAAgB,CAAC;QACtD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QAExB,IAAI,CAAC,OAAO,GAAG,CAAC,KAAmB,EAAE,EAAE;YACrC,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC;YAC1B,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvB,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC;QAEF,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,CAAC,GAAW,EAAE,EAAE;YACzC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,QAAQ,CAAC,QAAkC;QACjD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;YAAE,yBAAyB,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACnE,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,uEAAuE;QACvE,0EAA0E;QAC1E,wEAAwE;QACxE,0EAA0E;QAC1E,QAAQ;QACR,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACvC,IAAI,IAAI,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,8BAA8B;YAC3D,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;gBACb,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;oBACzB,MAAM,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;oBAC5B,IAAI,CAAC,GAAG,CAAC;wBAAE,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;gBAChD,CAAC;YACH,CAAC;YACD,oBAAoB,IAAI,IAAI,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,YAAY,CAAC,KAAsB;QACjC,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,aAAa;QACX,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjD,IAAI,UAAU,GAAG,MAAM,CAAC;QACxB,wEAAwE;QACxE,0EAA0E;QAC1E,sDAAsD;QACtD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,UAAU,IAAI,IAAI,CAAC;QACrB,CAAC;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,IAAI,CAAC;QACzE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,UAAU,CAAC;QAEvB,IAAI,CAAC,UAAU,CAAC,GAAG,WAAW,GAAG,UAAU,EAAE,CAAC,CAAC;IACjD,CAAC;CACF;AAID,MAAM,UAAU,MAAM,CAAC,IAAS;IAC9B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IACtD,IAAI,IAAI,YAAY,MAAM,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;QAC7D,QAAQ,CAAC,aAAa,EAAE,CAAC;QACzB,OAAO,QAAQ,CAAC,MAAM,EAAE,CAAC;IAC3B,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,CAAC;IACjB,OAAO;AACT,CAAC;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAgB;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAI,IAAe;IACnD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,eAAe,EAAE,CAAC;IACtD,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC7D,QAAQ,CAAC,aAAa,EAAE,CAAC;IACzB,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAgB,CAAC;IACxD,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,IAAI,oBAAoB,CAAC,oBAAoB,CAAC,CAAC;IACvD,CAAC;SAAM,CAAC;QACN,qEAAqE;QACrE,yEAAyE;QACzE,IAAI,MAAM,CAAC,IAAI,YAAY,KAAK,EAAE,CAAC;YACjC,MAAM,MAAM,CAAC,IAAI,CAAC;QACpB,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC;IACrB,CAAC;AACH,CAAC;AAED,IAAI,gBAES,CAAC;AAEd,MAAM,UAAU,WAAW,CACzB,QAAwE;IAExE,gBAAgB,GAAG,QAAQ,CAAC;AAC9B,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,GAI7B,EAAE;IACF,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAE9B,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC;QAClC,KAAK,EAAE,KAAK;QACZ,iBAAiB,EAAE,EAAE;KACtB,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAEvC,OAAO;QACL,KAAK;QACL,MAAM;QACN,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,KAAK,GAAG,CAAC,GAAW,EAAE,EAAE;IAC5B,MAAM,OAAO,GAAG;QACd,8HAA8H;QAC9H,wDAAwD;KACzD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEZ,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;IACrC,OAAO,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC9D,CAAC,CAAC;AAEF,MAAM,WAAW,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;AAE5D,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,MAAc,EAAE,OAAe;IAC5D,IAAI,CAAC,OAAO;QAAE,OAAO,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAE/C,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpC,KAAK,IAAI,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC,CAAC","sourcesContent":["import { ReadStream, WriteStream } from 'node:tty';\nimport { cursor, erase } from 'sisteransi';\nimport throttle from 'lodash.throttle';\nimport readline from 'node:readline';\n\nconst isWindows = process.platform === 'win32';\n\n/**\n * Set terminal raw mode on stdin, with a Windows workaround.\n *\n * Raw mode (true):\n * - Input available character-by-character (not line-buffered)\n * - No echo of typed characters\n * - Ctrl+C doesn't send SIGINT (must handle manually)\n * - Required to capture arrow keys and other special keys\n *\n * Normal mode (false):\n * - Input is line-buffered (available after Enter)\n * - Typed characters are echoed\n * - Ctrl+C sends SIGINT as normal\n *\n * Windows workaround: We skip disabling raw mode on Windows because\n * toggling it between prompts causes a race condition that breaks\n * subsequent keypress events. Raw mode is automatically reset when\n * the process exits, so this is safe.\n *\n * See: https://github.com/bombshell-dev/clack/issues/176\n */\nexport function setRawModeWindowsFriendly(input: ReadStream, value: boolean) {\n if (!value && isWindows) return;\n input.setRawMode(value);\n}\n\nexport interface Closable {\n close(): void;\n}\n\nexport type ModifyOutputFn = (\n output: string,\n status?: 'idle' | 'submitted' | 'aborted',\n) => string;\n\nexport abstract class Prompt<RESULT> {\n protected terminal: ITerminal | undefined;\n private attachCallbacks: ((terminal: ITerminal) => void)[] = [];\n private detachCallbacks: ((terminal: ITerminal) => void)[] = [];\n private inputCallbacks: ((str: string | undefined, key: AnyKey) => void)[] =\n [];\n\n public modifier: ModifyOutputFn | undefined = undefined;\n\n requestLayout() {\n if (this.terminal) {\n this.terminal!.requestLayout();\n }\n }\n\n constructor(modifier?: ModifyOutputFn) {\n this.modifier = modifier;\n }\n\n on(type: 'attach', callback: (terminal: ITerminal) => void): void;\n on(type: 'detach', callback: (terminal: ITerminal) => void): void;\n on(\n type: 'input',\n callback: (str: string | undefined, key: AnyKey) => void,\n ): void;\n on(type: 'attach' | 'detach' | 'input', callback: any): void {\n if (type === 'attach') {\n this.attachCallbacks.push(callback);\n } else if (type === 'detach') {\n this.detachCallbacks.push(callback);\n } else if (type === 'input') {\n this.inputCallbacks.push(callback);\n }\n }\n\n attach(terminal: ITerminal) {\n this.terminal = terminal;\n this.attachCallbacks.forEach((it) => it(terminal));\n }\n\n detach(terminal: ITerminal) {\n this.detachCallbacks.forEach((it) => it(terminal));\n this.terminal = undefined;\n }\n\n input(str: string | undefined, key: AnyKey) {\n this.inputCallbacks.forEach((it) => it(str, key));\n }\n\n abstract result(): RESULT;\n abstract render(status: 'idle' | 'submitted' | 'aborted'): string;\n fullRender(status: 'idle' | 'submitted' | 'aborted'): string {\n if (this.modifier) {\n return this.modifier(this.render(status), status);\n }\n return this.render(status);\n }\n}\n\nexport class SelectState<T> {\n public selectedIdx = 0;\n constructor(public readonly items: T[]) {}\n\n bind(prompt: Prompt<any>) {\n prompt.on('input', (str, key) => {\n const invalidate = this.consume(str, key);\n if (invalidate) prompt.requestLayout();\n });\n }\n\n private consume(str: string | undefined, key: AnyKey): boolean {\n if (!key) return false;\n\n if (key.name === 'down') {\n this.selectedIdx = (this.selectedIdx + 1) % this.items.length;\n return true;\n }\n\n if (key.name === 'up') {\n this.selectedIdx -= 1;\n this.selectedIdx =\n this.selectedIdx < 0 ? this.items.length - 1 : this.selectedIdx;\n return true;\n }\n\n return false;\n }\n}\n\nexport const deferred = <T>() => {\n let resolve!: (value: T | PromiseLike<T>) => void;\n let reject!: (reason?: any) => void;\n const promise = new Promise<T>((res, rej) => {\n resolve = res;\n reject = rej;\n });\n\n return {\n resolve,\n reject,\n promise,\n };\n};\n\nexport interface ITerminal {\n toggleCursor(state: 'hide' | 'show'): void;\n requestLayout(): void;\n resolve(value: Prompted<{}>): void;\n setAllowInteraction(value: boolean): void;\n}\n\nexport type AnyKey = {\n sequence: string;\n name: string | undefined;\n ctrl: boolean;\n meta: boolean;\n shift: boolean;\n};\n\ntype Prompted<T> =\n | {\n data: undefined;\n status: 'aborted';\n }\n | {\n data: T;\n status: 'submitted';\n };\n\n/**\n * Module-level counter that tracks the cumulative line count of submitted\n * prompts. A command opts in to \"erase the trail at the very end\" by calling\n * {@link clearPromptTrail} right before printing its final summary.\n */\nlet promptTrailLineCount = 0;\n\n/**\n * Walk the cursor up by however many lines submitted prompts have written, and\n * erase from there to the end of the screen. Resets the counter. No-op on a\n * non-TTY stdout (e.g. when output is piped). Vanished prompts don't\n * contribute, so calling this only erases the dimmed trail.\n */\nexport function clearPromptTrail(): void {\n if (process.stdout.isTTY && promptTrailLineCount > 0) {\n process.stdout.write(cursor.up(promptTrailLineCount) + erase.down());\n }\n promptTrailLineCount = 0;\n}\n\nexport class Terminal implements ITerminal {\n private text = '';\n private status: 'idle' | 'submitted' | 'aborted' = 'idle';\n private _resolve: (value: Prompted<{}>) => void;\n private promise: Promise<Prompted<{}>>;\n private renderFunc: (str: string) => void;\n\n private allowInteraction = true;\n\n public resolve: (value: Prompted<{}>) => void;\n\n public setAllowInteraction(value: boolean) {\n this.allowInteraction = value;\n }\n\n constructor(\n private readonly view: Prompt<any>,\n private readonly stdin: ReadStream,\n private readonly stdout: WriteStream,\n private readonly closable: Closable,\n ) {\n if (this.stdin.isTTY) setRawModeWindowsFriendly(this.stdin, true);\n\n const keypress = (str: string | undefined, key: AnyKey) => {\n if (key.name === 'c' && key.ctrl === true) {\n this.requestLayout();\n this.view.detach(this);\n this.tearDown(keypress);\n if (terminateHandler) {\n terminateHandler(this.stdin, this.stdout);\n return;\n }\n this.stdout.write(`\\n^C\\n`);\n process.exit(1);\n }\n\n if (this.allowInteraction) {\n if (key.name === 'escape') {\n this.status = 'aborted';\n this.requestLayout();\n this.view.detach(this);\n this.tearDown(keypress);\n this._resolve({ status: 'aborted', data: undefined });\n return;\n }\n\n if (key.name === 'return') {\n this.status = 'submitted';\n this.requestLayout();\n this.view.detach(this);\n this.tearDown(keypress);\n this._resolve({ status: 'submitted', data: this.view.result() });\n return;\n }\n }\n\n view.input(str, key);\n };\n\n this.stdin.on('keypress', keypress);\n this.view.attach(this);\n\n const { resolve, promise } = deferred<Prompted<{}>>();\n this._resolve = resolve;\n\n this.resolve = (value: Prompted<{}>) => {\n this.status = 'submitted';\n this.requestLayout();\n this.view.detach(this);\n this.tearDown(keypress);\n this._resolve(value);\n };\n\n this.promise = promise;\n\n this.renderFunc = throttle((str: string) => {\n this.stdout.write(str);\n });\n }\n\n private tearDown(keypress: (...args: any[]) => void) {\n this.stdout.write(cursor.show);\n this.stdin.removeListener('keypress', keypress);\n if (this.stdin.isTTY) setRawModeWindowsFriendly(this.stdin, false);\n this.closable.close();\n // Track rows the cursor advanced past so a command can erase the whole\n // prompt trail at the end. Counts each \\n plus wraps for lines wider than\n // the terminal — mirrors `clear()`'s formula so wrapped output is still\n // fully cleared. Skip vanished output (whitespace-only after the modifier\n // ran).\n if (this.status === 'submitted' && this.text.trim().length > 0) {\n const cols = this.stdout.columns || 0;\n const lines = this.text.split(/\\r?\\n/);\n let rows = lines.length - 1; // one cursor-down per newline\n if (cols > 0) {\n for (const line of lines) {\n const w = stringWidth(line);\n if (w > 0) rows += Math.floor((w - 1) / cols);\n }\n }\n promptTrailLineCount += rows;\n }\n }\n\n result(): Promise<{}> {\n return this.promise;\n }\n\n toggleCursor(state: 'hide' | 'show') {\n if (state === 'hide') {\n this.stdout.write(cursor.hide);\n } else {\n this.stdout.write(cursor.show);\n }\n }\n\n requestLayout() {\n const string = this.view.fullRender(this.status);\n let realString = string;\n // Only ensure a trailing newline when there's content. Vanished renders\n // (empty string after modifyOutput) would otherwise inject a phantom line\n // that pushes the next prompt down on each iteration.\n if (realString.length > 0 && !realString.endsWith('\\n')) {\n realString += '\\n';\n }\n const realText = this.text.endsWith('\\n') ? this.text : `${this.text}\\n`;\n const clearPrefix = this.text ? clear(realText, this.stdout.columns) : '';\n this.text = realString;\n\n this.renderFunc(`${clearPrefix}${realString}`);\n }\n}\n\nexport function render<T>(view: Prompt<T>): Promise<Prompted<T>>;\nexport function render(view: string): void;\nexport function render(view: any): any {\n const { stdin, stdout, closable } = prepareReadLine();\n if (view instanceof Prompt) {\n const terminal = new Terminal(view, stdin, stdout, closable);\n terminal.requestLayout();\n return terminal.result();\n }\n\n stdout.write(`${view}\\n`);\n closable.close();\n return;\n}\n\nexport class CancelledPromptError extends Error {\n constructor(message?: string) {\n super(message);\n this.name = 'CancelledPromptError';\n }\n}\n\n/**\n * Renders a prompt object and throws if the Prompt was \"cancelled\"\n * If using the standard render function you must check if the result ended in a cancellation before accessing the data.\n * Cancellations are rare so this is more of a future proof for future components\n * where cancelling may make more sense.\n */\nexport async function renderUnwrap<T>(view: Prompt<T>): Promise<T> {\n const { stdin, stdout, closable } = prepareReadLine();\n const terminal = new Terminal(view, stdin, stdout, closable);\n terminal.requestLayout();\n const result = (await terminal.result()) as Prompted<T>;\n if (result.status === 'aborted') {\n throw new CancelledPromptError('Prompt was aborted');\n } else {\n // Prompt.result may throw an error but it is swallowed by the use of\n // Terminal. Terminal.result() just returns the prompt's internal promise\n if (result.data instanceof Error) {\n throw result.data;\n }\n return result.data;\n }\n}\n\nlet terminateHandler:\n | ((stdin: ReadStream, stdout: WriteStream) => void)\n | undefined;\n\nexport function onTerminate(\n callback: ((stdin: ReadStream, stdout: WriteStream) => void) | undefined,\n) {\n terminateHandler = callback;\n}\n\nexport const prepareReadLine = (): {\n stdin: ReadStream;\n stdout: WriteStream;\n closable: Closable;\n} => {\n const stdin = process.stdin;\n const stdout = process.stdout;\n\n const rl = readline.createInterface({\n input: stdin,\n escapeCodeTimeout: 50,\n });\n\n readline.emitKeypressEvents(stdin, rl);\n\n return {\n stdin,\n stdout,\n closable: rl,\n };\n};\n\nconst strip = (str: string) => {\n const pattern = [\n '[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n '(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PRZcf-ntqry=><~]))',\n ].join('|');\n\n const RGX = new RegExp(pattern, 'g');\n return typeof str === 'string' ? str.replace(RGX, '') : str;\n};\n\nconst stringWidth = (str: string) => [...strip(str)].length;\n\nexport const clear = function (prompt: string, perLine: number) {\n if (!perLine) return erase.line + cursor.to(0);\n\n let rows = 0;\n const lines = prompt.split(/\\r?\\n/);\n for (let line of lines) {\n rows += 1 + Math.floor(Math.max(stringWidth(line) - 1, 0) / perLine);\n }\n\n return erase.lines(rows);\n};\n"]}
@@ -0,0 +1,13 @@
1
+ type ConfigCandidate = {
2
+ files: string;
3
+ extensions?: string[];
4
+ transform: (code: string) => string;
5
+ };
6
+ export declare function getSchemaReadCandidates(): ConfigCandidate[];
7
+ export declare function getPermsReadCandidates(): ConfigCandidate[];
8
+ export declare function getEmailReadCandidates(emailPath?: string): ConfigCandidate[];
9
+ export declare function getSchemaPathToWrite(existingPath?: string): string;
10
+ export declare function getPermsPathToWrite(): string;
11
+ export declare function getEmailPathToWrite(): string;
12
+ export {};
13
+ //# sourceMappingURL=findConfigCandidates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findConfigCandidates.d.ts","sourceRoot":"","sources":["../../src/util/findConfigCandidates.ts"],"names":[],"mappings":"AAIA,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CACrC,CAAC;AA0FF,wBAAgB,uBAAuB,IAAI,eAAe,EAAE,CA+C3D;AAED,wBAAgB,sBAAsB,IAAI,eAAe,EAAE,CAwC1D;AAED,wBAAgB,sBAAsB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,eAAe,EAAE,CAwC5E;AAED,wBAAgB,oBAAoB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAUlE;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAQ5C;AAED,wBAAgB,mBAAmB,IAAI,MAAM,CAQ5C"}
@@ -0,0 +1,211 @@
1
+ import { existsSync, readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import chalk from 'chalk';
4
+ /**
5
+ * Some framework packages can't be loaded in a Node.js CLI context:
6
+ * - @superlayer/react-native brings in react-native which isn't available
7
+ * - @superlayer/svelte re-exports .svelte files which can't be parsed
8
+ * - @superlayer/vue re-exports .vue files which can't be parsed
9
+ *
10
+ * Since schema files only need schema types (i, id, tx, etc.) which all
11
+ * come from @superlayer/core, we rewrite these imports to a safe export
12
+ * in the package that only re-exports from @superlayer/core.
13
+ */
14
+ function transformImports(code) {
15
+ return code
16
+ .replace(/["']@superlayer\/react-native["']/g, '"@superlayer/react-native/dist/cli"')
17
+ .replace(/["']@superlayer\/svelte["']/g, '"@superlayer/svelte/dist/cli"')
18
+ .replace(/["']@superlayer\/vue["']/g, '"@superlayer/vue/dist/cli"');
19
+ }
20
+ function findPathsRecursive(baseDir, maxDepth, fileName) {
21
+ const paths = [];
22
+ const cwd = process.cwd();
23
+ const scanDir = (currentDir, currentDepth) => {
24
+ if (currentDepth > maxDepth)
25
+ return;
26
+ const fullPath = join(cwd, currentDir);
27
+ if (!existsSync(fullPath))
28
+ return;
29
+ paths.push(join(currentDir, fileName));
30
+ if (currentDepth < maxDepth) {
31
+ try {
32
+ const entries = readdirSync(fullPath, { withFileTypes: true });
33
+ for (const entry of entries) {
34
+ if (entry.isDirectory() &&
35
+ !entry.name.startsWith('.') &&
36
+ entry.name !== 'node_modules') {
37
+ scanDir(join(currentDir, entry.name), currentDepth + 1);
38
+ }
39
+ }
40
+ }
41
+ catch (err) {
42
+ console.error(`Error scanning directory ${fullPath}: ${err}`);
43
+ }
44
+ }
45
+ };
46
+ scanDir(baseDir, 0);
47
+ return paths;
48
+ }
49
+ function getEnvSchemaPathWithLogging() {
50
+ const path = process.env.INSTANT_SCHEMA_FILE_PATH;
51
+ if (path) {
52
+ console.log(`Using INSTANT_SCHEMA_FILE_PATH=${chalk.green(process.env.INSTANT_SCHEMA_FILE_PATH)}`);
53
+ }
54
+ return path;
55
+ }
56
+ function getEnvPermsPathWithLogging() {
57
+ const path = process.env.INSTANT_PERMS_FILE_PATH;
58
+ if (path) {
59
+ console.log(`Using INSTANT_PERMS_FILE_PATH=${chalk.green(process.env.INSTANT_PERMS_FILE_PATH)}`);
60
+ }
61
+ return path;
62
+ }
63
+ function getEnvEmailPathWithLogging() {
64
+ const path = process.env.INSTANT_EMAIL_FILE_PATH;
65
+ if (path) {
66
+ console.log(`Using INSTANT_EMAIL_FILE_PATH=${chalk.green(process.env.INSTANT_EMAIL_FILE_PATH)}`);
67
+ }
68
+ return path;
69
+ }
70
+ export function getSchemaReadCandidates() {
71
+ const existing = getEnvSchemaPathWithLogging();
72
+ if (existing) {
73
+ return [{ files: existing, transform: transformImports }];
74
+ }
75
+ const extensions = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'];
76
+ const candidates = [];
77
+ candidates.push({
78
+ files: 'instant.schema',
79
+ extensions,
80
+ transform: transformImports,
81
+ });
82
+ // matches: src/any-folder/any-folder/instant.schema
83
+ // src/any-folder/instant.schema
84
+ // src/instant.schema
85
+ // 3 levels in case someone does src/lib/db/instant.schema
86
+ const srcPaths = findPathsRecursive('src', 3, 'instant.schema');
87
+ for (const srcPath of srcPaths) {
88
+ candidates.push({
89
+ files: srcPath,
90
+ extensions,
91
+ transform: transformImports,
92
+ });
93
+ }
94
+ // matches: lib/any-folder/instant.schema
95
+ // lib/instant.schema
96
+ // 2 levels in case someone does lib/db/instant.schema
97
+ const libPaths = findPathsRecursive('lib', 2, 'instant.schema');
98
+ for (const libPath of libPaths) {
99
+ candidates.push({
100
+ files: libPath,
101
+ extensions,
102
+ transform: transformImports,
103
+ });
104
+ }
105
+ candidates.push({
106
+ files: 'app/instant.schema',
107
+ extensions,
108
+ transform: transformImports,
109
+ });
110
+ return candidates;
111
+ }
112
+ export function getPermsReadCandidates() {
113
+ const existing = getEnvPermsPathWithLogging();
114
+ if (existing) {
115
+ return [{ files: existing, transform: transformImports }];
116
+ }
117
+ const extensions = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'];
118
+ const candidates = [];
119
+ candidates.push({
120
+ files: 'instant.perms',
121
+ extensions,
122
+ transform: transformImports,
123
+ });
124
+ const srcPaths = findPathsRecursive('src', 3, 'instant.perms');
125
+ for (const srcPath of srcPaths) {
126
+ candidates.push({
127
+ files: srcPath,
128
+ extensions,
129
+ transform: transformImports,
130
+ });
131
+ }
132
+ const libPaths = findPathsRecursive('lib', 2, 'instant.perms');
133
+ for (const libPath of libPaths) {
134
+ candidates.push({
135
+ files: libPath,
136
+ extensions,
137
+ transform: transformImports,
138
+ });
139
+ }
140
+ candidates.push({
141
+ files: 'app/instant.perms',
142
+ extensions,
143
+ transform: transformImports,
144
+ });
145
+ return candidates;
146
+ }
147
+ export function getEmailReadCandidates(emailPath) {
148
+ const existing = emailPath ?? getEnvEmailPathWithLogging();
149
+ if (existing) {
150
+ return [{ files: existing, transform: transformImports }];
151
+ }
152
+ const extensions = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'];
153
+ const candidates = [];
154
+ candidates.push({
155
+ files: 'instant.email',
156
+ extensions,
157
+ transform: transformImports,
158
+ });
159
+ const srcPaths = findPathsRecursive('src', 3, 'instant.email');
160
+ for (const srcPath of srcPaths) {
161
+ candidates.push({
162
+ files: srcPath,
163
+ extensions,
164
+ transform: transformImports,
165
+ });
166
+ }
167
+ const libPaths = findPathsRecursive('lib', 2, 'instant.email');
168
+ for (const libPath of libPaths) {
169
+ candidates.push({
170
+ files: libPath,
171
+ extensions,
172
+ transform: transformImports,
173
+ });
174
+ }
175
+ candidates.push({
176
+ files: 'app/instant.email',
177
+ extensions,
178
+ transform: transformImports,
179
+ });
180
+ return candidates;
181
+ }
182
+ export function getSchemaPathToWrite(existingPath) {
183
+ if (existingPath)
184
+ return existingPath;
185
+ if (process.env.INSTANT_SCHEMA_FILE_PATH) {
186
+ return process.env.INSTANT_SCHEMA_FILE_PATH;
187
+ }
188
+ if (existsSync(join(process.cwd(), 'src'))) {
189
+ return join('src', 'instant.schema.ts');
190
+ }
191
+ return 'instant.schema.ts';
192
+ }
193
+ export function getPermsPathToWrite() {
194
+ if (process.env.INSTANT_PERMS_FILE_PATH) {
195
+ return process.env.INSTANT_PERMS_FILE_PATH;
196
+ }
197
+ if (existsSync(join(process.cwd(), 'src'))) {
198
+ return join('src', 'instant.perms.ts');
199
+ }
200
+ return 'instant.perms.ts';
201
+ }
202
+ export function getEmailPathToWrite() {
203
+ if (process.env.INSTANT_EMAIL_FILE_PATH) {
204
+ return process.env.INSTANT_EMAIL_FILE_PATH;
205
+ }
206
+ if (existsSync(join(process.cwd(), 'src'))) {
207
+ return join('src', 'instant.email.ts');
208
+ }
209
+ return 'instant.email.ts';
210
+ }
211
+ //# sourceMappingURL=findConfigCandidates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findConfigCandidates.js","sourceRoot":"","sources":["../../src/util/findConfigCandidates.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync } from 'node:fs';\nimport { join } from 'node:path';\nimport chalk from 'chalk';\n\ntype ConfigCandidate = {\n files: string;\n extensions?: string[];\n transform: (code: string) => string;\n};\n\n/**\n * Some framework packages can't be loaded in a Node.js CLI context:\n * - @superlayer/react-native brings in react-native which isn't available\n * - @superlayer/svelte re-exports .svelte files which can't be parsed\n * - @superlayer/vue re-exports .vue files which can't be parsed\n *\n * Since schema files only need schema types (i, id, tx, etc.) which all\n * come from @superlayer/core, we rewrite these imports to a safe export\n * in the package that only re-exports from @superlayer/core.\n */\nfunction transformImports(code: string): string {\n return code\n .replace(\n /[\"']@superlayer\\/react-native[\"']/g,\n '\"@superlayer/react-native/dist/cli\"',\n )\n .replace(/[\"']@superlayer\\/svelte[\"']/g, '\"@superlayer/svelte/dist/cli\"')\n .replace(/[\"']@superlayer\\/vue[\"']/g, '\"@superlayer/vue/dist/cli\"');\n}\n\nfunction findPathsRecursive(\n baseDir: string,\n maxDepth: number,\n fileName: string,\n): string[] {\n const paths: string[] = [];\n const cwd = process.cwd();\n\n const scanDir = (currentDir: string, currentDepth: number): void => {\n if (currentDepth > maxDepth) return;\n\n const fullPath = join(cwd, currentDir);\n if (!existsSync(fullPath)) return;\n\n paths.push(join(currentDir, fileName));\n\n if (currentDepth < maxDepth) {\n try {\n const entries = readdirSync(fullPath, { withFileTypes: true });\n for (const entry of entries) {\n if (\n entry.isDirectory() &&\n !entry.name.startsWith('.') &&\n entry.name !== 'node_modules'\n ) {\n scanDir(join(currentDir, entry.name), currentDepth + 1);\n }\n }\n } catch (err) {\n console.error(`Error scanning directory ${fullPath}: ${err}`);\n }\n }\n };\n\n scanDir(baseDir, 0);\n return paths;\n}\n\nfunction getEnvSchemaPathWithLogging(): string | undefined {\n const path = process.env.INSTANT_SCHEMA_FILE_PATH;\n if (path) {\n console.log(\n `Using INSTANT_SCHEMA_FILE_PATH=${chalk.green(process.env.INSTANT_SCHEMA_FILE_PATH)}`,\n );\n }\n return path;\n}\n\nfunction getEnvPermsPathWithLogging(): string | undefined {\n const path = process.env.INSTANT_PERMS_FILE_PATH;\n if (path) {\n console.log(\n `Using INSTANT_PERMS_FILE_PATH=${chalk.green(process.env.INSTANT_PERMS_FILE_PATH)}`,\n );\n }\n return path;\n}\n\nfunction getEnvEmailPathWithLogging(): string | undefined {\n const path = process.env.INSTANT_EMAIL_FILE_PATH;\n if (path) {\n console.log(\n `Using INSTANT_EMAIL_FILE_PATH=${chalk.green(process.env.INSTANT_EMAIL_FILE_PATH)}`,\n );\n }\n return path;\n}\n\nexport function getSchemaReadCandidates(): ConfigCandidate[] {\n const existing = getEnvSchemaPathWithLogging();\n\n if (existing) {\n return [{ files: existing, transform: transformImports }];\n }\n const extensions = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'];\n const candidates: ConfigCandidate[] = [];\n\n candidates.push({\n files: 'instant.schema',\n extensions,\n transform: transformImports,\n });\n\n // matches: src/any-folder/any-folder/instant.schema\n // src/any-folder/instant.schema\n // src/instant.schema\n // 3 levels in case someone does src/lib/db/instant.schema\n const srcPaths = findPathsRecursive('src', 3, 'instant.schema');\n for (const srcPath of srcPaths) {\n candidates.push({\n files: srcPath,\n extensions,\n transform: transformImports,\n });\n }\n\n // matches: lib/any-folder/instant.schema\n // lib/instant.schema\n // 2 levels in case someone does lib/db/instant.schema\n const libPaths = findPathsRecursive('lib', 2, 'instant.schema');\n for (const libPath of libPaths) {\n candidates.push({\n files: libPath,\n extensions,\n transform: transformImports,\n });\n }\n\n candidates.push({\n files: 'app/instant.schema',\n extensions,\n transform: transformImports,\n });\n\n return candidates;\n}\n\nexport function getPermsReadCandidates(): ConfigCandidate[] {\n const existing = getEnvPermsPathWithLogging();\n if (existing) {\n return [{ files: existing, transform: transformImports }];\n }\n const extensions = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'];\n\n const candidates: ConfigCandidate[] = [];\n\n candidates.push({\n files: 'instant.perms',\n extensions,\n transform: transformImports,\n });\n\n const srcPaths = findPathsRecursive('src', 3, 'instant.perms');\n for (const srcPath of srcPaths) {\n candidates.push({\n files: srcPath,\n extensions,\n transform: transformImports,\n });\n }\n\n const libPaths = findPathsRecursive('lib', 2, 'instant.perms');\n for (const libPath of libPaths) {\n candidates.push({\n files: libPath,\n extensions,\n transform: transformImports,\n });\n }\n\n candidates.push({\n files: 'app/instant.perms',\n extensions,\n transform: transformImports,\n });\n\n return candidates;\n}\n\nexport function getEmailReadCandidates(emailPath?: string): ConfigCandidate[] {\n const existing = emailPath ?? getEnvEmailPathWithLogging();\n if (existing) {\n return [{ files: existing, transform: transformImports }];\n }\n const extensions = ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs'];\n\n const candidates: ConfigCandidate[] = [];\n\n candidates.push({\n files: 'instant.email',\n extensions,\n transform: transformImports,\n });\n\n const srcPaths = findPathsRecursive('src', 3, 'instant.email');\n for (const srcPath of srcPaths) {\n candidates.push({\n files: srcPath,\n extensions,\n transform: transformImports,\n });\n }\n\n const libPaths = findPathsRecursive('lib', 2, 'instant.email');\n for (const libPath of libPaths) {\n candidates.push({\n files: libPath,\n extensions,\n transform: transformImports,\n });\n }\n\n candidates.push({\n files: 'app/instant.email',\n extensions,\n transform: transformImports,\n });\n\n return candidates;\n}\n\nexport function getSchemaPathToWrite(existingPath?: string): string {\n if (existingPath) return existingPath;\n if (process.env.INSTANT_SCHEMA_FILE_PATH) {\n return process.env.INSTANT_SCHEMA_FILE_PATH;\n }\n if (existsSync(join(process.cwd(), 'src'))) {\n return join('src', 'instant.schema.ts');\n }\n\n return 'instant.schema.ts';\n}\n\nexport function getPermsPathToWrite(): string {\n if (process.env.INSTANT_PERMS_FILE_PATH) {\n return process.env.INSTANT_PERMS_FILE_PATH;\n }\n if (existsSync(join(process.cwd(), 'src'))) {\n return join('src', 'instant.perms.ts');\n }\n return 'instant.perms.ts';\n}\n\nexport function getEmailPathToWrite(): string {\n if (process.env.INSTANT_EMAIL_FILE_PATH) {\n return process.env.INSTANT_EMAIL_FILE_PATH;\n }\n if (existsSync(join(process.cwd(), 'src'))) {\n return join('src', 'instant.email.ts');\n }\n return 'instant.email.ts';\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { PathLike } from 'fs';
2
+ export declare function pathExists(p: PathLike): Promise<boolean>;
3
+ export declare function readJsonFile<T = Record<string, any>>(p: PathLike): Promise<T | null>;
4
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/util/fs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAGnC,wBAAsB,UAAU,CAAC,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAO9D;AAED,wBAAsB,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACxD,CAAC,EAAE,QAAQ,GACV,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAWnB"}