@geekmidas/cli 9.0.2 → 10.0.0-alpha.0

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 (390) hide show
  1. package/README.md +71 -120
  2. package/dist/{CachedStateProvider-BdX7klRc.cjs → CachedStateProvider-BLo7zv7S.cjs} +1 -1
  3. package/dist/CachedStateProvider-BxoAm-B2.mjs +3 -0
  4. package/dist/{CachedStateProvider-klLWZXWF.cjs → CachedStateProvider-CqPdW7CB.cjs} +1 -1
  5. package/dist/{CachedStateProvider-klLWZXWF.cjs.map → CachedStateProvider-CqPdW7CB.cjs.map} +1 -1
  6. package/dist/{CachedStateProvider-CzyFct42.mjs → CachedStateProvider-DTniehMP.mjs} +1 -1
  7. package/dist/{CachedStateProvider-CzyFct42.mjs.map → CachedStateProvider-DTniehMP.mjs.map} +1 -1
  8. package/dist/{HostingerProvider-B2ZYz7Yc.mjs → HostingerProvider-Cft7lEYr.mjs} +4 -3
  9. package/dist/HostingerProvider-Cft7lEYr.mjs.map +1 -0
  10. package/dist/{HostingerProvider-CrHfsgz9.cjs → HostingerProvider-h3EbEp-Z.cjs} +4 -3
  11. package/dist/HostingerProvider-h3EbEp-Z.cjs.map +1 -0
  12. package/dist/{LocalStateProvider-CP49rjzt.mjs → LocalStateProvider-Bn6tS-oL.mjs} +1 -1
  13. package/dist/{LocalStateProvider-CP49rjzt.mjs.map → LocalStateProvider-Bn6tS-oL.mjs.map} +1 -1
  14. package/dist/{LocalStateProvider-CalzNfNA.cjs → LocalStateProvider-Db9SEjyH.cjs} +1 -1
  15. package/dist/{LocalStateProvider-CalzNfNA.cjs.map → LocalStateProvider-Db9SEjyH.cjs.map} +1 -1
  16. package/dist/{Route53Provider-tlgBzrRQ.mjs → Route53Provider-RdpUDJQk.mjs} +1 -1
  17. package/dist/{Route53Provider-tlgBzrRQ.mjs.map → Route53Provider-RdpUDJQk.mjs.map} +1 -1
  18. package/dist/{Route53Provider-DwgXiLxt.cjs → Route53Provider-di2fMM5N.cjs} +1 -1
  19. package/dist/{Route53Provider-DwgXiLxt.cjs.map → Route53Provider-di2fMM5N.cjs.map} +1 -1
  20. package/dist/{SSMStateProvider-BlrTiV5m.mjs → SSMStateProvider-BRt2py-A.mjs} +1 -1
  21. package/dist/{SSMStateProvider-BlrTiV5m.mjs.map → SSMStateProvider-BRt2py-A.mjs.map} +1 -1
  22. package/dist/{SSMStateProvider-Bt6r8CTL.cjs → SSMStateProvider-DyX8s9HI.cjs} +1 -1
  23. package/dist/{SSMStateProvider-Bt6r8CTL.cjs.map → SSMStateProvider-DyX8s9HI.cjs.map} +1 -1
  24. package/dist/{backup-provisioner-Xunq-p_8.mjs → backup-provisioner-Bgj5Vi_L.mjs} +2 -2
  25. package/dist/{backup-provisioner-Xunq-p_8.mjs.map → backup-provisioner-Bgj5Vi_L.mjs.map} +1 -1
  26. package/dist/{backup-provisioner-B3HBN-2k.cjs → backup-provisioner-BrsHwYG0.cjs} +2 -2
  27. package/dist/{backup-provisioner-B3HBN-2k.cjs.map → backup-provisioner-BrsHwYG0.cjs.map} +1 -1
  28. package/dist/{bundler-Dufq3uvI.cjs → bundler-BY1OmV1e.cjs} +44 -14
  29. package/dist/bundler-BY1OmV1e.cjs.map +1 -0
  30. package/dist/{bundler-DkA4qzUD.mjs → bundler-Be8Zg4Wd.mjs} +45 -15
  31. package/dist/bundler-Be8Zg4Wd.mjs.map +1 -0
  32. package/dist/config-D8o6I_7Z.mjs +469 -0
  33. package/dist/config-D8o6I_7Z.mjs.map +1 -0
  34. package/dist/config-DbPE1KXF.cjs +535 -0
  35. package/dist/config-DbPE1KXF.cjs.map +1 -0
  36. package/dist/config.cjs +3 -2
  37. package/dist/config.d.cts +2 -2
  38. package/dist/config.d.cts.map +1 -1
  39. package/dist/config.d.mts +2 -2
  40. package/dist/config.d.mts.map +1 -1
  41. package/dist/config.mjs +3 -2
  42. package/dist/{credentials-s1kLcIzK.mjs → credentials-B5zRHdAl.mjs} +21 -6
  43. package/dist/credentials-B5zRHdAl.mjs.map +1 -0
  44. package/dist/{credentials-C8DWtnMY.cjs → credentials-BapzjyV5.cjs} +26 -5
  45. package/dist/credentials-BapzjyV5.cjs.map +1 -0
  46. package/dist/credentials-Dh0Q6HzY.mjs +2548 -0
  47. package/dist/credentials-Dh0Q6HzY.mjs.map +1 -0
  48. package/dist/credentials-K961ThG3.cjs +2680 -0
  49. package/dist/credentials-K961ThG3.cjs.map +1 -0
  50. package/dist/deploy/sniffer-routes-worker.cjs +6 -2
  51. package/dist/deploy/sniffer-routes-worker.cjs.map +1 -1
  52. package/dist/deploy/sniffer-routes-worker.mjs +6 -2
  53. package/dist/deploy/sniffer-routes-worker.mjs.map +1 -1
  54. package/dist/discover-CAlFgYec.mjs +229 -0
  55. package/dist/discover-CAlFgYec.mjs.map +1 -0
  56. package/dist/discover-DTmFeloL.cjs +271 -0
  57. package/dist/discover-DTmFeloL.cjs.map +1 -0
  58. package/dist/dokploy-api-BS2xnJLZ.mjs +3 -0
  59. package/dist/{dokploy-api-CqOIKHme.cjs → dokploy-api-BsVH0y_s.cjs} +141 -32
  60. package/dist/dokploy-api-BsVH0y_s.cjs.map +1 -0
  61. package/dist/dokploy-api-BuxDRo3l.cjs +3 -0
  62. package/dist/{dokploy-api-sfZFlWuE.mjs → dokploy-api-aTFPz7_4.mjs} +141 -32
  63. package/dist/dokploy-api-aTFPz7_4.mjs.map +1 -0
  64. package/dist/emit-CbcRolsa.cjs +236 -0
  65. package/dist/emit-CbcRolsa.cjs.map +1 -0
  66. package/dist/emit-CiZS_5Ub.mjs +206 -0
  67. package/dist/emit-CiZS_5Ub.mjs.map +1 -0
  68. package/dist/{encryption-MfXAiFTm.cjs → encryption-C6jaU0hE.cjs} +1 -1
  69. package/dist/{encryption-MfXAiFTm.cjs.map → encryption-C6jaU0hE.cjs.map} +1 -1
  70. package/dist/{encryption-BVS7Vmzs.cjs → encryption-CHzzeR8a.cjs} +1 -1
  71. package/dist/encryption-CQUncu7v.mjs +3 -0
  72. package/dist/{encryption-CO5Q4Bhf.mjs → encryption-D-abyhZx.mjs} +1 -1
  73. package/dist/{encryption-CO5Q4Bhf.mjs.map → encryption-D-abyhZx.mjs.map} +1 -1
  74. package/dist/fullstack-secrets-C-GGohke.cjs +111 -0
  75. package/dist/fullstack-secrets-C-GGohke.cjs.map +1 -0
  76. package/dist/fullstack-secrets-D1o9-G5l.mjs +87 -0
  77. package/dist/fullstack-secrets-D1o9-G5l.mjs.map +1 -0
  78. package/dist/{fullstack-secrets-BYzi6Hwl.cjs → generator-CNzBw7g5.cjs} +1 -114
  79. package/dist/generator-CNzBw7g5.cjs.map +1 -0
  80. package/dist/{fullstack-secrets-l8s3II_H.mjs → generator-VE2JrFlY.mjs} +2 -85
  81. package/dist/generator-VE2JrFlY.mjs.map +1 -0
  82. package/dist/index-BThUzEIp.d.mts +175 -0
  83. package/dist/index-BThUzEIp.d.mts.map +1 -0
  84. package/dist/index-CHB4tSzX.d.cts +175 -0
  85. package/dist/index-CHB4tSzX.d.cts.map +1 -0
  86. package/dist/index.cjs +2329 -1584
  87. package/dist/index.cjs.map +1 -1
  88. package/dist/index.mjs +2306 -1561
  89. package/dist/index.mjs.map +1 -1
  90. package/dist/{openapi-Cfwi0fqF.mjs → openapi-CgpMWMmM.mjs} +174 -95
  91. package/dist/openapi-CgpMWMmM.mjs.map +1 -0
  92. package/dist/{openapi-BzNOC7_i.cjs → openapi-CljONd_M.cjs} +175 -108
  93. package/dist/openapi-CljONd_M.cjs.map +1 -0
  94. package/dist/{openapi-react-query-C4iIvpPf.mjs → openapi-react-query-Byltvm_7.mjs} +2 -2
  95. package/dist/openapi-react-query-Byltvm_7.mjs.map +1 -0
  96. package/dist/{openapi-react-query-CYWik72n.cjs → openapi-react-query-CmJ1xDbn.cjs} +2 -2
  97. package/dist/openapi-react-query-CmJ1xDbn.cjs.map +1 -0
  98. package/dist/openapi-react-query.cjs +1 -1
  99. package/dist/openapi-react-query.mjs +1 -1
  100. package/dist/openapi.cjs +4 -3
  101. package/dist/openapi.d.cts +1 -1
  102. package/dist/openapi.d.mts +1 -1
  103. package/dist/openapi.mjs +4 -3
  104. package/dist/reconcile/public.cjs +9 -0
  105. package/dist/reconcile/public.d.cts +125 -0
  106. package/dist/reconcile/public.d.cts.map +1 -0
  107. package/dist/reconcile/public.d.mts +125 -0
  108. package/dist/reconcile/public.d.mts.map +1 -0
  109. package/dist/reconcile/public.mjs +4 -0
  110. package/dist/{reconcile-B2FoJE0a.mjs → reconcile-CFs8C_1a.mjs} +5 -4
  111. package/dist/reconcile-CFs8C_1a.mjs.map +1 -0
  112. package/dist/{reconcile-BzqKJ2Rt.cjs → reconcile-D0pimNiy.cjs} +5 -4
  113. package/dist/reconcile-D0pimNiy.cjs.map +1 -0
  114. package/dist/setup-CJiQM2pX.cjs +473 -0
  115. package/dist/setup-CJiQM2pX.cjs.map +1 -0
  116. package/dist/setup-DMtU3p41.cjs +11 -0
  117. package/dist/setup-DOsYueeQ.mjs +443 -0
  118. package/dist/setup-DOsYueeQ.mjs.map +1 -0
  119. package/dist/setup-DSutDAlt.mjs +11 -0
  120. package/dist/{storage-B1wvztiJ.cjs → storage-BJmzYxt8.cjs} +1 -1
  121. package/dist/{storage-B1wvztiJ.cjs.map → storage-BJmzYxt8.cjs.map} +1 -1
  122. package/dist/{storage-DOEtT2Hr.cjs → storage-BM9hGpgv.cjs} +1 -1
  123. package/dist/{storage-dbb9RyBl.mjs → storage-Bi24WfoW.mjs} +1 -1
  124. package/dist/{storage-dbb9RyBl.mjs.map → storage-Bi24WfoW.mjs.map} +1 -1
  125. package/dist/{storage-Cs4WBsc4.mjs → storage-CYlGwWTj.mjs} +1 -1
  126. package/dist/{sync-CSooqRQ8.mjs → sync-CmEuNZsB.mjs} +2 -2
  127. package/dist/{sync-CSooqRQ8.mjs.map → sync-CmEuNZsB.mjs.map} +1 -1
  128. package/dist/sync-D306yOWu.cjs +4 -0
  129. package/dist/{sync-o_CtEbvR.cjs → sync-SizaChmC.cjs} +2 -2
  130. package/dist/{sync-o_CtEbvR.cjs.map → sync-SizaChmC.cjs.map} +1 -1
  131. package/dist/{sync-B5UHXwRM.mjs → sync-hOqAWHR6.mjs} +1 -1
  132. package/dist/{index-Bw548Bta.d.mts → types-C-arnQ1r.d.mts} +590 -143
  133. package/dist/types-C-arnQ1r.d.mts.map +1 -0
  134. package/dist/{index-DTpkeFb8.d.cts → types-abJQuk7m.d.cts} +590 -143
  135. package/dist/types-abJQuk7m.d.cts.map +1 -0
  136. package/dist/workspace/index.cjs +5 -1
  137. package/dist/workspace/index.d.cts +3 -3
  138. package/dist/workspace/index.d.mts +3 -3
  139. package/dist/workspace/index.mjs +2 -2
  140. package/dist/{workspace-D-37Ylqo.mjs → workspace-7FqprxuJ.mjs} +117 -30
  141. package/dist/workspace-7FqprxuJ.mjs.map +1 -0
  142. package/dist/workspace-8acupeaI.cjs +9 -0
  143. package/dist/{workspace-CQTT7HJQ.cjs → workspace-XvqO9jIv.cjs} +139 -28
  144. package/dist/workspace-XvqO9jIv.cjs.map +1 -0
  145. package/dist/workspace-yP5AHnrn.mjs +8 -0
  146. package/package.json +26 -9
  147. package/CHANGELOG.md +0 -650
  148. package/FUNCTION_CRON_SUPPORT.md +0 -266
  149. package/dist/CachedStateProvider-GcGziXh1.mjs +0 -3
  150. package/dist/HostingerProvider-B2ZYz7Yc.mjs.map +0 -1
  151. package/dist/HostingerProvider-CrHfsgz9.cjs.map +0 -1
  152. package/dist/bundler-DkA4qzUD.mjs.map +0 -1
  153. package/dist/bundler-Dufq3uvI.cjs.map +0 -1
  154. package/dist/config-Bbu1JKvf.mjs +0 -211
  155. package/dist/config-Bbu1JKvf.mjs.map +0 -1
  156. package/dist/config-DujV8DbR.cjs +0 -253
  157. package/dist/config-DujV8DbR.cjs.map +0 -1
  158. package/dist/credentials-C8DWtnMY.cjs.map +0 -1
  159. package/dist/credentials-s1kLcIzK.mjs.map +0 -1
  160. package/dist/dokploy-api-BPYkG-ZZ.cjs +0 -3
  161. package/dist/dokploy-api-BiSzWM4v.mjs +0 -3
  162. package/dist/dokploy-api-CqOIKHme.cjs.map +0 -1
  163. package/dist/dokploy-api-sfZFlWuE.mjs.map +0 -1
  164. package/dist/encryption-Bd_m4q3g.mjs +0 -3
  165. package/dist/fullstack-secrets-BYzi6Hwl.cjs.map +0 -1
  166. package/dist/fullstack-secrets-l8s3II_H.mjs.map +0 -1
  167. package/dist/index-Bw548Bta.d.mts.map +0 -1
  168. package/dist/index-DTpkeFb8.d.cts.map +0 -1
  169. package/dist/openapi-BzNOC7_i.cjs.map +0 -1
  170. package/dist/openapi-Cfwi0fqF.mjs.map +0 -1
  171. package/dist/openapi-react-query-C4iIvpPf.mjs.map +0 -1
  172. package/dist/openapi-react-query-CYWik72n.cjs.map +0 -1
  173. package/dist/reconcile-B2FoJE0a.mjs.map +0 -1
  174. package/dist/reconcile-BzqKJ2Rt.cjs.map +0 -1
  175. package/dist/setup-DDXUXzzl.mjs +0 -765
  176. package/dist/setup-DDXUXzzl.mjs.map +0 -1
  177. package/dist/setup-DLwhfyt-.cjs +0 -8
  178. package/dist/setup-Dh-B7YTX.mjs +0 -8
  179. package/dist/setup-WZ-xqAQO.cjs +0 -849
  180. package/dist/setup-WZ-xqAQO.cjs.map +0 -1
  181. package/dist/sync-BLA94rgC.cjs +0 -4
  182. package/dist/types-B3GQUg3k.d.mts +0 -280
  183. package/dist/types-B3GQUg3k.d.mts.map +0 -1
  184. package/dist/types-BWQDiooe.d.cts +0 -280
  185. package/dist/types-BWQDiooe.d.cts.map +0 -1
  186. package/dist/workspace-CQTT7HJQ.cjs.map +0 -1
  187. package/dist/workspace-D-37Ylqo.mjs.map +0 -1
  188. package/docs/OPENAPI_TYPESCRIPT_DESIGN.md +0 -408
  189. package/docs/dev-server-resilience-design.md +0 -189
  190. package/docs/manifest-refactor-design.md +0 -287
  191. package/examples/cron-example.ts +0 -45
  192. package/examples/env.ts +0 -33
  193. package/examples/function-example.ts +0 -40
  194. package/examples/gkm.config.json +0 -22
  195. package/examples/gkm.config.ts +0 -14
  196. package/examples/gkm.minimal.config.json +0 -7
  197. package/examples/gkm.production.config.json +0 -27
  198. package/examples/logger.ts +0 -10
  199. package/scripts/sync-versions.ts +0 -108
  200. package/src/__tests__/EndpointGenerator.hooks.spec.ts +0 -204
  201. package/src/__tests__/config.spec.ts +0 -422
  202. package/src/__tests__/loadEnvFiles.spec.ts +0 -131
  203. package/src/__tests__/normalizeHooksConfig.spec.ts +0 -63
  204. package/src/__tests__/openapi-react-query.spec.ts +0 -506
  205. package/src/__tests__/openapi.spec.ts +0 -625
  206. package/src/__tests__/test-helpers.ts +0 -181
  207. package/src/auth/__tests__/credentials.spec.ts +0 -331
  208. package/src/auth/__tests__/index.spec.ts +0 -237
  209. package/src/auth/credentials.ts +0 -286
  210. package/src/auth/index.ts +0 -233
  211. package/src/build/__tests__/bundler.spec.ts +0 -446
  212. package/src/build/__tests__/endpoint-analyzer.spec.ts +0 -623
  213. package/src/build/__tests__/handler-templates.spec.ts +0 -1287
  214. package/src/build/__tests__/index-new.spec.ts +0 -550
  215. package/src/build/__tests__/manifests.spec.ts +0 -583
  216. package/src/build/__tests__/partitions.spec.ts +0 -110
  217. package/src/build/__tests__/workspace-build.spec.ts +0 -215
  218. package/src/build/bundler.ts +0 -256
  219. package/src/build/endpoint-analyzer.ts +0 -236
  220. package/src/build/handler-templates.ts +0 -1253
  221. package/src/build/index.ts +0 -616
  222. package/src/build/manifests.ts +0 -285
  223. package/src/build/partitions.ts +0 -58
  224. package/src/build/providerResolver.ts +0 -184
  225. package/src/build/types.ts +0 -104
  226. package/src/config.ts +0 -330
  227. package/src/credentials/__tests__/fullDockerPorts.spec.ts +0 -144
  228. package/src/credentials/__tests__/helpers.ts +0 -112
  229. package/src/credentials/__tests__/prepareEntryCredentials.spec.ts +0 -125
  230. package/src/credentials/__tests__/readonlyDockerPorts.spec.ts +0 -190
  231. package/src/credentials/__tests__/workspaceCredentials.spec.ts +0 -209
  232. package/src/credentials/index.ts +0 -843
  233. package/src/debug.ts +0 -68
  234. package/src/deploy/CachedStateProvider.ts +0 -86
  235. package/src/deploy/LocalStateProvider.ts +0 -57
  236. package/src/deploy/SSMStateProvider.ts +0 -117
  237. package/src/deploy/StateProvider.ts +0 -175
  238. package/src/deploy/__tests__/CachedStateProvider.spec.ts +0 -235
  239. package/src/deploy/__tests__/HostingerProvider.spec.ts +0 -347
  240. package/src/deploy/__tests__/LocalStateProvider.spec.ts +0 -130
  241. package/src/deploy/__tests__/Route53Provider.spec.ts +0 -425
  242. package/src/deploy/__tests__/SSMStateProvider.spec.ts +0 -201
  243. package/src/deploy/__tests__/__fixtures__/entry-apps/async-entry.ts +0 -24
  244. package/src/deploy/__tests__/__fixtures__/entry-apps/nested-config-entry.ts +0 -24
  245. package/src/deploy/__tests__/__fixtures__/entry-apps/no-env-entry.ts +0 -12
  246. package/src/deploy/__tests__/__fixtures__/entry-apps/simple-entry.ts +0 -14
  247. package/src/deploy/__tests__/__fixtures__/entry-apps/throwing-entry.ts +0 -16
  248. package/src/deploy/__tests__/__fixtures__/env-parsers/non-function-export.ts +0 -10
  249. package/src/deploy/__tests__/__fixtures__/env-parsers/optional-env-parser.ts +0 -21
  250. package/src/deploy/__tests__/__fixtures__/env-parsers/parseable-env-parser.ts +0 -18
  251. package/src/deploy/__tests__/__fixtures__/env-parsers/throwing-env-parser.ts +0 -16
  252. package/src/deploy/__tests__/__fixtures__/env-parsers/valid-env-parser.ts +0 -16
  253. package/src/deploy/__tests__/__fixtures__/route-apps/endpoints/auth.ts +0 -16
  254. package/src/deploy/__tests__/__fixtures__/route-apps/endpoints/health.ts +0 -13
  255. package/src/deploy/__tests__/__fixtures__/route-apps/endpoints/users.ts +0 -15
  256. package/src/deploy/__tests__/__fixtures__/route-apps/services.ts +0 -55
  257. package/src/deploy/__tests__/backup-provisioner.spec.ts +0 -428
  258. package/src/deploy/__tests__/createDnsProvider.spec.ts +0 -195
  259. package/src/deploy/__tests__/createStateProvider.spec.ts +0 -126
  260. package/src/deploy/__tests__/dns-orchestration.spec.ts +0 -192
  261. package/src/deploy/__tests__/dns-verification.spec.ts +0 -229
  262. package/src/deploy/__tests__/docker.spec.ts +0 -149
  263. package/src/deploy/__tests__/dokploy-api.spec.ts +0 -697
  264. package/src/deploy/__tests__/dokploy.spec.ts +0 -435
  265. package/src/deploy/__tests__/domain.spec.ts +0 -235
  266. package/src/deploy/__tests__/env-resolver.spec.ts +0 -903
  267. package/src/deploy/__tests__/index.spec.ts +0 -1091
  268. package/src/deploy/__tests__/init.spec.ts +0 -793
  269. package/src/deploy/__tests__/secrets.spec.ts +0 -303
  270. package/src/deploy/__tests__/sniffer.spec.ts +0 -838
  271. package/src/deploy/__tests__/state-e2e.spec.ts +0 -387
  272. package/src/deploy/__tests__/state.spec.ts +0 -876
  273. package/src/deploy/__tests__/undeploy.spec.ts +0 -758
  274. package/src/deploy/backup-provisioner.ts +0 -316
  275. package/src/deploy/dns/DnsProvider.ts +0 -201
  276. package/src/deploy/dns/HostingerProvider.ts +0 -174
  277. package/src/deploy/dns/Route53Provider.ts +0 -340
  278. package/src/deploy/dns/hostinger-api.ts +0 -261
  279. package/src/deploy/dns/index.ts +0 -627
  280. package/src/deploy/docker.ts +0 -260
  281. package/src/deploy/dokploy-api.ts +0 -1101
  282. package/src/deploy/dokploy.ts +0 -177
  283. package/src/deploy/domain.ts +0 -134
  284. package/src/deploy/env-resolver.ts +0 -305
  285. package/src/deploy/index.ts +0 -2094
  286. package/src/deploy/init.ts +0 -427
  287. package/src/deploy/secrets.ts +0 -187
  288. package/src/deploy/sniffer-envkit-patch.ts +0 -61
  289. package/src/deploy/sniffer-hooks.ts +0 -57
  290. package/src/deploy/sniffer-loader.ts +0 -28
  291. package/src/deploy/sniffer-routes-worker.ts +0 -104
  292. package/src/deploy/sniffer-worker.ts +0 -75
  293. package/src/deploy/sniffer.ts +0 -578
  294. package/src/deploy/state-commands.ts +0 -274
  295. package/src/deploy/state.ts +0 -482
  296. package/src/deploy/types.ts +0 -102
  297. package/src/deploy/undeploy.ts +0 -407
  298. package/src/dev/__tests__/entry-integration.spec.ts +0 -347
  299. package/src/dev/__tests__/entry.spec.ts +0 -144
  300. package/src/dev/__tests__/index.spec.ts +0 -2084
  301. package/src/dev/index.ts +0 -1649
  302. package/src/docker/__tests__/compose.spec.ts +0 -1142
  303. package/src/docker/__tests__/templates.spec.ts +0 -694
  304. package/src/docker/compose.ts +0 -808
  305. package/src/docker/index.ts +0 -523
  306. package/src/docker/templates.ts +0 -1067
  307. package/src/exec/index.ts +0 -118
  308. package/src/generators/CronGenerator.ts +0 -105
  309. package/src/generators/EndpointGenerator.ts +0 -954
  310. package/src/generators/FunctionGenerator.ts +0 -117
  311. package/src/generators/Generator.ts +0 -147
  312. package/src/generators/OpenApiTsGenerator.ts +0 -821
  313. package/src/generators/QueueGenerator.ts +0 -245
  314. package/src/generators/SubscriberGenerator.ts +0 -282
  315. package/src/generators/TopicGenerator.ts +0 -45
  316. package/src/generators/__tests__/CronGenerator.spec.ts +0 -445
  317. package/src/generators/__tests__/EndpointGenerator.spec.ts +0 -544
  318. package/src/generators/__tests__/FunctionGenerator.spec.ts +0 -256
  319. package/src/generators/__tests__/Generator.bustCache.spec.ts +0 -72
  320. package/src/generators/__tests__/OpenApiTsGenerator.registry.spec.ts +0 -98
  321. package/src/generators/__tests__/OpenApiTsGenerator.responseType.spec.ts +0 -56
  322. package/src/generators/__tests__/QueueGenerator.spec.ts +0 -141
  323. package/src/generators/__tests__/SubscriberGenerator.spec.ts +0 -410
  324. package/src/generators/index.ts +0 -11
  325. package/src/index.ts +0 -972
  326. package/src/init/__tests__/generators.spec.ts +0 -1070
  327. package/src/init/__tests__/init.spec.ts +0 -577
  328. package/src/init/__tests__/utils.spec.ts +0 -104
  329. package/src/init/generators/auth.ts +0 -225
  330. package/src/init/generators/config.ts +0 -316
  331. package/src/init/generators/docker.ts +0 -388
  332. package/src/init/generators/env.ts +0 -62
  333. package/src/init/generators/index.ts +0 -6
  334. package/src/init/generators/mobile-expo.ts +0 -576
  335. package/src/init/generators/models.ts +0 -153
  336. package/src/init/generators/monorepo.ts +0 -475
  337. package/src/init/generators/package.ts +0 -95
  338. package/src/init/generators/source.ts +0 -15
  339. package/src/init/generators/test.ts +0 -178
  340. package/src/init/generators/ui.ts +0 -1473
  341. package/src/init/generators/web-tanstack.ts +0 -348
  342. package/src/init/generators/web.ts +0 -363
  343. package/src/init/index.ts +0 -542
  344. package/src/init/templates/api.ts +0 -404
  345. package/src/init/templates/index.ts +0 -342
  346. package/src/init/templates/minimal.ts +0 -207
  347. package/src/init/templates/serverless.ts +0 -148
  348. package/src/init/templates/worker.ts +0 -216
  349. package/src/init/utils.ts +0 -197
  350. package/src/init/versions.ts +0 -52
  351. package/src/openapi-react-query.ts +0 -288
  352. package/src/openapi.ts +0 -259
  353. package/src/secrets/__tests__/encryption.spec.ts +0 -226
  354. package/src/secrets/__tests__/generator.spec.ts +0 -575
  355. package/src/secrets/__tests__/index.spec.ts +0 -91
  356. package/src/secrets/__tests__/reconcile.spec.ts +0 -123
  357. package/src/secrets/__tests__/storage.spec.ts +0 -645
  358. package/src/secrets/encryption.ts +0 -91
  359. package/src/secrets/generator.ts +0 -329
  360. package/src/secrets/index.ts +0 -417
  361. package/src/secrets/keystore.ts +0 -144
  362. package/src/secrets/reconcile.ts +0 -53
  363. package/src/secrets/storage.ts +0 -337
  364. package/src/secrets/sync.ts +0 -136
  365. package/src/secrets/types.ts +0 -70
  366. package/src/setup/__tests__/auto-setup.spec.ts +0 -147
  367. package/src/setup/__tests__/reconcile-secrets.spec.ts +0 -439
  368. package/src/setup/fullstack-secrets.ts +0 -140
  369. package/src/setup/index.ts +0 -411
  370. package/src/test/__tests__/__fixtures__/workspace.ts +0 -104
  371. package/src/test/__tests__/api.spec.ts +0 -199
  372. package/src/test/__tests__/auth.spec.ts +0 -162
  373. package/src/test/__tests__/index.spec.ts +0 -502
  374. package/src/test/__tests__/web.spec.ts +0 -210
  375. package/src/test/index.ts +0 -198
  376. package/src/types.ts +0 -363
  377. package/src/upgrade/__tests__/index.spec.ts +0 -354
  378. package/src/upgrade/index.ts +0 -253
  379. package/src/workspace/__tests__/client-generator.spec.ts +0 -326
  380. package/src/workspace/__tests__/index.spec.ts +0 -766
  381. package/src/workspace/__tests__/publicEnv.spec.ts +0 -64
  382. package/src/workspace/__tests__/schema.spec.ts +0 -737
  383. package/src/workspace/__tests__/type-inference.spec.ts +0 -251
  384. package/src/workspace/client-generator.ts +0 -109
  385. package/src/workspace/index.ts +0 -433
  386. package/src/workspace/publicEnv.ts +0 -57
  387. package/src/workspace/schema.ts +0 -861
  388. package/src/workspace/types.ts +0 -943
  389. package/tsconfig.json +0 -9
  390. package/tsdown.config.ts +0 -22
@@ -1,578 +0,0 @@
1
- import { spawn } from 'node:child_process';
2
- import { existsSync } from 'node:fs';
3
- import { createRequire } from 'node:module';
4
- import { dirname, resolve } from 'node:path';
5
- import { fileURLToPath, pathToFileURL } from 'node:url';
6
- import type { SniffResult } from '@geekmidas/envkit/sniffer';
7
- import { normalizeRoutes } from '../workspace/client-generator.js';
8
- import { getPublicEnvPrefix } from '../workspace/publicEnv.js';
9
- import type { NormalizedAppConfig } from '../workspace/types.js';
10
-
11
- const __filename = fileURLToPath(import.meta.url);
12
- const __dirname = dirname(__filename);
13
-
14
- /**
15
- * Resolve the tsx package path from the CLI package's dependencies.
16
- * This ensures tsx is available regardless of whether the target project has it installed.
17
- */
18
- function resolveTsxPath(): string {
19
- const require = createRequire(import.meta.url);
20
- return require.resolve('tsx');
21
- }
22
-
23
- /**
24
- * Resolve the path to a sniffer helper file.
25
- * Handles both dev (.ts with tsx) and production (.mjs from dist).
26
- *
27
- * In production: sniffer.ts is bundled into dist/index.mjs, but sniffer helper
28
- * files are output to dist/deploy/ as standalone modules for subprocess loading.
29
- *
30
- * In development: All files are in src/deploy/ and loaded via tsx.
31
- */
32
- function resolveSnifferFile(baseName: string): string {
33
- // Try deploy/ subdirectory first (production: bundled code is at dist/index.mjs,
34
- // but sniffer files are at dist/deploy/)
35
- const deployMjsPath = resolve(__dirname, 'deploy', `${baseName}.mjs`);
36
- if (existsSync(deployMjsPath)) {
37
- return deployMjsPath;
38
- }
39
-
40
- // Try same directory .mjs (production: if running from dist/deploy/ directly)
41
- const mjsPath = resolve(__dirname, `${baseName}.mjs`);
42
- if (existsSync(mjsPath)) {
43
- return mjsPath;
44
- }
45
-
46
- // Try same directory .ts (development with tsx: all files in src/deploy/)
47
- const tsPath = resolve(__dirname, `${baseName}.ts`);
48
- if (existsSync(tsPath)) {
49
- return tsPath;
50
- }
51
-
52
- // Fallback to .ts (will error if neither exists)
53
- return tsPath;
54
- }
55
-
56
- // Re-export SniffResult for consumers
57
- export type { SniffResult } from '@geekmidas/envkit/sniffer';
58
-
59
- /**
60
- * Result of sniffing an app's environment requirements.
61
- */
62
- export interface SniffedEnvironment {
63
- appName: string;
64
- /**
65
- * All required environment variable names.
66
- * When `SniffAppOptions.markOptional` is true, optional variables are
67
- * suffixed with `?` (e.g. `PORT?`).
68
- */
69
- requiredEnvVars: string[];
70
- /**
71
- * Subset of variables that are optional (accessed via `.optional()` or
72
- * `.default()`). Always populated regardless of `markOptional`.
73
- */
74
- optionalEnvVars: string[];
75
- }
76
-
77
- /**
78
- * Options for sniffing an app's environment.
79
- */
80
- export interface SniffAppOptions {
81
- /** Whether to log warnings for errors encountered during sniffing. Defaults to true. */
82
- logWarnings?: boolean;
83
- /**
84
- * When true, optional variables (those with `.optional()` or `.default()`)
85
- * are suffixed with `?` in `requiredEnvVars` (e.g. `PORT?`).
86
- * Defaults to false.
87
- */
88
- markOptional?: boolean;
89
- }
90
-
91
- /**
92
- * Get required environment variables for an app.
93
- *
94
- * Detection strategy (in order):
95
- * 1. Frontend apps: Returns empty (no server secrets)
96
- * 2. Apps with `requiredEnv`: Uses explicit list from config
97
- * 3. Entry apps: Imports entry file in subprocess to capture config.parse() calls
98
- * 4. Route-based apps: Loads route files and calls getEnvironment() on each construct
99
- * 5. Apps with `envParser` (no routes): Runs SnifferEnvironmentParser to detect usage
100
- * 6. Apps with neither: Returns empty
101
- *
102
- * This function handles "fire and forget" async operations gracefully,
103
- * capturing errors and unhandled rejections without failing the build.
104
- *
105
- * @param app - The normalized app configuration
106
- * @param appName - The name of the app
107
- * @param workspacePath - Absolute path to the workspace root
108
- * @param options - Optional configuration for sniffing behavior
109
- * @returns The sniffed environment with required variables
110
- */
111
- export async function sniffAppEnvironment(
112
- app: NormalizedAppConfig,
113
- appName: string,
114
- workspacePath: string,
115
- options: SniffAppOptions = {},
116
- ): Promise<SniffedEnvironment> {
117
- const { logWarnings = true, markOptional = false } = options;
118
-
119
- // 1. Frontend apps - handle dependencies and config sniffing
120
- if (app.type === 'web' || app.type === 'mobile') {
121
- // Auto-generate {prefix}{DEP}_URL from dependencies, where prefix matches
122
- // the framework's public-var convention (NEXT_PUBLIC_, VITE_, ...).
123
- // For frameworks without a prefix (e.g. Remix), no dep var is required.
124
- const publicPrefix = getPublicEnvPrefix(app.framework);
125
- const depVars = publicPrefix
126
- ? (app.dependencies ?? []).map(
127
- (dep) => `${publicPrefix}${dep.toUpperCase()}_URL`,
128
- )
129
- : [];
130
-
131
- // If config specified, sniff by importing the file(s)
132
- // The file calls .parse() at module load, which triggers sniffer to capture vars
133
- if (app.config) {
134
- const sniffedVars: string[] = [];
135
- const sniffedOptional: string[] = [];
136
-
137
- // Collect config paths to sniff
138
- const configPaths: string[] = [];
139
- if (app.config.client) configPaths.push(app.config.client);
140
- if (app.config.server) configPaths.push(app.config.server);
141
-
142
- // Sniff each config file
143
- for (const configPath of configPaths) {
144
- const result = await sniffEntryFile(
145
- configPath,
146
- app.path,
147
- workspacePath,
148
- );
149
-
150
- if (logWarnings && result.error) {
151
- console.warn(
152
- `[sniffer] ${appName}: Config file "${configPath}" threw error during sniffing (env vars still captured): ${result.error.message}`,
153
- );
154
- }
155
-
156
- sniffedVars.push(...result.envVars);
157
- sniffedOptional.push(...result.optionalEnvVars);
158
- }
159
-
160
- const optionalEnvVars = [...new Set(sniffedOptional)];
161
- // Combine: dependency vars + sniffed vars (deduplicated)
162
- const allVars = applyMarkOptional(
163
- [...new Set([...depVars, ...sniffedVars])],
164
- optionalEnvVars,
165
- markOptional,
166
- );
167
- return { appName, requiredEnvVars: allVars, optionalEnvVars };
168
- }
169
-
170
- return { appName, requiredEnvVars: depVars, optionalEnvVars: [] };
171
- }
172
-
173
- // 2. Entry apps - import entry file in subprocess to trigger config.parse()
174
- if (app.entry) {
175
- const result = await sniffEntryFile(app.entry, app.path, workspacePath);
176
-
177
- if (logWarnings && result.error) {
178
- console.warn(
179
- `[sniffer] ${appName}: Entry file threw error during sniffing (env vars still captured): ${result.error.message}`,
180
- );
181
- }
182
-
183
- return {
184
- appName,
185
- requiredEnvVars: applyMarkOptional(
186
- result.envVars,
187
- result.optionalEnvVars,
188
- markOptional,
189
- ),
190
- optionalEnvVars: result.optionalEnvVars,
191
- };
192
- }
193
-
194
- // 4. Route-based apps - load routes and call getEnvironment() on each construct
195
- if (app.routes) {
196
- const result = await sniffRouteFiles(
197
- normalizeRoutes(app.routes),
198
- app.path,
199
- workspacePath,
200
- );
201
-
202
- if (logWarnings && result.error) {
203
- console.warn(
204
- `[sniffer] ${appName}: Route sniffing threw error (env vars still captured): ${result.error.message}`,
205
- );
206
- }
207
-
208
- return {
209
- appName,
210
- requiredEnvVars: applyMarkOptional(
211
- result.envVars,
212
- result.optionalEnvVars,
213
- markOptional,
214
- ),
215
- optionalEnvVars: result.optionalEnvVars,
216
- };
217
- }
218
-
219
- // 5. Apps with envParser but no routes - run sniffer to detect env var usage
220
- if (app.envParser) {
221
- const result = await sniffEnvParser(app.envParser, app.path, workspacePath);
222
-
223
- // Log any issues for debugging
224
- if (logWarnings) {
225
- if (result.error) {
226
- console.warn(
227
- `[sniffer] ${appName}: envParser threw error during sniffing (env vars still captured): ${result.error.message}`,
228
- );
229
- }
230
- if (result.unhandledRejections.length > 0) {
231
- console.warn(
232
- `[sniffer] ${appName}: Fire-and-forget rejections during sniffing (suppressed): ${result.unhandledRejections.map((e) => e.message).join(', ')}`,
233
- );
234
- }
235
- }
236
-
237
- return {
238
- appName,
239
- requiredEnvVars: applyMarkOptional(
240
- result.envVars,
241
- result.optionalEnvVars,
242
- markOptional,
243
- ),
244
- optionalEnvVars: result.optionalEnvVars,
245
- };
246
- }
247
-
248
- // No env detection method available
249
- return { appName, requiredEnvVars: [], optionalEnvVars: [] };
250
- }
251
-
252
- /**
253
- * Apply the `?` suffix to optional variables in an env var list.
254
- * Only modifies the list when `markOptional` is true and there are optional vars.
255
- */
256
- function applyMarkOptional(
257
- envVars: string[],
258
- optionalEnvVars: string[],
259
- markOptional: boolean,
260
- ): string[] {
261
- if (!markOptional || optionalEnvVars.length === 0) return envVars;
262
- const optionalSet = new Set(optionalEnvVars);
263
- return envVars.map((v) => (optionalSet.has(v) ? `${v}?` : v));
264
- }
265
-
266
- /**
267
- * Result from sniffing an entry file.
268
- */
269
- interface EntrySniffResult {
270
- envVars: string[];
271
- optionalEnvVars: string[];
272
- error?: Error;
273
- }
274
-
275
- /**
276
- * Sniff an entry file by importing it in a subprocess.
277
- *
278
- * Entry apps call `config.parse()` at module load time. To capture which
279
- * env vars are accessed, we:
280
- * 1. Spawn a subprocess with a module loader hook
281
- * 2. The loader intercepts `@geekmidas/envkit` and replaces EnvironmentParser
282
- * with SnifferEnvironmentParser
283
- * 3. Import the entry file (triggers config.parse())
284
- * 4. Capture and return the accessed env var names
285
- *
286
- * This approach provides process isolation - each app is sniffed in its own
287
- * subprocess, preventing module cache pollution.
288
- *
289
- * @param entryPath - Relative path to the entry file (e.g., './src/index.ts')
290
- * @param appPath - The app's path relative to workspace (e.g., 'apps/auth')
291
- * @param workspacePath - Absolute path to workspace root
292
- * @returns EntrySniffResult with env vars and optional error
293
- */
294
- async function sniffEntryFile(
295
- entryPath: string,
296
- appPath: string,
297
- workspacePath: string,
298
- ): Promise<EntrySniffResult> {
299
- const fullEntryPath = resolve(workspacePath, appPath, entryPath);
300
- const loaderPath = resolveSnifferFile('sniffer-loader');
301
- const workerPath = resolveSnifferFile('sniffer-worker');
302
-
303
- return new Promise((resolvePromise) => {
304
- const child = spawn(
305
- 'node',
306
- ['--import', loaderPath, workerPath, fullEntryPath],
307
- {
308
- cwd: resolve(workspacePath, appPath),
309
- stdio: ['ignore', 'pipe', 'pipe'],
310
- env: {
311
- ...process.env,
312
- // Ensure tsx is available for TypeScript entry files
313
- NODE_OPTIONS: '--import=tsx',
314
- },
315
- },
316
- );
317
-
318
- let stdout = '';
319
- let stderr = '';
320
-
321
- child.stdout.on('data', (data) => {
322
- stdout += data.toString();
323
- });
324
-
325
- child.stderr.on('data', (data) => {
326
- stderr += data.toString();
327
- });
328
-
329
- child.on('close', (code) => {
330
- // Try to parse the JSON output from the worker
331
- try {
332
- // Find the last JSON object in stdout (worker may emit other output)
333
- const jsonMatch = stdout.match(/\{[^{}]*"envVars"[^{}]*\}[^{]*$/);
334
- if (jsonMatch) {
335
- const result = JSON.parse(jsonMatch[0]);
336
- resolvePromise({
337
- envVars: result.envVars || [],
338
- optionalEnvVars: result.optionalEnvVars || [],
339
- error: result.error ? new Error(result.error) : undefined,
340
- });
341
- return;
342
- }
343
- } catch {
344
- // JSON parse failed
345
- }
346
-
347
- // If we couldn't parse the output, return empty with error info
348
- resolvePromise({
349
- envVars: [],
350
- optionalEnvVars: [],
351
- error: new Error(
352
- `Failed to sniff entry file (exit code ${code}): ${stderr || stdout || 'No output'}`,
353
- ),
354
- });
355
- });
356
-
357
- child.on('error', (err) => {
358
- resolvePromise({
359
- envVars: [],
360
- optionalEnvVars: [],
361
- error: err,
362
- });
363
- });
364
- });
365
- }
366
-
367
- /**
368
- * Sniff route files by loading constructs and calling getEnvironment().
369
- *
370
- * Route-based apps have endpoints, functions, crons, and subscribers that
371
- * use services. Each service's register() method accesses environment variables.
372
- *
373
- * This runs in a subprocess with tsx loader to properly handle TypeScript
374
- * compilation and path alias resolution (e.g., `src/...` imports).
375
- *
376
- * @param routes - Glob pattern(s) for route files
377
- * @param appPath - The app's path relative to workspace (e.g., 'apps/api')
378
- * @param workspacePath - Absolute path to workspace root
379
- * @returns EntrySniffResult with env vars and optional error
380
- */
381
- async function sniffRouteFiles(
382
- routes: string | string[],
383
- appPath: string,
384
- workspacePath: string,
385
- ): Promise<EntrySniffResult> {
386
- const fullAppPath = resolve(workspacePath, appPath);
387
- const workerPath = resolveSnifferFile('sniffer-routes-worker');
388
- const tsxPath = resolveTsxPath();
389
-
390
- // Convert array of patterns to first pattern (worker handles glob internally)
391
- const routesArray = Array.isArray(routes) ? routes : [routes];
392
- const pattern = routesArray[0];
393
- if (!pattern) {
394
- return {
395
- envVars: [],
396
- optionalEnvVars: [],
397
- error: new Error('No route patterns provided'),
398
- };
399
- }
400
-
401
- return new Promise((resolvePromise) => {
402
- const child = spawn(
403
- 'node',
404
- ['--import', tsxPath, workerPath, fullAppPath, pattern],
405
- {
406
- cwd: fullAppPath,
407
- stdio: ['ignore', 'pipe', 'pipe'],
408
- env: {
409
- ...process.env,
410
- },
411
- },
412
- );
413
-
414
- let stdout = '';
415
- let stderr = '';
416
-
417
- child.stdout.on('data', (data) => {
418
- stdout += data.toString();
419
- });
420
-
421
- child.stderr.on('data', (data) => {
422
- stderr += data.toString();
423
- });
424
-
425
- child.on('close', (code) => {
426
- // Log any stderr output (import errors, etc.)
427
- if (stderr) {
428
- stderr
429
- .split('\n')
430
- .filter((line) => line.trim())
431
- .forEach((line) => console.warn(line));
432
- }
433
-
434
- // Try to parse the JSON output from the worker
435
- try {
436
- // Find the last JSON object in stdout (worker may emit other output)
437
- const jsonMatch = stdout.match(/\{[^{}]*"envVars"[^{}]*\}[^{]*$/);
438
- if (jsonMatch) {
439
- const result = JSON.parse(jsonMatch[0]);
440
- resolvePromise({
441
- envVars: result.envVars || [],
442
- // Routes worker uses getEnvironment() which doesn't track
443
- // optionality yet — populated when service register() is sniffed
444
- optionalEnvVars: result.optionalEnvVars || [],
445
- error: result.error ? new Error(result.error) : undefined,
446
- });
447
- return;
448
- }
449
- } catch {
450
- // JSON parse failed
451
- }
452
-
453
- // If we couldn't parse the output, return empty with error info
454
- resolvePromise({
455
- envVars: [],
456
- optionalEnvVars: [],
457
- error: new Error(
458
- `Failed to sniff route files (exit code ${code}): ${stderr || stdout || 'No output'}`,
459
- ),
460
- });
461
- });
462
-
463
- child.on('error', (err) => {
464
- resolvePromise({
465
- envVars: [],
466
- optionalEnvVars: [],
467
- error: err,
468
- });
469
- });
470
- });
471
- }
472
-
473
- /**
474
- * Run the SnifferEnvironmentParser on an envParser module to detect
475
- * which environment variables it accesses.
476
- *
477
- * This function handles "fire and forget" async operations by using
478
- * the shared sniffWithFireAndForget utility from @geekmidas/envkit.
479
- *
480
- * @param envParserPath - The envParser config (e.g., './src/config/env#envParser')
481
- * @param appPath - The app's path relative to workspace
482
- * @param workspacePath - Absolute path to workspace root
483
- * @returns SniffResult with env vars and any errors encountered
484
- */
485
- async function sniffEnvParser(
486
- envParserPath: string,
487
- appPath: string,
488
- workspacePath: string,
489
- ): Promise<SniffResult> {
490
- // Parse the envParser path: './src/config/env#envParser' or './src/config/env'
491
- const [modulePath, exportName = 'default'] = envParserPath.split('#');
492
- if (!modulePath) {
493
- return { envVars: [], optionalEnvVars: [], unhandledRejections: [] };
494
- }
495
-
496
- // Resolve the full path to the module
497
- const fullPath = resolve(workspacePath, appPath, modulePath);
498
-
499
- // Dynamically import the sniffer utilities
500
- let SnifferEnvironmentParser: any;
501
- let sniffWithFireAndForget: any;
502
- try {
503
- const envkitModule = await import('@geekmidas/envkit/sniffer');
504
- SnifferEnvironmentParser = envkitModule.SnifferEnvironmentParser;
505
- sniffWithFireAndForget = envkitModule.sniffWithFireAndForget;
506
- } catch (error) {
507
- const message = error instanceof Error ? error.message : String(error);
508
- console.warn(
509
- `[sniffer] Failed to import SnifferEnvironmentParser: ${message}`,
510
- );
511
- return { envVars: [], optionalEnvVars: [], unhandledRejections: [] };
512
- }
513
-
514
- const sniffer = new SnifferEnvironmentParser();
515
-
516
- return sniffWithFireAndForget(sniffer, async () => {
517
- // Import the envParser module
518
- const moduleUrl = pathToFileURL(fullPath).href;
519
- const module = await import(moduleUrl);
520
-
521
- // Get the envParser function
522
- const envParser = module[exportName];
523
- if (typeof envParser !== 'function') {
524
- console.warn(
525
- `[sniffer] Export "${exportName}" from "${modulePath}" is not a function`,
526
- );
527
- return;
528
- }
529
-
530
- // The envParser function typically creates and configures an EnvironmentParser.
531
- // We pass our sniffer which implements the same interface.
532
- const result = envParser(sniffer);
533
-
534
- // If the result is a ConfigParser, call parse() to trigger env var access
535
- if (result && typeof result.parse === 'function') {
536
- try {
537
- result.parse();
538
- } catch {
539
- // Parsing may fail due to mock values, that's expected
540
- }
541
- }
542
- });
543
- }
544
-
545
- /**
546
- * Sniff environment requirements for multiple apps.
547
- *
548
- * @param apps - Map of app name to app config
549
- * @param workspacePath - Absolute path to workspace root
550
- * @param options - Optional configuration for sniffing behavior
551
- * @returns Map of app name to sniffed environment
552
- */
553
- export async function sniffAllApps(
554
- apps: Record<string, NormalizedAppConfig>,
555
- workspacePath: string,
556
- options: SniffAppOptions = {},
557
- ): Promise<Map<string, SniffedEnvironment>> {
558
- const results = new Map<string, SniffedEnvironment>();
559
-
560
- for (const [appName, app] of Object.entries(apps)) {
561
- const sniffed = await sniffAppEnvironment(
562
- app,
563
- appName,
564
- workspacePath,
565
- options,
566
- );
567
- results.set(appName, sniffed);
568
- }
569
-
570
- return results;
571
- }
572
-
573
- // Export for testing
574
- export {
575
- sniffEnvParser as _sniffEnvParser,
576
- sniffEntryFile as _sniffEntryFile,
577
- sniffRouteFiles as _sniffRouteFiles,
578
- };