@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
@@ -0,0 +1,22 @@
1
+ import { readFile, stat } from 'fs/promises';
2
+ export async function pathExists(p) {
3
+ try {
4
+ await stat(p);
5
+ return true;
6
+ }
7
+ catch {
8
+ return false;
9
+ }
10
+ }
11
+ export async function readJsonFile(p) {
12
+ if (!pathExists(p)) {
13
+ return null;
14
+ }
15
+ try {
16
+ const data = await readFile(p, 'utf-8');
17
+ return JSON.parse(data);
18
+ }
19
+ catch (error) { }
20
+ return null;
21
+ }
22
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/util/fs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,CAAW;IAC1C,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,CAAW;IAEX,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC,CAAA,CAAC;IAElB,OAAO,IAAI,CAAC;AACd,CAAC","sourcesContent":["import type { PathLike } from 'fs';\nimport { readFile, stat } from 'fs/promises';\n\nexport async function pathExists(p: PathLike): Promise<boolean> {\n try {\n await stat(p);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function readJsonFile<T = Record<string, any>>(\n p: PathLike,\n): Promise<T | null> {\n if (!pathExists(p)) {\n return null;\n }\n\n try {\n const data = await readFile(p, 'utf-8');\n return JSON.parse(data);\n } catch (error) {}\n\n return null;\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import { Effect } from 'effect';
2
+ import { InstantHttpAuthed } from '../lib/http.ts';
3
+ import { CurrentApp } from '../context/currentApp.ts';
4
+ export declare const getAppName: Effect.Effect<string, import("effect/ParseResult").ParseError | import("../lib/http.ts").InstantHttpError | import("effect/Cause").TimeoutException | import("@effect/platform/HttpClientError").RequestError | import("@effect/platform/HttpClientError").ResponseError, InstantHttpAuthed | CurrentApp>;
5
+ //# sourceMappingURL=getAppName.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getAppName.d.ts","sourceRoot":"","sources":["../../src/util/getAppName.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAItD,eAAO,MAAM,UAAU,2SAOrB,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { Effect } from 'effect';
2
+ import { InstantHttpAuthed } from "../lib/http.js";
3
+ import { CurrentApp } from "../context/currentApp.js";
4
+ import { HttpClientResponse } from '@effect/platform';
5
+ import { DashAppResponse } from "../commands/info.js";
6
+ export const getAppName = Effect.gen(function* () {
7
+ const authedHttp = yield* InstantHttpAuthed;
8
+ const { appId } = yield* CurrentApp;
9
+ const appInfo = yield* authedHttp
10
+ .get(`/dash/apps/${appId}`)
11
+ .pipe(Effect.flatMap(HttpClientResponse.schemaBodyJson(DashAppResponse)));
12
+ return appInfo.app.title;
13
+ });
14
+ //# sourceMappingURL=getAppName.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getAppName.js","sourceRoot":"","sources":["../../src/util/getAppName.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC5C,MAAM,UAAU,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC;IAC5C,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,UAAU,CAAC;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,UAAU;SAC9B,GAAG,CAAC,cAAc,KAAK,EAAE,CAAC;SAC1B,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC5E,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;AAC3B,CAAC,CAAC,CAAC","sourcesContent":["import { Effect } from 'effect';\nimport { InstantHttpAuthed } from '../lib/http.ts';\nimport { CurrentApp } from '../context/currentApp.ts';\nimport { HttpClientResponse } from '@effect/platform';\nimport { DashAppResponse } from '../commands/info.ts';\n\nexport const getAppName = Effect.gen(function* () {\n const authedHttp = yield* InstantHttpAuthed;\n const { appId } = yield* CurrentApp;\n const appInfo = yield* authedHttp\n .get(`/dash/apps/${appId}`)\n .pipe(Effect.flatMap(HttpClientResponse.schemaBodyJson(DashAppResponse)));\n return appInfo.app.title;\n});\n"]}
@@ -0,0 +1,9 @@
1
+ export type InstantConfig = {
2
+ apiURI?: string;
3
+ dashURI?: string;
4
+ apps?: Record<string, {
5
+ id: string;
6
+ }>;
7
+ };
8
+ export declare function readInstantConfigFile(): Promise<InstantConfig>;
9
+ //# sourceMappingURL=instantConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instantConfig.d.ts","sourceRoot":"","sources":["../../src/util/instantConfig.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACvC,CAAC;AAEF,wBAAsB,qBAAqB,2BAY1C"}
@@ -0,0 +1,13 @@
1
+ import { loadConfig } from "./loadConfig.js";
2
+ export async function readInstantConfigFile() {
3
+ return (await loadConfig({
4
+ sources: [
5
+ {
6
+ files: 'instant.config',
7
+ extensions: ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs', 'json'],
8
+ },
9
+ ],
10
+ merge: false,
11
+ })).config;
12
+ }
13
+ //# sourceMappingURL=instantConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instantConfig.js","sourceRoot":"","sources":["../../src/util/instantConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAQ7C,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,OAAO,CACL,MAAM,UAAU,CAAgB;QAC9B,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,gBAAgB;gBACvB,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC;aAC7D;SACF;QACD,KAAK,EAAE,KAAK;KACb,CAAC,CACH,CAAC,MAAM,CAAC;AACX,CAAC","sourcesContent":["import { loadConfig } from './loadConfig.ts';\n\nexport type InstantConfig = {\n apiURI?: string;\n dashURI?: string;\n apps?: Record<string, { id: string }>;\n};\n\nexport async function readInstantConfigFile() {\n return (\n await loadConfig<InstantConfig>({\n sources: [\n {\n files: 'instant.config',\n extensions: ['ts', 'mts', 'cts', 'js', 'mjs', 'cjs', 'json'],\n },\n ],\n merge: false,\n })\n ).config;\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export declare function isHeadlessEnvironment(opts?: {
2
+ headless?: boolean;
3
+ }): boolean;
4
+ //# sourceMappingURL=isHeadlessEnvironment.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isHeadlessEnvironment.d.ts","sourceRoot":"","sources":["../../src/util/isHeadlessEnvironment.ts"],"names":[],"mappings":"AAAA,wBAAgB,qBAAqB,CAAC,IAAI,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,WAclE"}
@@ -0,0 +1,11 @@
1
+ export function isHeadlessEnvironment(opts) {
2
+ const noBrowserMode = Boolean(process.env.INSTANT_CLI_NO_BROWSER || process.env.CI || opts?.headless);
3
+ // Check for common headless environment indicators
4
+ return (noBrowserMode ||
5
+ process.env.TERM === 'dumb' ||
6
+ process.env.SSH_CONNECTION !== undefined ||
7
+ process.env.SSH_CLIENT !== undefined ||
8
+ (!process.env.DISPLAY && process.platform === 'linux') ||
9
+ process.env.WSL_DISTRO_NAME !== undefined);
10
+ }
11
+ //# sourceMappingURL=isHeadlessEnvironment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isHeadlessEnvironment.js","sourceRoot":"","sources":["../../src/util/isHeadlessEnvironment.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,qBAAqB,CAAC,IAA6B;IACjE,MAAM,aAAa,GAAG,OAAO,CAC3B,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,EAAE,QAAQ,CACvE,CAAC;IAEF,mDAAmD;IACnD,OAAO,CACL,aAAa;QACb,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM;QAC3B,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,SAAS;QACxC,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,SAAS;QACpC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,eAAe,KAAK,SAAS,CAC1C,CAAC;AACJ,CAAC","sourcesContent":["export function isHeadlessEnvironment(opts?: { headless?: boolean }) {\n const noBrowserMode = Boolean(\n process.env.INSTANT_CLI_NO_BROWSER || process.env.CI || opts?.headless,\n );\n\n // Check for common headless environment indicators\n return (\n noBrowserMode ||\n process.env.TERM === 'dumb' ||\n process.env.SSH_CONNECTION !== undefined ||\n process.env.SSH_CLIENT !== undefined ||\n (!process.env.DISPLAY && process.platform === 'linux') ||\n process.env.WSL_DISTRO_NAME !== undefined\n );\n}\n"]}
@@ -0,0 +1,3 @@
1
+ import type { LoadConfigOptions, LoadConfigResult } from 'unconfig';
2
+ export declare function loadConfig<T>(opts: LoadConfigOptions<T>): Promise<LoadConfigResult<T>>;
3
+ //# sourceMappingURL=loadConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadConfig.d.ts","sourceRoot":"","sources":["../../src/util/loadConfig.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAkElB,wBAAsB,UAAU,CAAC,CAAC,EAChC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAmB9B"}
@@ -0,0 +1,72 @@
1
+ import { loadConfig as _loadConfig } from 'unconfig';
2
+ import { createRequire } from 'node:module';
3
+ import path from 'node:path';
4
+ import { findProjectDir } from "./projectDir.js";
5
+ const toArray = (value) => Array.isArray(value) ? value : [value];
6
+ /**
7
+ * Resolve @superlayer packages from the CLI's own dependencies for
8
+ * projects without node_modules. All @superlayer packages re-export
9
+ * schema types from core, so a single core alias covers them all.
10
+ */
11
+ function getInstantAliases() {
12
+ try {
13
+ const require = createRequire(import.meta.url);
14
+ const corePackageJson = require.resolve('@superlayer/core/package.json');
15
+ const coreDir = path.dirname(corePackageJson);
16
+ return {
17
+ '@superlayer/core': coreDir,
18
+ '@superlayer/react': coreDir,
19
+ '@superlayer/react-native': coreDir,
20
+ '@superlayer/svelte': coreDir,
21
+ '@superlayer/vue': coreDir,
22
+ '@superlayer/admin': coreDir,
23
+ };
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ function withAliases(opts, alias) {
30
+ return {
31
+ ...opts,
32
+ sources: toArray(opts.sources).map((source) => {
33
+ if (source.parser === 'json' || typeof source.parser === 'function') {
34
+ return source;
35
+ }
36
+ return {
37
+ ...source,
38
+ parser: async (filepath) => {
39
+ const localRequire = createRequire(import.meta.url);
40
+ const unconfigRequire = createRequire(localRequire.resolve('unconfig/package.json'));
41
+ const { createJiti } = unconfigRequire('jiti');
42
+ const jiti = createJiti(import.meta.url, {
43
+ fsCache: false,
44
+ moduleCache: false,
45
+ interopDefault: true,
46
+ alias,
47
+ });
48
+ return jiti.import(filepath, { default: true });
49
+ },
50
+ };
51
+ }),
52
+ };
53
+ }
54
+ export async function loadConfig(opts) {
55
+ const projectInfo = await findProjectDir();
56
+ const needsAliases = projectInfo?.type === 'deno' || projectInfo?.type === 'python';
57
+ let res;
58
+ if (needsAliases) {
59
+ const alias = getInstantAliases();
60
+ res = await _loadConfig(alias ? withAliases(opts, alias) : opts);
61
+ }
62
+ else {
63
+ res = await _loadConfig(opts);
64
+ }
65
+ // Unconfig seems to add an __esModule property to the config object
66
+ // Removing it.
67
+ if (typeof res.config === 'object' && '__esModule' in res.config) {
68
+ delete res.config.__esModule;
69
+ }
70
+ return res;
71
+ }
72
+ //# sourceMappingURL=loadConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadConfig.js","sourceRoot":"","sources":["../../src/util/loadConfig.ts"],"names":[],"mappings":"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","sourcesContent":["import { loadConfig as _loadConfig } from 'unconfig';\nimport type {\n LoadConfigOptions,\n LoadConfigResult,\n LoadConfigSource,\n} from 'unconfig';\nimport { createRequire } from 'node:module';\nimport path from 'node:path';\nimport { findProjectDir } from './projectDir.ts';\n\ntype Arrayable<T> = T | T[];\n\nconst toArray = <T>(value: Arrayable<T>): T[] =>\n Array.isArray(value) ? value : [value];\n\n/**\n * Resolve @superlayer packages from the CLI's own dependencies for\n * projects without node_modules. All @superlayer packages re-export\n * schema types from core, so a single core alias covers them all.\n */\nfunction getInstantAliases(): Record<string, string> | null {\n try {\n const require = createRequire(import.meta.url);\n const corePackageJson = require.resolve('@superlayer/core/package.json');\n const coreDir = path.dirname(corePackageJson);\n return {\n '@superlayer/core': coreDir,\n '@superlayer/react': coreDir,\n '@superlayer/react-native': coreDir,\n '@superlayer/svelte': coreDir,\n '@superlayer/vue': coreDir,\n '@superlayer/admin': coreDir,\n };\n } catch {\n return null;\n }\n}\n\nfunction withAliases<T>(\n opts: LoadConfigOptions<T>,\n alias: Record<string, string>,\n): LoadConfigOptions<T> {\n return {\n ...opts,\n sources: toArray(opts.sources).map((source): LoadConfigSource<T> => {\n if (source.parser === 'json' || typeof source.parser === 'function') {\n return source;\n }\n\n return {\n ...source,\n parser: async (filepath) => {\n const localRequire = createRequire(import.meta.url);\n const unconfigRequire = createRequire(\n localRequire.resolve('unconfig/package.json'),\n );\n const { createJiti } = unconfigRequire('jiti');\n const jiti = createJiti(import.meta.url, {\n fsCache: false,\n moduleCache: false,\n interopDefault: true,\n alias,\n });\n\n return jiti.import(filepath, { default: true });\n },\n };\n }),\n };\n}\n\nexport async function loadConfig<T>(\n opts: LoadConfigOptions<T>,\n): Promise<LoadConfigResult<T>> {\n const projectInfo = await findProjectDir();\n const needsAliases =\n projectInfo?.type === 'deno' || projectInfo?.type === 'python';\n\n let res;\n if (needsAliases) {\n const alias = getInstantAliases();\n res = await _loadConfig(alias ? withAliases(opts, alias) : opts);\n } else {\n res = await _loadConfig(opts);\n }\n\n // Unconfig seems to add an __esModule property to the config object\n // Removing it.\n if (typeof res.config === 'object' && '__esModule' in res.config!) {\n delete res.config.__esModule;\n }\n return res;\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export declare const loadEnv: () => void;
2
+ //# sourceMappingURL=loadEnv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadEnv.d.ts","sourceRoot":"","sources":["../../src/util/loadEnv.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,YAQnB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import dotenvFlow from 'dotenv-flow';
2
+ export const loadEnv = () => {
3
+ const envIndex = process.argv.indexOf('--env');
4
+ const envFile = envIndex !== -1 ? process.argv[envIndex + 1] : undefined;
5
+ dotenvFlow.config({
6
+ silent: true,
7
+ files: envFile ? [envFile] : undefined,
8
+ });
9
+ };
10
+ //# sourceMappingURL=loadEnv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loadEnv.js","sourceRoot":"","sources":["../../src/util/loadEnv.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,aAAa,CAAC;AAErC,MAAM,CAAC,MAAM,OAAO,GAAG,GAAG,EAAE;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAEzE,UAAU,CAAC,MAAM,CAAC;QAChB,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;KACvC,CAAC,CAAC;AACL,CAAC,CAAC","sourcesContent":["import dotenvFlow from 'dotenv-flow';\n\nexport const loadEnv = () => {\n const envIndex = process.argv.indexOf('--env');\n const envFile = envIndex !== -1 ? process.argv[envIndex + 1] : undefined;\n\n dotenvFlow.config({\n silent: true,\n files: envFile ? [envFile] : undefined,\n });\n};\n"]}
@@ -0,0 +1,10 @@
1
+ declare const MergeSchemaError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
2
+ readonly _tag: "MergeSchemaError";
3
+ } & Readonly<A>;
4
+ export declare class MergeSchemaError extends MergeSchemaError_base<{
5
+ message: string;
6
+ }> {
7
+ }
8
+ export declare function mergeSchema(oldFile: string, newFile: string): string;
9
+ export {};
10
+ //# sourceMappingURL=mergeSchema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeSchema.d.ts","sourceRoot":"","sources":["../../src/util/mergeSchema.ts"],"names":[],"mappings":";;;AAIA,qBAAa,gBAAiB,SAAQ,sBAAqC;IACzE,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;CAAG;AAsML,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAyKpE"}
@@ -0,0 +1,338 @@
1
+ import * as acorn from 'acorn';
2
+ import tsPlugin from 'acorn-typescript';
3
+ import { Data } from 'effect';
4
+ export class MergeSchemaError extends Data.TaggedError('MergeSchemaError') {
5
+ }
6
+ // @ts-ignore
7
+ const node = acorn.Parser.extend(tsPlugin({ dts: false }));
8
+ // --- Import Handling Helpers ---
9
+ function collectImports(ast) {
10
+ const imports = new Map(); // localName -> { source, importedName, type, importKind }
11
+ for (const node of ast.body) {
12
+ if (node.type === 'ImportDeclaration') {
13
+ const source = node.source.value;
14
+ const declImportKind = node.importKind;
15
+ for (const specifier of node.specifiers) {
16
+ let kind = 'value';
17
+ if (declImportKind === 'type' || specifier.importKind === 'type') {
18
+ kind = 'type';
19
+ }
20
+ if (specifier.type === 'ImportSpecifier') {
21
+ imports.set(specifier.local.name, {
22
+ source,
23
+ importedName: specifier.imported.name,
24
+ type: 'named',
25
+ importKind: kind,
26
+ });
27
+ }
28
+ else if (specifier.type === 'ImportDefaultSpecifier') {
29
+ imports.set(specifier.local.name, {
30
+ source,
31
+ type: 'default',
32
+ importKind: kind,
33
+ });
34
+ }
35
+ else if (specifier.type === 'ImportNamespaceSpecifier') {
36
+ imports.set(specifier.local.name, {
37
+ source,
38
+ type: 'namespace',
39
+ importKind: kind,
40
+ });
41
+ }
42
+ }
43
+ }
44
+ }
45
+ return imports;
46
+ }
47
+ function collectExistingImports(ast) {
48
+ const existing = new Map(); // source -> Set<localName>
49
+ for (const node of ast.body) {
50
+ if (node.type === 'ImportDeclaration') {
51
+ const source = node.source.value;
52
+ if (!existing.has(source))
53
+ existing.set(source, new Set());
54
+ for (const specifier of node.specifiers) {
55
+ existing.get(source).add(specifier.local.name);
56
+ }
57
+ }
58
+ }
59
+ return existing;
60
+ }
61
+ function findIdentifiers(node, set = new Set()) {
62
+ if (!node)
63
+ return set;
64
+ // If it's a Type Reference, grab the name
65
+ if (node.type === 'TSTypeReference') {
66
+ if (node.typeName.type === 'Identifier') {
67
+ set.add(node.typeName.name);
68
+ }
69
+ else if (node.typeName.type === 'TSQualifiedName') {
70
+ // For A.B, we need A
71
+ let left = node.typeName.left;
72
+ while (left.type === 'TSQualifiedName') {
73
+ left = left.left;
74
+ }
75
+ if (left.type === 'Identifier') {
76
+ set.add(left.name);
77
+ }
78
+ }
79
+ }
80
+ // Recursive walk
81
+ for (const key in node) {
82
+ if (key === 'loc' || key === 'start' || key === 'end')
83
+ continue;
84
+ if (typeof node[key] === 'object' && node[key] !== null) {
85
+ if (Array.isArray(node[key])) {
86
+ node[key].forEach((child) => findIdentifiers(child, set));
87
+ }
88
+ else {
89
+ findIdentifiers(node[key], set);
90
+ }
91
+ }
92
+ }
93
+ return set;
94
+ }
95
+ // --- Schema Traversal Helpers ---
96
+ function getPropName(prop) {
97
+ if (prop.key.type === 'Identifier')
98
+ return prop.key.name;
99
+ if (prop.key.type === 'Literal')
100
+ return prop.key.value;
101
+ return null;
102
+ }
103
+ function analyzeChain(node) {
104
+ let curr = node;
105
+ let typeParams = null;
106
+ let baseCall = null;
107
+ while (curr.type === 'CallExpression') {
108
+ if (curr.typeParameters) {
109
+ typeParams = curr.typeParameters;
110
+ }
111
+ if (curr.callee.type === 'MemberExpression' &&
112
+ curr.callee.object.type === 'Identifier' &&
113
+ curr.callee.object.name === 'i') {
114
+ baseCall = curr;
115
+ }
116
+ if (curr.callee.type === 'MemberExpression') {
117
+ curr = curr.callee.object;
118
+ }
119
+ else {
120
+ break;
121
+ }
122
+ }
123
+ return { typeParams, baseCall };
124
+ }
125
+ function traverseSchema(node, path, callback) {
126
+ if (node.type === 'ObjectExpression') {
127
+ for (const prop of node.properties) {
128
+ const name = getPropName(prop);
129
+ if (!name)
130
+ continue;
131
+ const newPath = path ? `${path}.${name}` : name;
132
+ if (prop.value.type === 'ObjectExpression') {
133
+ traverseSchema(prop.value, newPath, callback);
134
+ }
135
+ else if (prop.value.type === 'CallExpression') {
136
+ let isEntity = false;
137
+ if (prop.value.callee.type === 'MemberExpression' &&
138
+ prop.value.callee.property.name === 'entity' &&
139
+ prop.value.callee.object.type === 'Identifier' &&
140
+ prop.value.callee.object.name === 'i') {
141
+ isEntity = true;
142
+ }
143
+ if (isEntity) {
144
+ callback(prop.value, newPath);
145
+ if (prop.value.arguments.length > 0) {
146
+ traverseSchema(prop.value.arguments[0], newPath, callback);
147
+ }
148
+ }
149
+ else {
150
+ callback(prop.value, newPath);
151
+ }
152
+ }
153
+ }
154
+ }
155
+ }
156
+ function findSchemaObject(ast) {
157
+ let schemaObj = null;
158
+ function walk(node) {
159
+ if (!node)
160
+ return;
161
+ if (schemaObj)
162
+ return;
163
+ if (node.type === 'CallExpression' &&
164
+ node.callee.type === 'MemberExpression' &&
165
+ node.callee.object.name === 'i' &&
166
+ node.callee.property.name === 'schema' &&
167
+ node.arguments.length > 0) {
168
+ schemaObj = node.arguments[0];
169
+ return;
170
+ }
171
+ for (const key in node) {
172
+ if (key === 'loc' || key === 'start' || key === 'end')
173
+ continue;
174
+ if (node[key] && typeof node[key] === 'object') {
175
+ if (Array.isArray(node[key])) {
176
+ node[key].forEach(walk);
177
+ }
178
+ else {
179
+ walk(node[key]);
180
+ }
181
+ }
182
+ }
183
+ }
184
+ walk(ast);
185
+ return schemaObj;
186
+ }
187
+ export function mergeSchema(oldFile, newFile) {
188
+ const oldParsed = node.parse(oldFile, {
189
+ sourceType: 'module',
190
+ ecmaVersion: 'latest',
191
+ locations: true,
192
+ });
193
+ const newParsed = node.parse(newFile, {
194
+ sourceType: 'module',
195
+ ecmaVersion: 'latest',
196
+ locations: true,
197
+ });
198
+ const schemaMap = new Map(); // Path -> { src, ast }
199
+ // 1. Extract from old file
200
+ const oldSchemaObj = findSchemaObject(oldParsed);
201
+ if (oldSchemaObj) {
202
+ traverseSchema(oldSchemaObj, '', (node, path) => {
203
+ const { typeParams } = analyzeChain(node);
204
+ if (typeParams) {
205
+ const src = oldFile.slice(typeParams.start, typeParams.end);
206
+ schemaMap.set(path, { src, ast: typeParams });
207
+ }
208
+ });
209
+ }
210
+ // 2. Collect Imports
211
+ const oldImports = collectImports(oldParsed);
212
+ const newExistingImports = collectExistingImports(newParsed);
213
+ const neededIdentifiers = new Set();
214
+ // 3. Apply to new file & Collect needed identifiers
215
+ const edits = [];
216
+ const newSchemaObj = findSchemaObject(newParsed);
217
+ if (newSchemaObj) {
218
+ traverseSchema(newSchemaObj, '', (node, path) => {
219
+ const { typeParams, baseCall } = analyzeChain(node);
220
+ const stored = schemaMap.get(path);
221
+ if (stored) {
222
+ // Collect identifiers from the type params we are about to inject
223
+ findIdentifiers(stored.ast, neededIdentifiers);
224
+ if (typeParams) {
225
+ edits.push({
226
+ start: typeParams.start,
227
+ end: typeParams.end,
228
+ text: stored.src,
229
+ });
230
+ }
231
+ else if (baseCall) {
232
+ edits.push({
233
+ start: baseCall.callee.end,
234
+ end: baseCall.callee.end,
235
+ text: stored.src,
236
+ });
237
+ }
238
+ }
239
+ });
240
+ }
241
+ // 4. Generate Import Statements
242
+ const importsToAdd = new Map(); // source -> { named: Map<string, {str, isType}>, default: {str, isType}, namespace: {str, isType} }
243
+ for (const id of neededIdentifiers) {
244
+ const importInfo = oldImports.get(id);
245
+ if (importInfo) {
246
+ // Check if already imported in new file
247
+ const existing = newExistingImports.get(importInfo.source);
248
+ if (existing && existing.has(id)) {
249
+ continue; // Already imported
250
+ }
251
+ if (!importsToAdd.has(importInfo.source)) {
252
+ importsToAdd.set(importInfo.source, {
253
+ named: new Map(),
254
+ default: null,
255
+ namespace: null,
256
+ });
257
+ }
258
+ const group = importsToAdd.get(importInfo.source);
259
+ const isType = importInfo.importKind === 'type';
260
+ if (importInfo.type === 'named') {
261
+ let importStr = id;
262
+ if (importInfo.importedName !== id) {
263
+ importStr = `${importInfo.importedName} as ${id}`;
264
+ }
265
+ group.named.set(importStr, { str: importStr, isType });
266
+ }
267
+ else if (importInfo.type === 'default') {
268
+ group.default = { str: id, isType };
269
+ }
270
+ else if (importInfo.type === 'namespace') {
271
+ group.namespace = { str: id, isType };
272
+ }
273
+ }
274
+ }
275
+ const importBlocks = [];
276
+ for (const [source, info] of importsToAdd) {
277
+ // Check if source exists in new file to merge?
278
+ // For simplicity, we append new import lines.
279
+ // But we can try to be smart.
280
+ // If we have named imports
281
+ if (info.named.size > 0) {
282
+ const namedImports = Array.from(info.named.values());
283
+ const allTypes = namedImports.every((x) => x.isType);
284
+ if (allTypes) {
285
+ const names = namedImports.map((x) => x.str).join(', ');
286
+ importBlocks.push(`import type { ${names} } from '${source}';`);
287
+ }
288
+ else {
289
+ const names = namedImports
290
+ .map((x) => (x.isType ? `type ${x.str}` : x.str))
291
+ .join(', ');
292
+ importBlocks.push(`import { ${names} } from '${source}';`);
293
+ }
294
+ }
295
+ if (info.default) {
296
+ if (info.default.isType) {
297
+ importBlocks.push(`import type ${info.default.str} from '${source}';`);
298
+ }
299
+ else {
300
+ importBlocks.push(`import ${info.default.str} from '${source}';`);
301
+ }
302
+ }
303
+ if (info.namespace) {
304
+ if (info.namespace.isType) {
305
+ importBlocks.push(`import type * as ${info.namespace.str} from '${source}';`);
306
+ }
307
+ else {
308
+ importBlocks.push(`import * as ${info.namespace.str} from '${source}';`);
309
+ }
310
+ }
311
+ }
312
+ // 5. Apply edits
313
+ edits.sort((a, b) => b.start - a.start);
314
+ let output = newFile;
315
+ for (const edit of edits) {
316
+ output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);
317
+ }
318
+ // Prepend imports
319
+ if (importBlocks.length > 0) {
320
+ // Check for leading comments (e.g. // Docs: ...)
321
+ // We want to insert imports AFTER the leading comments but BEFORE the first code/import
322
+ // Simple heuristic: match consecutive lines at start that begin with //
323
+ const commentMatch = output.match(/^(\s*\/\/.*(\r?\n|$))+/);
324
+ if (commentMatch) {
325
+ const commentEnd = commentMatch[0].length;
326
+ output =
327
+ output.slice(0, commentEnd) +
328
+ '\n' +
329
+ importBlocks.join('\n') +
330
+ output.slice(commentEnd);
331
+ }
332
+ else {
333
+ output = importBlocks.join('\n') + '\n' + output;
334
+ }
335
+ }
336
+ return output;
337
+ }
338
+ //# sourceMappingURL=mergeSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeSchema.js","sourceRoot":"","sources":["../../src/util/mergeSchema.ts"],"names":[],"mappings":"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","sourcesContent":["import * as acorn from 'acorn';\nimport tsPlugin from 'acorn-typescript';\nimport { Data } from 'effect';\n\nexport class MergeSchemaError extends Data.TaggedError('MergeSchemaError')<{\n message: string;\n}> {}\n\n// @ts-ignore\nconst node = acorn.Parser.extend(tsPlugin({ dts: false }));\n\n// --- Import Handling Helpers ---\n\nfunction collectImports(ast: any) {\n const imports = new Map(); // localName -> { source, importedName, type, importKind }\n\n for (const node of ast.body) {\n if (node.type === 'ImportDeclaration') {\n const source = node.source.value;\n const declImportKind = node.importKind;\n\n for (const specifier of node.specifiers) {\n let kind = 'value';\n if (declImportKind === 'type' || specifier.importKind === 'type') {\n kind = 'type';\n }\n\n if (specifier.type === 'ImportSpecifier') {\n imports.set(specifier.local.name, {\n source,\n importedName: specifier.imported.name,\n type: 'named',\n importKind: kind,\n });\n } else if (specifier.type === 'ImportDefaultSpecifier') {\n imports.set(specifier.local.name, {\n source,\n type: 'default',\n importKind: kind,\n });\n } else if (specifier.type === 'ImportNamespaceSpecifier') {\n imports.set(specifier.local.name, {\n source,\n type: 'namespace',\n importKind: kind,\n });\n }\n }\n }\n }\n return imports;\n}\n\nfunction collectExistingImports(ast: any) {\n const existing = new Map(); // source -> Set<localName>\n\n for (const node of ast.body) {\n if (node.type === 'ImportDeclaration') {\n const source = node.source.value;\n if (!existing.has(source)) existing.set(source, new Set());\n\n for (const specifier of node.specifiers) {\n existing.get(source).add(specifier.local.name);\n }\n }\n }\n return existing;\n}\n\nfunction findIdentifiers(node: any, set: Set<string> = new Set<string>()) {\n if (!node) return set;\n\n // If it's a Type Reference, grab the name\n if (node.type === 'TSTypeReference') {\n if (node.typeName.type === 'Identifier') {\n set.add(node.typeName.name);\n } else if (node.typeName.type === 'TSQualifiedName') {\n // For A.B, we need A\n let left = node.typeName.left;\n while (left.type === 'TSQualifiedName') {\n left = left.left;\n }\n if (left.type === 'Identifier') {\n set.add(left.name);\n }\n }\n }\n\n // Recursive walk\n for (const key in node) {\n if (key === 'loc' || key === 'start' || key === 'end') continue;\n if (typeof node[key] === 'object' && node[key] !== null) {\n if (Array.isArray(node[key])) {\n node[key].forEach((child) => findIdentifiers(child, set));\n } else {\n findIdentifiers(node[key], set);\n }\n }\n }\n return set;\n}\n\n// --- Schema Traversal Helpers ---\n\nfunction getPropName(prop: any) {\n if (prop.key.type === 'Identifier') return prop.key.name;\n if (prop.key.type === 'Literal') return prop.key.value;\n return null;\n}\n\nfunction analyzeChain(node: any): { typeParams: any; baseCall: any } {\n let curr = node;\n let typeParams = null;\n let baseCall = null;\n\n while (curr.type === 'CallExpression') {\n if (curr.typeParameters) {\n typeParams = curr.typeParameters;\n }\n\n if (\n curr.callee.type === 'MemberExpression' &&\n curr.callee.object.type === 'Identifier' &&\n curr.callee.object.name === 'i'\n ) {\n baseCall = curr;\n }\n\n if (curr.callee.type === 'MemberExpression') {\n curr = curr.callee.object;\n } else {\n break;\n }\n }\n return { typeParams, baseCall };\n}\n\nfunction traverseSchema(\n node: any,\n path: string,\n callback: (node: any, path: string) => void,\n) {\n if (node.type === 'ObjectExpression') {\n for (const prop of node.properties) {\n const name = getPropName(prop);\n if (!name) continue;\n const newPath = path ? `${path}.${name}` : name;\n\n if (prop.value.type === 'ObjectExpression') {\n traverseSchema(prop.value, newPath, callback);\n } else if (prop.value.type === 'CallExpression') {\n let isEntity = false;\n if (\n prop.value.callee.type === 'MemberExpression' &&\n prop.value.callee.property.name === 'entity' &&\n prop.value.callee.object.type === 'Identifier' &&\n prop.value.callee.object.name === 'i'\n ) {\n isEntity = true;\n }\n\n if (isEntity) {\n callback(prop.value, newPath);\n if (prop.value.arguments.length > 0) {\n traverseSchema(prop.value.arguments[0], newPath, callback);\n }\n } else {\n callback(prop.value, newPath);\n }\n }\n }\n }\n}\n\nfunction findSchemaObject(ast: any) {\n let schemaObj: any = null;\n function walk(node: any) {\n if (!node) return;\n if (schemaObj) return;\n if (\n node.type === 'CallExpression' &&\n node.callee.type === 'MemberExpression' &&\n node.callee.object.name === 'i' &&\n node.callee.property.name === 'schema' &&\n node.arguments.length > 0\n ) {\n schemaObj = node.arguments[0];\n return;\n }\n for (const key in node) {\n if (key === 'loc' || key === 'start' || key === 'end') continue;\n if (node[key] && typeof node[key] === 'object') {\n if (Array.isArray(node[key])) {\n node[key].forEach(walk);\n } else {\n walk(node[key]);\n }\n }\n }\n }\n walk(ast);\n return schemaObj;\n}\n\nexport function mergeSchema(oldFile: string, newFile: string): string {\n const oldParsed = node.parse(oldFile, {\n sourceType: 'module',\n ecmaVersion: 'latest',\n locations: true,\n });\n\n const newParsed = node.parse(newFile, {\n sourceType: 'module',\n ecmaVersion: 'latest',\n locations: true,\n });\n\n const schemaMap = new Map(); // Path -> { src, ast }\n\n // 1. Extract from old file\n const oldSchemaObj = findSchemaObject(oldParsed);\n if (oldSchemaObj) {\n traverseSchema(oldSchemaObj, '', (node: any, path: string) => {\n const { typeParams } = analyzeChain(node);\n if (typeParams) {\n const src = oldFile.slice(typeParams.start, typeParams.end);\n schemaMap.set(path, { src, ast: typeParams });\n }\n });\n }\n\n // 2. Collect Imports\n const oldImports = collectImports(oldParsed);\n const newExistingImports = collectExistingImports(newParsed);\n const neededIdentifiers = new Set<string>();\n\n // 3. Apply to new file & Collect needed identifiers\n const edits: any[] = [];\n const newSchemaObj = findSchemaObject(newParsed);\n\n if (newSchemaObj) {\n traverseSchema(newSchemaObj, '', (node: any, path: string) => {\n const { typeParams, baseCall } = analyzeChain(node);\n const stored = schemaMap.get(path);\n\n if (stored) {\n // Collect identifiers from the type params we are about to inject\n findIdentifiers(stored.ast, neededIdentifiers);\n\n if (typeParams) {\n edits.push({\n start: typeParams.start,\n end: typeParams.end,\n text: stored.src,\n });\n } else if (baseCall) {\n edits.push({\n start: baseCall.callee.end,\n end: baseCall.callee.end,\n text: stored.src,\n });\n }\n }\n });\n }\n\n // 4. Generate Import Statements\n const importsToAdd = new Map(); // source -> { named: Map<string, {str, isType}>, default: {str, isType}, namespace: {str, isType} }\n\n for (const id of neededIdentifiers) {\n const importInfo = oldImports.get(id);\n if (importInfo) {\n // Check if already imported in new file\n const existing = newExistingImports.get(importInfo.source);\n if (existing && existing.has(id)) {\n continue; // Already imported\n }\n\n if (!importsToAdd.has(importInfo.source)) {\n importsToAdd.set(importInfo.source, {\n named: new Map(),\n default: null,\n namespace: null,\n });\n }\n const group = importsToAdd.get(importInfo.source);\n const isType = importInfo.importKind === 'type';\n\n if (importInfo.type === 'named') {\n let importStr = id;\n if (importInfo.importedName !== id) {\n importStr = `${importInfo.importedName} as ${id}`;\n }\n group.named.set(importStr, { str: importStr, isType });\n } else if (importInfo.type === 'default') {\n group.default = { str: id, isType };\n } else if (importInfo.type === 'namespace') {\n group.namespace = { str: id, isType };\n }\n }\n }\n\n const importBlocks: string[] = [];\n\n for (const [source, info] of importsToAdd) {\n // Check if source exists in new file to merge?\n // For simplicity, we append new import lines.\n // But we can try to be smart.\n\n // If we have named imports\n if (info.named.size > 0) {\n const namedImports: any[] = Array.from(info.named.values());\n const allTypes = namedImports.every((x) => x.isType);\n\n if (allTypes) {\n const names = namedImports.map((x) => x.str).join(', ');\n importBlocks.push(`import type { ${names} } from '${source}';`);\n } else {\n const names = namedImports\n .map((x) => (x.isType ? `type ${x.str}` : x.str))\n .join(', ');\n importBlocks.push(`import { ${names} } from '${source}';`);\n }\n }\n if (info.default) {\n if (info.default.isType) {\n importBlocks.push(`import type ${info.default.str} from '${source}';`);\n } else {\n importBlocks.push(`import ${info.default.str} from '${source}';`);\n }\n }\n if (info.namespace) {\n if (info.namespace.isType) {\n importBlocks.push(\n `import type * as ${info.namespace.str} from '${source}';`,\n );\n } else {\n importBlocks.push(\n `import * as ${info.namespace.str} from '${source}';`,\n );\n }\n }\n }\n\n // 5. Apply edits\n edits.sort((a, b) => b.start - a.start);\n\n let output = newFile;\n for (const edit of edits) {\n output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);\n }\n\n // Prepend imports\n if (importBlocks.length > 0) {\n // Check for leading comments (e.g. // Docs: ...)\n // We want to insert imports AFTER the leading comments but BEFORE the first code/import\n\n // Simple heuristic: match consecutive lines at start that begin with //\n const commentMatch = output.match(/^(\\s*\\/\\/.*(\\r?\\n|$))+/);\n\n if (commentMatch) {\n const commentEnd = commentMatch[0].length;\n output =\n output.slice(0, commentEnd) +\n '\\n' +\n importBlocks.join('\\n') +\n output.slice(commentEnd);\n } else {\n output = importBlocks.join('\\n') + '\\n' + output;\n }\n }\n\n return output;\n}\n"]}