@voltro/cli 0.38.0 → 0.39.1

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 (173) hide show
  1. package/CHANGELOG.md +276 -0
  2. package/THIRD-PARTY-NOTICES.md +80 -45
  3. package/dist/{addCommand-BNeoeSxe.js → addCommand-C05L9tZh.js} +2 -2
  4. package/dist/addCommand-C3MdJG-a.js +2 -0
  5. package/dist/{agentsMd-mhQMF1bx.js → agentsMd-7zI2h5l9.js} +3 -3
  6. package/dist/agentsMd-BFCXh2gl.js +2 -0
  7. package/dist/apiBuild-BmR_bIxN.js +2 -0
  8. package/dist/{apiBuild-CvacV4zA.js → apiBuild-D9FB13_2.js} +3 -3
  9. package/dist/baselineCommand-CXv680Dc.js +2 -0
  10. package/dist/{baselineCommand-C6NMt-oa.js → baselineCommand-Ck2Xm8M7.js} +18 -18
  11. package/dist/bin.js +1 -1
  12. package/dist/{build-_LoTC1s0.js → build-DORV5mLM.js} +107 -100
  13. package/dist/{capabilitiesCommand-nq_pz5xd.js → capabilitiesCommand-D5gucwYa.js} +8 -8
  14. package/dist/{checkCommand-Pjk5sBl2.js → checkCommand-Bf6oMao4.js} +35 -35
  15. package/dist/{checkCommand-wibtQx-N.js → checkCommand-D9qK_gtA.js} +1 -1
  16. package/dist/{cloudCmd-NQSwe_Qk.js → cloudCmd-C42gaO8s.js} +16 -16
  17. package/dist/{clusterCmd-D5wsCmA_.js → clusterCmd-DrVFCzSj.js} +8 -4
  18. package/dist/{codegen-GYYcdpCg.js → codegen-CbpGCWLG.js} +1 -1
  19. package/dist/codegen-i8QGcHsi.js +2 -0
  20. package/dist/codegenCommand-CxOyKmc1.js +129 -0
  21. package/dist/{codemodRunner-CXgQ-ecJ.js → codemodRunner-D-jTyvWo.js} +622 -551
  22. package/dist/{commands-DaZVi9wi.js → commands-D6aW_6AR.js} +48 -48
  23. package/dist/{connectionConfig-UFlIEiys.js → connectionConfig-Bk9IC7D0.js} +1 -1
  24. package/dist/{dashboardCommand-Dxy_kmoW.js → dashboardCommand-CwTZh-XZ.js} +3 -3
  25. package/dist/{dataCommand-D6-Ha2lf.js → dataCommand-Cc9RiLQZ.js} +14 -11
  26. package/dist/{dbCommand-C4UW8cVN.js → dbCommand-DSwGv9wS.js} +50 -49
  27. package/dist/dbCommand-DcqEyxju.js +2 -0
  28. package/dist/{dev-E7Eo5GHc.js → dev-3mgc8c-H.js} +2260 -2184
  29. package/dist/dev-CjJAasDs.js +3 -0
  30. package/dist/{dialectDriver-CgXnDfec.js → dialectDriver-czCHYpeH.js} +2 -1
  31. package/dist/doctorCommand-Cghssndo.js +2 -0
  32. package/dist/{doctorCommand-gmDyALFL.js → doctorCommand-oLuzc-aC.js} +261 -244
  33. package/dist/{dormancyCommand-CE6wG8lj.js → dormancyCommand-Bxe4WtHU.js} +1 -1
  34. package/dist/{e2eCmd-BRabZww-.js → e2eCmd-uFHig1hV.js} +8 -2
  35. package/dist/{embeddingsCommand-C3uAuf6N.js → embeddingsCommand-CyNQkFIc.js} +6 -6
  36. package/dist/{envCommand-DzuWh8ya.js → envCommand-CAkSgBbh.js} +19 -19
  37. package/dist/{evolveCommand-DPLqcYb2.js → evolveCommand-CWhBoe_P.js} +6 -8
  38. package/dist/frameworkTableAssembly-DgylYh9_.js +2 -0
  39. package/dist/{generateCommand-DbgcUpGw.js → generateCommand-CcyvH2ve.js} +1 -1
  40. package/dist/index.js +1 -1
  41. package/dist/{infoCommand-CmczGj_l.js → infoCommand-CTo8Jnhq.js} +7 -7
  42. package/dist/inspect-B7U7Cl_Z.js +1192 -0
  43. package/dist/inspect-DUze25t0.js +2 -0
  44. package/dist/{inspectCmd-EHFZ9yYu.js → inspectCmd-niF97fAq.js} +5 -5
  45. package/dist/inspectGateHint-BjnFubmH.js +7 -0
  46. package/dist/{logFileSink-C_D2wRN1.js → logFileSink-B4uP8pvf.js} +1 -1
  47. package/dist/{logsCmd-D36xK7Zu.js → logsCmd-B6oNsfaZ.js} +10 -7
  48. package/dist/{manifestBuild-hpPLaGxV.js → manifestBuild-BK42hu0k.js} +1 -1
  49. package/dist/manifestBuild-j0n109tt.js +2 -0
  50. package/dist/{metaCommands-CIoQNlaQ.js → metaCommands-DUYR--Ts.js} +1 -1
  51. package/dist/{migrate-RwgUWXfc.js → migrate-BnPw2zC8.js} +7 -4
  52. package/dist/{packageCommand-Cug_3Ogl.js → packageCommand-9SVyvsSo.js} +3 -2
  53. package/dist/{probeCommand-BPEpwT32.js → probeCommand-C9gazU0H.js} +35 -24
  54. package/dist/{projectScaffold-CxgtJvlb.js → projectScaffold-BEhhHjPr.js} +1 -1
  55. package/dist/{projectScaffold-DDgWbNLe.js → projectScaffold-BvhLOrLq.js} +17 -15
  56. package/dist/{runtimeTrace-6jfznSzr.js → runtimeTrace-gNXeLf6H.js} +1 -1
  57. package/dist/{scheduleManifestCmd-D2x0CTTY.js → scheduleManifestCmd-kmWzrO_w.js} +6 -9
  58. package/dist/{sdkgen-CEJZZQUA.js → sdkgen-C8zz10-X.js} +4 -4
  59. package/dist/{seedRunner-ZmLSqNe2.js → seedRunner-IdHEprqf.js} +1 -4
  60. package/dist/serveCommand-BpK8-m1N.js +1770 -0
  61. package/dist/serveCommand-CW-goXvh.js +2 -0
  62. package/dist/serveEntry.js +2 -2
  63. package/dist/{serverlessCommand-CfJZy6dS.js → serverlessCommand-DbJ7Plg9.js} +3 -3
  64. package/dist/{start-CidwCcjl.js → start-BNuTWdRd.js} +1 -1
  65. package/dist/{start-RCh6qKFe.js → start-ft_KzFTd.js} +257 -254
  66. package/dist/startEntry.js +1 -1
  67. package/dist/{test-DIQ0jlkQ.js → test-CLYXrZ2F.js} +1 -1
  68. package/dist/{tracesCmd-DStmCJPi.js → tracesCmd-DgtgOUdi.js} +7 -4
  69. package/dist/{typecheckCommand-BlsWiCNq.js → typecheckCommand-BuCtT92o.js} +7 -7
  70. package/dist/updateCommand-6FMU2klq.js +2 -0
  71. package/dist/{updateCommand-CmksX7m_.js → updateCommand-CHBmCB17.js} +5 -3
  72. package/dist/{webDev-BKdD7c_a.js → webDev-CTpSY-e_.js} +813 -775
  73. package/dist/webDev-id3I5PvG.js +2 -0
  74. package/dist/{webhookDiscovery-D7VaeMlz.js → webhookDiscovery-CphsQe59.js} +4 -6
  75. package/dist/{webhookDiscovery-CrGAfhIG.js → webhookDiscovery-il9ti-HE.js} +1 -1
  76. package/dist/{webhooksCommand-BHeaF1ZJ.js → webhooksCommand-EccPZQZ4.js} +1 -1
  77. package/package.json +27 -21
  78. package/templates/AGENTS.md +2 -2
  79. package/templates/agent-docs/_index.md +2 -2
  80. package/templates/agent-docs/_manifest.json +2 -2
  81. package/templates/agent-docs/authentication.md +43 -4
  82. package/templates/agent-docs/cli.md +17 -13
  83. package/templates/agent-docs/data.md +44 -1
  84. package/templates/agent-docs/database/migrations.md +2 -2
  85. package/templates/agent-docs/database/seedsdialects.md +2 -2
  86. package/templates/agent-docs/deployment.md +21 -7
  87. package/templates/agent-docs/internationalization.md +10 -3
  88. package/templates/agent-docs/local-first-mobile.md +141 -20
  89. package/templates/agent-docs/plugins/mail.md +1 -1
  90. package/templates/agent-docs/plugins/ratelimit.md +1 -1
  91. package/templates/agent-docs/plugins.md +3 -1
  92. package/templates/agent-docs/releases.md +130 -1
  93. package/templates/agent-docs/routing.md +34 -2
  94. package/templates/agent-docs/templates/apibackends.md +1 -1
  95. package/templates/agent-docs/templates/mobile.md +1 -1
  96. package/templates/agent-docs/whats-new.md +26 -66
  97. package/templates/apps/api-ai/package.json +7 -7
  98. package/templates/apps/api-auth/package.json +8 -8
  99. package/templates/apps/api-backend/package.json +7 -7
  100. package/templates/apps/api-backend-deactivation/package.json +7 -7
  101. package/templates/apps/api-backend-mail/package.json +8 -8
  102. package/templates/apps/api-backend-mariadb/package.json +9 -9
  103. package/templates/apps/api-backend-sqlite/package.json +8 -8
  104. package/templates/apps/api-backend-storage/package.json +8 -8
  105. package/templates/apps/api-cms/package.json +10 -10
  106. package/templates/apps/api-collab/package.json +8 -8
  107. package/templates/apps/api-data-advanced/package.json +8 -8
  108. package/templates/apps/api-durable/package.json +8 -8
  109. package/templates/apps/api-durable/startup/warm.startup.tsx +16 -2
  110. package/templates/apps/api-feature-flags/package.json +9 -9
  111. package/templates/apps/api-governance/package.json +8 -8
  112. package/templates/apps/api-kv/package.json +8 -8
  113. package/templates/apps/api-moderation/package.json +8 -8
  114. package/templates/apps/api-observability/package.json +8 -8
  115. package/templates/apps/api-ratelimit/package.json +8 -8
  116. package/templates/apps/api-rbac/authz.ts +16 -1
  117. package/templates/apps/api-rbac/package.json +8 -8
  118. package/templates/apps/api-rest/package.json +7 -7
  119. package/templates/apps/api-saas/package.json +11 -11
  120. package/templates/apps/api-saas-starter/package.json +10 -10
  121. package/templates/apps/api-search/package.json +8 -8
  122. package/templates/apps/api-status/package.json +8 -8
  123. package/templates/apps/api-versioning/package.json +8 -8
  124. package/templates/apps/api-webhooks/package.json +9 -9
  125. package/templates/apps/changelog/package.json +6 -6
  126. package/templates/apps/edge-functions/package.json +2 -2
  127. package/templates/apps/frontend-admin/package.json +8 -8
  128. package/templates/apps/frontend-app/package.json +9 -9
  129. package/templates/apps/frontend-auth/package.json +8 -8
  130. package/templates/apps/frontend-blank/package.json +7 -7
  131. package/templates/apps/frontend-cms/package.json +9 -9
  132. package/templates/apps/frontend-collab/package.json +10 -10
  133. package/templates/apps/frontend-contact/package.json +7 -7
  134. package/templates/apps/frontend-dashboard/package.json +7 -7
  135. package/templates/apps/frontend-docs/package.json +7 -7
  136. package/templates/apps/frontend-i18n/package.json +6 -6
  137. package/templates/apps/frontend-landing/package.json +7 -7
  138. package/templates/apps/frontend-portal/package.json +8 -8
  139. package/templates/apps/frontend-saas/package.json +8 -8
  140. package/templates/apps/frontend-spa/package.json +7 -7
  141. package/templates/apps/frontend-ssr/package.json +7 -7
  142. package/templates/apps/frontend-ssr-api/package.json +8 -8
  143. package/templates/apps/frontend-static-blog/package.json +6 -6
  144. package/templates/apps/frontend-status/package.json +8 -8
  145. package/templates/apps/mobile-app/README.md +41 -17
  146. package/templates/apps/mobile-app/app.config.ts +1 -1
  147. package/templates/apps/mobile-app/package.json +15 -11
  148. package/templates/apps/mobile-app/src/app/_layout.tsx +44 -13
  149. package/templates/apps/mobile-app/src/app/index.tsx +1 -1
  150. package/templates/apps/mobile-app/src/app/settings.tsx +4 -1
  151. package/templates/apps/mobile-app/src/client.ts +74 -57
  152. package/templates/apps/mobile-app/src/lib/api.ts +4 -4
  153. package/templates/apps/mobile-app/src/lib/deeplinks.ts +6 -6
  154. package/templates/apps/mobile-app/src/persistence.ts +24 -3
  155. package/templates/apps/mobile-app/tsconfig.json +17 -3
  156. package/dist/addCommand-aXSQveak.js +0 -2
  157. package/dist/agentsMd-BTchIZku.js +0 -2
  158. package/dist/apiBuild-ttSDDOGp.js +0 -2
  159. package/dist/baselineCommand-Cfw2Afwm.js +0 -2
  160. package/dist/codegen-uYrrDzQv.js +0 -2
  161. package/dist/codegenCommand-C60m_LCp.js +0 -30
  162. package/dist/dbCommand-CC-qNzpz.js +0 -2
  163. package/dist/dev-CAOoXOkc.js +0 -3
  164. package/dist/doctorCommand-Cjl8Yii8.js +0 -2
  165. package/dist/frameworkTableAssembly-YyVe32Cb.js +0 -2
  166. package/dist/inspect-CjTYzAs_.js +0 -1190
  167. package/dist/inspect-P4pxoMaV.js +0 -2
  168. package/dist/inspectGateHint-BF6608UT.js +0 -4
  169. package/dist/manifestBuild-COkJoyAr.js +0 -2
  170. package/dist/serveCommand-DNRF2nDI.js +0 -2
  171. package/dist/serveCommand-DnY4VS3D.js +0 -1767
  172. package/dist/updateCommand-B0J_T9Vs.js +0 -2
  173. package/dist/webDev-CcJfdSjl2.js +0 -2
@@ -1,7 +1,7 @@
1
1
  import { a as e, t } from "./cliArgs-D4p8n7EE.js";
2
2
  import { a as n, i as r, n as i, r as a, t as o } from "./cloudClient-DWL-Hw_T.js";
3
3
  import { n as s } from "./cliOutput-D1tSBoRM.js";
4
- import { d as c, f as l, o as u } from "./projectScaffold-DDgWbNLe.js";
4
+ import { d as c, f as l, o as u } from "./projectScaffold-BvhLOrLq.js";
5
5
  import { basename as d, join as f, resolve as p } from "node:path";
6
6
  import { promises as m } from "node:fs";
7
7
  import { ansi as h } from "@voltro/logger";
@@ -115,7 +115,7 @@ var b = y(_), x = async (e) => {
115
115
  let s = setTimeout(() => a({
116
116
  ok: !1,
117
117
  error: "timed out waiting for the browser login (5 min)"
118
- }), 5 * 6e4);
118
+ }), 3e5);
119
119
  typeof s.unref == "function" && s.unref();
120
120
  });
121
121
  return r.close(), r.closeAllConnections?.(), i.ok ? (await n({
@@ -269,7 +269,7 @@ replicas = 1
269
269
  let f = d.data.deploymentId;
270
270
  if (typeof f != "string") return console.error("voltro cloud deploy: unexpected response from the control plane"), 1;
271
271
  console.log(`${h.green("queued")} ${f} · ${r} @ ${u.slice(0, 8)}`);
272
- let p = Date.now() + 15 * 6e4, m = "";
272
+ let p = Date.now() + 9e5, m = "";
273
273
  for (; Date.now() < p;) {
274
274
  await S(3e3);
275
275
  let e = await i(`/deployments/${encodeURIComponent(f)}`, { token: l });
@@ -285,23 +285,23 @@ replicas = 1
285
285
  }, q = async (e) => {
286
286
  let { json: t, rest: n } = D(e), { value: r, rest: a } = T(n, "--dir"), { project: o } = z(a), s = await w();
287
287
  if (s === null) return 1;
288
- let c = p(r ?? process.cwd()), u = await l(c, await H());
289
- if (u.apps.length === 0) return console.error(`voltro cloud scan: no apps (no app.config.ts found under ${c})`), 1;
290
- let d = JSON.stringify(u);
291
- if (/\bimport\s|\bexport\s|=>|function\s/.test(d)) return console.error("voltro cloud scan: refusing to send — payload looks like it contains source, not metadata"), 1;
292
- let f = await i(`/projects/${encodeURIComponent(o)}/inventory`, {
288
+ let c = p(r ?? process.cwd()), u = await H(), d = await l(c, u);
289
+ if (d.apps.length === 0) return console.error(`voltro cloud scan: no apps (no app.config.ts found under ${c})`), 1;
290
+ let f = JSON.stringify(d);
291
+ if (/\bimport\s|\bexport\s|=>|function\s/.test(f)) return console.error("voltro cloud scan: refusing to send — payload looks like it contains source, not metadata"), 1;
292
+ let m = await i(`/projects/${encodeURIComponent(o)}/inventory`, {
293
293
  method: "POST",
294
294
  token: s,
295
- body: u
295
+ body: d
296
296
  });
297
- if (f.kind === "err") return console.error(`voltro cloud scan: ${f.error}`), 1;
298
- if (t) return O(!0, f.data), 0;
299
- let m = f.data;
300
- for (let e of u.apps) {
301
- let t = m.apps?.find((t) => t.slug === e.slug), n = t?.created ? h.green("registered") : h.green("updated");
297
+ if (m.kind === "err") return console.error(`voltro cloud scan: ${m.error}`), 1;
298
+ if (t) return O(!0, m.data), 0;
299
+ let g = m.data;
300
+ for (let e of d.apps) {
301
+ let t = g.apps?.find((t) => t.slug === e.slug), n = t?.created ? h.green("registered") : h.green("updated");
302
302
  console.log(` ${n} ${e.slug} (${e.kind}) · ${t?.primitiveCount ?? 0} primitives · voltro ${e.voltroVersion ?? "unknown"}`);
303
303
  }
304
- return console.log(`${h.green("ok")} scanned ${u.apps.length} app(s) into ${o}`), 0;
304
+ return console.log(`${h.green("ok")} scanned ${d.apps.length} app(s) into ${o}`), 0;
305
305
  }, J = async (e) => {
306
306
  if (!G()) return console.error(W), 1;
307
307
  let { json: t, rest: n } = D(e), { project: r, rest: a } = z(n), { value: o } = T(a, "--app");
@@ -317,7 +317,7 @@ replicas = 1
317
317
  let l = c.data.deploymentId, u = c.data.rolledBackTo;
318
318
  if (typeof l != "string") return console.error("voltro cloud rollback: unexpected response from the control plane"), 1;
319
319
  console.log(`${h.green("queued")} ${l} · rollback ${o} → ${String(u).slice(0, 12)}`);
320
- let d = Date.now() + 15 * 6e4, f = "";
320
+ let d = Date.now() + 9e5, f = "";
321
321
  for (; Date.now() < d;) {
322
322
  await S(3e3);
323
323
  let e = await i(`/deployments/${encodeURIComponent(l)}`, { token: s });
@@ -15,10 +15,14 @@ var o = () => {
15
15
  name: e.name,
16
16
  error: e.error
17
17
  });
18
- return r === "json" ? (e(u.length > 0 ? {
19
- instances: l,
20
- fetchErrors: u
21
- } : { instances: l }, { pretty: !1 }), +!!s.every((e) => e.kind === "err")) : c(l, u, s);
18
+ if (r === "json") {
19
+ let t = u.length > 0 ? {
20
+ instances: l,
21
+ fetchErrors: u
22
+ } : { instances: l };
23
+ return e(t, { pretty: !1 }), +!!s.every((e) => e.kind === "err");
24
+ }
25
+ return c(l, u, s);
22
26
  }, c = (e, t, n) => {
23
27
  if (e.length > 0) {
24
28
  console.log(a.bold("cluster instances")), console.log("");
@@ -588,7 +588,7 @@ ${o.join("\n\n")}\n`);
588
588
  } catch (n) {
589
589
  e = `// <plugin:${t.pluginName}> ERROR: ${n?.message ?? String(n)}\n// </plugin:${t.pluginName}>`;
590
590
  }
591
- e === null || e === "" || b.push([
591
+ e !== null && e !== "" && b.push([
592
592
  `// <plugin:${t.pluginName}>`,
593
593
  e,
594
594
  `// </plugin:${t.pluginName}>`,
@@ -0,0 +1,2 @@
1
+ import { t as e } from "./codegen-CbpGCWLG.js";
2
+ export { e as checkRpcGroupFreshness };
@@ -0,0 +1,129 @@
1
+ import { l as e, z as t } from "./dev-3mgc8c-H.js";
2
+ import { rt as n } from "./webDev-CTpSY-e_.js";
3
+ import { r } from "./codegen-CbpGCWLG.js";
4
+ import { basename as i, join as a, relative as o, resolve as s } from "node:path";
5
+ import { promises as c } from "node:fs";
6
+ import { pathToFileURL as l } from "node:url";
7
+ //#region src/mobileCodegen.ts
8
+ var u = "voltro.mobile.ts", d = a(".framework", "mobileApis.generated.ts"), f = (e) => e.replace(/[^a-zA-Z0-9]/g, "_"), p = async (e) => {
9
+ let t = a(e, u);
10
+ try {
11
+ await c.stat(t);
12
+ } catch {
13
+ return { present: !1 };
14
+ }
15
+ try {
16
+ let e = (await import(`${l(t).href}?t=${Date.now()}`)).default;
17
+ return e === void 0 || typeof e != "object" || e.apis === void 0 ? {
18
+ present: !0,
19
+ error: /* @__PURE__ */ Error(`${u} has no default export with an \`apis\` map`)
20
+ } : {
21
+ present: !0,
22
+ binding: e
23
+ };
24
+ } catch (e) {
25
+ return {
26
+ present: !0,
27
+ error: e instanceof Error ? e : Error(String(e))
28
+ };
29
+ }
30
+ }, m = (e, t) => {
31
+ let n = t.filter(([, e]) => e.package !== void 0).map(([e, t]) => {
32
+ let n = `${f(e)}Group`, r = `${f(e)}Descriptors`;
33
+ return `import { ${n === "appGroup" ? "appGroup" : `appGroup as ${n}`}, ${r === "appDescriptors" ? "appDescriptors" : `appDescriptors as ${r}`} } from '${t.package}/rpcGroup'`;
34
+ }), r = t.map(([e, t]) => t.package === void 0 ? ` // ${JSON.stringify(e)}: declared with \`url\` only — no local rpc surface to import.\n // Add \`package: '<the api package>'\` to ${u} to get typed hooks for it.` : ` { ${[
35
+ `name: ${JSON.stringify(e)}`,
36
+ `group: ${f(e)}Group`,
37
+ `descriptors: ${f(e)}Descriptors`,
38
+ `wsUrl: wsUrl(${JSON.stringify(e)})`
39
+ ].join(", ")} },`), i = t.filter(([, e]) => e.url !== void 0).map(([e, t]) => ` ${JSON.stringify(e)}: ${JSON.stringify(t.url)},`);
40
+ return [
41
+ "// GENERATED BY `voltro codegen` — do not edit; regenerate with `voltro codegen`.",
42
+ "//",
43
+ `// The api bindings declared in ${u}. Only the BINDING is`,
44
+ "// generated: the procedure types ride the imports below, so a schema change",
45
+ "// in an api needs no regeneration here.",
46
+ "",
47
+ ...n,
48
+ "import type { MobileApiBinding } from '@voltro/react-native'",
49
+ "",
50
+ "/** Every api this app talks to, bound to a runtime-resolved ws URL.",
51
+ " *",
52
+ " * The URL is a parameter because it differs per environment and `localhost`",
53
+ " * on a device is the DEVICE — see `resolveDevWsUrl` in @voltro/react-native. */",
54
+ "export const mobileApis = (",
55
+ " wsUrl: (apiName: string) => string,",
56
+ "): ReadonlyArray<MobileApiBinding> => [",
57
+ ...r,
58
+ "]",
59
+ "",
60
+ "/** Api names in declaration order — the keys the hooks bind to. */",
61
+ `export const MOBILE_API_NAMES = [${t.map(([e]) => JSON.stringify(e)).join(", ")}] as const`,
62
+ ...i.length > 0 ? [
63
+ "",
64
+ `/** URLs declared in ${u} for apis this app does not build. */`,
65
+ "export const MOBILE_API_URLS: Readonly<Record<string, string>> = {",
66
+ ...i,
67
+ "}"
68
+ ] : [],
69
+ ""
70
+ ].join("\n");
71
+ }, h = async (e) => {
72
+ let t = s(e), r = await p(t);
73
+ if (!r.present) return { kind: "not-a-mobile-app" };
74
+ if ("error" in r) return {
75
+ kind: "refused",
76
+ reason: `${u} could not be loaded — ${r.error.message}`
77
+ };
78
+ let i = Object.entries(r.binding.apis);
79
+ if (i.length === 0) return {
80
+ kind: "refused",
81
+ reason: `${u} declares no apis`
82
+ };
83
+ for (let [e, t] of i) if (t.package === void 0 && t.url === void 0) return {
84
+ kind: "refused",
85
+ reason: `api ${JSON.stringify(e)} declares neither \`package\` nor \`url\``
86
+ };
87
+ for (let [e, r] of i) if (r.package !== void 0 && await n(t, r.package) === null) return {
88
+ kind: "refused",
89
+ reason: `api ${JSON.stringify(e)}: ${r.package} is not a workspace dependency of this app. Add it to the app's package.json (\`"${r.package}": "workspace:*"\`) and install.`
90
+ };
91
+ let o = a(t, d), l = m(t, i);
92
+ await c.mkdir(a(t, ".framework"), { recursive: !0 });
93
+ let f = null;
94
+ try {
95
+ f = await c.readFile(o, "utf8");
96
+ } catch {}
97
+ return f !== l && await c.writeFile(o, l, "utf8"), {
98
+ kind: "wrote",
99
+ file: o,
100
+ apis: i.map(([e]) => e)
101
+ };
102
+ }, g = (e, t) => t.kind === "wrote" ? `voltro codegen: wrote ${o(e, t.file)} (apis ${t.apis.join(", ")})` : t.kind === "refused" ? `voltro codegen: ${t.reason} — refusing to write.` : `voltro codegen: no ${u} here — not a mobile app.`, _ = async (n) => {
103
+ let { config: a, present: o, error: s } = await e(n);
104
+ if (o && a === null) return {
105
+ kind: "refused",
106
+ reason: "app.config.ts exists but could not be loaded" + (s === void 0 ? "" : ` — ${s instanceof Error ? s.message : String(s)}`)
107
+ };
108
+ let c = a?.plugins ?? [], { pluginContributions: l, pluginErrorImports: u, pluginRpcImports: d } = await t(c, a?.name ?? i(n), n), f = await r({
109
+ root: n,
110
+ ...l.length > 0 ? { pluginContributions: l } : {},
111
+ ...u.length > 0 ? { pluginErrorImports: u } : {},
112
+ ...d.length > 0 ? { pluginRpcImports: d } : {},
113
+ ...a?.name === void 0 ? {} : { apiName: a.name }
114
+ });
115
+ return f ? {
116
+ kind: "wrote",
117
+ file: f,
118
+ plugins: c.length,
119
+ errorSchemas: u.length,
120
+ routes: d.length
121
+ } : { kind: "nothing-to-write" };
122
+ }, v = async (e) => {
123
+ let t = s(e.find((e) => !e.startsWith("-")) ?? process.cwd()), n = await h(t);
124
+ if (n.kind !== "not-a-mobile-app") return console.log(g(t, n)), n.kind === "wrote" ? 0 : 1;
125
+ let r = await _(t);
126
+ return r.kind === "refused" ? (console.error(`voltro codegen: ${r.reason} — refusing to write.`), console.error(" The generated file would omit every plugin's error union and client routes, and would typecheck, so the omission would only surface as a missing error tag at runtime."), 1) : r.kind === "nothing-to-write" ? (console.log("voltro codegen: no rpc primitives found — nothing to write."), 0) : (console.log(`voltro codegen: wrote ${o(t, r.file)} (plugins ${r.plugins}, error schemas ${r.errorSchemas}, plugin routes ${r.routes})`), r.plugins > 0 && r.errorSchemas === 0 && console.log(" note: no plugin contributed a cross-cutting error schema, so the wire error union carries only each procedure's own `error:`. Expected if none of your plugins declare `errorSchemas` — but `guards:` needs @voltro/plugin-rbac for its ScopeError to decode typed."), 0);
127
+ };
128
+ //#endregion
129
+ export { _ as regenerateRpcGroup, v as runCodegenCommand };