@cicore/cli 1.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 (337) hide show
  1. package/bin/ci.js +13 -0
  2. package/dist/commands/addon/api-actions.d.ts +45 -0
  3. package/dist/commands/addon/api-actions.d.ts.map +1 -0
  4. package/dist/commands/addon/api-actions.js +281 -0
  5. package/dist/commands/addon/api-actions.js.map +1 -0
  6. package/dist/commands/addon/build.d.ts +11 -0
  7. package/dist/commands/addon/build.d.ts.map +1 -0
  8. package/dist/commands/addon/build.js +182 -0
  9. package/dist/commands/addon/build.js.map +1 -0
  10. package/dist/commands/addon/create.d.ts +11 -0
  11. package/dist/commands/addon/create.d.ts.map +1 -0
  12. package/dist/commands/addon/create.js +1186 -0
  13. package/dist/commands/addon/create.js.map +1 -0
  14. package/dist/commands/addon/delete.d.ts +13 -0
  15. package/dist/commands/addon/delete.d.ts.map +1 -0
  16. package/dist/commands/addon/delete.js +83 -0
  17. package/dist/commands/addon/delete.js.map +1 -0
  18. package/dist/commands/addon/deploy.d.ts +27 -0
  19. package/dist/commands/addon/deploy.d.ts.map +1 -0
  20. package/dist/commands/addon/deploy.js +459 -0
  21. package/dist/commands/addon/deploy.js.map +1 -0
  22. package/dist/commands/addon/dev-deploy.d.ts +31 -0
  23. package/dist/commands/addon/dev-deploy.d.ts.map +1 -0
  24. package/dist/commands/addon/dev-deploy.js +128 -0
  25. package/dist/commands/addon/dev-deploy.js.map +1 -0
  26. package/dist/commands/addon/dev.d.ts +36 -0
  27. package/dist/commands/addon/dev.d.ts.map +1 -0
  28. package/dist/commands/addon/dev.js +323 -0
  29. package/dist/commands/addon/dev.js.map +1 -0
  30. package/dist/commands/addon/extract-classes.d.ts +23 -0
  31. package/dist/commands/addon/extract-classes.d.ts.map +1 -0
  32. package/dist/commands/addon/extract-classes.js +281 -0
  33. package/dist/commands/addon/extract-classes.js.map +1 -0
  34. package/dist/commands/addon/generate-safelist.d.ts +24 -0
  35. package/dist/commands/addon/generate-safelist.d.ts.map +1 -0
  36. package/dist/commands/addon/generate-safelist.js +276 -0
  37. package/dist/commands/addon/generate-safelist.js.map +1 -0
  38. package/dist/commands/addon/index.d.ts +19 -0
  39. package/dist/commands/addon/index.d.ts.map +1 -0
  40. package/dist/commands/addon/index.js +296 -0
  41. package/dist/commands/addon/index.js.map +1 -0
  42. package/dist/commands/addon/init-repo.d.ts +25 -0
  43. package/dist/commands/addon/init-repo.d.ts.map +1 -0
  44. package/dist/commands/addon/init-repo.js +171 -0
  45. package/dist/commands/addon/init-repo.js.map +1 -0
  46. package/dist/commands/addon/install.d.ts +23 -0
  47. package/dist/commands/addon/install.d.ts.map +1 -0
  48. package/dist/commands/addon/install.js +84 -0
  49. package/dist/commands/addon/install.js.map +1 -0
  50. package/dist/commands/addon/list.d.ts +10 -0
  51. package/dist/commands/addon/list.d.ts.map +1 -0
  52. package/dist/commands/addon/list.js +102 -0
  53. package/dist/commands/addon/list.js.map +1 -0
  54. package/dist/commands/addon/manifest-refresh.d.ts +17 -0
  55. package/dist/commands/addon/manifest-refresh.d.ts.map +1 -0
  56. package/dist/commands/addon/manifest-refresh.js +48 -0
  57. package/dist/commands/addon/manifest-refresh.js.map +1 -0
  58. package/dist/commands/addon/migrate.d.ts +40 -0
  59. package/dist/commands/addon/migrate.d.ts.map +1 -0
  60. package/dist/commands/addon/migrate.js +236 -0
  61. package/dist/commands/addon/migrate.js.map +1 -0
  62. package/dist/commands/addon/publish.d.ts +33 -0
  63. package/dist/commands/addon/publish.d.ts.map +1 -0
  64. package/dist/commands/addon/publish.js +236 -0
  65. package/dist/commands/addon/publish.js.map +1 -0
  66. package/dist/commands/addon/scaffold-quality.d.ts +21 -0
  67. package/dist/commands/addon/scaffold-quality.d.ts.map +1 -0
  68. package/dist/commands/addon/scaffold-quality.js +90 -0
  69. package/dist/commands/addon/scaffold-quality.js.map +1 -0
  70. package/dist/commands/addon/sign.d.ts +9 -0
  71. package/dist/commands/addon/sign.d.ts.map +1 -0
  72. package/dist/commands/addon/sign.js +83 -0
  73. package/dist/commands/addon/sign.js.map +1 -0
  74. package/dist/commands/addon/toggle.d.ts +6 -0
  75. package/dist/commands/addon/toggle.d.ts.map +1 -0
  76. package/dist/commands/addon/toggle.js +46 -0
  77. package/dist/commands/addon/toggle.js.map +1 -0
  78. package/dist/commands/agent/index.d.ts +34 -0
  79. package/dist/commands/agent/index.d.ts.map +1 -0
  80. package/dist/commands/agent/index.js +564 -0
  81. package/dist/commands/agent/index.js.map +1 -0
  82. package/dist/commands/brand/index.d.ts +54 -0
  83. package/dist/commands/brand/index.d.ts.map +1 -0
  84. package/dist/commands/brand/index.js +367 -0
  85. package/dist/commands/brand/index.js.map +1 -0
  86. package/dist/commands/build/index.d.ts +53 -0
  87. package/dist/commands/build/index.d.ts.map +1 -0
  88. package/dist/commands/build/index.js +726 -0
  89. package/dist/commands/build/index.js.map +1 -0
  90. package/dist/commands/cache/flush-local.d.ts +31 -0
  91. package/dist/commands/cache/flush-local.d.ts.map +1 -0
  92. package/dist/commands/cache/flush-local.js +161 -0
  93. package/dist/commands/cache/flush-local.js.map +1 -0
  94. package/dist/commands/cache/index.d.ts +14 -0
  95. package/dist/commands/cache/index.d.ts.map +1 -0
  96. package/dist/commands/cache/index.js +453 -0
  97. package/dist/commands/cache/index.js.map +1 -0
  98. package/dist/commands/check/index.d.ts +8 -0
  99. package/dist/commands/check/index.d.ts.map +1 -0
  100. package/dist/commands/check/index.js +1316 -0
  101. package/dist/commands/check/index.js.map +1 -0
  102. package/dist/commands/cloudflare/index.d.ts +8 -0
  103. package/dist/commands/cloudflare/index.d.ts.map +1 -0
  104. package/dist/commands/cloudflare/index.js +453 -0
  105. package/dist/commands/cloudflare/index.js.map +1 -0
  106. package/dist/commands/core/create.d.ts +12 -0
  107. package/dist/commands/core/create.d.ts.map +1 -0
  108. package/dist/commands/core/create.js +206 -0
  109. package/dist/commands/core/create.js.map +1 -0
  110. package/dist/commands/core/delete.d.ts +11 -0
  111. package/dist/commands/core/delete.d.ts.map +1 -0
  112. package/dist/commands/core/delete.js +64 -0
  113. package/dist/commands/core/delete.js.map +1 -0
  114. package/dist/commands/core/env.d.ts +12 -0
  115. package/dist/commands/core/env.d.ts.map +1 -0
  116. package/dist/commands/core/env.js +95 -0
  117. package/dist/commands/core/env.js.map +1 -0
  118. package/dist/commands/core/health.d.ts +6 -0
  119. package/dist/commands/core/health.d.ts.map +1 -0
  120. package/dist/commands/core/health.js +215 -0
  121. package/dist/commands/core/health.js.map +1 -0
  122. package/dist/commands/core/index.d.ts +15 -0
  123. package/dist/commands/core/index.d.ts.map +1 -0
  124. package/dist/commands/core/index.js +86 -0
  125. package/dist/commands/core/index.js.map +1 -0
  126. package/dist/commands/core/list.d.ts +11 -0
  127. package/dist/commands/core/list.d.ts.map +1 -0
  128. package/dist/commands/core/list.js +58 -0
  129. package/dist/commands/core/list.js.map +1 -0
  130. package/dist/commands/core/rebuild.d.ts +13 -0
  131. package/dist/commands/core/rebuild.d.ts.map +1 -0
  132. package/dist/commands/core/rebuild.js +119 -0
  133. package/dist/commands/core/rebuild.js.map +1 -0
  134. package/dist/commands/db/index.d.ts +23 -0
  135. package/dist/commands/db/index.d.ts.map +1 -0
  136. package/dist/commands/db/index.js +355 -0
  137. package/dist/commands/db/index.js.map +1 -0
  138. package/dist/commands/db/promote-silo.d.ts +320 -0
  139. package/dist/commands/db/promote-silo.d.ts.map +1 -0
  140. package/dist/commands/db/promote-silo.js +930 -0
  141. package/dist/commands/db/promote-silo.js.map +1 -0
  142. package/dist/commands/db/relocate.d.ts +41 -0
  143. package/dist/commands/db/relocate.d.ts.map +1 -0
  144. package/dist/commands/db/relocate.js +482 -0
  145. package/dist/commands/db/relocate.js.map +1 -0
  146. package/dist/commands/db/rollback-silo.d.ts +44 -0
  147. package/dist/commands/db/rollback-silo.d.ts.map +1 -0
  148. package/dist/commands/db/rollback-silo.js +402 -0
  149. package/dist/commands/db/rollback-silo.js.map +1 -0
  150. package/dist/commands/deploy/index.d.ts +26 -0
  151. package/dist/commands/deploy/index.d.ts.map +1 -0
  152. package/dist/commands/deploy/index.js +107 -0
  153. package/dist/commands/deploy/index.js.map +1 -0
  154. package/dist/commands/devops/index.d.ts +6 -0
  155. package/dist/commands/devops/index.d.ts.map +1 -0
  156. package/dist/commands/devops/index.js +220 -0
  157. package/dist/commands/devops/index.js.map +1 -0
  158. package/dist/commands/domain/index.d.ts +8 -0
  159. package/dist/commands/domain/index.d.ts.map +1 -0
  160. package/dist/commands/domain/index.js +386 -0
  161. package/dist/commands/domain/index.js.map +1 -0
  162. package/dist/commands/image/index.d.ts +8 -0
  163. package/dist/commands/image/index.d.ts.map +1 -0
  164. package/dist/commands/image/index.js +308 -0
  165. package/dist/commands/image/index.js.map +1 -0
  166. package/dist/commands/install/factory-reset.d.ts +21 -0
  167. package/dist/commands/install/factory-reset.d.ts.map +1 -0
  168. package/dist/commands/install/factory-reset.js +83 -0
  169. package/dist/commands/install/factory-reset.js.map +1 -0
  170. package/dist/commands/install/index.d.ts +17 -0
  171. package/dist/commands/install/index.d.ts.map +1 -0
  172. package/dist/commands/install/index.js +44 -0
  173. package/dist/commands/install/index.js.map +1 -0
  174. package/dist/commands/install/install.d.ts +35 -0
  175. package/dist/commands/install/install.d.ts.map +1 -0
  176. package/dist/commands/install/install.js +171 -0
  177. package/dist/commands/install/install.js.map +1 -0
  178. package/dist/commands/login/index.d.ts +15 -0
  179. package/dist/commands/login/index.d.ts.map +1 -0
  180. package/dist/commands/login/index.js +58 -0
  181. package/dist/commands/login/index.js.map +1 -0
  182. package/dist/commands/nginx/index.d.ts +11 -0
  183. package/dist/commands/nginx/index.d.ts.map +1 -0
  184. package/dist/commands/nginx/index.js +580 -0
  185. package/dist/commands/nginx/index.js.map +1 -0
  186. package/dist/commands/server/bootstrap.d.ts +25 -0
  187. package/dist/commands/server/bootstrap.d.ts.map +1 -0
  188. package/dist/commands/server/bootstrap.js +260 -0
  189. package/dist/commands/server/bootstrap.js.map +1 -0
  190. package/dist/commands/server/index.d.ts +8 -0
  191. package/dist/commands/server/index.d.ts.map +1 -0
  192. package/dist/commands/server/index.js +2524 -0
  193. package/dist/commands/server/index.js.map +1 -0
  194. package/dist/commands/setup/index.d.ts +34 -0
  195. package/dist/commands/setup/index.d.ts.map +1 -0
  196. package/dist/commands/setup/index.js +423 -0
  197. package/dist/commands/setup/index.js.map +1 -0
  198. package/dist/commands/ssl/index.d.ts +8 -0
  199. package/dist/commands/ssl/index.d.ts.map +1 -0
  200. package/dist/commands/ssl/index.js +275 -0
  201. package/dist/commands/ssl/index.js.map +1 -0
  202. package/dist/commands/superadmin/index.d.ts +16 -0
  203. package/dist/commands/superadmin/index.d.ts.map +1 -0
  204. package/dist/commands/superadmin/index.js +81 -0
  205. package/dist/commands/superadmin/index.js.map +1 -0
  206. package/dist/commands/tenant/index.d.ts +6 -0
  207. package/dist/commands/tenant/index.d.ts.map +1 -0
  208. package/dist/commands/tenant/index.js +192 -0
  209. package/dist/commands/tenant/index.js.map +1 -0
  210. package/dist/index.d.ts +11 -0
  211. package/dist/index.d.ts.map +1 -0
  212. package/dist/index.js +107 -0
  213. package/dist/index.js.map +1 -0
  214. package/dist/lib/addon-sign.d.ts +23 -0
  215. package/dist/lib/addon-sign.d.ts.map +1 -0
  216. package/dist/lib/addon-sign.js +39 -0
  217. package/dist/lib/addon-sign.js.map +1 -0
  218. package/dist/lib/addon-sign.test.d.ts +2 -0
  219. package/dist/lib/addon-sign.test.d.ts.map +1 -0
  220. package/dist/lib/addon-sign.test.js +27 -0
  221. package/dist/lib/addon-sign.test.js.map +1 -0
  222. package/dist/lib/cdn.d.ts +25 -0
  223. package/dist/lib/cdn.d.ts.map +1 -0
  224. package/dist/lib/cdn.js +131 -0
  225. package/dist/lib/cdn.js.map +1 -0
  226. package/dist/lib/cloudflare.d.ts +133 -0
  227. package/dist/lib/cloudflare.d.ts.map +1 -0
  228. package/dist/lib/cloudflare.js +435 -0
  229. package/dist/lib/cloudflare.js.map +1 -0
  230. package/dist/lib/config.d.ts +96 -0
  231. package/dist/lib/config.d.ts.map +1 -0
  232. package/dist/lib/config.js +132 -0
  233. package/dist/lib/config.js.map +1 -0
  234. package/dist/lib/env.d.ts +8 -0
  235. package/dist/lib/env.d.ts.map +1 -0
  236. package/dist/lib/env.js +64 -0
  237. package/dist/lib/env.js.map +1 -0
  238. package/dist/lib/hosts.d.ts +194 -0
  239. package/dist/lib/hosts.d.ts.map +1 -0
  240. package/dist/lib/hosts.js +183 -0
  241. package/dist/lib/hosts.js.map +1 -0
  242. package/dist/lib/logger.d.ts +68 -0
  243. package/dist/lib/logger.d.ts.map +1 -0
  244. package/dist/lib/logger.js +130 -0
  245. package/dist/lib/logger.js.map +1 -0
  246. package/dist/lib/nginx-config.d.ts +78 -0
  247. package/dist/lib/nginx-config.d.ts.map +1 -0
  248. package/dist/lib/nginx-config.js +736 -0
  249. package/dist/lib/nginx-config.js.map +1 -0
  250. package/dist/lib/ops/addon-dev.d.ts +93 -0
  251. package/dist/lib/ops/addon-dev.d.ts.map +1 -0
  252. package/dist/lib/ops/addon-dev.js +237 -0
  253. package/dist/lib/ops/addon-dev.js.map +1 -0
  254. package/dist/lib/ops/addon-quality.d.ts +38 -0
  255. package/dist/lib/ops/addon-quality.d.ts.map +1 -0
  256. package/dist/lib/ops/addon-quality.js +338 -0
  257. package/dist/lib/ops/addon-quality.js.map +1 -0
  258. package/dist/lib/ops/addon-routes.d.ts +49 -0
  259. package/dist/lib/ops/addon-routes.d.ts.map +1 -0
  260. package/dist/lib/ops/addon-routes.js +189 -0
  261. package/dist/lib/ops/addon-routes.js.map +1 -0
  262. package/dist/lib/ops/addon.d.ts +120 -0
  263. package/dist/lib/ops/addon.d.ts.map +1 -0
  264. package/dist/lib/ops/addon.js +260 -0
  265. package/dist/lib/ops/addon.js.map +1 -0
  266. package/dist/lib/ops/cdn.d.ts +87 -0
  267. package/dist/lib/ops/cdn.d.ts.map +1 -0
  268. package/dist/lib/ops/cdn.js +170 -0
  269. package/dist/lib/ops/cdn.js.map +1 -0
  270. package/dist/lib/ops/cf.d.ts +36 -0
  271. package/dist/lib/ops/cf.d.ts.map +1 -0
  272. package/dist/lib/ops/cf.js +114 -0
  273. package/dist/lib/ops/cf.js.map +1 -0
  274. package/dist/lib/ops/compose.d.ts +95 -0
  275. package/dist/lib/ops/compose.d.ts.map +1 -0
  276. package/dist/lib/ops/compose.js +165 -0
  277. package/dist/lib/ops/compose.js.map +1 -0
  278. package/dist/lib/ops/core.d.ts +117 -0
  279. package/dist/lib/ops/core.d.ts.map +1 -0
  280. package/dist/lib/ops/core.js +322 -0
  281. package/dist/lib/ops/core.js.map +1 -0
  282. package/dist/lib/ops/db.d.ts +116 -0
  283. package/dist/lib/ops/db.d.ts.map +1 -0
  284. package/dist/lib/ops/db.js +351 -0
  285. package/dist/lib/ops/db.js.map +1 -0
  286. package/dist/lib/ops/dns.d.ts +111 -0
  287. package/dist/lib/ops/dns.d.ts.map +1 -0
  288. package/dist/lib/ops/dns.js +306 -0
  289. package/dist/lib/ops/dns.js.map +1 -0
  290. package/dist/lib/ops/image.d.ts +94 -0
  291. package/dist/lib/ops/image.d.ts.map +1 -0
  292. package/dist/lib/ops/image.js +159 -0
  293. package/dist/lib/ops/image.js.map +1 -0
  294. package/dist/lib/ops/nginx.d.ts +114 -0
  295. package/dist/lib/ops/nginx.d.ts.map +1 -0
  296. package/dist/lib/ops/nginx.js +388 -0
  297. package/dist/lib/ops/nginx.js.map +1 -0
  298. package/dist/lib/ops/redis.d.ts +7 -0
  299. package/dist/lib/ops/redis.d.ts.map +1 -0
  300. package/dist/lib/ops/redis.js +35 -0
  301. package/dist/lib/ops/redis.js.map +1 -0
  302. package/dist/lib/ops/ssh.d.ts +127 -0
  303. package/dist/lib/ops/ssh.d.ts.map +1 -0
  304. package/dist/lib/ops/ssh.js +269 -0
  305. package/dist/lib/ops/ssh.js.map +1 -0
  306. package/dist/lib/prompts.d.ts +46 -0
  307. package/dist/lib/prompts.d.ts.map +1 -0
  308. package/dist/lib/prompts.js +113 -0
  309. package/dist/lib/prompts.js.map +1 -0
  310. package/dist/lib/sast.d.ts +43 -0
  311. package/dist/lib/sast.d.ts.map +1 -0
  312. package/dist/lib/sast.js +79 -0
  313. package/dist/lib/sast.js.map +1 -0
  314. package/dist/lib/sast.test.d.ts +2 -0
  315. package/dist/lib/sast.test.d.ts.map +1 -0
  316. package/dist/lib/sast.test.js +33 -0
  317. package/dist/lib/sast.test.js.map +1 -0
  318. package/dist/lib/shell.d.ts +61 -0
  319. package/dist/lib/shell.d.ts.map +1 -0
  320. package/dist/lib/shell.js +183 -0
  321. package/dist/lib/shell.js.map +1 -0
  322. package/dist/lib/ssh-config.d.ts +37 -0
  323. package/dist/lib/ssh-config.d.ts.map +1 -0
  324. package/dist/lib/ssh-config.js +122 -0
  325. package/dist/lib/ssh-config.js.map +1 -0
  326. package/dist/lib/tenant-scope.d.ts +38 -0
  327. package/dist/lib/tenant-scope.d.ts.map +1 -0
  328. package/dist/lib/tenant-scope.js +129 -0
  329. package/dist/lib/tenant-scope.js.map +1 -0
  330. package/dist/lib/tenant-scope.test.d.ts +2 -0
  331. package/dist/lib/tenant-scope.test.d.ts.map +1 -0
  332. package/dist/lib/tenant-scope.test.js +223 -0
  333. package/dist/lib/tenant-scope.test.js.map +1 -0
  334. package/package.json +58 -0
  335. package/templates/bootstrap/.env.template +54 -0
  336. package/templates/bootstrap/docker-compose.yml +145 -0
  337. package/templates/vhost.conf.tmpl +446 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cdn.js","sourceRoot":"","sources":["../../../src/lib/ops/cdn.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * CiCore CLI — Cloudflare zone primitives
3
+ *
4
+ * Host-aware Cloudflare API calls for cache purge. Uses `cfg.cfZoneId` to
5
+ * scope each call to the right zone and `cfg.cfApiToken` (Bearer) for auth.
6
+ *
7
+ * Two purge modes:
8
+ * - {@link cfPurgeZone}: wipe the whole zone's edge cache. Use after a
9
+ * core deploy when many assets changed. Fast, but invalidates third-
10
+ * party content (e.g. /admin assets, public site) — accept the cost.
11
+ * - {@link cfPurgePaths}: surgical, list of specific URLs. Use for
12
+ * addon redeploys where only `cdn.X.com.tr/addons/<addon>/...` changed.
13
+ *
14
+ * Cloudflare's `/purge_cache` accepts up to 30 URLs per request on free
15
+ * plans, 500 on paid. We chunk on the lower bound (30) to stay safe across
16
+ * accounts; can lift later if profiling shows it matters.
17
+ */
18
+ import type { HostConfig } from '../hosts.js';
19
+ export interface CfResult {
20
+ readonly success: boolean;
21
+ readonly status: number;
22
+ readonly errorMessage: string;
23
+ }
24
+ /** Purge every cached asset in the zone. */
25
+ export declare function cfPurgeZone(cfg: HostConfig): Promise<CfResult>;
26
+ /**
27
+ * Purge a specific list of URLs from the edge cache.
28
+ *
29
+ * URLs must be absolute. Empty list returns success without making the
30
+ * request (avoiding the 400 CF returns for empty `files`). The list is
31
+ * chunked at {@link CHUNK_SIZE} entries; sequential requests because CF
32
+ * rate-limits the purge endpoint and parallel doesn't help wall time
33
+ * meaningfully for typical addon purges (<200 URLs).
34
+ */
35
+ export declare function cfPurgePaths(cfg: HostConfig, urls: readonly string[]): Promise<CfResult>;
36
+ //# sourceMappingURL=cf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cf.d.ts","sourceRoot":"","sources":["../../../src/lib/ops/cf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAQ7C,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAA;CAC9B;AAYD,4CAA4C;AAC5C,wBAAsB,WAAW,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,CAIpE;AAED;;;;;;;;GAQG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,OAAO,CAAC,QAAQ,CAAC,CAcnB"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * CiCore CLI — Cloudflare zone primitives
3
+ *
4
+ * Host-aware Cloudflare API calls for cache purge. Uses `cfg.cfZoneId` to
5
+ * scope each call to the right zone and `cfg.cfApiToken` (Bearer) for auth.
6
+ *
7
+ * Two purge modes:
8
+ * - {@link cfPurgeZone}: wipe the whole zone's edge cache. Use after a
9
+ * core deploy when many assets changed. Fast, but invalidates third-
10
+ * party content (e.g. /admin assets, public site) — accept the cost.
11
+ * - {@link cfPurgePaths}: surgical, list of specific URLs. Use for
12
+ * addon redeploys where only `cdn.X.com.tr/addons/<addon>/...` changed.
13
+ *
14
+ * Cloudflare's `/purge_cache` accepts up to 30 URLs per request on free
15
+ * plans, 500 on paid. We chunk on the lower bound (30) to stay safe across
16
+ * accounts; can lift later if profiling shows it matters.
17
+ */
18
+ import { isDryRun } from '../config.js';
19
+ import { log } from '../logger.js';
20
+ const DRY_RUN_OK = Object.freeze({
21
+ success: true,
22
+ status: 200,
23
+ errorMessage: '',
24
+ });
25
+ // ─────────────────────────────────────────────────────────────────────────
26
+ // Public primitives
27
+ // ─────────────────────────────────────────────────────────────────────────
28
+ /** Purge every cached asset in the zone. */
29
+ export async function cfPurgeZone(cfg) {
30
+ ensureZoneConfigured(cfg);
31
+ log.info(`[cf] zone-wide purge on ${cfg.brandName}`);
32
+ return postPurge(cfg, { purge_everything: true });
33
+ }
34
+ /**
35
+ * Purge a specific list of URLs from the edge cache.
36
+ *
37
+ * URLs must be absolute. Empty list returns success without making the
38
+ * request (avoiding the 400 CF returns for empty `files`). The list is
39
+ * chunked at {@link CHUNK_SIZE} entries; sequential requests because CF
40
+ * rate-limits the purge endpoint and parallel doesn't help wall time
41
+ * meaningfully for typical addon purges (<200 URLs).
42
+ */
43
+ export async function cfPurgePaths(cfg, urls) {
44
+ ensureZoneConfigured(cfg);
45
+ if (urls.length === 0) {
46
+ log.debug('[cf] purgePaths called with empty list — no-op');
47
+ return DRY_RUN_OK;
48
+ }
49
+ log.info(`[cf] purge ${urls.length} URL${urls.length === 1 ? '' : 's'} on ${cfg.brandName}`);
50
+ for (let i = 0; i < urls.length; i += CHUNK_SIZE) {
51
+ const chunk = urls.slice(i, i + CHUNK_SIZE);
52
+ const result = await postPurge(cfg, { files: [...chunk] });
53
+ if (!result.success)
54
+ return result;
55
+ }
56
+ return Object.freeze({ success: true, status: 200, errorMessage: '' });
57
+ }
58
+ // ─────────────────────────────────────────────────────────────────────────
59
+ // Internal
60
+ // ─────────────────────────────────────────────────────────────────────────
61
+ /** Max URLs per `/purge_cache` request. Conservative to fit Free plan limit. */
62
+ const CHUNK_SIZE = 30;
63
+ async function postPurge(cfg, body) {
64
+ const url = `https://api.cloudflare.com/client/v4/zones/${cfg.cfZoneId}/purge_cache`;
65
+ if (isDryRun()) {
66
+ log.debug('[dry-run] POST', url, 'body:', JSON.stringify(body));
67
+ return DRY_RUN_OK;
68
+ }
69
+ const controller = new AbortController();
70
+ const timeout = setTimeout(() => controller.abort(), 30_000);
71
+ try {
72
+ const response = await fetch(url, {
73
+ method: 'POST',
74
+ headers: {
75
+ Authorization: `Bearer ${cfg.cfApiToken}`,
76
+ 'Content-Type': 'application/json',
77
+ },
78
+ body: JSON.stringify(body),
79
+ signal: controller.signal,
80
+ });
81
+ if (response.ok) {
82
+ return Object.freeze({ success: true, status: response.status, errorMessage: '' });
83
+ }
84
+ const text = await response.text();
85
+ return Object.freeze({
86
+ success: false,
87
+ status: response.status,
88
+ errorMessage: `HTTP ${response.status}: ${text.slice(0, 200)}`,
89
+ });
90
+ }
91
+ catch (error) {
92
+ const message = error instanceof Error
93
+ ? error.name === 'AbortError'
94
+ ? 'Cloudflare purge timed out after 30s'
95
+ : error.message
96
+ : String(error);
97
+ return Object.freeze({ success: false, status: 0, errorMessage: message });
98
+ }
99
+ finally {
100
+ clearTimeout(timeout);
101
+ }
102
+ }
103
+ /**
104
+ * Throw a clear error if the host's Cloudflare zone isn't configured yet.
105
+ * Vucore prod's cfZoneId is currently empty (see hosts.ts) — purge calls
106
+ * for that host must be wired up via env-fallback before they can run.
107
+ */
108
+ function ensureZoneConfigured(cfg) {
109
+ if (!cfg.cfZoneId || cfg.cfZoneId.trim() === '') {
110
+ throw new Error(`Host '${cfg.alias}' has no cfZoneId configured. ` +
111
+ `Set it in STATIC_TOPOLOGY (cli/src/lib/hosts.ts) before using Cloudflare ops.`);
112
+ }
113
+ }
114
+ //# sourceMappingURL=cf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cf.js","sourceRoot":"","sources":["../../../src/lib/ops/cf.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * CiCore CLI — docker compose primitives
3
+ *
4
+ * Thin host-aware wrappers around `docker compose` on the remote host.
5
+ * Two layouts are supported transparently via {@link composeArgs}:
6
+ *
7
+ * - split (vucore prod): `docker compose -f docker-core-<svc>.yml up -d`
8
+ * no service positional — compose file is single-service
9
+ *
10
+ * - single (cicore): `docker compose -f docker-compose.yml up -d <svc>`
11
+ * service positional required — multi-service file
12
+ *
13
+ * Every primitive uses `cd <workDir> && docker compose ...` because the
14
+ * compose file path in `composeArgs` is relative to `workDir`. The cd is
15
+ * the only safe way to run compose against relative paths.
16
+ *
17
+ * `--no-deps` is the default for `up`-style ops: we deliberately only
18
+ * recreate the targeted service, not its dependencies (postgres, redis).
19
+ * Bringing down healthy dependencies would cause a multi-second outage on
20
+ * every deploy for no good reason.
21
+ */
22
+ import { type AppServiceKey, type HostConfig } from '../hosts.js';
23
+ import { type ExecResult } from './ssh.js';
24
+ interface RunComposeOptions {
25
+ readonly silent?: boolean;
26
+ readonly stream?: boolean;
27
+ }
28
+ /**
29
+ * Start (or recreate if image changed) a single service in detached mode.
30
+ *
31
+ * If the image reference in the compose file already maps to a running
32
+ * container with the same image digest, compose treats this as a no-op
33
+ * (logs "Container ... Running" instead of "Recreated"). For a guaranteed
34
+ * recreation use {@link composeForceRecreate}.
35
+ *
36
+ * `--no-deps` excludes postgres/redis from the dependency walk.
37
+ */
38
+ export declare function composeUp(cfg: HostConfig, service: AppServiceKey, opts?: RunComposeOptions): Promise<ExecResult>;
39
+ /**
40
+ * Force-recreate a service container, even if compose can't detect a change.
41
+ *
42
+ * Necessary when the compose-target image (`baynis/vucore-<svc>:latest`)
43
+ * has been retagged to a new digest *outside* compose's view — compose
44
+ * compares container labels against the compose file, not the underlying
45
+ * image, so a retag alone doesn't trigger recreation.
46
+ *
47
+ * Equivalent to: stop → rm → up. Causes ~5-15s downtime per service.
48
+ */
49
+ export declare function composeForceRecreate(cfg: HostConfig, service: AppServiceKey, opts?: RunComposeOptions): Promise<ExecResult>;
50
+ /**
51
+ * Restart a running container in place — no image change, no recreation.
52
+ * Useful for picking up environment file edits without an image churn.
53
+ */
54
+ export declare function composeRestart(cfg: HostConfig, service: AppServiceKey, opts?: RunComposeOptions): Promise<ExecResult>;
55
+ /**
56
+ * Stop and remove the container for a service. The image is preserved.
57
+ *
58
+ * Implemented as `stop` + `rm -f` rather than `down` because `docker
59
+ * compose down <service>` is invalid syntax — `down` is a global op that
60
+ * ignores positional args and would tear down every service in the file.
61
+ */
62
+ export declare function composeStop(cfg: HostConfig, service: AppServiceKey, opts?: RunComposeOptions): Promise<ExecResult>;
63
+ /**
64
+ * Pull the image referenced by the compose file from its registry.
65
+ * On cicore the compose file expects `baynis/vucore-*:latest`, but those
66
+ * tags don't exist there — the retag-after-pull pattern in image.ts handles
67
+ * that. So this primitive is mostly used on vucore prod.
68
+ */
69
+ export declare function composePull(cfg: HostConfig, service: AppServiceKey, opts?: RunComposeOptions): Promise<ExecResult>;
70
+ /**
71
+ * Parse `docker compose ps --format '{{.Service}}|{{.Status}}|{{.Image}}'`
72
+ * output into a structured list. Returns an empty array on failure rather
73
+ * than throwing — callers checking "is service X up?" can fall through.
74
+ */
75
+ export interface ComposeServiceStatus {
76
+ readonly service: string;
77
+ readonly status: string;
78
+ readonly image: string;
79
+ }
80
+ export declare function composeStatus(cfg: HostConfig, opts?: {
81
+ readonly silent?: boolean;
82
+ }): Promise<readonly ComposeServiceStatus[]>;
83
+ /**
84
+ * Wait for a service container to become healthy, polling `docker compose ps`.
85
+ *
86
+ * Returns the final status (true if healthy, false on timeout). Default
87
+ * timeout 60s, poll every 2s. Used by setup to gate progress until the
88
+ * stack is reachable before running migrations.
89
+ */
90
+ export declare function waitForHealthy(cfg: HostConfig, service: AppServiceKey, opts?: {
91
+ readonly timeoutMs?: number;
92
+ readonly pollIntervalMs?: number;
93
+ }): Promise<boolean>;
94
+ export {};
95
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../../src/lib/ops/compose.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,KAAK,aAAa,EAAe,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AAE9E,OAAO,EAAa,KAAK,UAAU,EAAE,MAAM,UAAU,CAAA;AAMrD,UAAU,iBAAiB;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B;AAiCD;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAGrB;AAED;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAGrB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAGrB;AAED;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAKrB;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAGrB;AAMD;;;;GAIG;AACH,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,UAAU,EACf,IAAI,GAAE;IAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAO,GACvC,OAAO,CAAC,SAAS,oBAAoB,EAAE,CAAC,CAsB1C;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,UAAU,EACf,OAAO,EAAE,aAAa,EACtB,IAAI,GAAE;IAAE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAO,GAC3E,OAAO,CAAC,OAAO,CAAC,CAkBlB"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * CiCore CLI — docker compose primitives
3
+ *
4
+ * Thin host-aware wrappers around `docker compose` on the remote host.
5
+ * Two layouts are supported transparently via {@link composeArgs}:
6
+ *
7
+ * - split (vucore prod): `docker compose -f docker-core-<svc>.yml up -d`
8
+ * no service positional — compose file is single-service
9
+ *
10
+ * - single (cicore): `docker compose -f docker-compose.yml up -d <svc>`
11
+ * service positional required — multi-service file
12
+ *
13
+ * Every primitive uses `cd <workDir> && docker compose ...` because the
14
+ * compose file path in `composeArgs` is relative to `workDir`. The cd is
15
+ * the only safe way to run compose against relative paths.
16
+ *
17
+ * `--no-deps` is the default for `up`-style ops: we deliberately only
18
+ * recreate the targeted service, not its dependencies (postgres, redis).
19
+ * Bringing down healthy dependencies would cause a multi-second outage on
20
+ * every deploy for no good reason.
21
+ */
22
+ import { composeArgs } from '../hosts.js';
23
+ import { log } from '../logger.js';
24
+ import { runRemote } from './ssh.js';
25
+ /**
26
+ * Build and execute the compose command line for a service. Composes:
27
+ *
28
+ * cd <workDir> && docker compose <fileFlag> <subcommand> <flags...> <serviceArg>
29
+ *
30
+ * `serviceArg` is empty for split-layout hosts (compose file is already
31
+ * scoped to one service); it carries the service name for single-file
32
+ * hosts. {@link composeArgs} encapsulates that logic.
33
+ */
34
+ async function runCompose(cfg, service, subcommand, opts = {}) {
35
+ const { fileFlag, serviceArg } = composeArgs(cfg, service);
36
+ // Service arg goes at the end of the compose invocation — `up -d <flags> <svc>`,
37
+ // `restart <svc>`, etc. Empty string is filtered to avoid producing trailing
38
+ // whitespace that some compose versions complain about.
39
+ const parts = [
40
+ `cd ${cfg.workDir}`,
41
+ `docker compose ${fileFlag} ${subcommand.join(' ')}${serviceArg ? ' ' + serviceArg : ''}`,
42
+ ];
43
+ const cmd = parts.join(' && ');
44
+ return runRemote(cfg, cmd, { silent: opts.silent, stream: opts.stream });
45
+ }
46
+ // ─────────────────────────────────────────────────────────────────────────
47
+ // Lifecycle primitives
48
+ // ─────────────────────────────────────────────────────────────────────────
49
+ /**
50
+ * Start (or recreate if image changed) a single service in detached mode.
51
+ *
52
+ * If the image reference in the compose file already maps to a running
53
+ * container with the same image digest, compose treats this as a no-op
54
+ * (logs "Container ... Running" instead of "Recreated"). For a guaranteed
55
+ * recreation use {@link composeForceRecreate}.
56
+ *
57
+ * `--no-deps` excludes postgres/redis from the dependency walk.
58
+ */
59
+ export async function composeUp(cfg, service, opts = {}) {
60
+ if (!opts.silent)
61
+ log.info(`compose up -d ${service} on ${cfg.brandName}`);
62
+ return runCompose(cfg, service, ['up', '-d', '--no-deps'], opts);
63
+ }
64
+ /**
65
+ * Force-recreate a service container, even if compose can't detect a change.
66
+ *
67
+ * Necessary when the compose-target image (`baynis/vucore-<svc>:latest`)
68
+ * has been retagged to a new digest *outside* compose's view — compose
69
+ * compares container labels against the compose file, not the underlying
70
+ * image, so a retag alone doesn't trigger recreation.
71
+ *
72
+ * Equivalent to: stop → rm → up. Causes ~5-15s downtime per service.
73
+ */
74
+ export async function composeForceRecreate(cfg, service, opts = {}) {
75
+ if (!opts.silent)
76
+ log.info(`compose up -d --force-recreate ${service} on ${cfg.brandName}`);
77
+ return runCompose(cfg, service, ['up', '-d', '--force-recreate', '--no-deps'], opts);
78
+ }
79
+ /**
80
+ * Restart a running container in place — no image change, no recreation.
81
+ * Useful for picking up environment file edits without an image churn.
82
+ */
83
+ export async function composeRestart(cfg, service, opts = {}) {
84
+ if (!opts.silent)
85
+ log.info(`compose restart ${service} on ${cfg.brandName}`);
86
+ return runCompose(cfg, service, ['restart'], opts);
87
+ }
88
+ /**
89
+ * Stop and remove the container for a service. The image is preserved.
90
+ *
91
+ * Implemented as `stop` + `rm -f` rather than `down` because `docker
92
+ * compose down <service>` is invalid syntax — `down` is a global op that
93
+ * ignores positional args and would tear down every service in the file.
94
+ */
95
+ export async function composeStop(cfg, service, opts = {}) {
96
+ if (!opts.silent)
97
+ log.info(`compose stop+rm ${service} on ${cfg.brandName}`);
98
+ const stop = await runCompose(cfg, service, ['stop'], opts);
99
+ if (!stop.success)
100
+ return stop;
101
+ return runCompose(cfg, service, ['rm', '-f'], opts);
102
+ }
103
+ /**
104
+ * Pull the image referenced by the compose file from its registry.
105
+ * On cicore the compose file expects `baynis/vucore-*:latest`, but those
106
+ * tags don't exist there — the retag-after-pull pattern in image.ts handles
107
+ * that. So this primitive is mostly used on vucore prod.
108
+ */
109
+ export async function composePull(cfg, service, opts = {}) {
110
+ if (!opts.silent)
111
+ log.info(`compose pull ${service} on ${cfg.brandName}`);
112
+ return runCompose(cfg, service, ['pull'], opts);
113
+ }
114
+ export async function composeStatus(cfg, opts = {}) {
115
+ // Use the nuxt compose file as the "entry point" for ps; for single-file
116
+ // hosts that's the whole stack, for split layout it's just one service —
117
+ // ps via -f reports for that file only. Callers wanting cross-file status
118
+ // on split layout should call this per-service-file.
119
+ const { fileFlag } = composeArgs(cfg, 'nuxt');
120
+ const cmd = `cd ${cfg.workDir} && docker compose ${fileFlag} ps --format '{{.Service}}|{{.Status}}|{{.Image}}'`;
121
+ const result = await runRemote(cfg, cmd, { silent: opts.silent ?? true });
122
+ if (!result.success)
123
+ return [];
124
+ return result.stdout
125
+ .split('\n')
126
+ .map(line => line.trim())
127
+ .filter(line => line.length > 0)
128
+ .map(line => {
129
+ const [service, status, image] = line.split('|');
130
+ return Object.freeze({
131
+ service: service ?? '',
132
+ status: status ?? '',
133
+ image: image ?? '',
134
+ });
135
+ });
136
+ }
137
+ /**
138
+ * Wait for a service container to become healthy, polling `docker compose ps`.
139
+ *
140
+ * Returns the final status (true if healthy, false on timeout). Default
141
+ * timeout 60s, poll every 2s. Used by setup to gate progress until the
142
+ * stack is reachable before running migrations.
143
+ */
144
+ export async function waitForHealthy(cfg, service, opts = {}) {
145
+ const timeoutMs = opts.timeoutMs ?? 60_000;
146
+ const pollMs = opts.pollIntervalMs ?? 2_000;
147
+ const deadline = Date.now() + timeoutMs;
148
+ while (Date.now() < deadline) {
149
+ const statuses = await composeStatus(cfg, { silent: true });
150
+ const target = statuses.find(s => s.service === service);
151
+ if (target && /\(healthy\)/.test(target.status)) {
152
+ return true;
153
+ }
154
+ if (target && /Up\b/.test(target.status) && !/health/.test(target.status)) {
155
+ // Service is up but has no healthcheck defined — treat as ready.
156
+ return true;
157
+ }
158
+ await sleep(pollMs);
159
+ }
160
+ return false;
161
+ }
162
+ function sleep(ms) {
163
+ return new Promise(resolve => setTimeout(resolve, ms));
164
+ }
165
+ //# sourceMappingURL=compose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.js","sourceRoot":"","sources":["../../../src/lib/ops/compose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ /**
2
+ * CiCore CLI — Core skeleton + environment primitives
3
+ *
4
+ * A "core" is one logical SaaS instance inside the multi-core VuCore
5
+ * stack. Each core lives in its own subdirectory under `cfg.coresHostPath`
6
+ * with its own `.env`, addons/, storage/, etc. The PHP and Nuxt containers
7
+ * are shared across cores — runtime routing (nginx $target_core) picks
8
+ * which core handles a given request.
9
+ *
10
+ * This module provides the primitives `vu setup` needs to onboard a new
11
+ * core:
12
+ *
13
+ * - {@link coreEnsureSkeleton}: server-side mkdir of the standard layout
14
+ * - {@link coreEnvGenerate}: build a config object from host + per-core
15
+ * inputs (domain, name, secrets)
16
+ * - {@link coreWriteEnv}: serialize the config and write it atomically
17
+ * to `<coresHostPath>/<core>/.env`
18
+ *
19
+ * Secrets (DB password, JWT) are generated with `crypto.randomBytes` — 32
20
+ * bytes hex, suitable for both. The caller can override via options to
21
+ * support importing an existing core's secrets.
22
+ */
23
+ import type { HostConfig } from '../hosts.js';
24
+ import { type ExecResult } from './ssh.js';
25
+ /**
26
+ * Create `cores/<name>/` and its subdirectories on the server if missing.
27
+ * Permissions are set so PHP container's www-data (uid 82) can write into
28
+ * the storage/ tree. Files outside storage/ keep root-owned defaults.
29
+ *
30
+ * Idempotent — safe to call repeatedly. Returns success when every dir
31
+ * exists (whether we created it or it was already there).
32
+ */
33
+ export declare function coreEnsureSkeleton(cfg: HostConfig, coreName: string): Promise<ExecResult>;
34
+ /** Inputs that drive `.env` generation — what differs per core. */
35
+ export interface CoreEnvInputs {
36
+ /** Primary domain for this core (e.g. `cicore.com.tr`). */
37
+ readonly domain: string;
38
+ /** Additional comma-separated domains the core also serves. */
39
+ readonly additionalDomains?: string;
40
+ /**
41
+ * Postgres LOGIN role for this core (per-core isolation; replaces the
42
+ * shared admin pattern). If omitted, `coreEnvGenerate` produces a
43
+ * core-derived random name `db_<core>_<8hex>`. The setup orchestrator
44
+ * passes the same role to `dbCreateRoleAndDb` so the postgres ROLE
45
+ * and the .env stay in sync.
46
+ */
47
+ readonly dbUser?: string;
48
+ /** Override the auto-generated DB password (e.g. importing an existing core). */
49
+ readonly dbPassword?: string;
50
+ /** Override the auto-generated JWT secret. */
51
+ readonly jwtSecret?: string;
52
+ /** Brand identifier — drives Nuxt useBrand() defaults. Defaults to core name. */
53
+ readonly brand?: string;
54
+ }
55
+ /**
56
+ * Build the full `.env` config object from the host topology and per-core
57
+ * inputs. Values are simple strings — caller serializes via
58
+ * {@link coreWriteEnv} when ready.
59
+ *
60
+ * Secrets default to fresh 32-byte hex values; pass overrides via
61
+ * `inputs.dbPassword` / `inputs.jwtSecret` when reusing an existing core's
62
+ * credentials (e.g. clone, restore).
63
+ */
64
+ export declare function coreEnvGenerate(cfg: HostConfig, coreName: string, inputs: CoreEnvInputs): Readonly<Record<string, string>>;
65
+ /**
66
+ * Serialize an env config to dotenv format and write atomically to the
67
+ * server at `cores/<coreName>/.env`.
68
+ *
69
+ * Format: `KEY=value` per line, no quoting (values must be free of
70
+ * newlines and unescaped `"`/`'`). Generated secrets meet this; caller
71
+ * overrides should too.
72
+ *
73
+ * Atomic via temp file + mv inside the same script. If a previous .env
74
+ * exists, it's backed up to `.env.bak-<timestamp>` so a botched setup is
75
+ * recoverable. Idempotent: writing the same content twice is a no-op
76
+ * (transform short-circuits when content matches).
77
+ */
78
+ export declare function coreWriteEnv(cfg: HostConfig, coreName: string, env: Readonly<Record<string, string>>): Promise<ExecResult>;
79
+ /**
80
+ * Parse the existing `.env` on the server into a plain object. Useful for
81
+ * re-using an existing core's secrets when adding domains or for
82
+ * inspection. Returns an empty object if the file doesn't exist.
83
+ *
84
+ * Best-effort parsing: supports `KEY=value` and `KEY="value"`, skips blank
85
+ * lines and `#` comments. Doesn't expand `$VAR` references — values are
86
+ * returned verbatim.
87
+ */
88
+ export declare function coreReadEnv(cfg: HostConfig, coreName: string): Promise<Record<string, string>>;
89
+ /**
90
+ * The brand identity shape projected into `cores/<slug>/brand.json`. This is
91
+ * the contract the Nuxt runtime reads (core-loader → useBrand → VBrandLogo +
92
+ * titleTemplate). Mirrors `BrandService::reconcileBrandJson` (PHP) exactly —
93
+ * the CLI is the canonical writer; PHP mirrors it for panel-driven edits.
94
+ */
95
+ export interface BrandProjection {
96
+ readonly brand: string;
97
+ readonly title: string;
98
+ readonly logoUrl: string | null;
99
+ readonly faviconUrl: string | null;
100
+ readonly theme: Record<string, unknown>;
101
+ }
102
+ /**
103
+ * Project a brand into `cores/<slug>/brand.json` on the host, idempotently.
104
+ *
105
+ * Reads the existing file and compares *semantically* (parsed + key-sorted),
106
+ * so formatting differences between the PHP and CLI writers never register as
107
+ * drift — only a real identity change rewrites the file. Returns whether the
108
+ * file changed so `ci brand reconcile` can report an honest unchanged/written
109
+ * summary. The freshly-written file is chowned to the PHP runtime uid so the
110
+ * container can read it.
111
+ */
112
+ export declare function coreReconcileBrandJson(cfg: HostConfig, slug: string, projection: BrandProjection): Promise<{
113
+ success: boolean;
114
+ changed: boolean;
115
+ stderr: string;
116
+ }>;
117
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/lib/ops/core.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,OAAO,EAA8B,KAAK,UAAU,EAAE,MAAM,UAAU,CAAA;AAoCtE;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,CAAC,CA+BrB;AA2BD,mEAAmE;AACnE,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,+DAA+D;IAC/D,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACnC;;;;;;OAMG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;IACxB,iFAAiF;IACjF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B,8CAA8C;IAC9C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAA;IAC3B,iFAAiF;IACjF,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,GACpB,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAwClC;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GACpC,OAAO,CAAC,UAAU,CAAC,CAgCrB;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,UAAU,EACf,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA0BjC;AAMD;;;;;GAKG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACxC;AAED;;;;;;;;;GASG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,eAAe,GAC1B,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CA+BjE"}