@voltro/cli 0.55.0 → 0.57.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 (175) hide show
  1. package/CHANGELOG.md +691 -0
  2. package/bin/voltro.mjs +24 -0
  3. package/dist/apiBuild-B83Cb2Rv.js +2 -0
  4. package/dist/{apiBuild-CMvLJM_K.js → apiBuild-DDr2aNFd.js} +119 -88
  5. package/dist/bin.js +1 -1
  6. package/dist/{build-S0QOzqPT.js → build-QKP6Bm0J.js} +308 -279
  7. package/dist/buildReport-52gHKgfO.js +64 -0
  8. package/dist/{checkCommand-DNkY5kwF.js → checkCommand-BISqx1OJ.js} +1 -1
  9. package/dist/{checkCommand-fbj9GDjN.js → checkCommand-DUtMWjcR.js} +6 -6
  10. package/dist/{clusterCmd-DrVFCzSj.js → clusterCmd-CdLB1GkT.js} +1 -1
  11. package/dist/{codegen-SIepQtUl.js → codegen-Bth5lUTU.js} +2 -1
  12. package/dist/codegen-DbH7NbCR.js +2 -0
  13. package/dist/{codegenCommand-3TDJezom.js → codegenCommand-DnVuDxwT.js} +11 -11
  14. package/dist/{codemodRunner-C2zxZUIw.js → codemodRunner-BlQPfjzA.js} +222 -0
  15. package/dist/{commands-BBYJ7Q3B.js → commands-CRbxgxv0.js} +35 -35
  16. package/dist/{dashboardCommand-D2kmyCLL.js → dashboardCommand-Bf_-Ne3P.js} +5 -5
  17. package/dist/{dataCommand-BEPPQiTl.js → dataCommand-BoBJJ-Gb.js} +3 -3
  18. package/dist/{dbCommand-DZTmOFT4.js → dbCommand-CMAIz-Bf.js} +457 -441
  19. package/dist/dbCommand-DHi_RuDl.js +2 -0
  20. package/dist/dev-Bl9HqtV7.js +3 -0
  21. package/dist/{dev-Ca_A_S9v.js → dev-DOEJXicj.js} +2623 -2485
  22. package/dist/{doctorCommand-CGZJK_4o.js → doctorCommand-BrWu67JZ.js} +524 -280
  23. package/dist/doctorCommand-DrQv9SL3.js +2 -0
  24. package/dist/{dormancyCommand-DY2rYpTa.js → dormancyCommand-xn2y-pJm.js} +1 -1
  25. package/dist/{embeddingsCommand-BoCqZsgp.js → embeddingsCommand-Cn5MbRDM.js} +1 -1
  26. package/dist/emptyResultHeadline-Csa5fZOF.js +18 -0
  27. package/dist/{envCommand-Bxy2fOjc.js → envCommand-UJmJIbs9.js} +8 -8
  28. package/dist/{evolveCommand-BsbZ-XDg.js → evolveCommand-Db30twUy.js} +2 -2
  29. package/dist/frameworkTableAssembly-B96WCNJA.js +2 -0
  30. package/dist/{frameworkTableAssembly-Do-cf6RJ.js → frameworkTableAssembly-vfkzuzEo.js} +131 -104
  31. package/dist/index.js +1 -1
  32. package/dist/{infoCommand-EmM3jPKD.js → infoCommand-BjVXpMlP.js} +1 -1
  33. package/dist/inspect-B0hL41s0.js +2 -0
  34. package/dist/inspect-DZnan87F.js +1500 -0
  35. package/dist/{inspectCmd-niF97fAq.js → inspectCmd-CP-G0sVK.js} +1 -1
  36. package/dist/{inspectFetch-EMuhTG_9.js → inspectFetch-BU1NyzxV.js} +36 -24
  37. package/dist/{inspectMetrics-CGF94puw.js → inspectMetrics-BY0Sjb2F.js} +19 -19
  38. package/dist/{logsCmd-B6oNsfaZ.js → logsCmd-C5y9HyrG.js} +59 -54
  39. package/dist/{manifestBuild-DjX5MoXy.js → manifestBuild-DnbFKF6w.js} +1 -1
  40. package/dist/manifestBuild-UXrnUcXP.js +2 -0
  41. package/dist/{migrate-CGFZS-1a.js → migrate-DtC3lu7H.js} +4 -4
  42. package/dist/precompressAssets-YhTi1aWp.js +40 -0
  43. package/dist/{probeCommand-Bs3iVBSL.js → probeCommand-C5fuN6Z2.js} +2 -2
  44. package/dist/{runtimeTrace-C1BTpHGQ.js → runtimeTrace-BQL_lfz6.js} +1 -1
  45. package/dist/{scheduleCmd-DQRu6BZC.js → scheduleCmd-DYBUfo_T.js} +1 -1
  46. package/dist/{sdkgen-CXMwLg9n.js → sdkgen-CMUPrDjH.js} +1 -1
  47. package/dist/{seedRunner-Dgsiwk_e.js → seedRunner-DISBKow-.js} +16 -16
  48. package/dist/serveCommand-B_w-Mpb_.js +2544 -0
  49. package/dist/serveCommand-Dtb48ffg.js +2 -0
  50. package/dist/serveEntry.js +1 -1
  51. package/dist/{start-EOV7s1NZ.js → start-YaUehtDV.js} +580 -558
  52. package/dist/{start-DH7cat4-.js → start-s25GAIgn.js} +1 -1
  53. package/dist/startEntry.js +1 -1
  54. package/dist/staticCachePolicy-CIyj6DbS.js +15 -0
  55. package/dist/{test-DO27-x2P.js → test-jipIQ5Mx.js} +1 -1
  56. package/dist/{tracesCmd-DgtgOUdi.js → tracesCmd-C1qKa94g.js} +69 -64
  57. package/dist/{updateCommand-C_jN1w18.js → updateCommand-C9n_Z_oG.js} +8 -2
  58. package/dist/updateCommand-DsXEAHbd.js +2 -0
  59. package/dist/webDev-B6ZMX42w.js +2 -0
  60. package/dist/{webDev-B7vNj4Bq.js → webDev-BgdkyjP6.js} +1379 -1303
  61. package/dist/{webhooksCommand-B1LVcyO3.js → webhooksCommand-CYXTNvXq.js} +2 -2
  62. package/dist/{workflowsCmd-BGF-mRZ5.js → workflowsCmd-g-DNpaUc.js} +1 -1
  63. package/package.json +55 -19
  64. package/templates/AGENTS.core.md +20 -1
  65. package/templates/AGENTS.md +21 -2
  66. package/templates/agent-docs/_index.md +1 -1
  67. package/templates/agent-docs/_manifest.json +2 -2
  68. package/templates/agent-docs/ai.md +1 -1
  69. package/templates/agent-docs/authentication.md +34 -19
  70. package/templates/agent-docs/cli.md +170 -0
  71. package/templates/agent-docs/configuration.md +29 -4
  72. package/templates/agent-docs/data.md +145 -5
  73. package/templates/agent-docs/database/scaling.md +50 -2
  74. package/templates/agent-docs/deployment.md +75 -1
  75. package/templates/agent-docs/internationalization.md +32 -0
  76. package/templates/agent-docs/local-first-mobile.md +9 -2
  77. package/templates/agent-docs/observability.md +227 -0
  78. package/templates/agent-docs/plugins/audit.md +21 -5
  79. package/templates/agent-docs/plugins/billing.md +17 -0
  80. package/templates/agent-docs/plugins/broadcast.md +2 -1
  81. package/templates/agent-docs/plugins/ratelimit.md +6 -1
  82. package/templates/agent-docs/plugins/row-history.md +11 -0
  83. package/templates/agent-docs/plugins.md +19 -0
  84. package/templates/agent-docs/reference.md +1 -0
  85. package/templates/agent-docs/scheduling.md +23 -0
  86. package/templates/agent-docs/schema-driven-ui.md +81 -0
  87. package/templates/agent-docs/templates/appshells.md +3 -3
  88. package/templates/agent-docs/whats-new.md +133 -77
  89. package/templates/apps/api-ai/package.json +6 -6
  90. package/templates/apps/api-auth/package.json +8 -8
  91. package/templates/apps/api-backend/package.json +7 -7
  92. package/templates/apps/api-backend-deactivation/package.json +7 -7
  93. package/templates/apps/api-backend-mail/package.json +8 -8
  94. package/templates/apps/api-backend-mariadb/package.json +9 -9
  95. package/templates/apps/api-backend-sqlite/package.json +8 -8
  96. package/templates/apps/api-backend-storage/package.json +8 -8
  97. package/templates/apps/api-cms/package.json +9 -9
  98. package/templates/apps/api-collab/package.json +8 -8
  99. package/templates/apps/api-data-advanced/package.json +8 -8
  100. package/templates/apps/api-durable/package.json +8 -8
  101. package/templates/apps/api-feature-flags/package.json +9 -9
  102. package/templates/apps/api-governance/package.json +8 -8
  103. package/templates/apps/api-kv/package.json +8 -8
  104. package/templates/apps/api-moderation/package.json +8 -8
  105. package/templates/apps/api-observability/package.json +8 -8
  106. package/templates/apps/api-ratelimit/package.json +8 -8
  107. package/templates/apps/api-rbac/package.json +8 -8
  108. package/templates/apps/api-rest/package.json +7 -7
  109. package/templates/apps/api-row-history/package.json +8 -8
  110. package/templates/apps/api-saas/package.json +11 -11
  111. package/templates/apps/api-saas-starter/package.json +10 -10
  112. package/templates/apps/api-search/package.json +8 -8
  113. package/templates/apps/api-status/package.json +8 -8
  114. package/templates/apps/api-webhooks/package.json +9 -9
  115. package/templates/apps/changelog/package.json +7 -7
  116. package/templates/apps/changelog/src/pages/[locale]/page.tsx +7 -1
  117. package/templates/apps/edge-functions/package.json +2 -2
  118. package/templates/apps/frontend-admin/package.json +7 -8
  119. package/templates/apps/frontend-admin/src/pages/(marketing)/layout.tsx +1 -2
  120. package/templates/apps/frontend-admin/src/pages/admin/layout.tsx +1 -2
  121. package/templates/apps/frontend-app/package.json +8 -9
  122. package/templates/apps/frontend-app/src/pages/layout.tsx +1 -2
  123. package/templates/apps/frontend-auth/package.json +7 -8
  124. package/templates/apps/frontend-auth/src/components/AuthShell.tsx +1 -2
  125. package/templates/apps/frontend-blank/package.json +6 -7
  126. package/templates/apps/frontend-blank/src/pages/layout.tsx +1 -2
  127. package/templates/apps/frontend-cms/package.json +8 -9
  128. package/templates/apps/frontend-cms/src/pages/(app)/layout.tsx +1 -2
  129. package/templates/apps/frontend-collab/README.md +7 -2
  130. package/templates/apps/frontend-collab/package.json +9 -10
  131. package/templates/apps/frontend-collab/src/pages/layout.tsx +1 -2
  132. package/templates/apps/frontend-collab/src/pages/page.test.tsx +8 -4
  133. package/templates/apps/frontend-collab/src/pages/page.tsx +10 -5
  134. package/templates/apps/frontend-contact/package.json +7 -7
  135. package/templates/apps/frontend-contact/src/components/ContactForm.island.tsx +1 -1
  136. package/templates/apps/frontend-dashboard/package.json +6 -7
  137. package/templates/apps/frontend-dashboard/src/pages/(marketing)/layout.tsx +1 -2
  138. package/templates/apps/frontend-dashboard/src/pages/dashboard/layout.tsx +1 -2
  139. package/templates/apps/frontend-docs/package.json +8 -8
  140. package/templates/apps/frontend-i18n/package.json +6 -6
  141. package/templates/apps/frontend-landing/package.json +7 -7
  142. package/templates/apps/frontend-portal/package.json +7 -8
  143. package/templates/apps/frontend-portal/src/pages/(portal)/layout.tsx +1 -2
  144. package/templates/apps/frontend-saas/package.json +7 -8
  145. package/templates/apps/frontend-saas/src/pages/(marketing)/layout.tsx +1 -2
  146. package/templates/apps/frontend-saas/src/pages/dashboard/layout.tsx +1 -2
  147. package/templates/apps/frontend-spa/package.json +6 -7
  148. package/templates/apps/frontend-spa/src/pages/layout.tsx +1 -2
  149. package/templates/apps/frontend-ssr/package.json +6 -7
  150. package/templates/apps/frontend-ssr/src/pages/layout.tsx +1 -2
  151. package/templates/apps/frontend-ssr-api/package.json +7 -8
  152. package/templates/apps/frontend-ssr-api/src/pages/layout.tsx +1 -2
  153. package/templates/apps/frontend-static-blog/package.json +8 -8
  154. package/templates/apps/frontend-static-blog/src/components/ReadingProgress.island.tsx +1 -1
  155. package/templates/apps/frontend-static-blog/src/pages/[locale]/page.tsx +7 -1
  156. package/templates/apps/frontend-status/package.json +7 -8
  157. package/templates/apps/frontend-status/src/pages/layout.tsx +1 -2
  158. package/templates/apps/mobile-app/package.json +4 -4
  159. package/templates/baselines/compose/docker/api.Dockerfile +61 -5
  160. package/templates/baselines/compose/docker/web.Dockerfile +55 -10
  161. package/templates/baselines/compose-mariadb/docker/api.Dockerfile +61 -5
  162. package/templates/baselines/compose-mariadb/docker/web.Dockerfile +55 -10
  163. package/dist/apiBuild-Cl0IDx8c.js +0 -2
  164. package/dist/codegen-CN6vMM4J.js +0 -2
  165. package/dist/dbCommand-BTyBGhIA.js +0 -2
  166. package/dist/dev-DfVZaoys.js +0 -3
  167. package/dist/doctorCommand-djmqEcDC.js +0 -2
  168. package/dist/frameworkTableAssembly-Df2Ymp2f.js +0 -2
  169. package/dist/inspect-DCqILJ1G.js +0 -1197
  170. package/dist/inspect-DGJwpOAb.js +0 -2
  171. package/dist/manifestBuild-CJ2zvPvT.js +0 -2
  172. package/dist/serveCommand-C7IrCD58.js +0 -2445
  173. package/dist/serveCommand-Cjt5S9hD.js +0 -2
  174. package/dist/updateCommand-nnFjDbl4.js +0 -2
  175. package/dist/webDev-1XpVnYkW.js +0 -2
@@ -12,8 +12,8 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@effect/platform": "^0.97.0",
15
- "@voltro/cli": "0.55.0",
16
- "@voltro/serverless": "0.55.0",
15
+ "@voltro/cli": "0.57.0",
16
+ "@voltro/serverless": "0.57.0",
17
17
  "effect": "^3.22.0"
18
18
  },
19
19
  "devDependencies": {
@@ -12,18 +12,17 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.55.0",
16
- "@voltro/cli": "0.55.0",
17
- "@voltro/client": "0.55.0",
18
- "@voltro/env": "0.55.0",
19
- "@voltro/i18n": "0.55.0",
20
- "@voltro/ui-shadcn": "0.55.0",
21
- "@voltro/web": "0.55.0",
15
+ "@{{projectName}}/api": "0.57.0",
16
+ "@voltro/cli": "0.57.0",
17
+ "@voltro/client": "0.57.0",
18
+ "@voltro/env": "0.57.0",
19
+ "@voltro/i18n": "0.57.0",
20
+ "@voltro/web": "0.57.0",
22
21
  "react": "^19.0.0",
23
22
  "react-dom": "^19.0.0"
24
23
  },
25
24
  "devDependencies": {
26
- "@voltro/devtools": "0.55.0",
25
+ "@voltro/devtools": "0.57.0",
27
26
  "@types/react": "^19.0.0",
28
27
  "@types/react-dom": "^19.0.0",
29
28
  "jsdom": "^30.0.0",
@@ -2,8 +2,7 @@
2
2
  // directory name never appears in a URL — the pages inside are `/` and
3
3
  // `/login`. Gives the public pages a header distinct from the admin sidebar.
4
4
  import type { ReactNode } from 'react'
5
- import { T, useLocale, useT } from '@voltro/i18n'
6
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
5
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
7
6
  import { APP_NAME } from '../../config'
8
7
 
9
8
  const LOCALES = [
@@ -16,8 +16,7 @@ import {
16
16
  useUndoLog,
17
17
  PermissionProvider,
18
18
  } from '@voltro/client'
19
- import { T, useLocale, useT } from '@voltro/i18n'
20
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
19
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
21
20
  import { APP_NAME } from '../../config'
22
21
  import { isSignedIn } from '../../lib/auth'
23
22
  import { DEMO_SCOPES } from '../../lib/admin'
@@ -12,19 +12,18 @@
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.55.0",
16
- "@voltro/cli": "0.55.0",
17
- "@voltro/client": "0.55.0",
18
- "@voltro/env": "0.55.0",
19
- "@voltro/i18n": "0.55.0",
20
- "@voltro/ui-shadcn": "0.55.0",
21
- "@voltro/web": "0.55.0",
15
+ "@{{projectName}}/api": "0.57.0",
16
+ "@voltro/cli": "0.57.0",
17
+ "@voltro/client": "0.57.0",
18
+ "@voltro/env": "0.57.0",
19
+ "@voltro/i18n": "0.57.0",
20
+ "@voltro/web": "0.57.0",
22
21
  "react": "^19.0.0",
23
22
  "react-dom": "^19.0.0"
24
23
  },
25
24
  "devDependencies": {
26
- "@voltro/devtools": "0.55.0",
27
- "@voltro/testing": "0.55.0",
25
+ "@voltro/devtools": "0.57.0",
26
+ "@voltro/testing": "0.57.0",
28
27
  "@types/react": "^19.0.0",
29
28
  "@types/react-dom": "^19.0.0",
30
29
  "jsdom": "^30.0.0",
@@ -8,8 +8,7 @@
8
8
  // + reloads so the framework re-renders in the chosen language.
9
9
 
10
10
  import type { ReactNode } from 'react'
11
- import { T, useLocale, useT } from '@voltro/i18n'
12
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
11
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
13
12
 
14
13
  interface LayoutProps {
15
14
  readonly children: ReactNode
@@ -12,18 +12,17 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.55.0",
16
- "@voltro/cli": "0.55.0",
17
- "@voltro/client": "0.55.0",
18
- "@voltro/env": "0.55.0",
19
- "@voltro/i18n": "0.55.0",
20
- "@voltro/ui-shadcn": "0.55.0",
21
- "@voltro/web": "0.55.0",
15
+ "@{{projectName}}/api": "0.57.0",
16
+ "@voltro/cli": "0.57.0",
17
+ "@voltro/client": "0.57.0",
18
+ "@voltro/env": "0.57.0",
19
+ "@voltro/i18n": "0.57.0",
20
+ "@voltro/web": "0.57.0",
22
21
  "react": "^19.0.0",
23
22
  "react-dom": "^19.0.0"
24
23
  },
25
24
  "devDependencies": {
26
- "@voltro/devtools": "0.55.0",
25
+ "@voltro/devtools": "0.57.0",
27
26
  "@types/react": "^19.0.0",
28
27
  "@types/react-dom": "^19.0.0",
29
28
  "jsdom": "^30.0.0",
@@ -1,8 +1,7 @@
1
1
  // The centered auth card every page renders inside — brand, title, the form
2
2
  // (children), an optional message, a footer link row, and the locale switcher.
3
3
  import type { ReactNode } from 'react'
4
- import { T, useLocale, useT } from '@voltro/i18n'
5
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
4
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
6
5
  import { APP_NAME } from '../config'
7
6
 
8
7
  const LOCALES = [
@@ -12,17 +12,16 @@
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.55.0",
16
- "@voltro/client": "0.55.0",
17
- "@voltro/env": "0.55.0",
18
- "@voltro/i18n": "0.55.0",
19
- "@voltro/ui-shadcn": "0.55.0",
20
- "@voltro/web": "0.55.0",
15
+ "@voltro/cli": "0.57.0",
16
+ "@voltro/client": "0.57.0",
17
+ "@voltro/env": "0.57.0",
18
+ "@voltro/i18n": "0.57.0",
19
+ "@voltro/web": "0.57.0",
21
20
  "react": "^19.0.0",
22
21
  "react-dom": "^19.0.0"
23
22
  },
24
23
  "devDependencies": {
25
- "@voltro/devtools": "0.55.0",
24
+ "@voltro/devtools": "0.57.0",
26
25
  "@types/react": "^19.0.0",
27
26
  "@types/react-dom": "^19.0.0",
28
27
  "jsdom": "^30.0.0",
@@ -11,8 +11,7 @@
11
11
  // the chosen language.
12
12
 
13
13
  import type { ReactNode } from 'react'
14
- import { useLocale, useT } from '@voltro/i18n'
15
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
14
+ import { useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
16
15
 
17
16
  interface LayoutProps {
18
17
  readonly children: ReactNode
@@ -12,19 +12,18 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.55.0",
16
- "@voltro/cli": "0.55.0",
17
- "@voltro/client": "0.55.0",
18
- "@voltro/cms": "0.55.0",
19
- "@voltro/env": "0.55.0",
20
- "@voltro/i18n": "0.55.0",
21
- "@voltro/ui-shadcn": "0.55.0",
22
- "@voltro/web": "0.55.0",
15
+ "@{{projectName}}/api": "0.57.0",
16
+ "@voltro/cli": "0.57.0",
17
+ "@voltro/client": "0.57.0",
18
+ "@voltro/cms": "0.57.0",
19
+ "@voltro/env": "0.57.0",
20
+ "@voltro/i18n": "0.57.0",
21
+ "@voltro/web": "0.57.0",
23
22
  "react": "^19.0.0",
24
23
  "react-dom": "^19.0.0"
25
24
  },
26
25
  "devDependencies": {
27
- "@voltro/devtools": "0.55.0",
26
+ "@voltro/devtools": "0.57.0",
28
27
  "@types/react": "^19.0.0",
29
28
  "@types/react-dom": "^19.0.0",
30
29
  "jsdom": "^30.0.0",
@@ -5,8 +5,7 @@
5
5
  // `renderMode: 'ssr'` precisely so this runs per request.
6
6
  import type { ReactNode } from 'react'
7
7
  import { RedirectError, useLoaderData, type LoaderFn } from '@voltro/web'
8
- import { T, useLocale, useT } from '@voltro/i18n'
9
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
8
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
10
9
  import type { Identity } from '../../lib/api'
11
10
 
12
11
  const LOCALES = [
@@ -60,13 +60,18 @@ the whole binding: `push` = the `setBody` mutation, `remote` = the `documents`
60
60
  subscription. The sync-client lifecycle, offline queue, bounded retry,
61
61
  `outstanding`/`synced` and the echo guard all live in the hook.
62
62
 
63
- ## `renderMode = 'client'`
63
+ ## `renderMode = 'spa'`
64
64
 
65
65
  `page.tsx` sets it explicitly. A rich-text editor needs a browser: `renderMode`
66
66
  defaults to `'static'`, which pre-renders at build time, and Tiptap's
67
67
  `new Editor()` finds no `window` there — the build fails. There is nothing
68
68
  worth pre-rendering for a document that arrives over a live subscription
69
- anyway.
69
+ anyway. `'spa'` skips the prerender and mounts on the client.
70
+
71
+ The value used to be `'client'`, which is not one of the four render modes
72
+ (`'static' | 'spa' | 'ssr' | 'isr'`), so this template could not be built at
73
+ all. It came from a docs page that taught the same non-existent value while
74
+ another page in the same site listed it as invalid.
70
75
 
71
76
  ## Not wired here: presence carets
72
77
 
@@ -12,24 +12,23 @@
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.55.0",
15
+ "@{{projectName}}/api": "0.57.0",
16
16
  "@tiptap/extension-collaboration": "^3.0.0",
17
17
  "@tiptap/extension-collaboration-caret": "^3.0.0",
18
18
  "@tiptap/react": "^3.0.0",
19
19
  "@tiptap/starter-kit": "^3.0.0",
20
- "@voltro/cli": "0.55.0",
21
- "@voltro/client": "0.55.0",
22
- "@voltro/env": "0.55.0",
23
- "@voltro/i18n": "0.55.0",
24
- "@voltro/local-first": "0.55.0",
25
- "@voltro/ui-shadcn": "0.55.0",
26
- "@voltro/web": "0.55.0",
20
+ "@voltro/cli": "0.57.0",
21
+ "@voltro/client": "0.57.0",
22
+ "@voltro/env": "0.57.0",
23
+ "@voltro/i18n": "0.57.0",
24
+ "@voltro/local-first": "0.57.0",
25
+ "@voltro/web": "0.57.0",
27
26
  "react": "^19.0.0",
28
27
  "react-dom": "^19.0.0"
29
28
  },
30
29
  "devDependencies": {
31
- "@voltro/devtools": "0.55.0",
32
- "@voltro/testing": "0.55.0",
30
+ "@voltro/devtools": "0.57.0",
31
+ "@voltro/testing": "0.57.0",
33
32
  "@types/react": "^19.0.0",
34
33
  "@types/react-dom": "^19.0.0",
35
34
  "jsdom": "^30.0.0",
@@ -8,8 +8,7 @@
8
8
  // re-renders in the chosen language.
9
9
 
10
10
  import type { ReactNode } from 'react'
11
- import { T, useLocale, useT } from '@voltro/i18n'
12
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
11
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
13
12
 
14
13
  interface LayoutProps {
15
14
  readonly children: ReactNode
@@ -115,10 +115,14 @@ afterEach(() => {
115
115
 
116
116
  describe('collab editor — the page contract', () => {
117
117
  test('renders in the browser only — a rich-text editor cannot be prerendered', () => {
118
- // Pinned because the failure is a BUILD failure with an unhelpful message:
119
- // `renderMode` defaults to 'static', and Tiptap's `new Editor()` has no
120
- // `window` during prerender.
121
- expect(renderMode).toBe('client')
118
+ // Pinned because the failure is a BUILD failure: `renderMode` defaults to
119
+ // 'static', and Tiptap's `new Editor()` has no `window` during prerender.
120
+ //
121
+ // The value is 'spa'. This assertion said 'client' — the reason above was
122
+ // right and the value was not a render mode at all, so it pinned a template
123
+ // that could not be built. A green suite is not a built app; `voltro test`
124
+ // transpiles and never runs the prerender that rejects the value.
125
+ expect(renderMode).toBe('spa')
122
126
  })
123
127
  })
124
128
 
@@ -34,11 +34,16 @@ import { getCatalog } from '../locales'
34
34
 
35
35
  // A rich-text editor needs a BROWSER. `renderMode` defaults to `'static'`,
36
36
  // which pre-renders this page at build time — and Tiptap's `new Editor()` has
37
- // no `window` there, so the build fails outright. `'client'` renders the page
38
- // in the browser only, which is what a collaborative editor wants anyway: there
39
- // is nothing meaningful to pre-render for a document that arrives over a live
40
- // subscription.
41
- export const renderMode = 'client' as const
37
+ // no `window` there, so the build fails outright. `'spa'` skips the prerender
38
+ // and mounts on the client, which is what a collaborative editor wants anyway:
39
+ // there is nothing meaningful to pre-render for a document that arrives over a
40
+ // live subscription.
41
+ //
42
+ // The mode is `'spa'`, not `'client'`. This file said `'client'` — not a valid
43
+ // value, so the page threw `unknown renderMode 'client'` and the template could
44
+ // not be built at all. It survived because nothing ever BUILT a template, and
45
+ // because the test next door pinned the wrong value with a good reason attached.
46
+ export const renderMode = 'spa' as const
42
47
 
43
48
  export const meta = ({ locale }: { readonly locale: string }): PageMeta => ({
44
49
  title: getCatalog(locale)['meta.editor.title'],
@@ -15,18 +15,18 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "@effect/platform": "^0.97.0",
18
- "@voltro/cli": "0.55.0",
19
- "@voltro/client": "0.55.0",
20
- "@voltro/env": "0.55.0",
21
- "@voltro/i18n": "0.55.0",
22
- "@voltro/serverless": "0.55.0",
23
- "@voltro/web": "0.55.0",
18
+ "@voltro/cli": "0.57.0",
19
+ "@voltro/client": "0.57.0",
20
+ "@voltro/env": "0.57.0",
21
+ "@voltro/i18n": "0.57.0",
22
+ "@voltro/serverless": "0.57.0",
23
+ "@voltro/web": "0.57.0",
24
24
  "effect": "^3.22.0",
25
25
  "react": "^19.0.0",
26
26
  "react-dom": "^19.0.0"
27
27
  },
28
28
  "devDependencies": {
29
- "@voltro/devtools": "0.55.0",
29
+ "@voltro/devtools": "0.57.0",
30
30
  "@types/react": "^19.0.0",
31
31
  "@types/react-dom": "^19.0.0",
32
32
  "jsdom": "^30.0.0",
@@ -18,7 +18,7 @@
18
18
 
19
19
  import type { FormEvent, ReactNode } from 'react'
20
20
  import { useState } from 'react'
21
- import { island } from '@voltro/web'
21
+ import { island } from '@voltro/web/islands'
22
22
  import { CONTACT_ENDPOINT } from '../config'
23
23
 
24
24
  // Every user-facing string the island shows, resolved per-locale by the page.
@@ -12,17 +12,16 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.55.0",
16
- "@voltro/client": "0.55.0",
17
- "@voltro/env": "0.55.0",
18
- "@voltro/i18n": "0.55.0",
19
- "@voltro/ui-shadcn": "0.55.0",
20
- "@voltro/web": "0.55.0",
15
+ "@voltro/cli": "0.57.0",
16
+ "@voltro/client": "0.57.0",
17
+ "@voltro/env": "0.57.0",
18
+ "@voltro/i18n": "0.57.0",
19
+ "@voltro/web": "0.57.0",
21
20
  "react": "^19.0.0",
22
21
  "react-dom": "^19.0.0"
23
22
  },
24
23
  "devDependencies": {
25
- "@voltro/devtools": "0.55.0",
24
+ "@voltro/devtools": "0.57.0",
26
25
  "@types/react": "^19.0.0",
27
26
  "@types/react-dom": "^19.0.0",
28
27
  "jsdom": "^30.0.0",
@@ -5,8 +5,7 @@
5
5
  // segment for it. Here it gives the public pages a marketing header/footer
6
6
  // distinct from the dashboard's sidebar shell.
7
7
  import type { ReactNode } from 'react'
8
- import { T, useLocale, useT } from '@voltro/i18n'
9
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
8
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
10
9
  import { APP_NAME } from '../../config'
11
10
 
12
11
  const LOCALES = [
@@ -10,8 +10,7 @@
10
10
  // can't redirect per-visitor, and the build rejects a RedirectError there.
11
11
  import type { ReactNode } from 'react'
12
12
  import { RedirectError, useLoaderData, useLocation, type LoaderFn } from '@voltro/web'
13
- import { T, useLocale, useT } from '@voltro/i18n'
14
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
13
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
15
14
  import { APP_NAME } from '../../config'
16
15
  import { isSignedIn } from '../../lib/auth'
17
16
 
@@ -12,19 +12,19 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.55.0",
16
- "@voltro/client": "0.55.0",
17
- "@voltro/content": "0.55.0",
18
- "@voltro/env": "0.55.0",
19
- "@voltro/i18n": "0.55.0",
20
- "@voltro/ui-shadcn": "0.55.0",
21
- "@voltro/web": "0.55.0",
15
+ "@voltro/cli": "0.57.0",
16
+ "@voltro/client": "0.57.0",
17
+ "@voltro/content": "0.57.0",
18
+ "@voltro/env": "0.57.0",
19
+ "@voltro/i18n": "0.57.0",
20
+ "@voltro/ui-shadcn": "0.57.0",
21
+ "@voltro/web": "0.57.0",
22
22
  "effect": "^3.22.0",
23
23
  "react": "^19.0.0",
24
24
  "react-dom": "^19.0.0"
25
25
  },
26
26
  "devDependencies": {
27
- "@voltro/devtools": "0.55.0",
27
+ "@voltro/devtools": "0.57.0",
28
28
  "@types/react": "^19.0.0",
29
29
  "@types/react-dom": "^19.0.0",
30
30
  "jsdom": "^30.0.0",
@@ -12,16 +12,16 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.55.0",
16
- "@voltro/client": "0.55.0",
17
- "@voltro/env": "0.55.0",
18
- "@voltro/i18n": "0.55.0",
19
- "@voltro/web": "0.55.0",
15
+ "@voltro/cli": "0.57.0",
16
+ "@voltro/client": "0.57.0",
17
+ "@voltro/env": "0.57.0",
18
+ "@voltro/i18n": "0.57.0",
19
+ "@voltro/web": "0.57.0",
20
20
  "react": "^19.0.0",
21
21
  "react-dom": "^19.0.0"
22
22
  },
23
23
  "devDependencies": {
24
- "@voltro/devtools": "0.55.0",
24
+ "@voltro/devtools": "0.57.0",
25
25
  "@types/react": "^19.0.0",
26
26
  "@types/react-dom": "^19.0.0",
27
27
  "jsdom": "^30.0.0",
@@ -12,17 +12,17 @@
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.55.0",
16
- "@voltro/client": "0.55.0",
17
- "@voltro/env": "0.55.0",
18
- "@voltro/i18n": "0.55.0",
19
- "@voltro/ui-shadcn": "0.55.0",
20
- "@voltro/web": "0.55.0",
15
+ "@voltro/cli": "0.57.0",
16
+ "@voltro/client": "0.57.0",
17
+ "@voltro/env": "0.57.0",
18
+ "@voltro/i18n": "0.57.0",
19
+ "@voltro/ui-shadcn": "0.57.0",
20
+ "@voltro/web": "0.57.0",
21
21
  "react": "^19.0.0",
22
22
  "react-dom": "^19.0.0"
23
23
  },
24
24
  "devDependencies": {
25
- "@voltro/devtools": "0.55.0",
25
+ "@voltro/devtools": "0.57.0",
26
26
  "@types/react": "^19.0.0",
27
27
  "@types/react-dom": "^19.0.0",
28
28
  "jsdom": "^30.0.0",
@@ -12,18 +12,17 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.55.0",
16
- "@voltro/cli": "0.55.0",
17
- "@voltro/client": "0.55.0",
18
- "@voltro/env": "0.55.0",
19
- "@voltro/i18n": "0.55.0",
20
- "@voltro/ui-shadcn": "0.55.0",
21
- "@voltro/web": "0.55.0",
15
+ "@{{projectName}}/api": "0.57.0",
16
+ "@voltro/cli": "0.57.0",
17
+ "@voltro/client": "0.57.0",
18
+ "@voltro/env": "0.57.0",
19
+ "@voltro/i18n": "0.57.0",
20
+ "@voltro/web": "0.57.0",
22
21
  "react": "^19.0.0",
23
22
  "react-dom": "^19.0.0"
24
23
  },
25
24
  "devDependencies": {
26
- "@voltro/devtools": "0.55.0",
25
+ "@voltro/devtools": "0.57.0",
27
26
  "@types/react": "^19.0.0",
28
27
  "@types/react-dom": "^19.0.0",
29
28
  "jsdom": "^30.0.0",
@@ -5,8 +5,7 @@
5
5
  // this runs per request.
6
6
  import type { ReactNode } from 'react'
7
7
  import { RedirectError, useLoaderData, useLocation, type LoaderFn } from '@voltro/web'
8
- import { T, useLocale, useT } from '@voltro/i18n'
9
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
8
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
10
9
  import { APP_NAME } from '../../config'
11
10
  import type { Identity } from '../../lib/api'
12
11
 
@@ -12,18 +12,17 @@
12
12
  "test": "voltro test"
13
13
  },
14
14
  "dependencies": {
15
- "@{{projectName}}/api": "0.55.0",
16
- "@voltro/cli": "0.55.0",
17
- "@voltro/client": "0.55.0",
18
- "@voltro/env": "0.55.0",
19
- "@voltro/i18n": "0.55.0",
20
- "@voltro/ui-shadcn": "0.55.0",
21
- "@voltro/web": "0.55.0",
15
+ "@{{projectName}}/api": "0.57.0",
16
+ "@voltro/cli": "0.57.0",
17
+ "@voltro/client": "0.57.0",
18
+ "@voltro/env": "0.57.0",
19
+ "@voltro/i18n": "0.57.0",
20
+ "@voltro/web": "0.57.0",
22
21
  "react": "^19.0.0",
23
22
  "react-dom": "^19.0.0"
24
23
  },
25
24
  "devDependencies": {
26
- "@voltro/devtools": "0.55.0",
25
+ "@voltro/devtools": "0.57.0",
27
26
  "@types/react": "^19.0.0",
28
27
  "@types/react-dom": "^19.0.0",
29
28
  "jsdom": "^30.0.0",
@@ -3,8 +3,7 @@
3
3
  // `/login`. It gives the public pages a marketing header distinct from the
4
4
  // dashboard's sidebar shell.
5
5
  import type { ReactNode } from 'react'
6
- import { T, useLocale, useT } from '@voltro/i18n'
7
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
6
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
8
7
  import { APP_NAME } from '../../config'
9
8
 
10
9
  const LOCALES = [
@@ -6,8 +6,7 @@
6
6
  // per-visitor, and the build rejects a RedirectError there.
7
7
  import type { ReactNode } from 'react'
8
8
  import { RedirectError, useLoaderData, useLocation, type LoaderFn } from '@voltro/web'
9
- import { T, useLocale, useT } from '@voltro/i18n'
10
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
9
+ import { T, useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
11
10
  import { APP_NAME } from '../../config'
12
11
  import type { Identity } from '../../lib/api'
13
12
 
@@ -12,17 +12,16 @@
12
12
  "typecheck": "tsc --noEmit"
13
13
  },
14
14
  "dependencies": {
15
- "@voltro/cli": "0.55.0",
16
- "@voltro/client": "0.55.0",
17
- "@voltro/env": "0.55.0",
18
- "@voltro/i18n": "0.55.0",
19
- "@voltro/ui-shadcn": "0.55.0",
20
- "@voltro/web": "0.55.0",
15
+ "@voltro/cli": "0.57.0",
16
+ "@voltro/client": "0.57.0",
17
+ "@voltro/env": "0.57.0",
18
+ "@voltro/i18n": "0.57.0",
19
+ "@voltro/web": "0.57.0",
21
20
  "react": "^19.0.0",
22
21
  "react-dom": "^19.0.0"
23
22
  },
24
23
  "devDependencies": {
25
- "@voltro/devtools": "0.55.0",
24
+ "@voltro/devtools": "0.57.0",
26
25
  "@types/react": "^19.0.0",
27
26
  "@types/react-dom": "^19.0.0",
28
27
  "jsdom": "^30.0.0",
@@ -6,8 +6,7 @@
6
6
  // chosen language.
7
7
 
8
8
  import type { ReactNode } from 'react'
9
- import { useLocale, useT } from '@voltro/i18n'
10
- import { LocaleSwitcher } from '@voltro/ui-shadcn'
9
+ import { useLocale, useT, LocaleSwitcher } from '@voltro/i18n'
11
10
  import '../globals.css'
12
11
 
13
12
  const LOCALES = [