@voltro/cli 0.39.0 → 0.40.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 (106) hide show
  1. package/CHANGELOG.md +210 -0
  2. package/dist/agentsMd-Bu_XQgVf.js +2 -0
  3. package/dist/{agentsMd-7zI2h5l9.js → agentsMd-D6yD7IQv.js} +31 -14
  4. package/dist/apiBuild-BIyGkym8.js +2 -0
  5. package/dist/{apiBuild-DGalUk9v.js → apiBuild-C8xBEYbL.js} +2 -2
  6. package/dist/bin.js +1 -1
  7. package/dist/{build-CfF6t0UM.js → build-CkhFGnKA.js} +168 -165
  8. package/dist/{checkCommand-CBtynBKW.js → checkCommand-BcXJa2IS.js} +3 -3
  9. package/dist/{checkCommand-BV56Pcc1.js → checkCommand-QbHshOac.js} +1 -1
  10. package/dist/{cloudCmd-C42gaO8s.js → cloudCmd-F4YJeqM3.js} +1 -1
  11. package/dist/{codegenCommand-W7SDdiAQ.js → codegenCommand-DF2OJh3O.js} +2 -2
  12. package/dist/{codemodRunner-D-jTyvWo.js → codemodRunner-BcOvi4A2.js} +103 -0
  13. package/dist/{commands-BD9eBRY3.js → commands-7Z7-HOE3.js} +30 -30
  14. package/dist/{dashboardCommand-7qGylm0F.js → dashboardCommand-CUycH6dR.js} +5 -5
  15. package/dist/{dataCommand-C_F2DYxe.js → dataCommand-By78lscK.js} +1 -1
  16. package/dist/{dev-alhkKoEX.js → dev-D8JSKlBM.js} +1 -1
  17. package/dist/{dev-gqpnzVhI.js → dev-Dh1NuYx1.js} +1569 -1569
  18. package/dist/{doctorCommand-Bvs-BQrM.js → doctorCommand-C-8-Z9D6.js} +55 -42
  19. package/dist/doctorCommand-FhQ7EVYL.js +2 -0
  20. package/dist/{dormancyCommand-B-PPHc9Q.js → dormancyCommand-A79Odglm.js} +1 -1
  21. package/dist/{embeddingsCommand-OKY6XjUf.js → embeddingsCommand-CoiyHfkY.js} +1 -1
  22. package/dist/{envCommand-B1-Zm85H.js → envCommand-B6d0s-jZ.js} +8 -8
  23. package/dist/{evolveCommand-C4-NlFbd.js → evolveCommand-BC5a9lxX.js} +2 -2
  24. package/dist/frameworkTableAssembly-DgylYh9_.js +2 -0
  25. package/dist/index.js +1 -1
  26. package/dist/{infoCommand-CTo8Jnhq.js → infoCommand-ZqSVzJZ4.js} +1 -1
  27. package/dist/{metaCommands-DUYR--Ts.js → metaCommands-CfRLra0s.js} +1 -1
  28. package/dist/{projectScaffold-BEhhHjPr.js → projectScaffold-BIl97_E6.js} +1 -1
  29. package/dist/{projectScaffold-BvhLOrLq.js → projectScaffold-mIX_DpSe.js} +1 -1
  30. package/dist/{runtimeTrace-DzZOCd94.js → runtimeTrace-BslKJjDY.js} +1 -1
  31. package/dist/{sdkgen-C4roLErM.js → sdkgen-DQ8uEmmn.js} +1 -1
  32. package/dist/serveCommand-BmvEQCMS.js +2 -0
  33. package/dist/{serveCommand-B6TATyCj.js → serveCommand-Dqb9Ku1-.js} +657 -657
  34. package/dist/serveEntry.js +1 -1
  35. package/dist/{start-BNuTWdRd.js → start-BA7txHhY.js} +1 -1
  36. package/dist/{start-ft_KzFTd.js → start-dkNYKtgQ.js} +342 -318
  37. package/dist/startEntry.js +1 -1
  38. package/dist/updateCommand-BauSVxPp.js +2 -0
  39. package/dist/{updateCommand-CHBmCB17.js → updateCommand-eoGpZr3E.js} +1 -1
  40. package/dist/webDev-CBbKs4dZ.js +2 -0
  41. package/dist/{webDev-CTpSY-e_.js → webDev-bybjZA0o.js} +240 -186
  42. package/dist/{webhooksCommand-BVvOtZ1B.js → webhooksCommand-DubZWNOx.js} +1 -1
  43. package/package.json +29 -17
  44. package/templates/AGENTS.md +1 -1
  45. package/templates/agent-docs/_index.md +1 -1
  46. package/templates/agent-docs/authentication.md +13 -4
  47. package/templates/agent-docs/data.md +43 -0
  48. package/templates/agent-docs/routing.md +40 -0
  49. package/templates/agent-docs/whats-new.md +91 -157
  50. package/templates/apps/api-ai/package.json +7 -7
  51. package/templates/apps/api-auth/package.json +8 -8
  52. package/templates/apps/api-backend/package.json +7 -7
  53. package/templates/apps/api-backend-deactivation/package.json +7 -7
  54. package/templates/apps/api-backend-mail/package.json +8 -8
  55. package/templates/apps/api-backend-mariadb/package.json +9 -9
  56. package/templates/apps/api-backend-sqlite/package.json +8 -8
  57. package/templates/apps/api-backend-storage/package.json +8 -8
  58. package/templates/apps/api-cms/package.json +10 -10
  59. package/templates/apps/api-collab/package.json +8 -8
  60. package/templates/apps/api-data-advanced/package.json +8 -8
  61. package/templates/apps/api-durable/package.json +8 -8
  62. package/templates/apps/api-durable/startup/warm.startup.tsx +16 -2
  63. package/templates/apps/api-durable/tests/orders.place.test.ts +17 -4
  64. package/templates/apps/api-feature-flags/package.json +9 -9
  65. package/templates/apps/api-governance/package.json +8 -8
  66. package/templates/apps/api-kv/package.json +8 -8
  67. package/templates/apps/api-moderation/package.json +8 -8
  68. package/templates/apps/api-observability/package.json +8 -8
  69. package/templates/apps/api-ratelimit/package.json +8 -8
  70. package/templates/apps/api-rbac/package.json +8 -8
  71. package/templates/apps/api-rest/package.json +7 -7
  72. package/templates/apps/api-saas/package.json +11 -11
  73. package/templates/apps/api-saas-starter/package.json +10 -10
  74. package/templates/apps/api-search/package.json +8 -8
  75. package/templates/apps/api-status/package.json +8 -8
  76. package/templates/apps/api-versioning/package.json +8 -8
  77. package/templates/apps/api-webhooks/package.json +9 -9
  78. package/templates/apps/changelog/package.json +6 -6
  79. package/templates/apps/changelog/src/pages/[slug]/page.test.tsx +8 -1
  80. package/templates/apps/edge-functions/package.json +2 -2
  81. package/templates/apps/frontend-admin/package.json +8 -8
  82. package/templates/apps/frontend-app/package.json +9 -9
  83. package/templates/apps/frontend-auth/package.json +8 -8
  84. package/templates/apps/frontend-blank/package.json +7 -7
  85. package/templates/apps/frontend-cms/package.json +9 -9
  86. package/templates/apps/frontend-collab/package.json +10 -10
  87. package/templates/apps/frontend-contact/package.json +7 -7
  88. package/templates/apps/frontend-dashboard/package.json +7 -7
  89. package/templates/apps/frontend-docs/package.json +7 -7
  90. package/templates/apps/frontend-i18n/package.json +6 -6
  91. package/templates/apps/frontend-landing/package.json +7 -7
  92. package/templates/apps/frontend-portal/package.json +8 -8
  93. package/templates/apps/frontend-saas/package.json +8 -8
  94. package/templates/apps/frontend-spa/package.json +7 -7
  95. package/templates/apps/frontend-ssr/package.json +7 -7
  96. package/templates/apps/frontend-ssr-api/package.json +8 -8
  97. package/templates/apps/frontend-static-blog/package.json +6 -6
  98. package/templates/apps/frontend-status/package.json +8 -8
  99. package/templates/apps/mobile-app/package.json +4 -4
  100. package/dist/agentsMd-BFCXh2gl.js +0 -2
  101. package/dist/apiBuild-2GvK8CUB.js +0 -2
  102. package/dist/doctorCommand-CVXfRrng.js +0 -2
  103. package/dist/frameworkTableAssembly-YyVe32Cb.js +0 -2
  104. package/dist/serveCommand-CNR0gI9V.js +0 -2
  105. package/dist/updateCommand-6FMU2klq.js +0 -2
  106. package/dist/webDev-id3I5PvG.js +0 -2
@@ -1,8 +1,8 @@
1
- import { hn as e } from "./dev-gqpnzVhI.js";
2
- import { D as t, G as n, K as r, O as i, S as a, W as o, Y as s, a as c, b as l, d as u, f as d, k as f, s as p, st as m, ut as h, v as g, x as _, y as v } from "./webDev-CTpSY-e_.js";
1
+ import { hn as e } from "./dev-Dh1NuYx1.js";
2
+ import { $ as t, E as n, J as r, M as i, N as a, T as o, X as s, Y as c, a as l, b as u, d, dt as f, f as p, j as m, mt as h, s as g, v as _, y as v } from "./webDev-bybjZA0o.js";
3
3
  import { t as y } from "./cliRuntime-Dh7UDinH.js";
4
4
  import { a as b } from "./renderModeScan-D7J1B7Kw.js";
5
- import { i as x, o as S, s as C } from "./apiBuild-DGalUk9v.js";
5
+ import { i as x, o as S, s as C } from "./apiBuild-C8xBEYbL.js";
6
6
  import { n as w } from "./renderProfile-1OWWAAtx.js";
7
7
  import { dirname as T, join as E, resolve as D } from "node:path";
8
8
  import { existsSync as O, promises as k } from "node:fs";
@@ -96,89 +96,89 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
96
96
  let n = t.replace(/^\//, "").split("/");
97
97
  return E(e, ...n, "index.html");
98
98
  }, B = (e) => e.replace(/<script\b(?=[^>]*\btype="module")(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<script\b(?=[^>]*\bsrc=)(?:(?!<\/script>).)*<\/script>/gi, "").replace(/<link\b[^>]*\brel="modulepreload"[^>]*>/gi, ""), V = (e, t) => {
99
- let n = e.replace("<div id=\"root\"></div>", `<div id="root">${t.body}</div>`), r = [
99
+ let r = e.replace("<div id=\"root\"></div>", `<div id="root">${t.body}</div>`), i = [
100
100
  t.metaHtml,
101
101
  `<meta name="voltro-interactive" content="${t.interactive}" />`,
102
102
  t.stateScript
103
103
  ].filter((e) => e.length > 0).join("\n ");
104
- return n = a(n, r), t.interactive === "none" && (n = B(n)), n;
104
+ return r = n(r, i), t.interactive === "none" && (r = B(r)), r;
105
105
  }, H = async (e) => {
106
- let { page: n, chainEntries: r, pageMod: o, helpers: s } = e, l = r.filter((e) => e.hasLayout);
107
- if (l.length === 0) return F.debug("skip page", {
108
- pattern: n.pattern,
106
+ let { page: t, chainEntries: r, pageMod: o, helpers: s } = e, c = r.filter((e) => e.hasLayout);
107
+ if (c.length === 0) return F.debug("skip page", {
108
+ pattern: t.pattern,
109
109
  reason: "renderMode=spa with no layout — nothing to shell"
110
110
  }), null;
111
- if (L(n.pattern)) return F.debug("skip page", {
112
- pattern: n.pattern,
111
+ if (L(t.pattern)) return F.debug("skip page", {
112
+ pattern: t.pattern,
113
113
  reason: "renderMode=spa with a dynamic pattern"
114
114
  }), null;
115
- let u = await Promise.all(l.map(e.loadLayout)), d = l.filter((e, t) => typeof u[t]?.loader == "function").map((e) => e.dir || "/");
116
- if (d.length > 0) return F.info(`spa shell for ${n.pattern} left to on-demand rendering — its layout chain has a loader (${d.join(", ")}), whose output may be per-request`, {
117
- pattern: n.pattern,
115
+ let u = await Promise.all(c.map(e.loadLayout)), d = c.filter((e, t) => typeof u[t]?.loader == "function").map((e) => e.dir || "/");
116
+ if (d.length > 0) return F.info(`spa shell for ${t.pattern} left to on-demand rendering — its layout chain has a loader (${d.join(", ")}), whose output may be per-request`, {
117
+ pattern: t.pattern,
118
118
  layouts: d
119
119
  }), null;
120
- let { chain: p, segmentLoaderData: m } = await c({
120
+ let { chain: f, segmentLoaderData: p } = await l({
121
121
  entries: r,
122
122
  loadLayout: e.loadLayout,
123
123
  loadError: e.loadError,
124
124
  loadPending: e.loadPending,
125
125
  ctx: e.ctx
126
126
  }), h = {
127
- pattern: n.pattern,
127
+ pattern: t.pattern,
128
128
  Component: o.default,
129
129
  meta: o.meta,
130
130
  ErrorBoundary: o.ErrorBoundary,
131
131
  Pending: o.Pending,
132
132
  renderMode: "spa",
133
- chain: p
134
- }, g = o.interactive ?? "full", _ = t({
133
+ chain: f
134
+ }, g = o.interactive ?? "full", _ = m({
135
135
  helpers: s,
136
- page: n.pattern,
136
+ page: t.pattern,
137
137
  interactive: g,
138
138
  delivery: "artefact",
139
139
  renderInput: {
140
140
  descriptor: h,
141
141
  params: {},
142
- pathname: n.pattern,
143
- segmentLoaderData: m,
142
+ pathname: t.pattern,
143
+ segmentLoaderData: p,
144
144
  ...e.outerWrap ? { outerWrap: e.outerWrap } : {},
145
145
  ...e.locale ? { locale: e.locale } : {}
146
146
  }
147
147
  }), v = i({
148
148
  helpers: s,
149
149
  prepared: _
150
- }), y = f({
150
+ }), y = a({
151
151
  helpers: s,
152
152
  prepared: _,
153
153
  meta: v.meta,
154
154
  interactive: g
155
- }), b = a(e.shellTemplate.replace("<div id=\"root\"></div>", `<div id="root">${v.body}</div>`), y), x = z(e.distDir, n.pattern);
156
- return await k.mkdir(T(x), { recursive: !0 }), await k.writeFile(x, b, "utf8"), F.debug("prerendered spa layout shell", { pattern: n.pattern }), {
157
- pattern: n.pattern,
155
+ }), b = n(e.shellTemplate.replace("<div id=\"root\"></div>", `<div id="root">${v.body}</div>`), y), x = z(e.distDir, t.pattern);
156
+ return await k.mkdir(T(x), { recursive: !0 }), await k.writeFile(x, b, "utf8"), F.debug("prerendered spa layout shell", { pattern: t.pattern }), {
157
+ pattern: t.pattern,
158
158
  outPath: x
159
159
  };
160
160
  }, U = async (e) => {
161
- let { root: t, distDir: n, pages: r, dirs: i, vite: a } = e, o = E(n, "index.html"), l = await k.readFile(o, "utf8"), u = E(n, "_voltro", "shell.html");
162
- await k.mkdir(T(u), { recursive: !0 }), await k.writeFile(u, l, "utf8");
163
- let d = E(t, "node_modules", "@voltro", "ui-shadcn"), f = O(E(d, "package.json")) ? d : null, m = [...f ? [
161
+ let { root: n, distDir: r, pages: i, dirs: a, vite: s } = e, c = E(r, "index.html"), u = await k.readFile(c, "utf8"), d = E(r, "_voltro", "shell.html");
162
+ await k.mkdir(T(d), { recursive: !0 }), await k.writeFile(d, u, "utf8");
163
+ let f = E(n, "node_modules", "@voltro", "ui-shadcn"), p = O(E(f, "package.json")) ? f : null, m = [...p ? [
164
164
  {
165
165
  find: "@voltro/ui-shadcn/tokens.css",
166
- replacement: E(f, "src/tokens.css")
166
+ replacement: E(p, "src/tokens.css")
167
167
  },
168
168
  {
169
169
  find: "@voltro/ui-shadcn/cn",
170
- replacement: E(f, "src/cn.ts")
170
+ replacement: E(p, "src/cn.ts")
171
171
  },
172
172
  {
173
173
  find: "@voltro/ui-shadcn/brand",
174
- replacement: E(f, "src/brand/voltroLogo.tsx")
174
+ replacement: E(p, "src/brand/voltroLogo.tsx")
175
175
  },
176
176
  {
177
177
  find: "@voltro/ui-shadcn",
178
- replacement: E(f, "src/index.ts")
178
+ replacement: E(p, "src/index.ts")
179
179
  }
180
- ] : [], ...s(t)], h = await a.createServer({
181
- root: E(t, ".framework"),
180
+ ] : [], ...t(n)], h = await s.createServer({
181
+ root: E(n, ".framework"),
182
182
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
183
183
  plugins: [(await import("@vitejs/plugin-react")).default(), (await import("@tailwindcss/vite")).default()],
184
184
  resolve: {
@@ -198,20 +198,20 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
198
198
  },
199
199
  appType: "custom",
200
200
  logLevel: "warn"
201
- }), g = await h.ssrLoadModule("@voltro/web/ssr"), { renderPageToHtml: v, renderMetaToHtml: y, renderRouterStateScript: x, isDeferredLoaderResult: S, assertDeferralSupported: C, beginStoreSeeds: w, seedPreloadedSubscription: D, seedPreloadedSubscriptionFailure: A } = g, j = /* @__PURE__ */ new Map();
201
+ }), _ = await h.ssrLoadModule("@voltro/web/ssr"), { renderPageToHtml: v, renderMetaToHtml: y, renderRouterStateScript: x, isDeferredLoaderResult: S, assertDeferralSupported: C, beginStoreSeeds: w, seedPreloadedSubscription: D, seedPreloadedSubscriptionFailure: A } = _, j = /* @__PURE__ */ new Map();
202
202
  if (e.locales && e.locales.length > 0 && e.defaultLocale) try {
203
- let n = (await h.ssrLoadModule("@voltro/i18n")).makeSsgWrap;
204
- if (typeof n != "function") throw Error("@voltro/i18n is installed but missing the `makeSsgWrap` export — upgrade @voltro/i18n to a version that ships SSG support.");
203
+ let t = (await h.ssrLoadModule("@voltro/i18n")).makeSsgWrap;
204
+ if (typeof t != "function") throw Error("@voltro/i18n is installed but missing the `makeSsgWrap` export — upgrade @voltro/i18n to a version that ships SSG support.");
205
205
  for (let r of e.locales) try {
206
- let i = await h.ssrLoadModule(E(t, "src", "locales", `${r}.ts`)), a = i.default ?? i;
207
- j.set(r, n(r, a, e.defaultLocale));
206
+ let i = await h.ssrLoadModule(E(n, "src", "locales", `${r}.ts`)), a = i.default ?? i;
207
+ j.set(r, t(r, a, e.defaultLocale));
208
208
  } catch (e) {
209
209
  F.warn(`i18n catalog missing for locale '${r}' — pages rendered at /${r}/* will crash. Add src/locales/${r}.ts.`, {}, e);
210
210
  }
211
211
  } catch (e) {
212
212
  F.warn("i18n wrapper unavailable for SSG — pages that call useT() will fail. Check that @voltro/i18n is installed.", {}, e);
213
213
  }
214
- let M = [], N = {}, P = (e) => e.dir === "" ? E(t, "src", "pages") : E(t, "src", "pages", e.dir), I = async (e) => await h.ssrLoadModule(E(P(e), "layout.tsx")), B = async (e) => await h.ssrLoadModule(E(P(e), "error.tsx")), U = async (e) => await h.ssrLoadModule(E(P(e), "loading.tsx")), W = (e, t) => ({
214
+ let M = [], N = {}, P = (e) => e.dir === "" ? E(n, "src", "pages") : E(n, "src", "pages", e.dir), I = async (e) => await h.ssrLoadModule(E(P(e), "layout.tsx")), B = async (e) => await h.ssrLoadModule(E(P(e), "error.tsx")), U = async (e) => await h.ssrLoadModule(E(P(e), "loading.tsx")), W = (e, t) => ({
215
215
  params: e.params,
216
216
  pathname: e.pathname,
217
217
  search: "",
@@ -220,166 +220,169 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
220
220
  query: void 0,
221
221
  isServer: !0
222
222
  });
223
- for (let a of r) {
224
- let r = `${E(t, "src", "pages", a.file)}`, o = await h.ssrLoadModule(r), s = b(o, E("src", "pages", a.file));
225
- N[a.pattern] = s;
226
- let u = s.renderMode, d = p(i, a.dirChain);
227
- if (u === "spa") {
228
- let t = await H({
229
- page: a,
230
- chainEntries: d,
231
- pageMod: o,
232
- shellTemplate: l,
233
- distDir: n,
234
- helpers: g,
223
+ for (let t of i) {
224
+ let i = `${E(n, "src", "pages", t.file)}`, s = await h.ssrLoadModule(i), c = b(s, E("src", "pages", t.file));
225
+ N[t.pattern] = c;
226
+ let d = c.renderMode, f = g(a, t.dirChain);
227
+ if (d === "spa") {
228
+ let n = await H({
229
+ page: t,
230
+ chainEntries: f,
231
+ pageMod: s,
232
+ shellTemplate: u,
233
+ distDir: r,
234
+ helpers: _,
235
235
  loadLayout: I,
236
236
  loadError: B,
237
237
  loadPending: U,
238
238
  ctx: W({
239
239
  params: {},
240
- pathname: a.pattern
240
+ pathname: t.pattern
241
241
  }, new AbortController().signal),
242
242
  outerWrap: j.get(e.defaultLocale ?? ""),
243
243
  locale: e.defaultLocale
244
244
  });
245
- t && M.push(t);
245
+ n && M.push(n);
246
246
  continue;
247
247
  }
248
- if (u !== "static") {
248
+ if (d !== "static") {
249
249
  F.debug("skip page", {
250
- pattern: a.pattern,
251
- reason: `renderMode=${u}`
250
+ pattern: t.pattern,
251
+ reason: `renderMode=${d}`
252
252
  });
253
253
  continue;
254
254
  }
255
- let f;
256
- if (L(a.pattern)) {
257
- if (typeof o.getStaticPaths != "function") {
255
+ let p;
256
+ if (L(t.pattern)) {
257
+ if (typeof s.getStaticPaths != "function") {
258
258
  F.debug("skip page", {
259
- pattern: a.pattern,
259
+ pattern: t.pattern,
260
260
  reason: "no getStaticPaths export"
261
261
  });
262
262
  continue;
263
263
  }
264
264
  try {
265
- let e = await o.getStaticPaths();
265
+ let e = await s.getStaticPaths();
266
266
  if (!Array.isArray(e)) {
267
- F.warn("skip page — getStaticPaths did not return an array", { pattern: a.pattern });
267
+ F.warn("skip page — getStaticPaths did not return an array", { pattern: t.pattern });
268
268
  continue;
269
269
  }
270
- f = e.map((e) => ({
270
+ p = e.map((e) => ({
271
271
  params: e.params,
272
- pathname: R(a.pattern, e.params)
272
+ pathname: R(t.pattern, e.params)
273
273
  }));
274
274
  } catch (e) {
275
- F.warn("skip page — getStaticPaths threw", { pattern: a.pattern }, e);
275
+ F.warn("skip page — getStaticPaths threw", { pattern: t.pattern }, e);
276
276
  continue;
277
277
  }
278
- if (f.length === 0) {
278
+ if (p.length === 0) {
279
279
  F.debug("skip page", {
280
- pattern: a.pattern,
280
+ pattern: t.pattern,
281
281
  reason: "getStaticPaths returned []"
282
282
  });
283
283
  continue;
284
284
  }
285
- } else f = [{
285
+ } else p = [{
286
286
  params: {},
287
- pathname: a.pattern
287
+ pathname: t.pattern
288
288
  }];
289
- let m = o.interactive ?? "full";
290
- for (let t of f) {
289
+ let m = s.interactive ?? "full";
290
+ for (let n of p) {
291
291
  w();
292
- let r, i, s = new AbortController();
292
+ let i, a, c = new AbortController();
293
293
  try {
294
- ({chain: r, segmentLoaderData: i} = await c({
295
- entries: d,
294
+ ({chain: i, segmentLoaderData: a} = await l({
295
+ entries: f,
296
296
  loadLayout: I,
297
297
  loadError: B,
298
298
  loadPending: U,
299
- ctx: W(t, s.signal)
299
+ ctx: W(n, c.signal)
300
300
  }));
301
301
  } catch (e) {
302
- let n = e?._voltroControl;
303
- if (e instanceof Error && n === "redirect") throw Error(`Static page "${t.pathname}" threw RedirectError from a LAYOUT loader at build time. Static pages can't redirect per-request — switch it to renderMode 'ssr'.`);
304
- if (e instanceof Error && n === "not-found") {
305
- F.warn("layout loader threw NotFoundError at build time — skipping artifact", { pathname: t.pathname });
302
+ let t = e?._voltroControl;
303
+ if (e instanceof Error && t === "redirect") throw Error(`Static page "${n.pathname}" threw RedirectError from a LAYOUT loader at build time. Static pages can't redirect per-request — switch it to renderMode 'ssr'.`);
304
+ if (e instanceof Error && t === "not-found") {
305
+ F.warn("layout loader threw NotFoundError at build time — skipping artifact", { pathname: n.pathname });
306
306
  continue;
307
307
  }
308
- F.warn("layout loader threw, falling back to no layout data", { pathname: t.pathname }, e), {chain: r, segmentLoaderData: i} = await c({
309
- entries: d,
308
+ F.warn("layout loader threw, falling back to no layout data", { pathname: n.pathname }, e), {chain: i, segmentLoaderData: a} = await l({
309
+ entries: f,
310
310
  loadLayout: async (e) => ({ default: (await I(e)).default }),
311
311
  loadError: B,
312
312
  loadPending: U,
313
- ctx: W(t, s.signal)
313
+ ctx: W(n, c.signal)
314
314
  });
315
315
  }
316
- let f = {
317
- pattern: a.pattern,
318
- Component: o.default,
319
- meta: o.meta,
320
- loader: o.loader,
321
- ErrorBoundary: o.ErrorBoundary,
322
- Pending: o.Pending,
323
- renderMode: u,
324
- chain: r
325
- }, p = null;
326
- if (typeof o.loader == "function") {
316
+ let p = {
317
+ pattern: t.pattern,
318
+ Component: s.default,
319
+ meta: s.meta,
320
+ loader: s.loader,
321
+ ErrorBoundary: s.ErrorBoundary,
322
+ Pending: s.Pending,
323
+ renderMode: d,
324
+ chain: i
325
+ }, h = null;
326
+ if (typeof s.loader == "function") {
327
327
  let e = new AbortController();
328
328
  try {
329
- p = await o.loader({
330
- params: t.params,
331
- pathname: t.pathname,
329
+ h = await s.loader({
330
+ params: n.params,
331
+ pathname: n.pathname,
332
+ search: "",
333
+ headers: {},
334
+ query: void 0,
332
335
  signal: e.signal,
333
336
  isServer: !0
334
337
  });
335
338
  } catch (e) {
336
- if (e instanceof Error && e._voltroControl === "redirect") throw Error(`Static page "${t.pathname}" threw RedirectError at build time. Static pages can't redirect per-request — switch it to renderMode 'ssr'.`);
339
+ if (e instanceof Error && e._voltroControl === "redirect") throw Error(`Static page "${n.pathname}" threw RedirectError at build time. Static pages can't redirect per-request — switch it to renderMode 'ssr'.`);
337
340
  if (e instanceof Error && e._voltroControl === "not-found") {
338
- F.warn("loader threw NotFoundError at build time — skipping artifact", { pathname: t.pathname });
341
+ F.warn("loader threw NotFoundError at build time — skipping artifact", { pathname: n.pathname });
339
342
  continue;
340
343
  }
341
- F.warn("loader threw, falling back to null", { pathname: t.pathname }, e);
344
+ F.warn("loader threw, falling back to null", { pathname: n.pathname }, e);
342
345
  }
343
346
  }
344
- S(p) && C({
345
- page: t.pathname,
346
- renderMode: u,
347
+ S(h) && C({
348
+ page: n.pathname,
349
+ renderMode: d,
347
350
  interactive: m
348
351
  });
349
- for (let e of Object.values(i)) S(e) && C({
350
- page: t.pathname,
351
- renderMode: u,
352
+ for (let e of Object.values(a)) S(e) && C({
353
+ page: n.pathname,
354
+ renderMode: d,
352
355
  interactive: m
353
356
  });
354
- await _({
355
- pageMod: o,
356
- params: t.params,
357
+ await o({
358
+ pageMod: s,
359
+ params: n.params,
357
360
  query: void 0,
358
361
  apiName: void 0,
359
362
  seed: D,
360
363
  seedFailure: A
361
364
  });
362
- let h = t.params.locale ?? e.defaultLocale ?? "en", g = j.get(h) ?? j.get(e.defaultLocale ?? ""), { html: b, meta: E } = v({
363
- descriptor: f,
364
- params: t.params,
365
- pathname: t.pathname,
366
- loaderData: p,
367
- segmentLoaderData: i,
368
- ...g ? { outerWrap: g } : {},
369
- locale: h
370
- }), O = V(l, {
365
+ let g = n.params.locale ?? e.defaultLocale ?? "en", _ = j.get(g) ?? j.get(e.defaultLocale ?? ""), { html: b, meta: E } = v({
366
+ descriptor: p,
367
+ params: n.params,
368
+ pathname: n.pathname,
369
+ loaderData: h,
370
+ segmentLoaderData: a,
371
+ ..._ ? { outerWrap: _ } : {},
372
+ locale: g
373
+ }), O = V(u, {
371
374
  body: b,
372
375
  metaHtml: y(E),
373
376
  stateScript: x({
374
- path: t.pathname,
375
- loaderData: p,
376
- segmentLoaderData: i,
377
- pageLoaderRan: typeof o.loader == "function"
377
+ path: n.pathname,
378
+ loaderData: h,
379
+ segmentLoaderData: a,
380
+ pageLoaderRan: typeof s.loader == "function"
378
381
  }),
379
382
  interactive: m
380
- }), N = z(n, t.pathname);
383
+ }), N = z(r, n.pathname);
381
384
  await k.mkdir(T(N), { recursive: !0 }), await k.writeFile(N, O, "utf8"), M.push({
382
- pattern: t.pathname,
385
+ pattern: n.pathname,
383
386
  outPath: N,
384
387
  ...E?.noIndex ? { noIndex: !0 } : {}
385
388
  });
@@ -474,7 +477,7 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
474
477
  file: n.file,
475
478
  reason: n.reason
476
479
  });
477
- let { regenerateRpcGroup: r } = await import("./codegenCommand-W7SDdiAQ.js"), i = await r(e);
480
+ let { regenerateRpcGroup: r } = await import("./codegenCommand-DF2OJh3O.js"), i = await r(e);
478
481
  if (i.kind === "refused") {
479
482
  F.warn("could not regenerate the rpc group — building against what is on disk", { reason: i.reason });
480
483
  return;
@@ -484,12 +487,12 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
484
487
  routes: i.routes
485
488
  });
486
489
  }, K = async (e) => {
487
- let t = await u(e);
488
- if (!t) {
489
- let { loadApiConfig: t } = await import("./dev-alhkKoEX.js"), n = await t(e);
490
+ let n = await d(e);
491
+ if (!n) {
492
+ let { loadApiConfig: t } = await import("./dev-D8JSKlBM.js"), n = await t(e);
490
493
  if (n) {
491
494
  F.info("building api app", { app: n.name ?? "(unnamed)" }), await G(e);
492
- let { runApiBuild: t, runServeBundleBuild: r } = await import("./apiBuild-2GvK8CUB.js");
495
+ let { runApiBuild: t, runServeBundleBuild: r } = await import("./apiBuild-BIyGkym8.js");
493
496
  await t(e);
494
497
  try {
495
498
  await r(e);
@@ -509,22 +512,22 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
509
512
  exitCode: 0
510
513
  };
511
514
  }
512
- F.info("building web app", { app: t.name ?? "(unnamed)" });
513
- let { resolved: i } = await m({
514
- rawEnv: t.env,
515
+ F.info("building web app", { app: n.name ?? "(unnamed)" });
516
+ let { resolved: i } = await f({
517
+ rawEnv: n.env,
515
518
  appType: "web",
516
519
  root: e,
517
520
  log: F,
518
521
  generateTypes: !0
519
- }), a = await d(e, t);
520
- await l(e, t, a, i.publicValues);
521
- let { pages: c } = await v(E(e, "src", "pages"));
522
- await r({
522
+ }), a = await p(e, n);
523
+ await u(e, n, a, i.publicValues);
524
+ let { pages: o } = await v(E(e, "src", "pages"));
525
+ await s({
523
526
  appRoot: e,
524
- pages: c,
527
+ pages: o,
525
528
  mode: "prod"
526
529
  });
527
- let f = E(e, ".framework"), p = E(f, "dist"), _ = E(e, "node_modules", "@voltro", "ui-shadcn"), y = O(E(_, "package.json")) ? _ : null, b = [...y ? [
530
+ let l = E(e, ".framework"), m = E(l, "dist"), g = E(e, "node_modules", "@voltro", "ui-shadcn"), y = O(E(g, "package.json")) ? g : null, b = [...y ? [
528
531
  {
529
532
  find: "@voltro/ui-shadcn/tokens.css",
530
533
  replacement: E(y, "src/tokens.css")
@@ -541,11 +544,11 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
541
544
  find: "@voltro/ui-shadcn",
542
545
  replacement: E(y, "src/index.ts")
543
546
  }
544
- ] : [], ...s(e)];
547
+ ] : [], ...t(e)];
545
548
  F.info("running vite build");
546
549
  let x = await h("vite", () => import("vite")), C = (await import("@vitejs/plugin-react")).default, T = (await import("@tailwindcss/vite")).default;
547
550
  await x.build({
548
- root: f,
551
+ root: l,
549
552
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
550
553
  plugins: [C(), T()],
551
554
  resolve: {
@@ -561,32 +564,32 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
561
564
  build: {
562
565
  outDir: "dist",
563
566
  emptyOutDir: !0,
564
- rollupOptions: { output: { manualChunks: g } }
567
+ rollupOptions: { output: { manualChunks: _ } }
565
568
  },
566
569
  logLevel: "warn"
567
570
  });
568
571
  let D = E(e, "src", "pages"), { pages: A, dirs: j } = await v(D);
569
572
  if (A.length === 0) return F.info("no pages found — client-only bundle written", {
570
573
  pagesDir: D,
571
- distDir: p
574
+ distDir: m
572
575
  }), {
573
576
  ran: !0,
574
577
  exitCode: 0
575
578
  };
576
579
  let { rendered: M, pageMeta: N } = await U({
577
580
  root: e,
578
- distDir: p,
581
+ distDir: m,
579
582
  pages: A,
580
583
  dirs: j,
581
584
  vite: x,
582
- ...t.locales ? { locales: t.locales } : {},
583
- ...t.defaultLocale ? { defaultLocale: t.defaultLocale } : {}
585
+ ...n.locales ? { locales: n.locales } : {},
586
+ ...n.defaultLocale ? { defaultLocale: n.defaultLocale } : {}
584
587
  });
585
- F.info("generating .framework/ssrEntry.ts"), await W(e, A, j, t.locales, t.defaultLocale, N), F.info("vite build --ssr → dist/server/");
588
+ F.info("generating .framework/ssrEntry.ts"), await W(e, A, j, n.locales, n.defaultLocale, N), F.info("vite build --ssr → dist/server/");
586
589
  let L = /* @__PURE__ */ new Set();
587
590
  try {
588
591
  await x.build({
589
- root: f,
592
+ root: l,
590
593
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
591
594
  plugins: [
592
595
  C(),
@@ -626,7 +629,7 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
626
629
  try {
627
630
  await (await h("esbuild", () => import("esbuild"))).build({
628
631
  entryPoints: [R],
629
- outfile: E(p, "server", "appConfig.js"),
632
+ outfile: E(m, "server", "appConfig.js"),
630
633
  bundle: !0,
631
634
  format: "esm",
632
635
  platform: "node",
@@ -656,36 +659,36 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
656
659
  routes: M.map((e) => e.pattern)
657
660
  });
658
661
  try {
659
- let e = process.env.VOLTRO_SEO_NOINDEX !== "1", r = t.seo?.siteUrl, i = t.locales ?? [], a = t.defaultLocale ?? i[0];
660
- if (r && !O(E(p, "sitemap.xml"))) {
661
- let t = new Set(i.filter((e) => e !== a)), o = M.filter((e) => !e.noIndex).map((e) => e.pattern).filter((e) => {
662
- let n = e.split("/").filter(Boolean)[0];
663
- return n === void 0 || !t.has(n);
664
- }).filter((e) => !e.includes("[")).map((e) => ({ path: e })), s = n({
665
- siteUrl: r,
666
- entries: o,
662
+ let e = process.env.VOLTRO_SEO_NOINDEX !== "1", t = n.seo?.siteUrl, i = n.locales ?? [], a = n.defaultLocale ?? i[0];
663
+ if (t && !O(E(m, "sitemap.xml"))) {
664
+ let n = new Set(i.filter((e) => e !== a)), r = M.filter((e) => !e.noIndex).map((e) => e.pattern).filter((e) => {
665
+ let t = e.split("/").filter(Boolean)[0];
666
+ return t === void 0 || !n.has(t);
667
+ }).filter((e) => !e.includes("[")).map((e) => ({ path: e })), o = c({
668
+ siteUrl: t,
669
+ entries: r,
667
670
  ...i.length > 1 ? { locales: i } : {},
668
671
  ...a ? { defaultLocale: a } : {}
669
672
  });
670
- await k.writeFile(E(p, "sitemap.xml"), s, "utf8"), F.info("wrote dist/sitemap.xml", {
671
- urls: o.length,
673
+ await k.writeFile(E(m, "sitemap.xml"), o, "utf8"), F.info("wrote dist/sitemap.xml", {
674
+ urls: r.length,
672
675
  indexable: e
673
676
  });
674
677
  }
675
- if (!O(E(p, "robots.txt"))) {
676
- let n = o({
678
+ if (!O(E(m, "robots.txt"))) {
679
+ let i = r({
677
680
  indexable: e,
678
- ...e && r ? { sitemapUrl: `${r.replace(/\/$/, "")}/sitemap.xml` } : {},
679
- ...t.seo?.disallow ? { disallow: t.seo.disallow } : {}
681
+ ...e && t ? { sitemapUrl: `${t.replace(/\/$/, "")}/sitemap.xml` } : {},
682
+ ...n.seo?.disallow ? { disallow: n.seo.disallow } : {}
680
683
  });
681
- await k.writeFile(E(p, "robots.txt"), n, "utf8"), F.info("wrote dist/robots.txt", { indexable: e });
684
+ await k.writeFile(E(m, "robots.txt"), i, "utf8"), F.info("wrote dist/robots.txt", { indexable: e });
682
685
  }
683
686
  } catch (e) {
684
687
  F.warn("SEO artefact generation failed (non-fatal)", {}, e);
685
688
  }
686
689
  try {
687
690
  let t = await w(e);
688
- await k.writeFile(E(p, ".voltro-build.json"), JSON.stringify({
691
+ await k.writeFile(E(m, ".voltro-build.json"), JSON.stringify({
689
692
  version: 1,
690
693
  profile: t
691
694
  }, null, 2), "utf8"), F.info("wrote deploy profile manifest", {
@@ -696,7 +699,7 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
696
699
  } catch (e) {
697
700
  F.warn("could not write .voltro-build.json deploy manifest", {}, e);
698
701
  }
699
- return F.info("build complete", { distDir: p }), {
702
+ return F.info("build complete", { distDir: m }), {
700
703
  ran: !0,
701
704
  exitCode: 0
702
705
  };
@@ -708,7 +711,7 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
708
711
  return t.ran ? t.exitCode : (yield* j.logError("no web app found at this path", { hint: "looked for app.config.ts with `type: 'web'`" }), 1);
709
712
  }), J = async (t) => {
710
713
  if (t.includes("--target")) {
711
- let { runSdkBuildCommand: e } = await import("./sdkgen-C4roLErM.js");
714
+ let { runSdkBuildCommand: e } = await import("./sdkgen-DQ8uEmmn.js");
712
715
  return e(t);
713
716
  }
714
717
  let n = t.find((e) => !e.startsWith("-")) ?? process.cwd(), r = await y(q(n), { scope: "voltro:build" }), i = e(n);
@@ -4,7 +4,7 @@ import { r } from "./appGraph-KGDPTuTy.js";
4
4
  import { n as i } from "./cliOutput-D1tSBoRM.js";
5
5
  import { n as a, o, r as s, t as c } from "./inspectFetch-EMuhTG_9.js";
6
6
  import { r as l } from "./fileTaxonomy-CJfgOllU.js";
7
- import { x as u } from "./doctorCommand-Bvs-BQrM.js";
7
+ import { x as u } from "./doctorCommand-C-8-Z9D6.js";
8
8
  import { resolve as d } from "node:path";
9
9
  import { readdirSync as f, statSync as p } from "node:fs";
10
10
  //#region src/observedDiff.ts
@@ -141,12 +141,12 @@ var m = (e) => e === void 0 ? [] : typeof e == "string" ? [e] : e, h = /* @__PUR
141
141
  let t = e.severity === "error" ? "✗ error" : "⚠ warn", n = e.file ? ` (${e.file})` : "";
142
142
  return `${t} ${e.rule} ${e.node}${n}\n ${e.breaks.join("; ")}\n fix: ${e.fix}`;
143
143
  }).join("\n"), C = async (e) => {
144
- let { walk: t, loadDiscovered: n, loadApiConfig: r } = await import("./dev-alhkKoEX.js"), { buildRpcEntry: i } = await import("./manifestBuild-j0n109tt.js"), { buildCapabilityManifest: a } = await import("./inspect-DUze25t0.js"), { relative: o } = await import("node:path"), s = await n(await t(e)), c = (t, n, r) => i(t, n, o(e, r)), l = [
144
+ let { walk: t, loadDiscovered: n, loadApiConfig: r } = await import("./dev-D8JSKlBM.js"), { buildRpcEntry: i } = await import("./manifestBuild-j0n109tt.js"), { buildCapabilityManifest: a } = await import("./inspect-DUze25t0.js"), { relative: o } = await import("node:path"), s = await n(await t(e)), c = (t, n, r) => i(t, n, o(e, r)), l = [
145
145
  ...s.queries.map((e) => c(e.descriptor, "query", e.file)),
146
146
  ...s.mutations.map((e) => c(e.descriptor, "mutation", e.file)),
147
147
  ...s.actions.map((e) => c(e.descriptor, "action", e.file)),
148
148
  ...s.streams.map((e) => c(e.descriptor, "stream", e.file))
149
- ], { assembleFrameworkTables: u } = await import("./frameworkTableAssembly-YyVe32Cb.js"), d = await u({ root: e }).catch((e) => (console.warn(`\n⚠ plugin tables could not be collected — this report is INCOMPLETE.\n ${e instanceof Error ? e.message.split("\n")[0] : String(e)}\n`), [])), f = new Set(s.tables.map((e) => e.tableName)), p = [...[...f].map((e) => ({ name: e })), ...d.map((e) => e.tableName).filter((e) => !f.has(e)).map((e) => ({
149
+ ], { assembleFrameworkTables: u } = await import("./frameworkTableAssembly-DgylYh9_.js"), d = await u({ root: e }).catch((e) => (console.warn(`\n⚠ plugin tables could not be collected — this report is INCOMPLETE.\n ${e instanceof Error ? e.message.split("\n")[0] : String(e)}\n`), [])), f = new Set(s.tables.map((e) => e.tableName)), p = [...[...f].map((e) => ({ name: e })), ...d.map((e) => e.tableName).filter((e) => !f.has(e)).map((e) => ({
150
150
  name: e,
151
151
  framework: !0
152
152
  }))], m = await r(e).then((e) => e?.plugins ?? []).catch(() => []);
@@ -1,2 +1,2 @@
1
- import { n as e, r as t, t as n } from "./checkCommand-CBtynBKW.js";
1
+ import { n as e, r as t, t as n } from "./checkCommand-BcXJa2IS.js";
2
2
  export { n as offlineManifest, e as runCheckCommand, t as toInput };
@@ -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-BvhLOrLq.js";
4
+ import { d as c, f as l, o as u } from "./projectScaffold-mIX_DpSe.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";