@voltro/cli 0.40.0 → 0.42.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 (104) hide show
  1. package/CHANGELOG.md +171 -0
  2. package/dist/{apiBuild-C8xBEYbL.js → apiBuild-B_iH24qf.js} +2 -2
  3. package/dist/apiBuild-RM5W5YXk.js +2 -0
  4. package/dist/bin.js +1 -1
  5. package/dist/{build-CkhFGnKA.js → build-DUdi6F_Q.js} +150 -150
  6. package/dist/{checkCommand-QbHshOac.js → checkCommand-B2RWrpWi.js} +1 -1
  7. package/dist/{checkCommand-BcXJa2IS.js → checkCommand-DWL2_PPR.js} +2 -2
  8. package/dist/{codegenCommand-DF2OJh3O.js → codegenCommand-DkjoJ30Q.js} +2 -2
  9. package/dist/{codemodRunner-BcOvi4A2.js → codemodRunner-sFuWDETH.js} +520 -460
  10. package/dist/{commands-7Z7-HOE3.js → commands-DoTClnSk.js} +22 -22
  11. package/dist/{dashboardCommand-CUycH6dR.js → dashboardCommand-Bro7Jwts.js} +5 -5
  12. package/dist/dataCommand-Rj57y1vg.js +669 -0
  13. package/dist/dataProfile-Cm0YVKSy.js +18 -0
  14. package/dist/{dbCommand-DSwGv9wS.js → dbCommand-B237qI-j.js} +343 -316
  15. package/dist/dbCommand-BvQeKQOb.js +2 -0
  16. package/dist/{dev-Dh1NuYx1.js → dev-D4l_YOzI.js} +22 -22
  17. package/dist/{dev-D8JSKlBM.js → dev-DuqBJC7g.js} +1 -1
  18. package/dist/doctorCommand-Bw3V4L1j.js +2 -0
  19. package/dist/{doctorCommand-C-8-Z9D6.js → doctorCommand-TmZTAepc.js} +385 -279
  20. package/dist/{dormancyCommand-A79Odglm.js → dormancyCommand-CUKhRmGG.js} +1 -1
  21. package/dist/{embeddingsCommand-CoiyHfkY.js → embeddingsCommand-Db-iQM3l.js} +1 -1
  22. package/dist/{envCommand-B6d0s-jZ.js → envCommand-DQ_URZq9.js} +12 -12
  23. package/dist/{evolveCommand-BC5a9lxX.js → evolveCommand-CghRPrGO.js} +2 -2
  24. package/dist/index.js +1 -1
  25. package/dist/{infoCommand-ZqSVzJZ4.js → infoCommand-BCs_ZFnl.js} +1 -1
  26. package/dist/{migrate-BnPw2zC8.js → migrate-DN47p2PG.js} +1 -1
  27. package/dist/{runtimeTrace-BslKJjDY.js → runtimeTrace-jFKvOPBz.js} +1 -1
  28. package/dist/{sdkgen-DQ8uEmmn.js → sdkgen-COQqHB9V.js} +1 -1
  29. package/dist/{serveCommand-Dqb9Ku1-.js → serveCommand-C512kzZA.js} +417 -411
  30. package/dist/serveCommand-gj7MsqXY.js +2 -0
  31. package/dist/serveEntry.js +1 -1
  32. package/dist/{start-dkNYKtgQ.js → start-BjcuFME_.js} +379 -343
  33. package/dist/{start-BA7txHhY.js → start-fifc0xpW.js} +1 -1
  34. package/dist/startEntry.js +1 -1
  35. package/dist/updateCommand-B2alql9k.js +2 -0
  36. package/dist/{updateCommand-eoGpZr3E.js → updateCommand-HZQVBU3T.js} +1 -1
  37. package/dist/webDev-D6QeXw3P.js +2 -0
  38. package/dist/{webDev-bybjZA0o.js → webDev-Dk8lFUzf.js} +642 -525
  39. package/dist/{webhooksCommand-DubZWNOx.js → webhooksCommand-D7ZpH7w0.js} +1 -1
  40. package/package.json +23 -17
  41. package/templates/AGENTS.md +1 -1
  42. package/templates/agent-docs/_index.md +1 -1
  43. package/templates/agent-docs/_manifest.json +1 -1
  44. package/templates/agent-docs/cli.md +79 -6
  45. package/templates/agent-docs/data.md +33 -0
  46. package/templates/agent-docs/plugins/governance.md +8 -0
  47. package/templates/agent-docs/routing.md +141 -28
  48. package/templates/agent-docs/security.md +24 -0
  49. package/templates/agent-docs/whats-new.md +48 -109
  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-feature-flags/package.json +9 -9
  63. package/templates/apps/api-governance/package.json +8 -8
  64. package/templates/apps/api-kv/package.json +8 -8
  65. package/templates/apps/api-moderation/package.json +8 -8
  66. package/templates/apps/api-observability/package.json +8 -8
  67. package/templates/apps/api-ratelimit/package.json +8 -8
  68. package/templates/apps/api-rbac/package.json +8 -8
  69. package/templates/apps/api-rest/package.json +7 -7
  70. package/templates/apps/api-saas/package.json +11 -11
  71. package/templates/apps/api-saas-starter/package.json +10 -10
  72. package/templates/apps/api-search/package.json +8 -8
  73. package/templates/apps/api-status/package.json +8 -8
  74. package/templates/apps/api-versioning/package.json +8 -8
  75. package/templates/apps/api-webhooks/package.json +9 -9
  76. package/templates/apps/changelog/package.json +6 -6
  77. package/templates/apps/edge-functions/package.json +2 -2
  78. package/templates/apps/frontend-admin/package.json +8 -8
  79. package/templates/apps/frontend-app/package.json +9 -9
  80. package/templates/apps/frontend-auth/package.json +8 -8
  81. package/templates/apps/frontend-blank/package.json +7 -7
  82. package/templates/apps/frontend-cms/package.json +9 -9
  83. package/templates/apps/frontend-collab/package.json +10 -10
  84. package/templates/apps/frontend-contact/package.json +7 -7
  85. package/templates/apps/frontend-dashboard/package.json +7 -7
  86. package/templates/apps/frontend-docs/package.json +7 -7
  87. package/templates/apps/frontend-i18n/package.json +6 -6
  88. package/templates/apps/frontend-landing/package.json +7 -7
  89. package/templates/apps/frontend-portal/package.json +8 -8
  90. package/templates/apps/frontend-saas/package.json +8 -8
  91. package/templates/apps/frontend-spa/package.json +7 -7
  92. package/templates/apps/frontend-ssr/package.json +7 -7
  93. package/templates/apps/frontend-ssr-api/package.json +8 -8
  94. package/templates/apps/frontend-static-blog/package.json +6 -6
  95. package/templates/apps/frontend-status/package.json +8 -8
  96. package/templates/apps/mobile-app/package.json +4 -4
  97. package/dist/apiBuild-BIyGkym8.js +0 -2
  98. package/dist/dataCommand-By78lscK.js +0 -540
  99. package/dist/dataProfile-dW-PsfLB.js +0 -15
  100. package/dist/dbCommand-DcqEyxju.js +0 -2
  101. package/dist/doctorCommand-FhQ7EVYL.js +0 -2
  102. package/dist/serveCommand-BmvEQCMS.js +0 -2
  103. package/dist/updateCommand-BauSVxPp.js +0 -2
  104. package/dist/webDev-CBbKs4dZ.js +0 -2
@@ -1,8 +1,8 @@
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";
1
+ import { hn as e } from "./dev-D4l_YOzI.js";
2
+ import { $ as t, A as n, F as r, I as i, L as a, Q as o, a as s, b as c, d as l, et as u, f as d, ht as f, k as p, rt as m, s as h, v as g, vt as _, y as v } from "./webDev-Dk8lFUzf.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-C8xBEYbL.js";
5
+ import { i as x, o as S, s as C } from "./apiBuild-B_iH24qf.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";
@@ -12,7 +12,7 @@ import { Effect as j } from "effect";
12
12
  import { createRequire as M } from "node:module";
13
13
  //#region src/webStartBundle.ts
14
14
  var N = A({ scope: "voltro:build" }), P = async (e) => {
15
- let t = await h("esbuild", () => import("esbuild")), n = E(e, ".framework"), r = E(n, "dist-web", "startBundle");
15
+ let t = await _("esbuild", () => import("esbuild")), n = E(e, ".framework"), r = E(n, "dist-web", "startBundle");
16
16
  await k.mkdir(n, { recursive: !0 });
17
17
  let i = Date.now(), a = E(e, "tsconfig.json"), o = /* @__PURE__ */ new Set(), s = E(n, "startEntry.ts");
18
18
  await k.writeFile(s, [
@@ -103,8 +103,8 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
103
103
  ].filter((e) => e.length > 0).join("\n ");
104
104
  return r = n(r, i), t.interactive === "none" && (r = B(r)), r;
105
105
  }, H = async (e) => {
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", {
106
+ let { page: t, chainEntries: o, pageMod: c, helpers: l } = e, u = o.filter((e) => e.hasLayout);
107
+ if (u.length === 0) return F.debug("skip page", {
108
108
  pattern: t.pattern,
109
109
  reason: "renderMode=spa with no layout — nothing to shell"
110
110
  }), null;
@@ -112,27 +112,27 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
112
112
  pattern: t.pattern,
113
113
  reason: "renderMode=spa with a dynamic pattern"
114
114
  }), null;
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`, {
115
+ let d = await Promise.all(u.map(e.loadLayout)), f = u.filter((e, t) => typeof d[t]?.loader == "function").map((e) => e.dir || "/");
116
+ if (f.length > 0) return F.info(`spa shell for ${t.pattern} left to on-demand rendering — its layout chain has a loader (${f.join(", ")}), whose output may be per-request`, {
117
117
  pattern: t.pattern,
118
- layouts: d
118
+ layouts: f
119
119
  }), null;
120
- let { chain: f, segmentLoaderData: p } = await l({
121
- entries: r,
120
+ let { chain: p, segmentLoaderData: m } = await s({
121
+ entries: o,
122
122
  loadLayout: e.loadLayout,
123
123
  loadError: e.loadError,
124
124
  loadPending: e.loadPending,
125
125
  ctx: e.ctx
126
126
  }), h = {
127
127
  pattern: t.pattern,
128
- Component: o.default,
129
- meta: o.meta,
130
- ErrorBoundary: o.ErrorBoundary,
131
- Pending: o.Pending,
128
+ Component: c.default,
129
+ meta: c.meta,
130
+ ErrorBoundary: c.ErrorBoundary,
131
+ Pending: c.Pending,
132
132
  renderMode: "spa",
133
- chain: f
134
- }, g = o.interactive ?? "full", _ = m({
135
- helpers: s,
133
+ chain: p
134
+ }, g = c.interactive ?? "full", _ = r({
135
+ helpers: l,
136
136
  page: t.pattern,
137
137
  interactive: g,
138
138
  delivery: "artefact",
@@ -140,15 +140,15 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
140
140
  descriptor: h,
141
141
  params: {},
142
142
  pathname: t.pattern,
143
- segmentLoaderData: p,
143
+ segmentLoaderData: m,
144
144
  ...e.outerWrap ? { outerWrap: e.outerWrap } : {},
145
145
  ...e.locale ? { locale: e.locale } : {}
146
146
  }
147
147
  }), v = i({
148
- helpers: s,
148
+ helpers: l,
149
149
  prepared: _
150
150
  }), y = a({
151
- helpers: s,
151
+ helpers: l,
152
152
  prepared: _,
153
153
  meta: v.meta,
154
154
  interactive: g
@@ -158,31 +158,31 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
158
158
  outPath: x
159
159
  };
160
160
  }, U = async (e) => {
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 ? [
161
+ let { root: t, distDir: n, pages: r, dirs: i, vite: a } = e, o = E(n, "index.html"), c = await k.readFile(o, "utf8"), l = E(n, "_voltro", "shell.html");
162
+ await k.mkdir(T(l), { recursive: !0 }), await k.writeFile(l, c, "utf8");
163
+ let u = E(t, "node_modules", "@voltro", "ui-shadcn"), d = O(E(u, "package.json")) ? u : null, f = [...d ? [
164
164
  {
165
165
  find: "@voltro/ui-shadcn/tokens.css",
166
- replacement: E(p, "src/tokens.css")
166
+ replacement: E(d, "src/tokens.css")
167
167
  },
168
168
  {
169
169
  find: "@voltro/ui-shadcn/cn",
170
- replacement: E(p, "src/cn.ts")
170
+ replacement: E(d, "src/cn.ts")
171
171
  },
172
172
  {
173
173
  find: "@voltro/ui-shadcn/brand",
174
- replacement: E(p, "src/brand/voltroLogo.tsx")
174
+ replacement: E(d, "src/brand/voltroLogo.tsx")
175
175
  },
176
176
  {
177
177
  find: "@voltro/ui-shadcn",
178
- replacement: E(p, "src/index.ts")
178
+ replacement: E(d, "src/index.ts")
179
179
  }
180
- ] : [], ...t(n)], h = await s.createServer({
181
- root: E(n, ".framework"),
180
+ ] : [], ...m(t)], g = await a.createServer({
181
+ root: E(t, ".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: {
185
- alias: m,
185
+ alias: f,
186
186
  dedupe: [
187
187
  "react",
188
188
  "react-dom",
@@ -198,20 +198,20 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
198
198
  },
199
199
  appType: "custom",
200
200
  logLevel: "warn"
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();
201
+ }), _ = await g.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 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.");
203
+ let n = (await g.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.");
205
205
  for (let r of e.locales) try {
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));
206
+ let i = await g.ssrLoadModule(E(t, "src", "locales", `${r}.ts`)), a = i.default ?? i;
207
+ j.set(r, n(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(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) => ({
214
+ let M = [], N = {}, P = (e) => e.dir === "" ? E(t, "src", "pages") : E(t, "src", "pages", e.dir), I = async (e) => await g.ssrLoadModule(E(P(e), "layout.tsx")), B = async (e) => await g.ssrLoadModule(E(P(e), "error.tsx")), U = async (e) => await g.ssrLoadModule(E(P(e), "loading.tsx")), W = (e, t) => ({
215
215
  params: e.params,
216
216
  pathname: e.pathname,
217
217
  search: "",
@@ -220,115 +220,115 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
220
220
  query: void 0,
221
221
  isServer: !0
222
222
  });
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,
223
+ for (let a of r) {
224
+ let r = `${E(t, "src", "pages", a.file)}`, o = await g.ssrLoadModule(r), l = b(o, E("src", "pages", a.file));
225
+ N[a.pattern] = l;
226
+ let u = l.renderMode, d = h(i, a.dirChain);
227
+ if (u === "spa") {
228
+ let t = await H({
229
+ page: a,
230
+ chainEntries: d,
231
+ pageMod: o,
232
+ shellTemplate: c,
233
+ distDir: n,
234
234
  helpers: _,
235
235
  loadLayout: I,
236
236
  loadError: B,
237
237
  loadPending: U,
238
238
  ctx: W({
239
239
  params: {},
240
- pathname: t.pattern
240
+ pathname: a.pattern
241
241
  }, new AbortController().signal),
242
242
  outerWrap: j.get(e.defaultLocale ?? ""),
243
243
  locale: e.defaultLocale
244
244
  });
245
- n && M.push(n);
245
+ t && M.push(t);
246
246
  continue;
247
247
  }
248
- if (d !== "static") {
248
+ if (u !== "static") {
249
249
  F.debug("skip page", {
250
- pattern: t.pattern,
251
- reason: `renderMode=${d}`
250
+ pattern: a.pattern,
251
+ reason: `renderMode=${u}`
252
252
  });
253
253
  continue;
254
254
  }
255
- let p;
256
- if (L(t.pattern)) {
257
- if (typeof s.getStaticPaths != "function") {
255
+ let f;
256
+ if (L(a.pattern)) {
257
+ if (typeof o.getStaticPaths != "function") {
258
258
  F.debug("skip page", {
259
- pattern: t.pattern,
259
+ pattern: a.pattern,
260
260
  reason: "no getStaticPaths export"
261
261
  });
262
262
  continue;
263
263
  }
264
264
  try {
265
- let e = await s.getStaticPaths();
265
+ let e = await o.getStaticPaths();
266
266
  if (!Array.isArray(e)) {
267
- F.warn("skip page — getStaticPaths did not return an array", { pattern: t.pattern });
267
+ F.warn("skip page — getStaticPaths did not return an array", { pattern: a.pattern });
268
268
  continue;
269
269
  }
270
- p = e.map((e) => ({
270
+ f = e.map((e) => ({
271
271
  params: e.params,
272
- pathname: R(t.pattern, e.params)
272
+ pathname: R(a.pattern, e.params)
273
273
  }));
274
274
  } catch (e) {
275
- F.warn("skip page — getStaticPaths threw", { pattern: t.pattern }, e);
275
+ F.warn("skip page — getStaticPaths threw", { pattern: a.pattern }, e);
276
276
  continue;
277
277
  }
278
- if (p.length === 0) {
278
+ if (f.length === 0) {
279
279
  F.debug("skip page", {
280
- pattern: t.pattern,
280
+ pattern: a.pattern,
281
281
  reason: "getStaticPaths returned []"
282
282
  });
283
283
  continue;
284
284
  }
285
- } else p = [{
285
+ } else f = [{
286
286
  params: {},
287
- pathname: t.pattern
287
+ pathname: a.pattern
288
288
  }];
289
- let m = s.interactive ?? "full";
290
- for (let n of p) {
289
+ let m = o.interactive ?? "full";
290
+ for (let t of f) {
291
291
  w();
292
- let i, a, c = new AbortController();
292
+ let r, i, l = new AbortController();
293
293
  try {
294
- ({chain: i, segmentLoaderData: a} = await l({
295
- entries: f,
294
+ ({chain: r, segmentLoaderData: i} = await s({
295
+ entries: d,
296
296
  loadLayout: I,
297
297
  loadError: B,
298
298
  loadPending: U,
299
- ctx: W(n, c.signal)
299
+ ctx: W(t, l.signal)
300
300
  }));
301
301
  } catch (e) {
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 });
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 });
306
306
  continue;
307
307
  }
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,
308
+ F.warn("layout loader threw, falling back to no layout data", { pathname: t.pathname }, e), {chain: r, segmentLoaderData: i} = await s({
309
+ entries: d,
310
310
  loadLayout: async (e) => ({ default: (await I(e)).default }),
311
311
  loadError: B,
312
312
  loadPending: U,
313
- ctx: W(n, c.signal)
313
+ ctx: W(t, l.signal)
314
314
  });
315
315
  }
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
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
325
  }, h = null;
326
- if (typeof s.loader == "function") {
326
+ if (typeof o.loader == "function") {
327
327
  let e = new AbortController();
328
328
  try {
329
- h = await s.loader({
330
- params: n.params,
331
- pathname: n.pathname,
329
+ h = await o.loader({
330
+ params: t.params,
331
+ pathname: t.pathname,
332
332
  search: "",
333
333
  headers: {},
334
334
  query: void 0,
@@ -336,59 +336,59 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
336
336
  isServer: !0
337
337
  });
338
338
  } catch (e) {
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'.`);
339
+ 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'.`);
340
340
  if (e instanceof Error && e._voltroControl === "not-found") {
341
- F.warn("loader threw NotFoundError at build time — skipping artifact", { pathname: n.pathname });
341
+ F.warn("loader threw NotFoundError at build time — skipping artifact", { pathname: t.pathname });
342
342
  continue;
343
343
  }
344
- F.warn("loader threw, falling back to null", { pathname: n.pathname }, e);
344
+ F.warn("loader threw, falling back to null", { pathname: t.pathname }, e);
345
345
  }
346
346
  }
347
347
  S(h) && C({
348
- page: n.pathname,
349
- renderMode: d,
348
+ page: t.pathname,
349
+ renderMode: u,
350
350
  interactive: m
351
351
  });
352
- for (let e of Object.values(a)) S(e) && C({
353
- page: n.pathname,
354
- renderMode: d,
352
+ for (let e of Object.values(i)) S(e) && C({
353
+ page: t.pathname,
354
+ renderMode: u,
355
355
  interactive: m
356
356
  });
357
- await o({
358
- pageMod: s,
359
- params: n.params,
357
+ await p({
358
+ pageMod: o,
359
+ params: t.params,
360
360
  query: void 0,
361
361
  apiName: void 0,
362
362
  seed: D,
363
363
  seedFailure: A
364
364
  });
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,
365
+ let g = t.params.locale ?? e.defaultLocale ?? "en", _ = j.get(g) ?? j.get(e.defaultLocale ?? ""), { html: b, meta: E } = v({
366
+ descriptor: f,
367
+ params: t.params,
368
+ pathname: t.pathname,
369
369
  loaderData: h,
370
- segmentLoaderData: a,
370
+ segmentLoaderData: i,
371
371
  ..._ ? { outerWrap: _ } : {},
372
372
  locale: g
373
- }), O = V(u, {
373
+ }), O = V(c, {
374
374
  body: b,
375
375
  metaHtml: y(E),
376
376
  stateScript: x({
377
- path: n.pathname,
377
+ path: t.pathname,
378
378
  loaderData: h,
379
- segmentLoaderData: a,
380
- pageLoaderRan: typeof s.loader == "function"
379
+ segmentLoaderData: i,
380
+ pageLoaderRan: typeof o.loader == "function"
381
381
  }),
382
382
  interactive: m
383
- }), N = z(r, n.pathname);
383
+ }), N = z(n, t.pathname);
384
384
  await k.mkdir(T(N), { recursive: !0 }), await k.writeFile(N, O, "utf8"), M.push({
385
- pattern: n.pathname,
385
+ pattern: t.pathname,
386
386
  outPath: N,
387
387
  ...E?.noIndex ? { noIndex: !0 } : {}
388
388
  });
389
389
  }
390
390
  }
391
- return await h.close(), {
391
+ return await g.close(), {
392
392
  rendered: M,
393
393
  pageMeta: N
394
394
  };
@@ -477,7 +477,7 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
477
477
  file: n.file,
478
478
  reason: n.reason
479
479
  });
480
- let { regenerateRpcGroup: r } = await import("./codegenCommand-DF2OJh3O.js"), i = await r(e);
480
+ let { regenerateRpcGroup: r } = await import("./codegenCommand-DkjoJ30Q.js"), i = await r(e);
481
481
  if (i.kind === "refused") {
482
482
  F.warn("could not regenerate the rpc group — building against what is on disk", { reason: i.reason });
483
483
  return;
@@ -487,12 +487,12 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
487
487
  routes: i.routes
488
488
  });
489
489
  }, K = async (e) => {
490
- let n = await d(e);
490
+ let n = await l(e);
491
491
  if (!n) {
492
- let { loadApiConfig: t } = await import("./dev-D8JSKlBM.js"), n = await t(e);
492
+ let { loadApiConfig: t } = await import("./dev-DuqBJC7g.js"), n = await t(e);
493
493
  if (n) {
494
494
  F.info("building api app", { app: n.name ?? "(unnamed)" }), await G(e);
495
- let { runApiBuild: t, runServeBundleBuild: r } = await import("./apiBuild-BIyGkym8.js");
495
+ let { runApiBuild: t, runServeBundleBuild: r } = await import("./apiBuild-RM5W5YXk.js");
496
496
  await t(e);
497
497
  try {
498
498
  await r(e);
@@ -513,21 +513,21 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
513
513
  };
514
514
  }
515
515
  F.info("building web app", { app: n.name ?? "(unnamed)" });
516
- let { resolved: i } = await f({
516
+ let { resolved: r } = await f({
517
517
  rawEnv: n.env,
518
518
  appType: "web",
519
519
  root: e,
520
520
  log: F,
521
521
  generateTypes: !0
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({
522
+ }), i = await d(e, n);
523
+ await c(e, n, i, r.publicValues);
524
+ let { pages: a } = await v(E(e, "src", "pages"));
525
+ await u({
526
526
  appRoot: e,
527
- pages: o,
527
+ pages: a,
528
528
  mode: "prod"
529
529
  });
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 ? [
530
+ let s = E(e, ".framework"), p = E(s, "dist"), h = E(e, "node_modules", "@voltro", "ui-shadcn"), y = O(E(h, "package.json")) ? h : null, b = [...y ? [
531
531
  {
532
532
  find: "@voltro/ui-shadcn/tokens.css",
533
533
  replacement: E(y, "src/tokens.css")
@@ -544,11 +544,11 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
544
544
  find: "@voltro/ui-shadcn",
545
545
  replacement: E(y, "src/index.ts")
546
546
  }
547
- ] : [], ...t(e)];
547
+ ] : [], ...m(e)];
548
548
  F.info("running vite build");
549
- let x = await h("vite", () => import("vite")), C = (await import("@vitejs/plugin-react")).default, T = (await import("@tailwindcss/vite")).default;
549
+ let x = await _("vite", () => import("vite")), C = (await import("@vitejs/plugin-react")).default, T = (await import("@tailwindcss/vite")).default;
550
550
  await x.build({
551
- root: l,
551
+ root: s,
552
552
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
553
553
  plugins: [C(), T()],
554
554
  resolve: {
@@ -564,21 +564,21 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
564
564
  build: {
565
565
  outDir: "dist",
566
566
  emptyOutDir: !0,
567
- rollupOptions: { output: { manualChunks: _ } }
567
+ rollupOptions: { output: { manualChunks: g } }
568
568
  },
569
569
  logLevel: "warn"
570
570
  });
571
571
  let D = E(e, "src", "pages"), { pages: A, dirs: j } = await v(D);
572
572
  if (A.length === 0) return F.info("no pages found — client-only bundle written", {
573
573
  pagesDir: D,
574
- distDir: m
574
+ distDir: p
575
575
  }), {
576
576
  ran: !0,
577
577
  exitCode: 0
578
578
  };
579
579
  let { rendered: M, pageMeta: N } = await U({
580
580
  root: e,
581
- distDir: m,
581
+ distDir: p,
582
582
  pages: A,
583
583
  dirs: j,
584
584
  vite: x,
@@ -589,7 +589,7 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
589
589
  let L = /* @__PURE__ */ new Set();
590
590
  try {
591
591
  await x.build({
592
- root: l,
592
+ root: s,
593
593
  envPrefix: "__VOLTRO_VITE_ENV_DISABLED__",
594
594
  plugins: [
595
595
  C(),
@@ -627,9 +627,9 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
627
627
  if (O(R)) {
628
628
  F.info("precompiling app.config.ts → dist/server/appConfig.js");
629
629
  try {
630
- await (await h("esbuild", () => import("esbuild"))).build({
630
+ await (await _("esbuild", () => import("esbuild"))).build({
631
631
  entryPoints: [R],
632
- outfile: E(m, "server", "appConfig.js"),
632
+ outfile: E(p, "server", "appConfig.js"),
633
633
  bundle: !0,
634
634
  format: "esm",
635
635
  platform: "node",
@@ -659,36 +659,36 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
659
659
  routes: M.map((e) => e.pattern)
660
660
  });
661
661
  try {
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) => {
662
+ let e = process.env.VOLTRO_SEO_NOINDEX !== "1", r = n.seo?.siteUrl, i = n.locales ?? [], a = n.defaultLocale ?? i[0];
663
+ if (r && !O(E(p, "sitemap.xml"))) {
664
+ let n = new Set(i.filter((e) => e !== a)), o = M.filter((e) => !e.noIndex).map((e) => e.pattern).filter((e) => {
665
665
  let t = e.split("/").filter(Boolean)[0];
666
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
+ }).filter((e) => !e.includes("[")).map((e) => ({ path: e })), s = t({
668
+ siteUrl: r,
669
+ entries: o,
670
670
  ...i.length > 1 ? { locales: i } : {},
671
671
  ...a ? { defaultLocale: a } : {}
672
672
  });
673
- await k.writeFile(E(m, "sitemap.xml"), o, "utf8"), F.info("wrote dist/sitemap.xml", {
674
- urls: r.length,
673
+ await k.writeFile(E(p, "sitemap.xml"), s, "utf8"), F.info("wrote dist/sitemap.xml", {
674
+ urls: o.length,
675
675
  indexable: e
676
676
  });
677
677
  }
678
- if (!O(E(m, "robots.txt"))) {
679
- let i = r({
678
+ if (!O(E(p, "robots.txt"))) {
679
+ let t = o({
680
680
  indexable: e,
681
- ...e && t ? { sitemapUrl: `${t.replace(/\/$/, "")}/sitemap.xml` } : {},
681
+ ...e && r ? { sitemapUrl: `${r.replace(/\/$/, "")}/sitemap.xml` } : {},
682
682
  ...n.seo?.disallow ? { disallow: n.seo.disallow } : {}
683
683
  });
684
- await k.writeFile(E(m, "robots.txt"), i, "utf8"), F.info("wrote dist/robots.txt", { indexable: e });
684
+ await k.writeFile(E(p, "robots.txt"), t, "utf8"), F.info("wrote dist/robots.txt", { indexable: e });
685
685
  }
686
686
  } catch (e) {
687
687
  F.warn("SEO artefact generation failed (non-fatal)", {}, e);
688
688
  }
689
689
  try {
690
690
  let t = await w(e);
691
- await k.writeFile(E(m, ".voltro-build.json"), JSON.stringify({
691
+ await k.writeFile(E(p, ".voltro-build.json"), JSON.stringify({
692
692
  version: 1,
693
693
  profile: t
694
694
  }, null, 2), "utf8"), F.info("wrote deploy profile manifest", {
@@ -699,7 +699,7 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
699
699
  } catch (e) {
700
700
  F.warn("could not write .voltro-build.json deploy manifest", {}, e);
701
701
  }
702
- return F.info("build complete", { distDir: m }), {
702
+ return F.info("build complete", { distDir: p }), {
703
703
  ran: !0,
704
704
  exitCode: 0
705
705
  };
@@ -711,7 +711,7 @@ var N = A({ scope: "voltro:build" }), P = async (e) => {
711
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);
712
712
  }), J = async (t) => {
713
713
  if (t.includes("--target")) {
714
- let { runSdkBuildCommand: e } = await import("./sdkgen-DQ8uEmmn.js");
714
+ let { runSdkBuildCommand: e } = await import("./sdkgen-COQqHB9V.js");
715
715
  return e(t);
716
716
  }
717
717
  let n = t.find((e) => !e.startsWith("-")) ?? process.cwd(), r = await y(q(n), { scope: "voltro:build" }), i = e(n);
@@ -1,2 +1,2 @@
1
- import { n as e, r as t, t as n } from "./checkCommand-BcXJa2IS.js";
1
+ import { n as e, r as t, t as n } from "./checkCommand-DWL2_PPR.js";
2
2
  export { n as offlineManifest, e as runCheckCommand, t as toInput };
@@ -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-C-8-Z9D6.js";
7
+ import { x as u } from "./doctorCommand-TmZTAepc.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,7 +141,7 @@ 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-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 = [
144
+ let { walk: t, loadDiscovered: n, loadApiConfig: r } = await import("./dev-DuqBJC7g.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)),
@@ -1,5 +1,5 @@
1
- import { l as e, z as t } from "./dev-Dh1NuYx1.js";
2
- import { st as n } from "./webDev-bybjZA0o.js";
1
+ import { l as e, z as t } from "./dev-D4l_YOzI.js";
2
+ import { dt as n } from "./webDev-Dk8lFUzf.js";
3
3
  import { r } from "./codegen-CbpGCWLG.js";
4
4
  import { basename as i, join as a, relative as o, resolve as s } from "node:path";
5
5
  import { promises as c } from "node:fs";