@celljs/cli 3.9.0 → 4.0.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 (758) hide show
  1. package/README.md +442 -1
  2. package/agent/guide.md +39 -0
  3. package/bin/cell.js +2 -0
  4. package/lib/agent/agent-guide.d.ts +39 -0
  5. package/lib/agent/agent-guide.d.ts.map +1 -0
  6. package/lib/agent/agent-guide.js +67 -0
  7. package/lib/agent/agent-guide.js.map +1 -0
  8. package/lib/build/executable-compiler.d.ts +44 -0
  9. package/lib/build/executable-compiler.d.ts.map +1 -0
  10. package/lib/build/executable-compiler.js +145 -0
  11. package/lib/build/executable-compiler.js.map +1 -0
  12. package/lib/build/executable-compiler.spec.d.ts +2 -0
  13. package/lib/build/executable-compiler.spec.d.ts.map +1 -0
  14. package/lib/build/executable-compiler.spec.js +71 -0
  15. package/lib/build/executable-compiler.spec.js.map +1 -0
  16. package/lib/build/single-compile.spec.d.ts +2 -0
  17. package/lib/build/single-compile.spec.d.ts.map +1 -0
  18. package/lib/build/single-compile.spec.js +135 -0
  19. package/lib/build/single-compile.spec.js.map +1 -0
  20. package/lib/check/project-checker.d.ts +85 -0
  21. package/lib/check/project-checker.d.ts.map +1 -0
  22. package/lib/check/project-checker.js +332 -0
  23. package/lib/check/project-checker.js.map +1 -0
  24. package/lib/check/project-checker.spec.d.ts +2 -0
  25. package/lib/check/project-checker.spec.d.ts.map +1 -0
  26. package/lib/check/project-checker.spec.js +147 -0
  27. package/lib/check/project-checker.spec.js.map +1 -0
  28. package/lib/cli/agent-command.d.ts +15 -0
  29. package/lib/cli/agent-command.d.ts.map +1 -0
  30. package/lib/cli/agent-command.js +42 -0
  31. package/lib/cli/agent-command.js.map +1 -0
  32. package/lib/cli/build-command.d.ts +84 -0
  33. package/lib/cli/build-command.d.ts.map +1 -0
  34. package/lib/cli/build-command.js +170 -0
  35. package/lib/cli/build-command.js.map +1 -0
  36. package/lib/cli/cell-cli.d.ts +35 -0
  37. package/lib/cli/cell-cli.d.ts.map +1 -0
  38. package/lib/cli/cell-cli.js +159 -0
  39. package/lib/cli/cell-cli.js.map +1 -0
  40. package/lib/cli/cell-cli.spec.d.ts +2 -0
  41. package/lib/cli/cell-cli.spec.d.ts.map +1 -0
  42. package/lib/cli/cell-cli.spec.js +195 -0
  43. package/lib/cli/cell-cli.spec.js.map +1 -0
  44. package/lib/cli/check-command.d.ts +31 -0
  45. package/lib/cli/check-command.d.ts.map +1 -0
  46. package/lib/cli/check-command.js +67 -0
  47. package/lib/cli/check-command.js.map +1 -0
  48. package/lib/cli/command.d.ts +24 -0
  49. package/lib/cli/command.d.ts.map +1 -0
  50. package/lib/cli/command.js +10 -0
  51. package/lib/cli/command.js.map +1 -0
  52. package/lib/cli/config-command.d.ts +29 -0
  53. package/lib/cli/config-command.d.ts.map +1 -0
  54. package/lib/cli/config-command.js +71 -0
  55. package/lib/cli/config-command.js.map +1 -0
  56. package/lib/cli/config-command.spec.d.ts +2 -0
  57. package/lib/cli/config-command.spec.d.ts.map +1 -0
  58. package/lib/cli/config-command.spec.js +79 -0
  59. package/lib/cli/config-command.spec.js.map +1 -0
  60. package/lib/cli/deploy-command.d.ts +41 -0
  61. package/lib/cli/deploy-command.d.ts.map +1 -0
  62. package/lib/cli/deploy-command.js +114 -0
  63. package/lib/cli/deploy-command.js.map +1 -0
  64. package/lib/cli/dev-command.d.ts +47 -0
  65. package/lib/cli/dev-command.d.ts.map +1 -0
  66. package/lib/cli/dev-command.js +219 -0
  67. package/lib/cli/dev-command.js.map +1 -0
  68. package/lib/cli/dev-command.spec.d.ts +2 -0
  69. package/lib/cli/dev-command.spec.d.ts.map +1 -0
  70. package/lib/cli/dev-command.spec.js +149 -0
  71. package/lib/cli/dev-command.spec.js.map +1 -0
  72. package/lib/cli/docs-command.d.ts +19 -0
  73. package/lib/cli/docs-command.d.ts.map +1 -0
  74. package/lib/cli/docs-command.js +47 -0
  75. package/lib/cli/docs-command.js.map +1 -0
  76. package/lib/cli/info-command.d.ts +44 -0
  77. package/lib/cli/info-command.d.ts.map +1 -0
  78. package/lib/cli/info-command.js +39 -0
  79. package/lib/cli/info-command.js.map +1 -0
  80. package/lib/cli/info-command.spec.d.ts +2 -0
  81. package/lib/cli/info-command.spec.d.ts.map +1 -0
  82. package/lib/cli/info-command.spec.js +236 -0
  83. package/lib/cli/info-command.spec.js.map +1 -0
  84. package/lib/cli/init-command.d.ts +20 -0
  85. package/lib/cli/init-command.d.ts.map +1 -0
  86. package/lib/cli/init-command.js +43 -0
  87. package/lib/cli/init-command.js.map +1 -0
  88. package/lib/cli/main.d.ts +2 -0
  89. package/lib/cli/main.d.ts.map +1 -0
  90. package/lib/cli/main.js +3 -0
  91. package/lib/cli/main.js.map +1 -0
  92. package/lib/cli/mcp-command.d.ts +34 -0
  93. package/lib/cli/mcp-command.d.ts.map +1 -0
  94. package/lib/cli/mcp-command.js +85 -0
  95. package/lib/cli/mcp-command.js.map +1 -0
  96. package/lib/cli/mcp-command.spec.d.ts +2 -0
  97. package/lib/cli/mcp-command.spec.d.ts.map +1 -0
  98. package/lib/cli/mcp-command.spec.js +132 -0
  99. package/lib/cli/mcp-command.spec.js.map +1 -0
  100. package/lib/cli/preview-command.d.ts +24 -0
  101. package/lib/cli/preview-command.d.ts.map +1 -0
  102. package/lib/cli/preview-command.js +91 -0
  103. package/lib/cli/preview-command.js.map +1 -0
  104. package/lib/cli/reporter.d.ts +26 -0
  105. package/lib/cli/reporter.d.ts.map +1 -0
  106. package/lib/cli/reporter.js +58 -0
  107. package/lib/cli/reporter.js.map +1 -0
  108. package/lib/config/config-build.spec.d.ts +2 -0
  109. package/lib/config/config-build.spec.d.ts.map +1 -0
  110. package/lib/config/config-build.spec.js +111 -0
  111. package/lib/config/config-build.spec.js.map +1 -0
  112. package/lib/config/config-explainer.d.ts +48 -0
  113. package/lib/config/config-explainer.d.ts.map +1 -0
  114. package/lib/config/config-explainer.js +130 -0
  115. package/lib/config/config-explainer.js.map +1 -0
  116. package/lib/config/config-file-loader.d.ts +22 -0
  117. package/lib/config/config-file-loader.d.ts.map +1 -0
  118. package/lib/config/config-file-loader.js +63 -0
  119. package/lib/config/config-file-loader.js.map +1 -0
  120. package/lib/config/config-resolver.d.ts +111 -0
  121. package/lib/config/config-resolver.d.ts.map +1 -0
  122. package/lib/config/config-resolver.js +215 -0
  123. package/lib/config/config-resolver.js.map +1 -0
  124. package/lib/config/config-resolver.spec.d.ts +2 -0
  125. package/lib/config/config-resolver.spec.d.ts.map +1 -0
  126. package/lib/config/config-resolver.spec.js +159 -0
  127. package/lib/config/config-resolver.spec.js.map +1 -0
  128. package/lib/config/config-validator.d.ts +35 -0
  129. package/lib/config/config-validator.d.ts.map +1 -0
  130. package/lib/config/config-validator.js +160 -0
  131. package/lib/config/config-validator.js.map +1 -0
  132. package/lib/config/config-validator.spec.d.ts +2 -0
  133. package/lib/config/config-validator.spec.d.ts.map +1 -0
  134. package/lib/config/config-validator.spec.js +77 -0
  135. package/lib/config/config-validator.spec.js.map +1 -0
  136. package/lib/config/define-config.d.ts +4 -0
  137. package/lib/config/define-config.d.ts.map +1 -0
  138. package/lib/config/define-config.js +5 -0
  139. package/lib/config/define-config.js.map +1 -0
  140. package/lib/config/types.d.ts +53 -0
  141. package/lib/config/types.d.ts.map +1 -0
  142. package/lib/config/types.js +2 -0
  143. package/lib/config/types.js.map +1 -0
  144. package/lib/deploy/cloud-api.d.ts +58 -0
  145. package/lib/deploy/cloud-api.d.ts.map +1 -0
  146. package/lib/deploy/cloud-api.js +189 -0
  147. package/lib/deploy/cloud-api.js.map +1 -0
  148. package/lib/deploy/code-package.d.ts +15 -0
  149. package/lib/deploy/code-package.d.ts.map +1 -0
  150. package/lib/deploy/code-package.js +40 -0
  151. package/lib/deploy/code-package.js.map +1 -0
  152. package/lib/deploy/deploy-utils.spec.d.ts +2 -0
  153. package/lib/deploy/deploy-utils.spec.d.ts.map +1 -0
  154. package/lib/deploy/deploy-utils.spec.js +56 -0
  155. package/lib/deploy/deploy-utils.spec.js.map +1 -0
  156. package/lib/deploy/deployer-registry.d.ts +11 -0
  157. package/lib/deploy/deployer-registry.d.ts.map +1 -0
  158. package/lib/deploy/deployer-registry.js +40 -0
  159. package/lib/deploy/deployer-registry.js.map +1 -0
  160. package/lib/deploy/request-signer.d.ts +51 -0
  161. package/lib/deploy/request-signer.d.ts.map +1 -0
  162. package/lib/deploy/request-signer.js +109 -0
  163. package/lib/deploy/request-signer.js.map +1 -0
  164. package/lib/deploy/zip-writer.d.ts +32 -0
  165. package/lib/deploy/zip-writer.d.ts.map +1 -0
  166. package/lib/deploy/zip-writer.js +114 -0
  167. package/lib/deploy/zip-writer.js.map +1 -0
  168. package/lib/docs/docs-index.d.ts +54 -0
  169. package/lib/docs/docs-index.d.ts.map +1 -0
  170. package/lib/docs/docs-index.js +140 -0
  171. package/lib/docs/docs-index.js.map +1 -0
  172. package/lib/docs/docs-index.spec.d.ts +2 -0
  173. package/lib/docs/docs-index.spec.d.ts.map +1 -0
  174. package/lib/docs/docs-index.spec.js +52 -0
  175. package/lib/docs/docs-index.spec.js.map +1 -0
  176. package/lib/events/event-bus.d.ts +30 -0
  177. package/lib/events/event-bus.d.ts.map +1 -0
  178. package/lib/events/event-bus.js +81 -0
  179. package/lib/events/event-bus.js.map +1 -0
  180. package/lib/events/event-bus.spec.d.ts +2 -0
  181. package/lib/events/event-bus.spec.d.ts.map +1 -0
  182. package/lib/events/event-bus.spec.js +69 -0
  183. package/lib/events/event-bus.spec.js.map +1 -0
  184. package/lib/events/hook-runner.d.ts +27 -0
  185. package/lib/events/hook-runner.d.ts.map +1 -0
  186. package/lib/events/hook-runner.js +65 -0
  187. package/lib/events/hook-runner.js.map +1 -0
  188. package/lib/events/hook-runner.spec.d.ts +2 -0
  189. package/lib/events/hook-runner.spec.d.ts.map +1 -0
  190. package/lib/events/hook-runner.spec.js +36 -0
  191. package/lib/events/hook-runner.spec.js.map +1 -0
  192. package/lib/index.d.ts +57 -1
  193. package/lib/index.d.ts.map +1 -1
  194. package/lib/index.js +57 -2
  195. package/lib/index.js.map +1 -1
  196. package/lib/info/project-inspector.d.ts +143 -0
  197. package/lib/info/project-inspector.d.ts.map +1 -0
  198. package/lib/info/project-inspector.js +244 -0
  199. package/lib/info/project-inspector.js.map +1 -0
  200. package/lib/init/project-initializer.d.ts +44 -0
  201. package/lib/init/project-initializer.d.ts.map +1 -0
  202. package/lib/init/project-initializer.js +90 -0
  203. package/lib/init/project-initializer.js.map +1 -0
  204. package/lib/init/project-initializer.spec.d.ts +2 -0
  205. package/lib/init/project-initializer.spec.d.ts.map +1 -0
  206. package/lib/init/project-initializer.spec.js +88 -0
  207. package/lib/init/project-initializer.spec.js.map +1 -0
  208. package/lib/mcp/dev-activity.d.ts +34 -0
  209. package/lib/mcp/dev-activity.d.ts.map +1 -0
  210. package/lib/mcp/dev-activity.js +46 -0
  211. package/lib/mcp/dev-activity.js.map +1 -0
  212. package/lib/mcp/dev-mcp-endpoint.d.ts +62 -0
  213. package/lib/mcp/dev-mcp-endpoint.d.ts.map +1 -0
  214. package/lib/mcp/dev-mcp-endpoint.js +280 -0
  215. package/lib/mcp/dev-mcp-endpoint.js.map +1 -0
  216. package/lib/mcp/dev-mcp-endpoint.spec.d.ts +2 -0
  217. package/lib/mcp/dev-mcp-endpoint.spec.d.ts.map +1 -0
  218. package/lib/mcp/dev-mcp-endpoint.spec.js +143 -0
  219. package/lib/mcp/dev-mcp-endpoint.spec.js.map +1 -0
  220. package/lib/mcp/mcp-server.d.ts +64 -0
  221. package/lib/mcp/mcp-server.d.ts.map +1 -0
  222. package/lib/mcp/mcp-server.js +201 -0
  223. package/lib/mcp/mcp-server.js.map +1 -0
  224. package/lib/mcp/mcp-server.spec.d.ts +2 -0
  225. package/lib/mcp/mcp-server.spec.d.ts.map +1 -0
  226. package/lib/mcp/mcp-server.spec.js +136 -0
  227. package/lib/mcp/mcp-server.spec.js.map +1 -0
  228. package/lib/mcp/project-mcp-tools.d.ts +35 -0
  229. package/lib/mcp/project-mcp-tools.d.ts.map +1 -0
  230. package/lib/mcp/project-mcp-tools.js +199 -0
  231. package/lib/mcp/project-mcp-tools.js.map +1 -0
  232. package/lib/modules/module-host.d.ts +118 -0
  233. package/lib/modules/module-host.d.ts.map +1 -0
  234. package/lib/modules/module-host.js +405 -0
  235. package/lib/modules/module-host.js.map +1 -0
  236. package/lib/modules/module-host.spec.d.ts +2 -0
  237. package/lib/modules/module-host.spec.d.ts.map +1 -0
  238. package/lib/modules/module-host.spec.js +220 -0
  239. package/lib/modules/module-host.spec.js.map +1 -0
  240. package/lib/preset/builtin-presets.d.ts +9 -0
  241. package/lib/preset/builtin-presets.d.ts.map +1 -0
  242. package/lib/preset/builtin-presets.js +24 -0
  243. package/lib/preset/builtin-presets.js.map +1 -0
  244. package/lib/preset/cloudflare/cloudflare-deployer.d.ts +26 -0
  245. package/lib/preset/cloudflare/cloudflare-deployer.d.ts.map +1 -0
  246. package/lib/preset/cloudflare/cloudflare-deployer.js +116 -0
  247. package/lib/preset/cloudflare/cloudflare-deployer.js.map +1 -0
  248. package/lib/preset/cloudflare/cloudflare-preset.d.ts +16 -0
  249. package/lib/preset/cloudflare/cloudflare-preset.d.ts.map +1 -0
  250. package/lib/preset/cloudflare/cloudflare-preset.js +97 -0
  251. package/lib/preset/cloudflare/cloudflare-preset.js.map +1 -0
  252. package/lib/preset/cloudflare/cloudflare.spec.d.ts +2 -0
  253. package/lib/preset/cloudflare/cloudflare.spec.d.ts.map +1 -0
  254. package/lib/preset/cloudflare/cloudflare.spec.js +212 -0
  255. package/lib/preset/cloudflare/cloudflare.spec.js.map +1 -0
  256. package/lib/preset/cloudflare/wrangler-config.d.ts +50 -0
  257. package/lib/preset/cloudflare/wrangler-config.d.ts.map +1 -0
  258. package/lib/preset/cloudflare/wrangler-config.js +160 -0
  259. package/lib/preset/cloudflare/wrangler-config.js.map +1 -0
  260. package/lib/preset/cloudflare/wrangler-config.spec.d.ts +2 -0
  261. package/lib/preset/cloudflare/wrangler-config.spec.d.ts.map +1 -0
  262. package/lib/preset/cloudflare/wrangler-config.spec.js +112 -0
  263. package/lib/preset/cloudflare/wrangler-config.spec.js.map +1 -0
  264. package/lib/preset/cloudflare/wrangler.d.ts +38 -0
  265. package/lib/preset/cloudflare/wrangler.d.ts.map +1 -0
  266. package/lib/preset/cloudflare/wrangler.js +90 -0
  267. package/lib/preset/cloudflare/wrangler.js.map +1 -0
  268. package/lib/preset/cloudflare/wrangler.spec.d.ts +2 -0
  269. package/lib/preset/cloudflare/wrangler.spec.d.ts.map +1 -0
  270. package/lib/preset/cloudflare/wrangler.spec.js +64 -0
  271. package/lib/preset/cloudflare/wrangler.spec.js.map +1 -0
  272. package/lib/preset/fc/fc-deployer.d.ts +50 -0
  273. package/lib/preset/fc/fc-deployer.d.ts.map +1 -0
  274. package/lib/preset/fc/fc-deployer.js +209 -0
  275. package/lib/preset/fc/fc-deployer.js.map +1 -0
  276. package/lib/preset/fc/fc-preset.d.ts +20 -0
  277. package/lib/preset/fc/fc-preset.d.ts.map +1 -0
  278. package/lib/preset/fc/fc-preset.js +46 -0
  279. package/lib/preset/fc/fc-preset.js.map +1 -0
  280. package/lib/preset/lambda/lambda-deployer.d.ts +50 -0
  281. package/lib/preset/lambda/lambda-deployer.d.ts.map +1 -0
  282. package/lib/preset/lambda/lambda-deployer.js +274 -0
  283. package/lib/preset/lambda/lambda-deployer.js.map +1 -0
  284. package/lib/preset/lambda/lambda-preset.d.ts +14 -0
  285. package/lib/preset/lambda/lambda-preset.d.ts.map +1 -0
  286. package/lib/preset/lambda/lambda-preset.js +44 -0
  287. package/lib/preset/lambda/lambda-preset.js.map +1 -0
  288. package/lib/preset/preset-output.d.ts +19 -0
  289. package/lib/preset/preset-output.d.ts.map +1 -0
  290. package/lib/preset/preset-output.js +45 -0
  291. package/lib/preset/preset-output.js.map +1 -0
  292. package/lib/preset/preset-registry.d.ts +16 -0
  293. package/lib/preset/preset-registry.d.ts.map +1 -0
  294. package/lib/preset/preset-registry.js +58 -0
  295. package/lib/preset/preset-registry.js.map +1 -0
  296. package/lib/preset/preset-registry.spec.d.ts +2 -0
  297. package/lib/preset/preset-registry.spec.d.ts.map +1 -0
  298. package/lib/preset/preset-registry.spec.js +28 -0
  299. package/lib/preset/preset-registry.spec.js.map +1 -0
  300. package/lib/preset/scf/scf-deployer.d.ts +54 -0
  301. package/lib/preset/scf/scf-deployer.d.ts.map +1 -0
  302. package/lib/preset/scf/scf-deployer.js +202 -0
  303. package/lib/preset/scf/scf-deployer.js.map +1 -0
  304. package/lib/preset/scf/scf-preset.d.ts +19 -0
  305. package/lib/preset/scf/scf-preset.d.ts.map +1 -0
  306. package/lib/preset/scf/scf-preset.js +43 -0
  307. package/lib/preset/scf/scf-preset.js.map +1 -0
  308. package/lib/preset/serverless-deployers.spec.d.ts +2 -0
  309. package/lib/preset/serverless-deployers.spec.d.ts.map +1 -0
  310. package/lib/preset/serverless-deployers.spec.js +307 -0
  311. package/lib/preset/serverless-deployers.spec.js.map +1 -0
  312. package/lib/preset/serverless-presets.spec.d.ts +2 -0
  313. package/lib/preset/serverless-presets.spec.d.ts.map +1 -0
  314. package/lib/preset/serverless-presets.spec.js +280 -0
  315. package/lib/preset/serverless-presets.spec.js.map +1 -0
  316. package/lib/preset/serverless-scripts.d.ts +29 -0
  317. package/lib/preset/serverless-scripts.d.ts.map +1 -0
  318. package/lib/preset/serverless-scripts.js +120 -0
  319. package/lib/preset/serverless-scripts.js.map +1 -0
  320. package/lib/preset/vercel/vercel-deployer.d.ts +38 -0
  321. package/lib/preset/vercel/vercel-deployer.d.ts.map +1 -0
  322. package/lib/preset/vercel/vercel-deployer.js +160 -0
  323. package/lib/preset/vercel/vercel-deployer.js.map +1 -0
  324. package/lib/preset/vercel/vercel-preset.d.ts +19 -0
  325. package/lib/preset/vercel/vercel-preset.d.ts.map +1 -0
  326. package/lib/preset/vercel/vercel-preset.js +102 -0
  327. package/lib/preset/vercel/vercel-preset.js.map +1 -0
  328. package/lib/test/fixture-project.d.ts +17 -0
  329. package/lib/test/fixture-project.d.ts.map +1 -0
  330. package/lib/test/fixture-project.js +43 -0
  331. package/lib/test/fixture-project.js.map +1 -0
  332. package/lib/testing/create-test-app.d.ts +27 -0
  333. package/lib/testing/create-test-app.d.ts.map +1 -0
  334. package/lib/testing/create-test-app.js +54 -0
  335. package/lib/testing/create-test-app.js.map +1 -0
  336. package/lib/testing/create-test-app.spec.d.ts +2 -0
  337. package/lib/testing/create-test-app.spec.d.ts.map +1 -0
  338. package/lib/testing/create-test-app.spec.js +66 -0
  339. package/lib/testing/create-test-app.spec.js.map +1 -0
  340. package/lib/toolchain/toolchain.d.ts +49 -0
  341. package/lib/toolchain/toolchain.d.ts.map +1 -0
  342. package/lib/toolchain/toolchain.js +100 -0
  343. package/lib/toolchain/toolchain.js.map +1 -0
  344. package/lib/utils/json-util.d.ts +11 -0
  345. package/lib/utils/json-util.d.ts.map +1 -0
  346. package/lib/utils/json-util.js +73 -0
  347. package/lib/utils/json-util.js.map +1 -0
  348. package/lib/utils/json-util.spec.d.ts +2 -0
  349. package/lib/utils/json-util.spec.d.ts.map +1 -0
  350. package/lib/utils/json-util.spec.js +18 -0
  351. package/lib/utils/json-util.spec.js.map +1 -0
  352. package/lib/utils/text-util.d.ts +19 -0
  353. package/lib/utils/text-util.d.ts.map +1 -0
  354. package/lib/utils/text-util.js +66 -0
  355. package/lib/utils/text-util.js.map +1 -0
  356. package/lib/utils/text-util.spec.d.ts +2 -0
  357. package/lib/utils/text-util.spec.d.ts.map +1 -0
  358. package/lib/utils/text-util.spec.js +22 -0
  359. package/lib/utils/text-util.spec.js.map +1 -0
  360. package/package.json +28 -30
  361. package/src/agent/agent-guide.ts +90 -0
  362. package/src/build/executable-compiler.ts +179 -0
  363. package/src/check/project-checker.ts +365 -0
  364. package/src/cli/agent-command.ts +46 -0
  365. package/src/cli/build-command.ts +189 -0
  366. package/src/cli/cell-cli.ts +174 -0
  367. package/src/cli/check-command.ts +74 -0
  368. package/src/cli/command.ts +29 -0
  369. package/src/cli/config-command.ts +73 -0
  370. package/src/cli/deploy-command.ts +122 -0
  371. package/src/cli/dev-command.ts +232 -0
  372. package/src/cli/docs-command.ts +53 -0
  373. package/src/cli/info-command.ts +40 -0
  374. package/src/cli/init-command.ts +53 -0
  375. package/src/cli/main.ts +3 -0
  376. package/src/cli/mcp-command.ts +98 -0
  377. package/src/cli/preview-command.ts +98 -0
  378. package/src/cli/reporter.ts +67 -0
  379. package/src/config/config-explainer.ts +158 -0
  380. package/src/config/config-file-loader.ts +76 -0
  381. package/src/config/config-resolver.ts +300 -0
  382. package/src/config/config-validator.ts +208 -0
  383. package/src/config/define-config.ts +6 -0
  384. package/src/config/types.ts +57 -0
  385. package/src/deploy/cloud-api.ts +194 -0
  386. package/src/deploy/code-package.ts +44 -0
  387. package/src/deploy/deployer-registry.ts +44 -0
  388. package/src/deploy/request-signer.ts +155 -0
  389. package/src/deploy/zip-writer.ts +132 -0
  390. package/src/docs/docs-index.ts +174 -0
  391. package/src/events/event-bus.ts +94 -0
  392. package/src/events/hook-runner.ts +78 -0
  393. package/src/index.ts +57 -0
  394. package/src/info/project-inspector.ts +352 -0
  395. package/src/init/project-initializer.ts +111 -0
  396. package/src/mcp/dev-activity.ts +71 -0
  397. package/src/mcp/dev-mcp-endpoint.ts +323 -0
  398. package/src/mcp/mcp-server.ts +251 -0
  399. package/src/mcp/project-mcp-tools.ts +216 -0
  400. package/src/modules/module-host.ts +489 -0
  401. package/src/preset/builtin-presets.ts +26 -0
  402. package/src/preset/cloudflare/cloudflare-deployer.ts +126 -0
  403. package/src/preset/cloudflare/cloudflare-preset.ts +97 -0
  404. package/src/preset/cloudflare/wrangler-config.ts +173 -0
  405. package/src/preset/cloudflare/wrangler.ts +113 -0
  406. package/src/preset/fc/fc-deployer.ts +237 -0
  407. package/src/preset/fc/fc-preset.ts +51 -0
  408. package/src/preset/lambda/lambda-deployer.ts +317 -0
  409. package/src/preset/lambda/lambda-preset.ts +45 -0
  410. package/src/preset/preset-output.ts +55 -0
  411. package/src/preset/preset-registry.ts +65 -0
  412. package/src/preset/scf/scf-deployer.ts +232 -0
  413. package/src/preset/scf/scf-preset.ts +45 -0
  414. package/src/preset/serverless-scripts.ts +132 -0
  415. package/src/preset/vercel/vercel-deployer.ts +168 -0
  416. package/src/preset/vercel/vercel-preset.ts +111 -0
  417. package/src/test/fixture-project.ts +50 -0
  418. package/src/testing/create-test-app.ts +73 -0
  419. package/src/toolchain/toolchain.ts +121 -0
  420. package/src/utils/json-util.ts +67 -0
  421. package/src/utils/text-util.ts +68 -0
  422. package/templates/backend/README.md +13 -0
  423. package/templates/backend/_gitignore +5 -0
  424. package/templates/backend/cell.yml +3 -0
  425. package/templates/backend/package.json +23 -0
  426. package/templates/{file-service/src → backend/src/node}/home-controller.ts +5 -2
  427. package/templates/{file-service/src → backend/src/node}/module.ts +0 -1
  428. package/templates/backend/template.json +3 -0
  429. package/templates/backend/test/app.spec.ts +19 -0
  430. package/templates/backend/tsconfig.json +25 -0
  431. package/templates/fullstack/README.md +13 -0
  432. package/templates/fullstack/_gitignore +5 -0
  433. package/templates/fullstack/cell.yml +6 -0
  434. package/templates/fullstack/package.json +27 -0
  435. package/templates/fullstack/src/browser/home.view.tsx +19 -0
  436. package/templates/{cell-component/src → fullstack/src/browser}/module.ts +1 -1
  437. package/templates/fullstack/src/common/greeting-protocol.ts +5 -0
  438. package/templates/fullstack/src/node/greeting-server.ts +13 -0
  439. package/templates/{admin-app/src/browser → fullstack/src/node}/module.ts +2 -1
  440. package/templates/fullstack/template.json +3 -0
  441. package/templates/fullstack/test/app.spec.ts +18 -0
  442. package/templates/fullstack/tsconfig.json +27 -0
  443. package/bin/cell +0 -2
  444. package/lib/build/build-manager.d.ts +0 -9
  445. package/lib/build/build-manager.d.ts.map +0 -1
  446. package/lib/build/build-manager.js +0 -41
  447. package/lib/build/build-manager.js.map +0 -1
  448. package/lib/build/build.d.ts +0 -6
  449. package/lib/build/build.d.ts.map +0 -1
  450. package/lib/build/build.js +0 -16
  451. package/lib/build/build.js.map +0 -1
  452. package/lib/cell-main.d.ts +0 -2
  453. package/lib/cell-main.d.ts.map +0 -1
  454. package/lib/cell-main.js +0 -110
  455. package/lib/cell-main.js.map +0 -1
  456. package/lib/cell.d.ts +0 -2
  457. package/lib/cell.d.ts.map +0 -1
  458. package/lib/cell.js +0 -194
  459. package/lib/cell.js.map +0 -1
  460. package/lib/config/config.d.ts +0 -12
  461. package/lib/config/config.d.ts.map +0 -1
  462. package/lib/config/config.js +0 -48
  463. package/lib/config/config.js.map +0 -1
  464. package/lib/deploy/deploy.d.ts +0 -7
  465. package/lib/deploy/deploy.d.ts.map +0 -1
  466. package/lib/deploy/deploy.js +0 -30
  467. package/lib/deploy/deploy.js.map +0 -1
  468. package/lib/info/info.d.ts +0 -6
  469. package/lib/info/info.d.ts.map +0 -1
  470. package/lib/info/info.js +0 -21
  471. package/lib/info/info.js.map +0 -1
  472. package/lib/init/init-manager.d.ts +0 -33
  473. package/lib/init/init-manager.d.ts.map +0 -1
  474. package/lib/init/init-manager.js +0 -141
  475. package/lib/init/init-manager.js.map +0 -1
  476. package/lib/init/init.d.ts +0 -4
  477. package/lib/init/init.d.ts.map +0 -1
  478. package/lib/init/init.js +0 -17
  479. package/lib/init/init.js.map +0 -1
  480. package/lib/init/templates.d.ts +0 -2
  481. package/lib/init/templates.d.ts.map +0 -1
  482. package/lib/init/templates.js +0 -23
  483. package/lib/init/templates.js.map +0 -1
  484. package/lib/package.spec.d.ts +0 -2
  485. package/lib/package.spec.d.ts.map +0 -1
  486. package/lib/package.spec.js +0 -7
  487. package/lib/package.spec.js.map +0 -1
  488. package/lib/props/props.d.ts +0 -9
  489. package/lib/props/props.d.ts.map +0 -1
  490. package/lib/props/props.js +0 -49
  491. package/lib/props/props.js.map +0 -1
  492. package/lib/serve/serve-manager.d.ts +0 -8
  493. package/lib/serve/serve-manager.d.ts.map +0 -1
  494. package/lib/serve/serve-manager.js +0 -44
  495. package/lib/serve/serve-manager.js.map +0 -1
  496. package/lib/serve/serve.d.ts +0 -8
  497. package/lib/serve/serve.d.ts.map +0 -1
  498. package/lib/serve/serve.js +0 -25
  499. package/lib/serve/serve.js.map +0 -1
  500. package/lib/update/update.d.ts +0 -9
  501. package/lib/update/update.d.ts.map +0 -1
  502. package/lib/update/update.js +0 -56
  503. package/lib/update/update.js.map +0 -1
  504. package/lib/utils/banner-util.d.ts +0 -6
  505. package/lib/utils/banner-util.d.ts.map +0 -1
  506. package/lib/utils/banner-util.js +0 -44
  507. package/lib/utils/banner-util.js.map +0 -1
  508. package/lib/utils/index.d.ts +0 -2
  509. package/lib/utils/index.d.ts.map +0 -1
  510. package/lib/utils/index.js +0 -18
  511. package/lib/utils/index.js.map +0 -1
  512. package/src/build/build-manager.ts +0 -50
  513. package/src/build/build.ts +0 -17
  514. package/src/cell-main.ts +0 -125
  515. package/src/cell.ts +0 -215
  516. package/src/config/config.ts +0 -56
  517. package/src/deploy/deploy.ts +0 -31
  518. package/src/info/info.ts +0 -23
  519. package/src/init/init-manager.ts +0 -163
  520. package/src/init/init.ts +0 -15
  521. package/src/init/templates.ts +0 -19
  522. package/src/package.spec.ts +0 -5
  523. package/src/props/props.ts +0 -48
  524. package/src/serve/serve-manager.ts +0 -51
  525. package/src/serve/serve.ts +0 -29
  526. package/src/update/update.ts +0 -61
  527. package/src/utils/banner-util.ts +0 -41
  528. package/src/utils/index.ts +0 -1
  529. package/templates/accounts/README.md +0 -76
  530. package/templates/accounts/cell-database.yml +0 -17
  531. package/templates/accounts/cell-locale.yml +0 -17
  532. package/templates/accounts/cell-oauth2.0.yml +0 -8
  533. package/templates/accounts/cell-theme.yml +0 -9
  534. package/templates/accounts/cell.yml +0 -10
  535. package/templates/accounts/favicon.ico +0 -0
  536. package/templates/accounts/package.json +0 -48
  537. package/templates/accounts/src/browser/home.view.tsx +0 -86
  538. package/templates/accounts/src/browser/index.ts +0 -3
  539. package/templates/accounts/src/browser/login.view.tsx +0 -78
  540. package/templates/accounts/src/browser/module.ts +0 -3
  541. package/templates/accounts/src/common/entity-protocol.ts +0 -7
  542. package/templates/accounts/src/common/index.ts +0 -1
  543. package/templates/accounts/src/node/authentication/authentication-success-handler.ts +0 -69
  544. package/templates/accounts/src/node/authentication/index.ts +0 -1
  545. package/templates/accounts/src/node/entity/base-entity.ts +0 -13
  546. package/templates/accounts/src/node/entity/connection.ts +0 -52
  547. package/templates/accounts/src/node/entity/index.ts +0 -1
  548. package/templates/accounts/src/node/entity/user.ts +0 -73
  549. package/templates/accounts/src/node/error/error.ts +0 -14
  550. package/templates/accounts/src/node/error/index.ts +0 -1
  551. package/templates/accounts/src/node/index.ts +0 -2
  552. package/templates/accounts/src/node/module.ts +0 -9
  553. package/templates/accounts/src/node/user/index.ts +0 -4
  554. package/templates/accounts/src/node/user/user-protocol.ts +0 -19
  555. package/templates/accounts/src/node/user/user-repository.ts +0 -72
  556. package/templates/accounts/src/node/user/user-service.ts +0 -36
  557. package/templates/accounts/tsconfig.json +0 -32
  558. package/templates/admin-app/.github/workflows/deploy.yml +0 -25
  559. package/templates/admin-app/.vscode/launch.json +0 -23
  560. package/templates/admin-app/README.md +0 -76
  561. package/templates/admin-app/cell-database.yml +0 -7
  562. package/templates/admin-app/cell.yml +0 -93
  563. package/templates/admin-app/package.json +0 -37
  564. package/templates/admin-app/src/browser/user.view.tsx +0 -40
  565. package/templates/admin-app/src/common/index.ts +0 -1
  566. package/templates/admin-app/src/common/user-protocol.ts +0 -23
  567. package/templates/admin-app/src/node/entity/index.ts +0 -1
  568. package/templates/admin-app/src/node/entity/user.ts +0 -15
  569. package/templates/admin-app/src/node/module.ts +0 -8
  570. package/templates/admin-app/src/node/user-service.ts +0 -41
  571. package/templates/admin-app/tsconfig.json +0 -32
  572. package/templates/backend-app/.github/workflows/deploy.yml +0 -25
  573. package/templates/backend-app/.vscode/launch.json +0 -23
  574. package/templates/backend-app/README.md +0 -76
  575. package/templates/backend-app/cell.yml +0 -0
  576. package/templates/backend-app/package.json +0 -33
  577. package/templates/backend-app/src/home-controller.ts +0 -11
  578. package/templates/backend-app/src/module.ts +0 -4
  579. package/templates/backend-app/src/user-controller.ts +0 -48
  580. package/templates/backend-app/test/home-controller.spec.ts +0 -19
  581. package/templates/backend-app/tsconfig.json +0 -32
  582. package/templates/cell-component/README.md +0 -27
  583. package/templates/cell-component/cell.yml +0 -0
  584. package/templates/cell-component/package.json +0 -29
  585. package/templates/cell-component/src/echo-service.ts +0 -16
  586. package/templates/cell-component/src/index.ts +0 -1
  587. package/templates/cell-component/src/package.spec.ts +0 -5
  588. package/templates/cell-component/tsconfig.json +0 -37
  589. package/templates/database-app/.github/workflows/deploy.yml +0 -25
  590. package/templates/database-app/.vscode/launch.json +0 -23
  591. package/templates/database-app/README.md +0 -76
  592. package/templates/database-app/cell.yml +0 -17
  593. package/templates/database-app/package.json +0 -31
  594. package/templates/database-app/src/entity/index.ts +0 -1
  595. package/templates/database-app/src/entity/user.ts +0 -13
  596. package/templates/database-app/src/home-controller.ts +0 -11
  597. package/templates/database-app/src/module.ts +0 -8
  598. package/templates/database-app/src/user-controller.ts +0 -43
  599. package/templates/database-app/tsconfig.json +0 -32
  600. package/templates/docker-app/.github/workflows/deploy.yml +0 -25
  601. package/templates/docker-app/.vscode/launch.json +0 -23
  602. package/templates/docker-app/Dockerfile +0 -27
  603. package/templates/docker-app/README.md +0 -77
  604. package/templates/docker-app/cell.yml +0 -0
  605. package/templates/docker-app/package.json +0 -31
  606. package/templates/docker-app/src/browser/assets/logo.png +0 -0
  607. package/templates/docker-app/src/browser/css-shims.d.ts +0 -30
  608. package/templates/docker-app/src/browser/hello.view.tsx +0 -31
  609. package/templates/docker-app/src/browser/module.ts +0 -3
  610. package/templates/docker-app/src/browser/style/hello.module.scss +0 -4
  611. package/templates/docker-app/src/common/welcome-protocol.ts +0 -5
  612. package/templates/docker-app/src/node/module.ts +0 -3
  613. package/templates/docker-app/src/node/welcome-server.ts +0 -9
  614. package/templates/docker-app/tsconfig.json +0 -33
  615. package/templates/file-service/.github/workflows/deploy.yml +0 -25
  616. package/templates/file-service/.vscode/launch.json +0 -23
  617. package/templates/file-service/README.md +0 -76
  618. package/templates/file-service/cell.yml +0 -12
  619. package/templates/file-service/package.json +0 -34
  620. package/templates/file-service/src/file-controller.ts +0 -47
  621. package/templates/file-service/tsconfig.json +0 -32
  622. package/templates/jwt-app/.github/workflows/deploy.yml +0 -25
  623. package/templates/jwt-app/.vscode/launch.json +0 -23
  624. package/templates/jwt-app/README.md +0 -76
  625. package/templates/jwt-app/cell.yml +0 -4
  626. package/templates/jwt-app/package.json +0 -36
  627. package/templates/jwt-app/src/context.ts +0 -16
  628. package/templates/jwt-app/src/error-handler.ts +0 -30
  629. package/templates/jwt-app/src/error.ts +0 -4
  630. package/templates/jwt-app/src/home-controller.ts +0 -23
  631. package/templates/jwt-app/src/index.ts +0 -5
  632. package/templates/jwt-app/src/jwt-middleware.ts +0 -36
  633. package/templates/jwt-app/src/module.ts +0 -3
  634. package/templates/jwt-app/test/home-controller.spec.ts +0 -19
  635. package/templates/jwt-app/tsconfig.json +0 -32
  636. package/templates/koa-app/app.js +0 -8
  637. package/templates/koa-app/package.json +0 -9
  638. package/templates/microservice/.github/workflows/deploy.yml +0 -28
  639. package/templates/microservice/.vscode/launch.json +0 -24
  640. package/templates/microservice/README.md +0 -76
  641. package/templates/microservice/examples/backend-app/README.md +0 -76
  642. package/templates/microservice/examples/backend-app/cell-remote.yml +0 -4
  643. package/templates/microservice/examples/backend-app/cell.yml +0 -3
  644. package/templates/microservice/examples/backend-app/package.json +0 -32
  645. package/templates/microservice/examples/backend-app/src/api-controller.ts +0 -31
  646. package/templates/microservice/examples/backend-app/src/module.ts +0 -3
  647. package/templates/microservice/examples/backend-app/tsconfig.json +0 -32
  648. package/templates/microservice/package.json +0 -20
  649. package/templates/microservice/packages/api/README.md +0 -76
  650. package/templates/microservice/packages/api/cell.yml +0 -0
  651. package/templates/microservice/packages/api/package.json +0 -25
  652. package/templates/microservice/packages/api/src/common/api-protocol.ts +0 -10
  653. package/templates/microservice/packages/api/src/common/index.ts +0 -1
  654. package/templates/microservice/packages/api/tsconfig.json +0 -30
  655. package/templates/microservice/packages/serviceA/.vscode/launch.json +0 -23
  656. package/templates/microservice/packages/serviceA/README.md +0 -76
  657. package/templates/microservice/packages/serviceA/cell.yml +0 -6
  658. package/templates/microservice/packages/serviceA/package.json +0 -29
  659. package/templates/microservice/packages/serviceA/src/node/module.ts +0 -3
  660. package/templates/microservice/packages/serviceA/src/node/service-a.ts +0 -9
  661. package/templates/microservice/packages/serviceA/tsconfig.json +0 -30
  662. package/templates/microservice/packages/serviceB/README.md +0 -76
  663. package/templates/microservice/packages/serviceB/cell.yml +0 -5
  664. package/templates/microservice/packages/serviceB/package.json +0 -29
  665. package/templates/microservice/packages/serviceB/src/node/module.ts +0 -3
  666. package/templates/microservice/packages/serviceB/src/node/service-b.ts +0 -9
  667. package/templates/microservice/packages/serviceB/tsconfig.json +0 -30
  668. package/templates/microservice/tsconfig.json +0 -32
  669. package/templates/mycli/.vscode/launch.json +0 -33
  670. package/templates/mycli/bin/mycli +0 -2
  671. package/templates/mycli/bin/mycli-deploy +0 -2
  672. package/templates/mycli/bin/mycli-init +0 -2
  673. package/templates/mycli/package.json +0 -33
  674. package/templates/mycli/src/bootstrap.ts +0 -7
  675. package/templates/mycli/src/constants.ts +0 -1
  676. package/templates/mycli/src/deploy/deploy-manager.ts +0 -12
  677. package/templates/mycli/src/deploy/deploy.ts +0 -16
  678. package/templates/mycli/src/deploy/index.ts +0 -1
  679. package/templates/mycli/src/index.ts +0 -2
  680. package/templates/mycli/src/init/index.ts +0 -1
  681. package/templates/mycli/src/init/init-manager.ts +0 -85
  682. package/templates/mycli/src/init/init.ts +0 -25
  683. package/templates/mycli/src/init/templates.ts +0 -3
  684. package/templates/mycli/src/module.ts +0 -3
  685. package/templates/mycli/src/mycli.ts +0 -13
  686. package/templates/mycli/templates/application-template/README.md +0 -0
  687. package/templates/mycli/tsconfig.json +0 -32
  688. package/templates/nest-app/.eslintrc.js +0 -25
  689. package/templates/nest-app/.prettierrc +0 -4
  690. package/templates/nest-app/README.md +0 -73
  691. package/templates/nest-app/nest-cli.json +0 -8
  692. package/templates/nest-app/package.json +0 -69
  693. package/templates/nest-app/src/app.controller.spec.ts +0 -22
  694. package/templates/nest-app/src/app.controller.ts +0 -12
  695. package/templates/nest-app/src/app.module.ts +0 -10
  696. package/templates/nest-app/src/app.service.ts +0 -8
  697. package/templates/nest-app/src/main.ts +0 -8
  698. package/templates/nest-app/test/app.e2e-spec.ts +0 -24
  699. package/templates/nest-app/test/jest-e2e.json +0 -9
  700. package/templates/nest-app/tsconfig.build.json +0 -12
  701. package/templates/nest-app/tsconfig.json +0 -25
  702. package/templates/nextjs-app/.eslintrc.json +0 -3
  703. package/templates/nextjs-app/README.md +0 -34
  704. package/templates/nextjs-app/next.config.js +0 -6
  705. package/templates/nextjs-app/package.json +0 -20
  706. package/templates/nextjs-app/pages/_app.js +0 -7
  707. package/templates/nextjs-app/pages/api/hello.js +0 -5
  708. package/templates/nextjs-app/pages/index.js +0 -69
  709. package/templates/nextjs-app/public/favicon.ico +0 -0
  710. package/templates/nextjs-app/public/vercel.svg +0 -4
  711. package/templates/nextjs-app/styles/Home.module.css +0 -116
  712. package/templates/nextjs-app/styles/globals.css +0 -16
  713. package/templates/sample-app/.github/workflows/deploy.yml +0 -25
  714. package/templates/sample-app/.vscode/launch.json +0 -23
  715. package/templates/sample-app/README.md +0 -76
  716. package/templates/sample-app/cell.yml +0 -0
  717. package/templates/sample-app/package.json +0 -31
  718. package/templates/sample-app/src/browser/assets/logo.png +0 -0
  719. package/templates/sample-app/src/browser/css-shims.d.ts +0 -30
  720. package/templates/sample-app/src/browser/hello.view.tsx +0 -31
  721. package/templates/sample-app/src/browser/module.ts +0 -3
  722. package/templates/sample-app/src/browser/style/hello.module.scss +0 -4
  723. package/templates/sample-app/src/common/welcome-protocol.ts +0 -5
  724. package/templates/sample-app/src/node/module.ts +0 -3
  725. package/templates/sample-app/src/node/welcome-server.ts +0 -9
  726. package/templates/sample-app/tsconfig.json +0 -32
  727. package/templates/schedule/.github/workflows/deploy.yml +0 -25
  728. package/templates/schedule/.vscode/launch.json +0 -23
  729. package/templates/schedule/README.md +0 -76
  730. package/templates/schedule/cell.yml +0 -1
  731. package/templates/schedule/package.json +0 -29
  732. package/templates/schedule/src/module.ts +0 -3
  733. package/templates/schedule/src/scheduler.ts +0 -10
  734. package/templates/schedule/tsconfig.json +0 -32
  735. package/templates/standalone-app/package.json +0 -17
  736. package/templates/standalone-app/src/app.service.ts +0 -10
  737. package/templates/standalone-app/src/main.ts +0 -14
  738. package/templates/standalone-app/src/module.ts +0 -3
  739. package/templates/standalone-app/tsconfig.json +0 -30
  740. package/templates/vue-app/.github/workflows/deploy.yml +0 -25
  741. package/templates/vue-app/.vscode/launch.json +0 -23
  742. package/templates/vue-app/README.md +0 -76
  743. package/templates/vue-app/cell.yml +0 -0
  744. package/templates/vue-app/package.json +0 -32
  745. package/templates/vue-app/src/browser/App.vue +0 -32
  746. package/templates/vue-app/src/browser/app.ts +0 -7
  747. package/templates/vue-app/src/browser/components/HelloWorld.vue +0 -42
  748. package/templates/vue-app/src/browser/declare.d.ts +0 -7
  749. package/templates/vue-app/src/browser/images/logo.png +0 -0
  750. package/templates/vue-app/src/browser/module.ts +0 -3
  751. package/templates/vue-app/src/browser/router.ts +0 -13
  752. package/templates/vue-app/src/browser/shims-vue.d.ts +0 -5
  753. package/templates/vue-app/src/browser/views/About.vue +0 -5
  754. package/templates/vue-app/src/browser/views/Root.vue +0 -37
  755. package/templates/vue-app/src/common/welcome-protocol.ts +0 -5
  756. package/templates/vue-app/src/node/module.ts +0 -3
  757. package/templates/vue-app/src/node/welcome-server.ts +0 -9
  758. package/templates/vue-app/tsconfig.json +0 -32
@@ -0,0 +1,208 @@
1
+ import { CELL_EVENTS, CellError, EVENT_RULES, HOOKABLE_EVENTS } from '@celljs/kit';
2
+ import { ConfigUtil } from '@celljs/vite';
3
+ import { TextUtil } from '../utils/text-util.js';
4
+ import type { CellConfig } from './types.js';
5
+
6
+ type Path = readonly (string | number)[];
7
+
8
+ /**
9
+ * Checks the shape of a loaded cell.config file. Every problem is a `CELL_CONFIG_INVALID` error that
10
+ * names the field, where it is written and how to fix it; likely typos get a "did you mean".
11
+ */
12
+ export class ConfigValidator {
13
+ static readonly KEYS = ['preset', 'targets', 'modules', 'build', 'vite', 'hooks'];
14
+ static readonly TARGETS = ['frontend', 'backend'];
15
+ static readonly BUILD_KEYS = ['format', 'single', 'compile', 'external', 'sourcemap', 'outDir'];
16
+ static readonly FILTER_KEYS = ['source', 'runtime', 'toolchain'];
17
+ static readonly FORMATS = ['esm', 'cjs'];
18
+ static readonly COMPILE_TARGETS = ['bun', 'node', 'deno'];
19
+ static readonly PACKAGE_NAME = /^(@[a-z0-9-~][a-z0-9-._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/;
20
+
21
+ /** @param source text of the file, used to report line numbers */
22
+ constructor(
23
+ protected readonly file: string,
24
+ protected readonly source = '',
25
+ ) {}
26
+
27
+ static isLocalPath(entry: string): boolean {
28
+ return entry.startsWith('.') || entry.startsWith('/');
29
+ }
30
+
31
+ validate(value: unknown): CellConfig {
32
+ if (!ConfigUtil.isPlainObject(value)) {
33
+ throw this.error([], `The default export is ${this.describe(value)}, not an object.`, 'Write `export default defineConfig({ ... })`.');
34
+ }
35
+ for (const [key, item] of Object.entries(value)) {
36
+ if (item === undefined) {
37
+ continue;
38
+ }
39
+ switch (key) {
40
+ case 'preset':
41
+ this.expect(typeof item === 'string' && item !== '', [key], 'a preset name such as `node`', item);
42
+ break;
43
+ case 'targets':
44
+ this.targets(item);
45
+ break;
46
+ case 'modules':
47
+ this.modules(item);
48
+ break;
49
+ case 'build':
50
+ this.build(item);
51
+ break;
52
+ case 'vite':
53
+ this.expect(ConfigUtil.isPlainObject(item), [key], 'a Vite configuration object', item);
54
+ break;
55
+ case 'hooks':
56
+ this.hooks(item);
57
+ break;
58
+ default:
59
+ this.moduleOptions(key, item);
60
+ }
61
+ }
62
+ return value as CellConfig;
63
+ }
64
+
65
+ protected modules(value: unknown): void {
66
+ this.expect(Array.isArray(value), ['modules'], 'an array', value);
67
+ (value as unknown[]).forEach((entry, index) => {
68
+ const path = ['modules', index];
69
+ if (typeof entry === 'string') {
70
+ const name = entry.startsWith('!') ? entry.slice(1) : entry;
71
+ const valid = ConfigValidator.isLocalPath(entry) || ConfigValidator.PACKAGE_NAME.test(name);
72
+ this.expect(valid, path, "a relative path ('./modules/x'), a package name, or '!' and a package name", entry);
73
+ return;
74
+ }
75
+ this.expect(ConfigUtil.isPlainObject(entry), path, 'a string or `{ source, runtime?, toolchain? }`', entry);
76
+ const filter = entry as Record<string, unknown>;
77
+ this.unknownKeys(filter, ConfigValidator.FILTER_KEYS, path);
78
+ this.expect(
79
+ typeof filter.source === 'string' && ConfigValidator.PACKAGE_NAME.test(filter.source),
80
+ [...path, 'source'],
81
+ 'a package name',
82
+ filter.source,
83
+ );
84
+ for (const key of ['runtime', 'toolchain']) {
85
+ this.expect(filter[key] === undefined || typeof filter[key] === 'boolean', [...path, key], 'a boolean', filter[key]);
86
+ }
87
+ if (filter.runtime !== false && filter.toolchain !== false) {
88
+ throw this.error(
89
+ path,
90
+ `The entry for ${filter.source} keeps everything, so it has no effect.`,
91
+ `Set \`runtime: false\` or \`toolchain: false\`, or write '!${filter.source}' to leave the component out.`,
92
+ );
93
+ }
94
+ });
95
+ }
96
+
97
+ protected targets(value: unknown): void {
98
+ const list = value as unknown[];
99
+ const valid =
100
+ Array.isArray(value) && list.length > 0 && list.every(t => ConfigValidator.TARGETS.includes(t as string)) && new Set(list).size === list.length;
101
+ this.expect(valid, ['targets'], "a non-empty list of 'frontend' and 'backend' without duplicates", value);
102
+ }
103
+
104
+ protected build(value: unknown): void {
105
+ this.expect(ConfigUtil.isPlainObject(value), ['build'], 'an object', value);
106
+ const build = value as Record<string, unknown>;
107
+ this.unknownKeys(build, ConfigValidator.BUILD_KEYS, ['build']);
108
+ const optional = (key: string, ok: boolean, expected: string) => this.expect(build[key] === undefined || ok, ['build', key], expected, build[key]);
109
+ optional('format', ConfigValidator.FORMATS.includes(build.format as string), "'esm' or 'cjs'");
110
+ optional('single', typeof build.single === 'boolean', 'a boolean');
111
+ optional(
112
+ 'compile',
113
+ typeof build.compile === 'boolean' || ConfigValidator.COMPILE_TARGETS.includes(build.compile as string),
114
+ "a boolean, 'bun', 'node' or 'deno'",
115
+ );
116
+ optional('external', Array.isArray(build.external) && build.external.every(name => typeof name === 'string'), 'an array of package names');
117
+ optional('sourcemap', typeof build.sourcemap === 'boolean', 'a boolean');
118
+ optional('outDir', typeof build.outDir === 'string' && build.outDir !== '', 'a directory relative to the project root');
119
+ }
120
+
121
+ protected hooks(value: unknown): void {
122
+ this.expect(ConfigUtil.isPlainObject(value), ['hooks'], 'an object of event names to hooks', value);
123
+ for (const [event, hook] of Object.entries(value as Record<string, unknown>)) {
124
+ if (!(CELL_EVENTS as readonly string[]).includes(event)) {
125
+ const suggestion = TextUtil.closest(event, CELL_EVENTS, 3);
126
+ throw this.error(
127
+ ['hooks', event],
128
+ `Unknown event '${event}'.`,
129
+ suggestion ? `Did you mean '${suggestion}'?` : `Use one of: ${CELL_EVENTS.join(', ')}.`,
130
+ );
131
+ }
132
+ if (EVENT_RULES[event as keyof typeof EVENT_RULES] === 'mutate') {
133
+ throw this.error(
134
+ ['hooks', event],
135
+ `'${event}' lets handlers change the event object, which a command cannot do.`,
136
+ `Subscribe with cell.on('${event}', ...) in a local module, or run the command on one of: ${HOOKABLE_EVENTS.join(', ')}.`,
137
+ );
138
+ }
139
+ if (typeof hook === 'function') {
140
+ throw this.error(
141
+ ['hooks', event],
142
+ `hooks['${event}'] is a function; hooks only run shell commands.`,
143
+ `Move the function into a local module (export default (cell) => cell.on('${event}', ...)) and list it in \`modules\`.`,
144
+ );
145
+ }
146
+ this.expect(typeof hook === 'string' && hook.trim() !== '', ['hooks', event], 'a shell command', hook);
147
+ }
148
+ }
149
+
150
+ /** Any other top-level field holds the options of a toolchain module, read with `cell.options(key)`. */
151
+ protected moduleOptions(key: string, value: unknown): void {
152
+ const suggestion = TextUtil.closest(key, ConfigValidator.KEYS, key.length >= 5 ? 2 : 1);
153
+ if (suggestion) {
154
+ throw this.error([key], `Unknown field '${key}'.`, `Did you mean '${suggestion}'?`);
155
+ }
156
+ if (!ConfigUtil.isPlainObject(value)) {
157
+ throw this.error(
158
+ [key],
159
+ `'${key}' is ${this.describe(value)}; options of a toolchain module must be an object.`,
160
+ `Write \`${key}: { ... }\`. To turn a component off, add '!<package>' to \`modules\`.`,
161
+ );
162
+ }
163
+ }
164
+
165
+ protected unknownKeys(value: Record<string, unknown>, known: readonly string[], path: Path): void {
166
+ for (const key of Object.keys(value)) {
167
+ if (!known.includes(key)) {
168
+ const suggestion = TextUtil.closest(key, known);
169
+ throw this.error(
170
+ [...path, key],
171
+ `Unknown field '${key}'.`,
172
+ suggestion ? `Did you mean '${suggestion}'?` : `Known fields: ${known.join(', ')}.`,
173
+ );
174
+ }
175
+ }
176
+ }
177
+
178
+ protected expect(ok: boolean, path: Path, expected: string, actual: unknown): void {
179
+ if (!ok) {
180
+ throw this.error(path, `${this.format(path)} must be ${expected}, got ${this.describe(actual)}.`, `Change ${this.format(path)} to ${expected}.`);
181
+ }
182
+ }
183
+
184
+ protected error(path: Path, message: string, hint: string): CellError {
185
+ const position = TextUtil.locate(this.source, path);
186
+ return new CellError({ code: 'CELL_CONFIG_INVALID', message, hint, file: this.file, line: position?.line, column: position?.column });
187
+ }
188
+
189
+ protected format(path: Path): string {
190
+ return path.map((key, i) => (typeof key === 'number' ? `[${key}]` : /^[A-Za-z_$][\w$]*$/.test(key) ? `${i ? '.' : ''}${key}` : `['${key}']`)).join('');
191
+ }
192
+
193
+ protected describe(value: unknown): string {
194
+ if (value === undefined || value === null) {
195
+ return String(value);
196
+ }
197
+ if (typeof value === 'function') {
198
+ return 'a function';
199
+ }
200
+ if (Array.isArray(value)) {
201
+ return 'an array';
202
+ }
203
+ if (typeof value === 'object') {
204
+ return 'an object';
205
+ }
206
+ return JSON.stringify(value);
207
+ }
208
+ }
@@ -0,0 +1,6 @@
1
+ import type { CellConfig } from './types.js';
2
+
3
+ /** Types the default export of cell.config.ts; returns it unchanged. */
4
+ export function defineConfig(config: CellConfig): CellConfig {
5
+ return config;
6
+ }
@@ -0,0 +1,57 @@
1
+ import type { CellModuleOptions, HookableEventName, Target } from '@celljs/kit';
2
+ import type { UserConfig } from 'vite';
3
+
4
+ /** Targets of `cell build --compile`: the runtime that produces the executable. */
5
+ export type CompileTarget = 'bun' | 'node' | 'deno';
6
+
7
+ export interface BuildOptions {
8
+ /** Server bundle format. Default: the preset's format, else `esm`. Node executables need `cjs`. */
9
+ format?: 'esm' | 'cjs';
10
+ /** Embed the frontend into the server bundle: one file runs the whole application. */
11
+ single?: boolean;
12
+ /** Produce one executable file; `true` means `bun`. */
13
+ compile?: boolean | CompileTarget;
14
+ /** Packages the server bundle must not inline; they are copied next to it. */
15
+ external?: string[];
16
+ sourcemap?: boolean;
17
+ /** Output directory, relative to the project root. Default `.cell/output`. */
18
+ outDir?: string;
19
+ }
20
+
21
+ /** Narrows what a component contributes: `runtime: false` drops its DI modules, `toolchain: false` its toolchain module. */
22
+ export interface ModuleFilter {
23
+ source: string;
24
+ runtime?: boolean;
25
+ toolchain?: boolean;
26
+ }
27
+
28
+ /**
29
+ * One entry of `modules`:
30
+ * - `'./modules/audit'` — a toolchain module of the project (a file, or a directory with a package.json);
31
+ * - `'@scope/name'` — the toolchain module of a package that is not a runtime dependency;
32
+ * - `'!@scope/name'` — leave a component out entirely;
33
+ * - `{ source, runtime?, toolchain? }` — keep a component but drop part of it.
34
+ */
35
+ export type ModuleEntry = string | ModuleFilter;
36
+
37
+ /**
38
+ * cell.config.ts: configuration of the toolchain only. Application configuration (what `@Value`
39
+ * reads) belongs in cell.yml (docs/design/agent-first.md R1). Every other top-level field is the
40
+ * options object of a toolchain module, typed through {@link CellModuleOptions}.
41
+ */
42
+ export interface CellConfig extends CellModuleOptions {
43
+ /** Shape of the output, e.g. `node`, `fc`. Overridden by `--preset`; falls back to `CELL_PRESET`, CI detection, `node`. */
44
+ preset?: string;
45
+ /** Targets to build, replacing the default: `backend` plus the components' `targets` (e.g. `@celljs/widget` adds `frontend`). */
46
+ targets?: Target[];
47
+ modules?: ModuleEntry[];
48
+ build?: BuildOptions;
49
+ /** Merged into the Vite configuration of every environment. */
50
+ vite?: UserConfig;
51
+ /**
52
+ * Shell commands run on toolchain events, e.g. `{ 'build:before': 'prisma generate' }`. Only notification
53
+ * and gate events; a failing command cancels a gate event and fails the command otherwise. Anything that
54
+ * needs code belongs in a local module.
55
+ */
56
+ hooks?: Partial<Record<HookableEventName, string>>;
57
+ }
@@ -0,0 +1,194 @@
1
+ import { existsSync, readFileSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { CellError, type StandardSchema } from '@celljs/kit';
5
+
6
+ /** What the clouds' API clients need from the outside world; tests replace it. */
7
+ export interface CloudIo {
8
+ fetch(url: string, init: RequestInit): Promise<Response>;
9
+ sleep(ms: number): Promise<void>;
10
+ now(): Date;
11
+ }
12
+
13
+ export const DEFAULT_IO: CloudIo = {
14
+ fetch: (input, init) => fetch(input, init),
15
+ sleep: ms => new Promise(resolve => setTimeout(resolve, ms)),
16
+ now: () => new Date(),
17
+ };
18
+
19
+ /** An error answer of a cloud API, with the cloud's own code. */
20
+ export class CloudApiError extends Error {
21
+ constructor(
22
+ readonly status: number,
23
+ readonly code: string,
24
+ message: string,
25
+ readonly requestId?: string,
26
+ ) {
27
+ super(message);
28
+ }
29
+ }
30
+
31
+ export namespace CloudApi {
32
+ /** Sends a request; a network failure becomes CELL_DEPLOY_NETWORK. */
33
+ export async function send(io: CloudIo, url: string, init: RequestInit, cloud: string): Promise<Response> {
34
+ try {
35
+ return await io.fetch(url, init);
36
+ } catch (cause) {
37
+ throw new CellError({
38
+ code: 'CELL_DEPLOY_NETWORK',
39
+ message: `Cannot reach ${new URL(url).host} (${cloud}): ${(cause as Error)?.message ?? cause}`,
40
+ hint: 'Check the network connection and proxy settings of this machine, then deploy again.',
41
+ cause,
42
+ });
43
+ }
44
+ }
45
+
46
+ /** A failed API call as a CellError for people and agents. */
47
+ export function failure(cloud: string, step: string, error: CloudApiError, hint?: string): CellError {
48
+ const auth = error.status === 401 || error.status === 403 || /auth|signature|accesskey|secret|credential|forbidden|denied|token/i.test(error.code);
49
+ return new CellError({
50
+ code: auth ? 'CELL_DEPLOY_UNAUTHORIZED' : 'CELL_DEPLOY_API_ERROR',
51
+ message: `${cloud} ${step} failed: [${error.code}] ${error.message}${error.requestId ? ` (request ${error.requestId})` : ''}`,
52
+ hint:
53
+ hint ??
54
+ (auth
55
+ ? 'Check that the credentials are valid and allowed to manage functions in this account and region.'
56
+ : 'Fix what the cloud reports (see the code and message), then deploy again.'),
57
+ });
58
+ }
59
+
60
+ export async function poll<T>(io: CloudIo, read: () => Promise<T>, done: (value: T) => boolean, what: string, timeoutMs = 180_000): Promise<T> {
61
+ const started = io.now().getTime();
62
+ for (let delay = 1000; ; delay = Math.min(delay * 1.5, 5000)) {
63
+ const value = await read();
64
+ if (done(value)) {
65
+ return value;
66
+ }
67
+ if (io.now().getTime() - started > timeoutMs) {
68
+ throw new CellError({
69
+ code: 'CELL_DEPLOY_TIMEOUT',
70
+ message: `Timed out after ${Math.round(timeoutMs / 1000)}s waiting for ${what}.`,
71
+ hint: 'Look at the function in the console of the cloud; deploy again once it is ready.',
72
+ });
73
+ }
74
+ await io.sleep(delay);
75
+ }
76
+ }
77
+ }
78
+
79
+ /** Credentials of each cloud, from the environment variables their own CLIs and SDKs read. */
80
+ export namespace CloudCredentials {
81
+ export function alibaba(env: NodeJS.ProcessEnv): { accessKeyId: string; accessKeySecret: string; securityToken?: string } | undefined {
82
+ const accessKeyId = env.ALIBABA_CLOUD_ACCESS_KEY_ID;
83
+ const accessKeySecret = env.ALIBABA_CLOUD_ACCESS_KEY_SECRET;
84
+ return accessKeyId && accessKeySecret ? { accessKeyId, accessKeySecret, securityToken: env.ALIBABA_CLOUD_SECURITY_TOKEN || undefined } : undefined;
85
+ }
86
+
87
+ export function tencent(env: NodeJS.ProcessEnv): { secretId: string; secretKey: string; token?: string } | undefined {
88
+ const secretId = env.TENCENTCLOUD_SECRET_ID;
89
+ const secretKey = env.TENCENTCLOUD_SECRET_KEY;
90
+ return secretId && secretKey ? { secretId, secretKey, token: env.TENCENTCLOUD_SESSION_TOKEN || undefined } : undefined;
91
+ }
92
+
93
+ /** `AWS_ACCESS_KEY_ID` / `AWS_SECRET_ACCESS_KEY`, else the `AWS_PROFILE` (or default) profile of ~/.aws/credentials. */
94
+ export function aws(env: NodeJS.ProcessEnv, home = homedir()): { accessKeyId: string; secretAccessKey: string; sessionToken?: string } | undefined {
95
+ if (env.AWS_ACCESS_KEY_ID && env.AWS_SECRET_ACCESS_KEY) {
96
+ return { accessKeyId: env.AWS_ACCESS_KEY_ID, secretAccessKey: env.AWS_SECRET_ACCESS_KEY, sessionToken: env.AWS_SESSION_TOKEN || undefined };
97
+ }
98
+ const file = env.AWS_SHARED_CREDENTIALS_FILE ?? join(home, '.aws', 'credentials');
99
+ if (!existsSync(file)) {
100
+ return undefined;
101
+ }
102
+ const section = ini(readFileSync(file, 'utf8'))[env.AWS_PROFILE ?? 'default'];
103
+ return section?.aws_access_key_id && section.aws_secret_access_key
104
+ ? { accessKeyId: section.aws_access_key_id, secretAccessKey: section.aws_secret_access_key, sessionToken: section.aws_session_token }
105
+ : undefined;
106
+ }
107
+
108
+ export function ini(text: string): Record<string, Record<string, string>> {
109
+ const sections: Record<string, Record<string, string>> = {};
110
+ let current: Record<string, string> | undefined;
111
+ for (const raw of text.split(/\r?\n/)) {
112
+ const line = raw.trim();
113
+ const header = /^\[\s*(?:profile\s+)?([^\]]+?)\s*\]$/.exec(line);
114
+ if (header) {
115
+ current = sections[header[1]] ??= {};
116
+ } else if (current && /^[\w.-]+\s*=/.test(line)) {
117
+ const index = line.indexOf('=');
118
+ current[line.slice(0, index).trim()] = line.slice(index + 1).trim();
119
+ }
120
+ }
121
+ return sections;
122
+ }
123
+
124
+ export function missing(cloud: string, variables: string, more = ''): CellError {
125
+ return new CellError({
126
+ code: 'CELL_DEPLOY_CREDENTIALS_MISSING',
127
+ message: `No ${cloud} credentials: ${variables} are not set.`,
128
+ hint: `Set ${variables} in the environment of cell deploy (CI secrets, or your shell)${more}. cell deploy --dry-run works without them.`,
129
+ });
130
+ }
131
+ }
132
+
133
+ type FieldType = 'string' | 'number' | 'boolean' | 'env' | readonly string[];
134
+
135
+ /**
136
+ * A Standard Schema for the options of a preset (its field of cell.config.ts), without a
137
+ * validation library: known keys only, each of one type; `env` is a record of strings.
138
+ */
139
+ export namespace PresetOptionsSchema {
140
+ export function of(fields: Record<string, FieldType>): StandardSchema {
141
+ return {
142
+ '~standard': {
143
+ version: 1,
144
+ vendor: 'cell',
145
+ validate: value => {
146
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
147
+ return { issues: [{ message: 'must be an object' }] };
148
+ }
149
+ for (const [key, field] of Object.entries(value as Record<string, unknown>)) {
150
+ const type = fields[key];
151
+ const problem = type === undefined ? `unknown option; the options are ${Object.keys(fields).join(', ')}` : check(field, type);
152
+ if (problem) {
153
+ return { issues: [{ message: problem, path: [key] }] };
154
+ }
155
+ }
156
+ return { value };
157
+ },
158
+ },
159
+ };
160
+ }
161
+
162
+ function check(value: unknown, type: FieldType): string | undefined {
163
+ if (Array.isArray(type)) {
164
+ return type.includes(value as string) ? undefined : `must be one of ${type.map(t => JSON.stringify(t)).join(', ')}`;
165
+ }
166
+ if (type === 'env') {
167
+ const ok = typeof value === 'object' && value !== null && !Array.isArray(value) && Object.values(value).every(v => typeof v === 'string');
168
+ return ok ? undefined : 'must be an object of strings';
169
+ }
170
+ if (type === 'number') {
171
+ return typeof value === 'number' && Number.isFinite(value) && value > 0 ? undefined : 'must be a positive number';
172
+ }
173
+ return typeof value === type ? undefined : `must be a ${type}`;
174
+ }
175
+ }
176
+
177
+ /** Names of cloud resources derived from the package name. */
178
+ export namespace CloudNames {
179
+ /** Letters, digits and `-`, starting with a letter, at most `max` characters. */
180
+ export function functionName(root: string, given: unknown, max = 60): string {
181
+ if (typeof given === 'string' && given) {
182
+ return given;
183
+ }
184
+ const file = join(root, 'package.json');
185
+ const pkg = existsSync(file) ? (JSON.parse(readFileSync(file, 'utf8')) as { name?: string }).name : undefined;
186
+ const base = (pkg ?? 'cell-app')
187
+ .replace(/^@[^/]+\//, '')
188
+ .toLowerCase()
189
+ .replace(/[^a-z0-9-]+/g, '-')
190
+ .replace(/^[^a-z]+/, '')
191
+ .replace(/-+$/, '');
192
+ return (base || 'cell-app').slice(0, max).replace(/-+$/, '');
193
+ }
194
+ }
@@ -0,0 +1,44 @@
1
+ import { CellError } from '@celljs/kit';
2
+ import { ZipWriter } from './zip-writer.js';
3
+
4
+ /** The zip of a build output that function platforms take as code. */
5
+ export class CodePackage {
6
+ protected constructor(
7
+ readonly zip: Buffer,
8
+ readonly files: number,
9
+ ) {}
10
+
11
+ /** Every file of the output directory. */
12
+ static of(outDir: string): CodePackage {
13
+ const writer = new ZipWriter();
14
+ writer.addDirectory(outDir);
15
+ return new CodePackage(writer.toBuffer(), writer.files);
16
+ }
17
+
18
+ get size(): number {
19
+ return this.zip.length;
20
+ }
21
+
22
+ get base64(): string {
23
+ return this.zip.toString('base64');
24
+ }
25
+
26
+ describe(): string {
27
+ return `${CodePackage.bytes(this.size)} zipped, ${this.files} files`;
28
+ }
29
+
30
+ /** Fails before uploading when the platform would reject the package. */
31
+ checkSize(limit: number, cloud: string, hint: string): void {
32
+ if (this.size > limit) {
33
+ throw new CellError({
34
+ code: 'CELL_DEPLOY_PACKAGE_TOO_LARGE',
35
+ message: `The code package is ${CodePackage.bytes(this.size)}; ${cloud} accepts at most ${CodePackage.bytes(limit)} in a direct upload.`,
36
+ hint,
37
+ });
38
+ }
39
+ }
40
+
41
+ static bytes(n: number): string {
42
+ return n >= 1024 * 1024 ? `${(n / 1024 / 1024).toFixed(1)} MB` : `${Math.max(1, Math.round(n / 1024))} KB`;
43
+ }
44
+ }
@@ -0,0 +1,44 @@
1
+ import { CellError, type Deployer } from '@celljs/kit';
2
+ import { cloudflareDeployer } from '../preset/cloudflare/cloudflare-deployer.js';
3
+ import { fcDeployer } from '../preset/fc/fc-deployer.js';
4
+ import { lambdaDeployer } from '../preset/lambda/lambda-deployer.js';
5
+ import { scfDeployer } from '../preset/scf/scf-deployer.js';
6
+ import { vercelDeployer } from '../preset/vercel/vercel-deployer.js';
7
+
8
+ /** Deployers by name; a preset names the one that publishes its output (`Preset.deployer`). */
9
+ export class DeployerRegistry {
10
+ protected readonly deployers = new Map<string, Deployer>();
11
+
12
+ /** The deployers that come with the CLI. */
13
+ static builtin(): DeployerRegistry {
14
+ return new DeployerRegistry().register(cloudflareDeployer).register(fcDeployer).register(scfDeployer).register(lambdaDeployer).register(vercelDeployer);
15
+ }
16
+
17
+ register(deployer: Deployer): this {
18
+ if (this.deployers.has(deployer.name)) {
19
+ throw new CellError({
20
+ code: 'CELL_DEPLOYER_DUPLICATE',
21
+ message: `Deployer '${deployer.name}' is registered twice.`,
22
+ hint: 'Give the deployer another name.',
23
+ });
24
+ }
25
+ this.deployers.set(deployer.name, deployer);
26
+ return this;
27
+ }
28
+
29
+ get names(): string[] {
30
+ return [...this.deployers.keys()];
31
+ }
32
+
33
+ get(name: string): Deployer {
34
+ const deployer = this.deployers.get(name);
35
+ if (!deployer) {
36
+ throw new CellError({
37
+ code: 'CELL_DEPLOYER_NOT_FOUND',
38
+ message: `Unknown deployer '${name}'. Available: ${this.names.join(', ') || 'none'}.`,
39
+ hint: 'Use a preset whose deployer is available, or add the module that provides it.',
40
+ });
41
+ }
42
+ return deployer;
43
+ }
44
+ }