@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 @@
1
+ {"version":3,"file":"scf-deployer.d.ts","sourceRoot":"","sources":["../../../src/preset/scf/scf-deployer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,UAAU,EAAuC,MAAM,aAAa,CAAC;AACnI,OAAO,EAA2B,gBAAgB,EAAE,KAAK,OAAO,EAA0B,MAAM,2BAA2B,CAAC;AAG5H,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,KAAK,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC,CAAC;AAE5E,+DAA+D;AAC/D,qBAAa,SAAS;IAKd,QAAQ,CAAC,MAAM,EAAE,MAAM;IACvB,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW;IAC3C,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO;IANlC,MAAM,CAAC,QAAQ,CAAC,IAAI,6BAA6B;IACjD,MAAM,CAAC,QAAQ,CAAC,OAAO,gBAAgB;IAEvC,YACa,MAAM,EAAE,MAAM,EACJ,WAAW,EAAE,WAAW,EACxB,EAAE,GAAE,OAAoB,EAC3C;IAEE,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAe/F;IAEK,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC,CAS3F;CACJ;AAED;;;;GAIG;AACH,qBAAa,aAAa;IAYlB,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,aAAa;IACzC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,OAAO;IAZlC,mDAAmD;IACnD,MAAM,CAAC,QAAQ,CAAC,WAAW,SAAoB;IAC/C,MAAM,CAAC,QAAQ,CAAC,WAAW,wDAAwD;IACnF,MAAM,CAAC,QAAQ,CAAC,OAAO,cAAc;IAErC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IAE7C,YACuB,OAAO,EAAE,aAAa,EACtB,EAAE,GAAE,OAAoB,EAO9C;IAED,IAAI,OAAO,IAAI,SAAS,CAAC,OAAO,CAE/B;IAED,IAAI,QAAQ,IAAI;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE;YAAE,SAAS,EAAE;gBAAE,GAAG,EAAE,MAAM,CAAC;gBAAC,KAAK,EAAE,MAAM,CAAA;aAAE,EAAE,CAAA;SAAE,CAAA;KAAE,CAQpH;IAEK,IAAI,IAAI,OAAO,CAAC,UAAU,CAAC,CAmChC;IAEK,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,CAkDjC;IAED,wHAAwH;IACxH,UAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CASzE;IAED,UAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAe3D;IAED,SAAS,CAAC,WAAW,IAAI,IAAI,CAQ5B;IAED,UAAgB,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAMxE;CACJ;AAED,eAAO,MAAM,WAAW,gCAKtB,CAAC"}
@@ -0,0 +1,202 @@
1
+ import { CellError, defineDeployer } from '@celljs/kit';
2
+ import { CloudApi, CloudApiError, CloudCredentials, CloudNames, DEFAULT_IO } from '../../deploy/cloud-api.js';
3
+ import { CodePackage } from '../../deploy/code-package.js';
4
+ import { RequestSigner } from '../../deploy/request-signer.js';
5
+ import { ScfPreset } from './scf-preset.js';
6
+ /** Tencent Cloud API 3.0 calls of SCF (version 2018-04-16). */
7
+ export class ScfClient {
8
+ region;
9
+ credentials;
10
+ io;
11
+ static HOST = 'scf.tencentcloudapi.com';
12
+ static VERSION = '2018-04-16';
13
+ constructor(region, credentials, io = DEFAULT_IO) {
14
+ this.region = region;
15
+ this.credentials = credentials;
16
+ this.io = io;
17
+ }
18
+ async call(action, params) {
19
+ const body = JSON.stringify(params);
20
+ const headers = RequestSigner.tc3({ service: 'scf', host: ScfClient.HOST, action, version: ScfClient.VERSION, region: this.region, body }, this.credentials, this.io.now());
21
+ const response = await CloudApi.send(this.io, `https://${ScfClient.HOST}/`, { method: 'POST', headers, body }, 'Tencent Cloud SCF');
22
+ const raw = await response.text();
23
+ const json = (raw ? JSON.parse(raw) : {});
24
+ const result = json.Response ?? {};
25
+ if (result.Error || !response.ok) {
26
+ throw new CloudApiError(response.status, result.Error?.Code ?? String(response.status), result.Error?.Message ?? raw, result.RequestId);
27
+ }
28
+ return result;
29
+ }
30
+ async getFunction(name, namespace) {
31
+ try {
32
+ return await this.call('GetFunction', { FunctionName: name, Namespace: namespace });
33
+ }
34
+ catch (error) {
35
+ if (error instanceof CloudApiError && error.code.startsWith('ResourceNotFound')) {
36
+ return undefined;
37
+ }
38
+ throw error;
39
+ }
40
+ }
41
+ }
42
+ /**
43
+ * Deploys the output of the scf preset with the SCF API: a web function (Type HTTP) with the output
44
+ * directory as code, and a public function URL without authentication. Credentials:
45
+ * TENCENTCLOUD_SECRET_ID / TENCENTCLOUD_SECRET_KEY (/ TENCENTCLOUD_SESSION_TOKEN).
46
+ */
47
+ export class ScfDeployment {
48
+ context;
49
+ io;
50
+ /** ZipFile of the API: base64 of at most 20 MB. */
51
+ static MAX_PACKAGE = 20 * 1024 * 1024;
52
+ static CREDENTIALS = 'TENCENTCLOUD_SECRET_ID and TENCENTCLOUD_SECRET_KEY';
53
+ static TRIGGER = 'cell-url';
54
+ name;
55
+ region;
56
+ namespace;
57
+ credentials;
58
+ constructor(context, io = DEFAULT_IO) {
59
+ this.context = context;
60
+ this.io = io;
61
+ const { options, env, root } = context;
62
+ this.name = CloudNames.functionName(root, options.name, 60);
63
+ this.region = options.region ?? env.TENCENTCLOUD_REGION ?? 'ap-guangzhou';
64
+ this.namespace = options.namespace ?? 'default';
65
+ this.credentials = CloudCredentials.tencent(env);
66
+ }
67
+ get runtime() {
68
+ return this.context.options.runtime ?? ScfPreset.DEFAULT_RUNTIME;
69
+ }
70
+ get settings() {
71
+ const { options } = this.context;
72
+ const env = { NODE_ENV: 'production', ...(options.env ?? {}) };
73
+ return {
74
+ MemorySize: Math.ceil((options.memory ?? 512) / 128) * 128,
75
+ Timeout: options.timeout ?? 60,
76
+ Environment: { Variables: Object.entries(env).map(([Key, Value]) => ({ Key, Value })) },
77
+ };
78
+ }
79
+ async plan() {
80
+ this.checkOutput();
81
+ const code = CodePackage.of(this.context.outDir);
82
+ let fn;
83
+ let url;
84
+ if (this.credentials) {
85
+ const client = new ScfClient(this.region, this.credentials, this.io);
86
+ fn = Boolean(await this.step('GetFunction', () => client.getFunction(this.name, this.namespace)));
87
+ url = fn && (await this.urlTrigger(client)) !== undefined;
88
+ }
89
+ else {
90
+ this.context.warn(`No Tencent Cloud credentials (${ScfDeployment.CREDENTIALS}): the plan does not say whether the function exists.`);
91
+ }
92
+ const action = (found) => (found === undefined ? 'deploy' : found ? 'update' : 'create');
93
+ return {
94
+ deployer: 'scf',
95
+ resources: [
96
+ {
97
+ type: 'web-function',
98
+ name: this.name,
99
+ action: action(fn),
100
+ details: {
101
+ region: this.region,
102
+ namespace: this.namespace,
103
+ runtime: this.runtime,
104
+ memorySize: this.settings.MemorySize,
105
+ timeout: this.settings.Timeout,
106
+ package: code.describe(),
107
+ },
108
+ },
109
+ ...(url
110
+ ? []
111
+ : [{ type: 'function-url', name: ScfDeployment.TRIGGER, action: action(url), details: { authType: 'NONE' } }]),
112
+ ],
113
+ details: { region: this.region, credentials: this.credentials ? 'TENCENTCLOUD_SECRET_ID' : 'missing' },
114
+ };
115
+ }
116
+ async apply() {
117
+ this.checkOutput();
118
+ if (!this.credentials) {
119
+ throw CloudCredentials.missing('Tencent Cloud', ScfDeployment.CREDENTIALS, ' (an API key of a sub-user with QcloudSCFFullAccess)');
120
+ }
121
+ const client = new ScfClient(this.region, this.credentials, this.io);
122
+ const code = CodePackage.of(this.context.outDir);
123
+ code.checkSize(ScfDeployment.MAX_PACKAGE, 'SCF', 'Keep large packages out of the server bundle and the output directory, or upload the package with COS from the SCF console.');
124
+ const id = { FunctionName: this.name, Namespace: this.namespace };
125
+ if (await this.step('GetFunction', () => client.getFunction(this.name, this.namespace))) {
126
+ this.context.info(`Updating web function ${this.name} in ${this.region} (${code.describe()})…`);
127
+ await this.waitActive(client);
128
+ await this.step('UpdateFunctionCode', () => client.call('UpdateFunctionCode', { ...id, ZipFile: code.base64, CodeSource: 'ZipFile' }));
129
+ await this.waitActive(client);
130
+ await this.step('UpdateFunctionConfiguration', () => client.call('UpdateFunctionConfiguration', { ...id, Runtime: this.runtime, ...this.settings }));
131
+ }
132
+ else {
133
+ this.context.info(`Creating web function ${this.name} in ${this.region} (${code.describe()})…`);
134
+ await this.step('CreateFunction', () => client.call('CreateFunction', {
135
+ ...id,
136
+ Type: 'HTTP',
137
+ Runtime: this.runtime,
138
+ Code: { ZipFile: code.base64 },
139
+ Description: 'Deployed by Cell (cell deploy --preset scf)',
140
+ ...this.settings,
141
+ }));
142
+ }
143
+ await this.waitActive(client);
144
+ let url = await this.urlTrigger(client);
145
+ if (url === undefined) {
146
+ this.context.info('Creating the function URL…');
147
+ await this.step('CreateTrigger', () => client.call('CreateTrigger', {
148
+ ...id,
149
+ TriggerName: ScfDeployment.TRIGGER,
150
+ Type: 'http',
151
+ Qualifier: '$DEFAULT',
152
+ TriggerDesc: JSON.stringify({ AuthType: 'NONE', NetConfig: { EnableIntranet: false, EnableExtranet: true } }),
153
+ }));
154
+ url = await this.urlTrigger(client);
155
+ }
156
+ return { url: url || undefined, details: { region: this.region, namespace: this.namespace, function: this.name } };
157
+ }
158
+ /** The public URL of the function URL trigger: '' when there is one without a URL yet, undefined when there is none. */
159
+ async urlTrigger(client) {
160
+ const { Triggers = [] } = await this.step('ListTriggers', () => client.call('ListTriggers', { FunctionName: this.name, Namespace: this.namespace }));
161
+ const trigger = Triggers.find(t => String(t.Type).toLowerCase() === 'http');
162
+ if (!trigger) {
163
+ return undefined;
164
+ }
165
+ return /https:\/\/[^\s"\\]+/.exec(JSON.stringify(trigger))?.[0] ?? '';
166
+ }
167
+ async waitActive(client) {
168
+ const fn = await CloudApi.poll(this.io, () => this.step('GetFunction', async () => (await client.getFunction(this.name, this.namespace)) ?? {}), f => !/ing$/.test(String(f.Status ?? '')), `web function ${this.name} to become active`);
169
+ if (fn.Status !== 'Active') {
170
+ const reasons = fn.StatusReasons?.map(r => r.ErrorMessage).join('; ');
171
+ throw new CellError({
172
+ code: 'CELL_DEPLOY_FAILED',
173
+ message: `Web function ${this.name} is ${fn.Status}${reasons ? `: ${reasons}` : ''}.`,
174
+ hint: 'Look at the function in the SCF console (its logs show why scf_bootstrap failed); fix it and deploy again.',
175
+ });
176
+ }
177
+ }
178
+ checkOutput() {
179
+ if (this.context.manifest.preset !== 'scf') {
180
+ throw new CellError({
181
+ code: 'CELL_DEPLOY_OUTPUT_MISMATCH',
182
+ message: `${this.context.outDir} has no output of the scf preset (built with: ${this.context.manifest.preset ?? 'no preset'}).`,
183
+ hint: 'Run cell deploy --preset scf without --skip-build, or cell build --preset scf first.',
184
+ });
185
+ }
186
+ }
187
+ async step(name, call) {
188
+ try {
189
+ return await call();
190
+ }
191
+ catch (error) {
192
+ throw error instanceof CloudApiError ? CloudApi.failure('SCF', name, error) : error;
193
+ }
194
+ }
195
+ }
196
+ export const scfDeployer = defineDeployer({
197
+ name: 'scf',
198
+ description: 'Tencent Cloud SCF through its API (TENCENTCLOUD_SECRET_ID / _KEY)',
199
+ plan: context => new ScfDeployment(context).plan(),
200
+ apply: context => new ScfDeployment(context).apply(),
201
+ });
202
+ //# sourceMappingURL=scf-deployer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scf-deployer.js","sourceRoot":"","sources":["../../../src/preset/scf/scf-deployer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { type PresetOutputContext } from '@celljs/kit';
2
+ /**
3
+ * Tencent Cloud SCF web functions: `scf_bootstrap` starts the Cell server with the Node.js of the
4
+ * runtime on port 9000, and a function URL sends requests to it. Only /tmp is writable there.
5
+ */
6
+ export declare namespace ScfPreset {
7
+ const BOOTSTRAP = "scf_bootstrap";
8
+ const PORT = 9000;
9
+ const RUNTIMES: {
10
+ readonly 'Nodejs18.15': '/var/lang/node18/bin/node';
11
+ readonly 'Nodejs16.13': '/var/lang/node16/bin/node';
12
+ };
13
+ type Runtime = keyof typeof RUNTIMES;
14
+ const DEFAULT_RUNTIME: Runtime;
15
+ const OPTIONS: import("@celljs/kit").StandardSchema<unknown>;
16
+ function output(context: PresetOutputContext): void;
17
+ }
18
+ export declare const scfPreset: import("@celljs/kit").Preset;
19
+ //# sourceMappingURL=scf-preset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scf-preset.d.ts","sourceRoot":"","sources":["../../../src/preset/scf/scf-preset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAIrE;;;GAGG;AACH,yBAAiB,SAAS,CAAC;IAChB,MAAM,SAAS,kBAAkB,CAAC;IAClC,MAAM,IAAI,OAAO,CAAC;IAClB,MAAM,QAAQ;iBAAK,aAAa,EAAE,2BAA2B;iBAAE,aAAa,EAAE,2BAA2B;KAAW,CAAC;IAC5H,KAAY,OAAO,GAAG,MAAM,OAAO,QAAQ,CAAC;IACrC,MAAM,eAAe,EAAE,OAAuB,CAAC;IAE/C,MAAM,OAAO,+CAQlB,CAAC;IAEH,SAAgB,MAAM,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAQzD;CACJ;AAED,eAAO,MAAM,SAAS,8BAQpB,CAAC"}
@@ -0,0 +1,43 @@
1
+ import { definePreset } from '@celljs/kit';
2
+ import { PresetOptionsSchema } from '../../deploy/cloud-api.js';
3
+ import { ServerlessScripts } from '../serverless-scripts.js';
4
+ /**
5
+ * Tencent Cloud SCF web functions: `scf_bootstrap` starts the Cell server with the Node.js of the
6
+ * runtime on port 9000, and a function URL sends requests to it. Only /tmp is writable there.
7
+ */
8
+ export var ScfPreset;
9
+ (function (ScfPreset) {
10
+ ScfPreset.BOOTSTRAP = 'scf_bootstrap';
11
+ ScfPreset.PORT = 9000;
12
+ ScfPreset.RUNTIMES = { 'Nodejs18.15': '/var/lang/node18/bin/node', 'Nodejs16.13': '/var/lang/node16/bin/node' };
13
+ ScfPreset.DEFAULT_RUNTIME = 'Nodejs18.15';
14
+ ScfPreset.OPTIONS = PresetOptionsSchema.of({
15
+ name: 'string',
16
+ region: 'string',
17
+ namespace: 'string',
18
+ runtime: Object.keys(ScfPreset.RUNTIMES),
19
+ memory: 'number',
20
+ timeout: 'number',
21
+ env: 'env',
22
+ });
23
+ function output(context) {
24
+ const { manifest, options } = context;
25
+ if (!manifest.server) {
26
+ context.warn('The scf preset deploys a server, but the project builds no backend.');
27
+ return;
28
+ }
29
+ const node = ScfPreset.RUNTIMES[options.runtime ?? ScfPreset.DEFAULT_RUNTIME];
30
+ context.write(ScfPreset.BOOTSTRAP, ServerlessScripts.bootstrap({ preset: 'scf', node, port: ScfPreset.PORT, server: manifest.server }), 0o755);
31
+ }
32
+ ScfPreset.output = output;
33
+ })(ScfPreset || (ScfPreset = {}));
34
+ export const scfPreset = definePreset({
35
+ name: 'scf',
36
+ description: 'Tencent Cloud SCF web function (function URL)',
37
+ entry: 'http',
38
+ format: 'esm',
39
+ options: ScfPreset.OPTIONS,
40
+ output: context => ScfPreset.output(context),
41
+ deployer: 'scf',
42
+ });
43
+ //# sourceMappingURL=scf-preset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scf-preset.js","sourceRoot":"","sources":["../../../src/preset/scf/scf-preset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA4B,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D;;;GAGG;AACH,MAAM,KAAW,SAAS,CA0BzB;AA1BD,WAAiB,SAAS;IACT,mBAAS,GAAG,eAAe,CAAC;IAC5B,cAAI,GAAG,IAAI,CAAC;IACZ,kBAAQ,GAAG,EAAE,aAAa,EAAE,2BAA2B,EAAE,aAAa,EAAE,2BAA2B,EAAW,CAAC;IAE/G,yBAAe,GAAY,aAAa,CAAC;IAEzC,iBAAO,GAAG,mBAAmB,CAAC,EAAE,CAAC;QAC1C,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,kBAAQ,CAAC;QAC9B,MAAM,EAAE,QAAQ;QAChB,OAAO,EAAE,QAAQ;QACjB,GAAG,EAAE,KAAK;KACb,CAAC,CAAC;IAEH,SAAgB,MAAM,CAAC,OAA4B;QAC/C,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QACtC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACnB,OAAO,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;YACpF,OAAO;QACX,CAAC;QACD,MAAM,IAAI,GAAG,kBAAQ,CAAE,OAAO,CAAC,OAA+B,IAAI,yBAAe,CAAC,CAAC;QACnF,OAAO,CAAC,KAAK,CAAC,mBAAS,EAAE,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,cAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;IAC/H,CAAC;IARe,UAAA,MAAM,SAQrB,CAAA;AACL,CAAC,EA1BgB,SAAS,KAAT,SAAS,QA0BzB;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,YAAY,CAAC;IAClC,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,+CAA+C;IAC5D,KAAK,EAAE,MAAM;IACb,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,SAAS,CAAC,OAAO;IAC1B,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;IAC5C,QAAQ,EAAE,KAAK;CAClB,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=serverless-deployers.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serverless-deployers.spec.d.ts","sourceRoot":"","sources":["../../src/preset/serverless-deployers.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,307 @@
1
+ import { afterAll, describe, expect, it } from 'bun:test';
2
+ import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join } from 'node:path';
5
+ import { FcDeployment } from './fc/fc-deployer.js';
6
+ import { LambdaDeployment } from './lambda/lambda-deployer.js';
7
+ import { ScfDeployment } from './scf/scf-deployer.js';
8
+ /** A cloud that records requests and answers from a script of handlers, tried in order. */
9
+ class FakeCloud {
10
+ answer;
11
+ calls = [];
12
+ slept = 0;
13
+ constructor(answer) {
14
+ this.answer = answer;
15
+ }
16
+ fetch = async (url, init) => {
17
+ const raw = init.body;
18
+ let body = raw;
19
+ try {
20
+ body = raw ? JSON.parse(raw) : undefined;
21
+ }
22
+ catch {
23
+ // form or text
24
+ }
25
+ const call = { method: init.method ?? 'GET', url, headers: init.headers, body };
26
+ this.calls.push(call);
27
+ const a = this.answer(call, this.calls);
28
+ return new Response(a.text ?? (a.json === undefined ? '' : JSON.stringify(a.json)), { status: a.status ?? 200, headers: a.headers });
29
+ };
30
+ sleep = async (ms) => {
31
+ this.slept += ms;
32
+ };
33
+ now = () => new Date('2026-11-08T00:00:00Z');
34
+ actions() {
35
+ return this.calls.map(c => {
36
+ const iam = typeof c.body === 'string' ? new URLSearchParams(c.body).get('Action') : undefined;
37
+ return c.headers['x-acs-action'] ?? c.headers['x-tc-action'] ?? `${c.method} ${new URL(c.url).pathname}${iam ? ` ${iam}` : ''}`;
38
+ });
39
+ }
40
+ }
41
+ const dirs = [];
42
+ function context(preset, options = {}, env = {}) {
43
+ const root = mkdtempSync(join(tmpdir(), 'cell-deployer-'));
44
+ dirs.push(root);
45
+ writeFileSync(join(root, 'package.json'), JSON.stringify({ name: '@acme/Shop_App' }));
46
+ const outDir = join(root, '.cell/output');
47
+ mkdirSync(join(outDir, 'server'), { recursive: true });
48
+ writeFileSync(join(outDir, 'server/index.mjs'), 'console.log(1)');
49
+ writeFileSync(join(outDir, 'bootstrap'), '#!/bin/bash\n');
50
+ const manifest = { schemaVersion: 1, preset, format: 'esm', targets: ['backend'], server: 'server/index.mjs' };
51
+ const messages = [];
52
+ return {
53
+ root,
54
+ outDir,
55
+ manifest,
56
+ env,
57
+ options,
58
+ messages,
59
+ info: m => messages.push(m),
60
+ warn: m => messages.push(`warning: ${m}`),
61
+ relay: () => { },
62
+ };
63
+ }
64
+ afterAll(() => {
65
+ for (const dir of dirs) {
66
+ rmSync(dir, { recursive: true, force: true });
67
+ }
68
+ });
69
+ const ALIBABA = { ALIBABA_CLOUD_ACCESS_KEY_ID: 'ak', ALIBABA_CLOUD_ACCESS_KEY_SECRET: 'sk' };
70
+ const TENCENT = { TENCENTCLOUD_SECRET_ID: 'id', TENCENTCLOUD_SECRET_KEY: 'key' };
71
+ const AWS = { AWS_ACCESS_KEY_ID: 'AKID', AWS_SECRET_ACCESS_KEY: 'secret', AWS_SHARED_CREDENTIALS_FILE: '/nonexistent' };
72
+ describe('FcDeployment', () => {
73
+ it('plans without credentials: the function and trigger, with a warning', async () => {
74
+ const ctx = context('fc');
75
+ const plan = await new FcDeployment(ctx, new FakeCloud(() => ({}))).plan();
76
+ expect(plan.resources.map(r => [r.type, r.name, r.action])).toEqual([
77
+ ['function', 'shop-app', 'deploy'],
78
+ ['http-trigger', 'http', 'deploy'],
79
+ ]);
80
+ expect(plan.resources[0].details).toMatchObject({
81
+ region: 'cn-hangzhou',
82
+ runtime: 'custom.debian10 (Node.js 20)',
83
+ memorySize: 1024,
84
+ cpu: 0.5,
85
+ timeout: 60,
86
+ });
87
+ expect(plan.details).toMatchObject({ credentials: 'missing' });
88
+ expect(ctx.messages[0]).toStartWith('warning: No Alibaba Cloud credentials');
89
+ });
90
+ it('creates the function and an anonymous HTTP trigger, then returns its URL', async () => {
91
+ let state = 'Pending';
92
+ const cloud = new FakeCloud(({ method, url }) => {
93
+ const path = new URL(url).pathname;
94
+ if (method === 'GET' && path === '/2023-03-30/functions/shop') {
95
+ const exists = cloud.calls.some(c => c.method === 'POST' && new URL(c.url).pathname === '/2023-03-30/functions');
96
+ if (!exists) {
97
+ return { status: 404, json: { Code: 'FunctionNotFound', Message: 'function not found', RequestId: 'r1' } };
98
+ }
99
+ const answer = { json: { state, lastUpdateStatus: 'Successful' } };
100
+ state = 'Active';
101
+ return answer;
102
+ }
103
+ if (method === 'GET' && path.endsWith('/triggers/http')) {
104
+ return { status: 404, json: { Code: 'TriggerNotFound', Message: 'no trigger' } };
105
+ }
106
+ if (method === 'POST' && path.endsWith('/triggers')) {
107
+ return { json: { triggerName: 'http', httpTrigger: { urlInternet: 'https://shop-abc.cn-shanghai.fcapp.run' } } };
108
+ }
109
+ return { json: {} };
110
+ });
111
+ const ctx = context('fc', { name: 'shop', region: 'cn-shanghai', memory: 2048, env: { DB: 'x' } }, ALIBABA);
112
+ const deployment = await new FcDeployment(ctx, cloud).apply();
113
+ expect(deployment.url).toBe('https://shop-abc.cn-shanghai.fcapp.run');
114
+ expect(cloud.actions()).toEqual(['GetFunction', 'CreateFunction', 'GetFunction', 'GetFunction', 'GetTrigger', 'CreateTrigger']);
115
+ const create = cloud.calls[1];
116
+ expect(new URL(create.url).host).toBe('fcv3.cn-shanghai.aliyuncs.com');
117
+ expect(create.headers.authorization).toStartWith('ACS3-HMAC-SHA256 Credential=ak,');
118
+ expect(create.body).toMatchObject({
119
+ functionName: 'shop',
120
+ runtime: 'custom.debian10',
121
+ customRuntimeConfig: { command: ['/code/bootstrap'], port: 9000 },
122
+ memorySize: 2048,
123
+ cpu: 1,
124
+ environmentVariables: { NODE_ENV: 'production', DB: 'x' },
125
+ });
126
+ expect(Buffer.from(create.body.code.zipFile, 'base64').subarray(0, 4).toString('hex')).toBe('504b0304');
127
+ expect(JSON.parse(cloud.calls[5].body.triggerConfig)).toMatchObject({ authType: 'anonymous' });
128
+ expect(cloud.slept).toBeGreaterThan(0);
129
+ });
130
+ it('updates an existing function and keeps its trigger', async () => {
131
+ const cloud = new FakeCloud(({ method, url }) => method === 'GET' && url.endsWith('/triggers/http') ? { json: { httpTrigger: { urlInternet: 'https://u' } } } : { json: { state: 'Active' } });
132
+ const deployment = await new FcDeployment(context('fc', {}, ALIBABA), cloud).apply();
133
+ expect(cloud.actions()).toEqual(['GetFunction', 'UpdateFunction', 'GetFunction', 'GetTrigger']);
134
+ expect(cloud.calls[1].method).toBe('PUT');
135
+ expect(cloud.calls[1].body.functionName).toBeUndefined();
136
+ expect(deployment.url).toBe('https://u');
137
+ });
138
+ it('reports API errors with the code of the cloud, and missing credentials', async () => {
139
+ const denied = new FakeCloud(() => ({
140
+ status: 403,
141
+ json: { Code: 'InvalidAccessKeyId.NotFound', Message: 'Specified access key is not found.', RequestId: 'req-9' },
142
+ }));
143
+ await expect(new FcDeployment(context('fc', {}, ALIBABA), denied).apply()).rejects.toMatchObject({
144
+ code: 'CELL_DEPLOY_UNAUTHORIZED',
145
+ message: 'Function Compute GetFunction failed: [InvalidAccessKeyId.NotFound] Specified access key is not found. (request req-9)',
146
+ });
147
+ await expect(new FcDeployment(context('fc'), denied).apply()).rejects.toMatchObject({ code: 'CELL_DEPLOY_CREDENTIALS_MISSING' });
148
+ await expect(new FcDeployment(context('scf'), denied).plan()).rejects.toMatchObject({ code: 'CELL_DEPLOY_OUTPUT_MISMATCH' });
149
+ });
150
+ });
151
+ describe('ScfDeployment', () => {
152
+ const response = (body) => ({ json: { Response: { RequestId: 'r', ...body } } });
153
+ it('creates a web function and a function URL, waiting while it is creating', async () => {
154
+ let status = 'Creating';
155
+ let triggers = [];
156
+ const cloud = new FakeCloud(({ headers }) => {
157
+ switch (headers['x-tc-action']) {
158
+ case 'GetFunction':
159
+ if (!cloud.calls.some(c => c.headers['x-tc-action'] === 'CreateFunction')) {
160
+ return response({ Error: { Code: 'ResourceNotFound.Function', Message: 'not found' } });
161
+ }
162
+ {
163
+ const current = status;
164
+ status = 'Active';
165
+ return response({ Status: current });
166
+ }
167
+ case 'ListTriggers':
168
+ return response({ Triggers: triggers });
169
+ case 'CreateTrigger':
170
+ triggers = [
171
+ {
172
+ Type: 'http',
173
+ TriggerDesc: JSON.stringify({ NetConfig: { EnableExtranet: true } }),
174
+ Url: 'https://1250000000-abc.ap-guangzhou.tencentscf.com',
175
+ },
176
+ ];
177
+ return response({});
178
+ default:
179
+ return response({});
180
+ }
181
+ });
182
+ const ctx = context('scf', { memory: 300, env: { A: '1' } }, TENCENT);
183
+ const deployment = await new ScfDeployment(ctx, cloud).apply();
184
+ expect(cloud.actions()).toEqual(['GetFunction', 'CreateFunction', 'GetFunction', 'GetFunction', 'ListTriggers', 'CreateTrigger', 'ListTriggers']);
185
+ const create = cloud.calls[1];
186
+ expect(create.headers.authorization).toStartWith('TC3-HMAC-SHA256 Credential=id/2026-11-08/scf/tc3_request');
187
+ expect(create.headers['x-tc-region']).toBe('ap-guangzhou');
188
+ expect(create.body).toMatchObject({
189
+ FunctionName: 'shop-app',
190
+ Namespace: 'default',
191
+ Type: 'HTTP',
192
+ Runtime: 'Nodejs18.15',
193
+ MemorySize: 384,
194
+ Environment: {
195
+ Variables: [
196
+ { Key: 'NODE_ENV', Value: 'production' },
197
+ { Key: 'A', Value: '1' },
198
+ ],
199
+ },
200
+ });
201
+ expect(JSON.parse(cloud.calls[5].body.TriggerDesc)).toEqual({ AuthType: 'NONE', NetConfig: { EnableIntranet: false, EnableExtranet: true } });
202
+ expect(deployment.url).toBe('https://1250000000-abc.ap-guangzhou.tencentscf.com');
203
+ });
204
+ it('updates code then configuration of an existing function, and reports a failed start', async () => {
205
+ const cloud = new FakeCloud(({ headers }) => {
206
+ const action = headers['x-tc-action'];
207
+ if (action === 'GetFunction') {
208
+ const updated = cloud.calls.some(c => c.headers['x-tc-action'] === 'UpdateFunctionConfiguration');
209
+ return response(updated ? { Status: 'UpdateFailed', StatusReasons: [{ ErrorMessage: 'scf_bootstrap exited' }] } : { Status: 'Active' });
210
+ }
211
+ return response({});
212
+ });
213
+ await expect(new ScfDeployment(context('scf', {}, TENCENT), cloud).apply()).rejects.toMatchObject({
214
+ code: 'CELL_DEPLOY_FAILED',
215
+ message: 'Web function shop-app is UpdateFailed: scf_bootstrap exited.',
216
+ });
217
+ expect(cloud.actions()).toEqual(['GetFunction', 'GetFunction', 'UpdateFunctionCode', 'GetFunction', 'UpdateFunctionConfiguration', 'GetFunction']);
218
+ });
219
+ it('turns an error of the API into a CellError', async () => {
220
+ const cloud = new FakeCloud(() => response({ Error: { Code: 'AuthFailure.SignatureFailure', Message: 'The provided credentials could not be validated.' } }));
221
+ await expect(new ScfDeployment(context('scf', {}, TENCENT), cloud).plan()).rejects.toMatchObject({ code: 'CELL_DEPLOY_UNAUTHORIZED' });
222
+ });
223
+ });
224
+ describe('LambdaDeployment', () => {
225
+ it('creates the execution role, the function (retrying while the role propagates) and a public function URL', async () => {
226
+ let createAttempts = 0;
227
+ const cloud = new FakeCloud(({ method, url, body }) => {
228
+ const path = new URL(url).pathname;
229
+ if (url.startsWith('https://iam.amazonaws.com')) {
230
+ const action = new URLSearchParams(body).get('Action');
231
+ if (action === 'GetRole') {
232
+ return { status: 404, text: '<ErrorResponse><Error><Code>NoSuchEntity</Code><Message>no role</Message></Error></ErrorResponse>' };
233
+ }
234
+ return { text: '<CreateRoleResponse><Role><Arn>arn:aws:iam::123:role/cell-lambda-execution</Arn></Role></CreateRoleResponse>' };
235
+ }
236
+ if (method === 'GET' && path === '/2015-03-31/functions/shop-app') {
237
+ return { status: 404, json: { message: 'Function not found' }, headers: { 'x-amzn-errortype': 'ResourceNotFoundException:http://internal' } };
238
+ }
239
+ if (method === 'POST' && path === '/2015-03-31/functions') {
240
+ createAttempts++;
241
+ return createAttempts === 1
242
+ ? {
243
+ status: 400,
244
+ json: { message: 'The role defined for the function cannot be assumed by Lambda.' },
245
+ headers: { 'x-amzn-errortype': 'InvalidParameterValueException' },
246
+ }
247
+ : { json: {} };
248
+ }
249
+ if (path.endsWith('/configuration')) {
250
+ return { json: { State: 'Active', LastUpdateStatus: 'Successful' } };
251
+ }
252
+ if (method === 'GET' && path.endsWith('/url')) {
253
+ return { status: 404, json: { message: 'none' }, headers: { 'x-amzn-errortype': 'ResourceNotFoundException' } };
254
+ }
255
+ if (method === 'POST' && path.endsWith('/url')) {
256
+ return { json: { FunctionUrl: 'https://abc.lambda-url.eu-west-1.on.aws/' } };
257
+ }
258
+ if (path.endsWith('/policy') && body.StatementId === 'cell-function-url') {
259
+ return { status: 409, json: { message: 'exists' }, headers: { 'x-amzn-errortype': 'ResourceConflictException' } };
260
+ }
261
+ return { json: {} };
262
+ });
263
+ const ctx = context('lambda', { region: 'eu-west-1', architecture: 'arm64' }, AWS);
264
+ const deployment = await new LambdaDeployment(ctx, cloud).apply();
265
+ expect(deployment.url).toBe('https://abc.lambda-url.eu-west-1.on.aws/');
266
+ expect(cloud.actions()).toEqual([
267
+ 'GET /2015-03-31/functions/shop-app',
268
+ 'POST / GetRole',
269
+ 'POST / CreateRole',
270
+ 'POST / AttachRolePolicy',
271
+ 'POST /2015-03-31/functions',
272
+ 'POST /2015-03-31/functions',
273
+ 'GET /2015-03-31/functions/shop-app/configuration',
274
+ 'GET /2021-10-31/functions/shop-app/url',
275
+ 'POST /2021-10-31/functions/shop-app/url',
276
+ 'POST /2015-03-31/functions/shop-app/policy',
277
+ 'POST /2015-03-31/functions/shop-app/policy',
278
+ ]);
279
+ const create = cloud.calls[5];
280
+ expect(create.headers.authorization).toStartWith('AWS4-HMAC-SHA256 Credential=AKID/20261108/eu-west-1/lambda/aws4_request');
281
+ expect(create.body).toMatchObject({
282
+ FunctionName: 'shop-app',
283
+ Role: 'arn:aws:iam::123:role/cell-lambda-execution',
284
+ Runtime: 'nodejs22.x',
285
+ Handler: 'server/lambda.handler',
286
+ Architectures: ['arm64'],
287
+ });
288
+ expect(cloud.calls[10].body).toEqual({
289
+ StatementId: 'cell-function-url-invoke',
290
+ Action: 'lambda:InvokeFunction',
291
+ Principal: '*',
292
+ InvokedViaFunctionUrl: true,
293
+ });
294
+ });
295
+ it('reads credentials from ~/.aws/credentials and plans the role only without lambda.role', async () => {
296
+ const home = mkdtempSync(join(tmpdir(), 'cell-aws-'));
297
+ dirs.push(home);
298
+ mkdirSync(join(home, '.aws'));
299
+ writeFileSync(join(home, '.aws/credentials'), '[default]\naws_access_key_id = A\naws_secret_access_key = B\n[profile work]\naws_access_key_id = W\naws_secret_access_key = X\n');
300
+ const { CloudCredentials } = await import('../deploy/cloud-api.js');
301
+ expect(CloudCredentials.aws({}, home)).toEqual({ accessKeyId: 'A', secretAccessKey: 'B', sessionToken: undefined });
302
+ expect(CloudCredentials.aws({ AWS_PROFILE: 'work' }, home)?.accessKeyId).toBe('W');
303
+ const plan = await new LambdaDeployment(context('lambda', { role: 'arn:aws:iam::1:role/r' }, { AWS_SHARED_CREDENTIALS_FILE: '/nonexistent' }), new FakeCloud(() => ({}))).plan();
304
+ expect(plan.resources.map(r => r.type)).toEqual(['function', 'function-url']);
305
+ });
306
+ });
307
+ //# sourceMappingURL=serverless-deployers.spec.js.map