@jasonshimmy/vite-plugin-cer-app 0.23.1 → 0.24.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 (397) hide show
  1. package/dist/cli/checks/lighthouse.d.ts +26 -0
  2. package/dist/cli/checks/lighthouse.d.ts.map +1 -0
  3. package/dist/cli/checks/lighthouse.js +121 -0
  4. package/dist/cli/checks/lighthouse.js.map +1 -0
  5. package/dist/cli/checks/links.d.ts +12 -0
  6. package/dist/cli/checks/links.d.ts.map +1 -0
  7. package/dist/cli/checks/links.js +89 -0
  8. package/dist/cli/checks/links.js.map +1 -0
  9. package/dist/cli/checks/performance.d.ts +17 -0
  10. package/dist/cli/checks/performance.d.ts.map +1 -0
  11. package/dist/cli/checks/performance.js +61 -0
  12. package/dist/cli/checks/performance.js.map +1 -0
  13. package/dist/cli/commands/check.d.ts +3 -0
  14. package/dist/cli/commands/check.d.ts.map +1 -0
  15. package/dist/cli/commands/check.js +85 -0
  16. package/dist/cli/commands/check.js.map +1 -0
  17. package/dist/cli/commands/preview.d.ts.map +1 -1
  18. package/dist/cli/commands/preview.js +37 -4
  19. package/dist/cli/commands/preview.js.map +1 -1
  20. package/dist/cli/create/index.d.ts +11 -1
  21. package/dist/cli/create/index.d.ts.map +1 -1
  22. package/dist/cli/create/index.js +135 -65
  23. package/dist/cli/create/index.js.map +1 -1
  24. package/dist/cli/create/templates/spa/package.json.tpl +5 -3
  25. package/dist/cli/create/templates/ssg/cer.config.ts.tpl +2 -0
  26. package/dist/cli/create/templates/ssg/package.json.tpl +5 -3
  27. package/dist/cli/create/templates/ssr/package.json.tpl +5 -3
  28. package/dist/cli/index.js +2 -0
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/index.d.ts +3 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/plugin/build-ssg.d.ts +22 -4
  33. package/dist/plugin/build-ssg.d.ts.map +1 -1
  34. package/dist/plugin/build-ssg.js +273 -13
  35. package/dist/plugin/build-ssg.js.map +1 -1
  36. package/dist/plugin/content/parser.d.ts.map +1 -1
  37. package/dist/plugin/content/parser.js +54 -10
  38. package/dist/plugin/content/parser.js.map +1 -1
  39. package/dist/plugin/dev-server.d.ts +6 -1
  40. package/dist/plugin/dev-server.d.ts.map +1 -1
  41. package/dist/plugin/dev-server.js.map +1 -1
  42. package/dist/plugin/dts-generator.d.ts.map +1 -1
  43. package/dist/plugin/dts-generator.js +50 -8
  44. package/dist/plugin/dts-generator.js.map +1 -1
  45. package/dist/plugin/generated-dir.d.ts +2 -0
  46. package/dist/plugin/generated-dir.d.ts.map +1 -1
  47. package/dist/plugin/generated-dir.js +17 -6
  48. package/dist/plugin/generated-dir.js.map +1 -1
  49. package/dist/plugin/html-post-process.d.ts +35 -0
  50. package/dist/plugin/html-post-process.d.ts.map +1 -0
  51. package/dist/plugin/html-post-process.js +112 -0
  52. package/dist/plugin/html-post-process.js.map +1 -0
  53. package/dist/plugin/index.d.ts +9 -0
  54. package/dist/plugin/index.d.ts.map +1 -1
  55. package/dist/plugin/index.js +89 -14
  56. package/dist/plugin/index.js.map +1 -1
  57. package/dist/plugin/transforms/auto-import.d.ts.map +1 -1
  58. package/dist/plugin/transforms/auto-import.js +7 -0
  59. package/dist/plugin/transforms/auto-import.js.map +1 -1
  60. package/dist/plugin/transforms/prune-runtime-css.d.ts +8 -0
  61. package/dist/plugin/transforms/prune-runtime-css.d.ts.map +1 -0
  62. package/dist/plugin/transforms/prune-runtime-css.js +40 -0
  63. package/dist/plugin/transforms/prune-runtime-css.js.map +1 -0
  64. package/dist/runtime/app-template.d.ts +1 -4
  65. package/dist/runtime/app-template.d.ts.map +1 -1
  66. package/dist/runtime/app-template.js +211 -40
  67. package/dist/runtime/app-template.js.map +1 -1
  68. package/dist/runtime/composables/index.d.ts +4 -0
  69. package/dist/runtime/composables/index.d.ts.map +1 -1
  70. package/dist/runtime/composables/index.js +2 -0
  71. package/dist/runtime/composables/index.js.map +1 -1
  72. package/dist/runtime/composables/use-active-headings.d.ts +24 -0
  73. package/dist/runtime/composables/use-active-headings.d.ts.map +1 -0
  74. package/dist/runtime/composables/use-active-headings.js +112 -0
  75. package/dist/runtime/composables/use-active-headings.js.map +1 -0
  76. package/dist/runtime/composables/use-content-page.d.ts +45 -0
  77. package/dist/runtime/composables/use-content-page.d.ts.map +1 -0
  78. package/dist/runtime/composables/use-content-page.js +179 -0
  79. package/dist/runtime/composables/use-content-page.js.map +1 -0
  80. package/dist/runtime/composables/use-content-search.d.ts.map +1 -1
  81. package/dist/runtime/composables/use-content-search.js +1 -5
  82. package/dist/runtime/composables/use-content-search.js.map +1 -1
  83. package/dist/runtime/composables/use-fetch.d.ts +2 -1
  84. package/dist/runtime/composables/use-fetch.d.ts.map +1 -1
  85. package/dist/runtime/composables/use-fetch.js +112 -43
  86. package/dist/runtime/composables/use-fetch.js.map +1 -1
  87. package/dist/runtime/composables/use-head.d.ts.map +1 -1
  88. package/dist/runtime/composables/use-head.js +30 -6
  89. package/dist/runtime/composables/use-head.js.map +1 -1
  90. package/dist/runtime/composables/use-route.d.ts.map +1 -1
  91. package/dist/runtime/composables/use-route.js +39 -11
  92. package/dist/runtime/composables/use-route.js.map +1 -1
  93. package/dist/runtime/content/client.js +2 -2
  94. package/dist/runtime/content/client.js.map +1 -1
  95. package/dist/runtime/entry-server-template.d.ts +16 -1
  96. package/dist/runtime/entry-server-template.d.ts.map +1 -1
  97. package/dist/runtime/entry-server-template.js +120 -13
  98. package/dist/runtime/entry-server-template.js.map +1 -1
  99. package/dist/types/config.d.ts +53 -4
  100. package/dist/types/config.d.ts.map +1 -1
  101. package/dist/types/config.js.map +1 -1
  102. package/dist/types/middleware.d.ts +2 -2
  103. package/dist/types/middleware.d.ts.map +1 -1
  104. package/package.json +22 -19
  105. package/.github/copilot-instructions.md +0 -169
  106. package/.github/workflows/publish.yml +0 -257
  107. package/.nvmrc +0 -1
  108. package/CHANGELOG.md +0 -232
  109. package/CLAUDE.md +0 -113
  110. package/commits.txt +0 -1
  111. package/cypress.config.ts +0 -16
  112. package/docs/authentication.md +0 -285
  113. package/docs/cli.md +0 -324
  114. package/docs/components.md +0 -237
  115. package/docs/composables.md +0 -907
  116. package/docs/configuration.md +0 -667
  117. package/docs/content.md +0 -570
  118. package/docs/data-loading.md +0 -336
  119. package/docs/getting-started.md +0 -237
  120. package/docs/head-management.md +0 -212
  121. package/docs/i18n.md +0 -159
  122. package/docs/layouts.md +0 -224
  123. package/docs/middleware.md +0 -234
  124. package/docs/plugins.md +0 -170
  125. package/docs/rendering-modes.md +0 -377
  126. package/docs/routing.md +0 -485
  127. package/docs/server-api.md +0 -253
  128. package/docs/testing.md +0 -455
  129. package/docs/use-fetch.md +0 -183
  130. package/e2e/cypress/e2e/api.cy.ts +0 -123
  131. package/e2e/cypress/e2e/async-component.cy.ts +0 -27
  132. package/e2e/cypress/e2e/component-splitting.cy.ts +0 -50
  133. package/e2e/cypress/e2e/content.cy.ts +0 -425
  134. package/e2e/cypress/e2e/cookie.cy.ts +0 -85
  135. package/e2e/cypress/e2e/data.cy.ts +0 -158
  136. package/e2e/cypress/e2e/error-boundary.cy.ts +0 -88
  137. package/e2e/cypress/e2e/fouc.cy.ts +0 -254
  138. package/e2e/cypress/e2e/group-meta.cy.ts +0 -36
  139. package/e2e/cypress/e2e/head.cy.ts +0 -89
  140. package/e2e/cypress/e2e/i18n.cy.ts +0 -79
  141. package/e2e/cypress/e2e/interactive.cy.ts +0 -137
  142. package/e2e/cypress/e2e/isr-nested-runtime.cy.ts +0 -102
  143. package/e2e/cypress/e2e/jit-css-custom-colors.cy.ts +0 -43
  144. package/e2e/cypress/e2e/middleware-chain.cy.ts +0 -89
  145. package/e2e/cypress/e2e/middleware-status.cy.ts +0 -30
  146. package/e2e/cypress/e2e/middleware.cy.ts +0 -45
  147. package/e2e/cypress/e2e/navigate.cy.ts +0 -39
  148. package/e2e/cypress/e2e/observability.cy.ts +0 -77
  149. package/e2e/cypress/e2e/per-route-error.cy.ts +0 -42
  150. package/e2e/cypress/e2e/per-route-render.cy.ts +0 -70
  151. package/e2e/cypress/e2e/preview-hardening.cy.ts +0 -88
  152. package/e2e/cypress/e2e/routes.cy.ts +0 -128
  153. package/e2e/cypress/e2e/seo-meta.cy.ts +0 -108
  154. package/e2e/cypress/e2e/server-middleware.cy.ts +0 -46
  155. package/e2e/cypress/e2e/session-rotation.cy.ts +0 -25
  156. package/e2e/cypress/e2e/session.cy.ts +0 -73
  157. package/e2e/cypress/e2e/ssr-render-error.cy.ts +0 -68
  158. package/e2e/cypress/e2e/synthetic-404.cy.ts +0 -45
  159. package/e2e/cypress/e2e/use-page-data.cy.ts +0 -122
  160. package/e2e/cypress/e2e/use-state.cy.ts +0 -138
  161. package/e2e/cypress/support/commands.ts +0 -120
  162. package/e2e/cypress/support/e2e.ts +0 -10
  163. package/e2e/cypress/tsconfig.json +0 -14
  164. package/e2e/kitchen-sink/app/components/ks-badge.ts +0 -8
  165. package/e2e/kitchen-sink/app/composables/useKsCounter.ts +0 -9
  166. package/e2e/kitchen-sink/app/error.ts +0 -18
  167. package/e2e/kitchen-sink/app/layouts/admin.ts +0 -13
  168. package/e2e/kitchen-sink/app/layouts/default.ts +0 -25
  169. package/e2e/kitchen-sink/app/layouts/group.ts +0 -9
  170. package/e2e/kitchen-sink/app/layouts/minimal.ts +0 -7
  171. package/e2e/kitchen-sink/app/loading.ts +0 -9
  172. package/e2e/kitchen-sink/app/middleware/auth.ts +0 -9
  173. package/e2e/kitchen-sink/app/middleware/custom-log.ts +0 -4
  174. package/e2e/kitchen-sink/app/middleware/group-auth.ts +0 -7
  175. package/e2e/kitchen-sink/app/middleware/logger.ts +0 -14
  176. package/e2e/kitchen-sink/app/pages/(auth)/login.ts +0 -13
  177. package/e2e/kitchen-sink/app/pages/(auth)/protected.ts +0 -16
  178. package/e2e/kitchen-sink/app/pages/404.ts +0 -9
  179. package/e2e/kitchen-sink/app/pages/about.ts +0 -17
  180. package/e2e/kitchen-sink/app/pages/admin/_layout.ts +0 -1
  181. package/e2e/kitchen-sink/app/pages/admin/dashboard.ts +0 -11
  182. package/e2e/kitchen-sink/app/pages/async-component-error-test.ts +0 -18
  183. package/e2e/kitchen-sink/app/pages/async-component-test.ts +0 -18
  184. package/e2e/kitchen-sink/app/pages/blog/[slug].ts +0 -59
  185. package/e2e/kitchen-sink/app/pages/blog/index.ts +0 -51
  186. package/e2e/kitchen-sink/app/pages/content-blog.ts +0 -37
  187. package/e2e/kitchen-sink/app/pages/content-doc.ts +0 -42
  188. package/e2e/kitchen-sink/app/pages/content-fallback.ts +0 -36
  189. package/e2e/kitchen-sink/app/pages/content-guides.ts +0 -35
  190. package/e2e/kitchen-sink/app/pages/content-index.ts +0 -39
  191. package/e2e/kitchen-sink/app/pages/content-search.ts +0 -36
  192. package/e2e/kitchen-sink/app/pages/cookie-test.ts +0 -22
  193. package/e2e/kitchen-sink/app/pages/counter.ts +0 -17
  194. package/e2e/kitchen-sink/app/pages/group-auth-blocked.ts +0 -9
  195. package/e2e/kitchen-sink/app/pages/group-meta-test/_layout.ts +0 -6
  196. package/e2e/kitchen-sink/app/pages/group-meta-test/custom-mw.ts +0 -14
  197. package/e2e/kitchen-sink/app/pages/group-meta-test/page.ts +0 -9
  198. package/e2e/kitchen-sink/app/pages/group-meta-test/protected.ts +0 -8
  199. package/e2e/kitchen-sink/app/pages/head.ts +0 -20
  200. package/e2e/kitchen-sink/app/pages/i18n-test.ts +0 -14
  201. package/e2e/kitchen-sink/app/pages/index.ts +0 -27
  202. package/e2e/kitchen-sink/app/pages/isr-test.ts +0 -17
  203. package/e2e/kitchen-sink/app/pages/items/[id].ts +0 -20
  204. package/e2e/kitchen-sink/app/pages/jit-css-custom-colors-test.ts +0 -14
  205. package/e2e/kitchen-sink/app/pages/loader-error-test.ts +0 -13
  206. package/e2e/kitchen-sink/app/pages/loader-props-test.ts +0 -19
  207. package/e2e/kitchen-sink/app/pages/loader-response-error-test.ts +0 -13
  208. package/e2e/kitchen-sink/app/pages/middleware-chain-test.ts +0 -12
  209. package/e2e/kitchen-sink/app/pages/middleware-status-test.ts +0 -9
  210. package/e2e/kitchen-sink/app/pages/navigate-test.ts +0 -16
  211. package/e2e/kitchen-sink/app/pages/observability-test.ts +0 -25
  212. package/e2e/kitchen-sink/app/pages/per-route-error-test.error.ts +0 -13
  213. package/e2e/kitchen-sink/app/pages/per-route-error-test.ts +0 -15
  214. package/e2e/kitchen-sink/app/pages/plugin-dsd-test.ts +0 -10
  215. package/e2e/kitchen-sink/app/pages/render-error-test.ts +0 -12
  216. package/e2e/kitchen-sink/app/pages/render-server-test.ts +0 -12
  217. package/e2e/kitchen-sink/app/pages/render-spa-test.ts +0 -12
  218. package/e2e/kitchen-sink/app/pages/route-info.ts +0 -14
  219. package/e2e/kitchen-sink/app/pages/seo-test.ts +0 -23
  220. package/e2e/kitchen-sink/app/pages/session-rotation-test.ts +0 -25
  221. package/e2e/kitchen-sink/app/pages/use-state-test.ts +0 -37
  222. package/e2e/kitchen-sink/app/plugins/01.setup.ts +0 -7
  223. package/e2e/kitchen-sink/app/plugins/02.ks-plugin-components.ts +0 -27
  224. package/e2e/kitchen-sink/cer-auto-imports.d.ts +0 -51
  225. package/e2e/kitchen-sink/cer-env.d.ts +0 -35
  226. package/e2e/kitchen-sink/cer-tsconfig.json +0 -30
  227. package/e2e/kitchen-sink/cer.config.ts +0 -43
  228. package/e2e/kitchen-sink/content/01.guides/01.index.md +0 -8
  229. package/e2e/kitchen-sink/content/01.guides/02.intro.md +0 -8
  230. package/e2e/kitchen-sink/content/01.guides/10.advanced.md +0 -8
  231. package/e2e/kitchen-sink/content/blog/2026-04-01-hello.md +0 -26
  232. package/e2e/kitchen-sink/content/blog/2026-04-02-draft.md +0 -10
  233. package/e2e/kitchen-sink/content/blog/index.md +0 -8
  234. package/e2e/kitchen-sink/content/blog/no-frontmatter.md +0 -7
  235. package/e2e/kitchen-sink/content/docs/getting-started.md +0 -48
  236. package/e2e/kitchen-sink/content/index.md +0 -16
  237. package/e2e/kitchen-sink/server/api/echo.ts +0 -12
  238. package/e2e/kitchen-sink/server/api/health.ts +0 -3
  239. package/e2e/kitchen-sink/server/api/posts/[slug].ts +0 -11
  240. package/e2e/kitchen-sink/server/api/posts/index.ts +0 -5
  241. package/e2e/kitchen-sink/server/api/session.ts +0 -23
  242. package/e2e/kitchen-sink/server/data/posts.ts +0 -21
  243. package/e2e/kitchen-sink/server/middleware/01-headers.ts +0 -6
  244. package/e2e/kitchen-sink/server/middleware/02-status-test.ts +0 -10
  245. package/e2e/kitchen-sink/tsconfig.json +0 -3
  246. package/e2e/scripts/clean.mjs +0 -14
  247. package/eslint.config.ts +0 -22
  248. package/src/__tests__/cli/adapters/cloudflare-worker.integration.test.ts +0 -132
  249. package/src/__tests__/cli/adapters/cloudflare.test.ts +0 -332
  250. package/src/__tests__/cli/adapters/netlify-bridge.integration.test.ts +0 -139
  251. package/src/__tests__/cli/adapters/netlify.test.ts +0 -286
  252. package/src/__tests__/cli/adapters/vercel-launcher.integration.test.ts +0 -129
  253. package/src/__tests__/cli/adapters/vercel.test.ts +0 -263
  254. package/src/__tests__/cli/preview-hardening.test.ts +0 -265
  255. package/src/__tests__/cli/preview-isr.test.ts +0 -320
  256. package/src/__tests__/index.test.ts +0 -21
  257. package/src/__tests__/plugin/app-template.test.ts +0 -112
  258. package/src/__tests__/plugin/build-ssg-render.test.ts +0 -155
  259. package/src/__tests__/plugin/build-ssg.test.ts +0 -598
  260. package/src/__tests__/plugin/build-ssr.test.ts +0 -192
  261. package/src/__tests__/plugin/cer-app-plugin.test.ts +0 -552
  262. package/src/__tests__/plugin/content/emitter.test.ts +0 -117
  263. package/src/__tests__/plugin/content/loader.test.ts +0 -154
  264. package/src/__tests__/plugin/content/parser.test.ts +0 -381
  265. package/src/__tests__/plugin/content/path-utils.test.ts +0 -69
  266. package/src/__tests__/plugin/content/search.test.ts +0 -119
  267. package/src/__tests__/plugin/dev-server.test.ts +0 -813
  268. package/src/__tests__/plugin/dts-generator.test.ts +0 -394
  269. package/src/__tests__/plugin/entry-server-template.test.ts +0 -385
  270. package/src/__tests__/plugin/generated-dir.test.ts +0 -144
  271. package/src/__tests__/plugin/path-utils.test.ts +0 -411
  272. package/src/__tests__/plugin/resolve-config.test.ts +0 -200
  273. package/src/__tests__/plugin/scanner.test.ts +0 -186
  274. package/src/__tests__/plugin/transforms/auto-import.test.ts +0 -510
  275. package/src/__tests__/plugin/transforms/head-inject.test.ts +0 -178
  276. package/src/__tests__/plugin/virtual/composables.test.ts +0 -57
  277. package/src/__tests__/plugin/virtual/content-components.test.ts +0 -66
  278. package/src/__tests__/plugin/virtual/error.test.ts +0 -71
  279. package/src/__tests__/plugin/virtual/layouts.test.ts +0 -70
  280. package/src/__tests__/plugin/virtual/loading.test.ts +0 -72
  281. package/src/__tests__/plugin/virtual/middleware.test.ts +0 -83
  282. package/src/__tests__/plugin/virtual/plugins.test.ts +0 -129
  283. package/src/__tests__/plugin/virtual/routes.test.ts +0 -884
  284. package/src/__tests__/plugin/virtual/server-api.test.ts +0 -164
  285. package/src/__tests__/plugin/virtual/server-middleware.test.ts +0 -102
  286. package/src/__tests__/runtime/app-template.test.ts +0 -198
  287. package/src/__tests__/runtime/define-middleware.test.ts +0 -64
  288. package/src/__tests__/runtime/define-server-middleware.test.ts +0 -54
  289. package/src/__tests__/runtime/entry-client-template.test.ts +0 -61
  290. package/src/__tests__/runtime/isr-handler.test.ts +0 -338
  291. package/src/__tests__/runtime/oauth/handler.test.ts +0 -358
  292. package/src/__tests__/runtime/oauth/providers.test.ts +0 -47
  293. package/src/__tests__/runtime/oauth-index.test.ts +0 -43
  294. package/src/__tests__/runtime/use-auth.test.ts +0 -169
  295. package/src/__tests__/runtime/use-content-search-composable.test.ts +0 -405
  296. package/src/__tests__/runtime/use-content-search.test.ts +0 -163
  297. package/src/__tests__/runtime/use-content.test.ts +0 -226
  298. package/src/__tests__/runtime/use-cookie.test.ts +0 -277
  299. package/src/__tests__/runtime/use-fetch-component.test.ts +0 -214
  300. package/src/__tests__/runtime/use-fetch.test.ts +0 -377
  301. package/src/__tests__/runtime/use-head.test.ts +0 -266
  302. package/src/__tests__/runtime/use-inject-client.test.ts +0 -67
  303. package/src/__tests__/runtime/use-inject.test.ts +0 -66
  304. package/src/__tests__/runtime/use-locale.test.ts +0 -152
  305. package/src/__tests__/runtime/use-navigate.test.ts +0 -121
  306. package/src/__tests__/runtime/use-page-data.test.ts +0 -298
  307. package/src/__tests__/runtime/use-route.test.ts +0 -156
  308. package/src/__tests__/runtime/use-runtime-config.test.ts +0 -182
  309. package/src/__tests__/runtime/use-seo-meta.test.ts +0 -109
  310. package/src/__tests__/runtime/use-session.test.ts +0 -320
  311. package/src/__tests__/runtime/use-state.test.ts +0 -340
  312. package/src/__tests__/types/config.test.ts +0 -18
  313. package/src/cli/adapters/cloudflare.ts +0 -335
  314. package/src/cli/adapters/netlify.ts +0 -326
  315. package/src/cli/adapters/vercel.ts +0 -311
  316. package/src/cli/commands/adapt.ts +0 -84
  317. package/src/cli/commands/build.ts +0 -165
  318. package/src/cli/commands/dev.ts +0 -125
  319. package/src/cli/commands/generate.ts +0 -91
  320. package/src/cli/commands/preview-isr.ts +0 -172
  321. package/src/cli/commands/preview.ts +0 -489
  322. package/src/cli/create/index.ts +0 -275
  323. package/src/cli/create/templates/shared/.gitignore.tpl +0 -25
  324. package/src/cli/create/templates/shared/app/layouts/default.ts.tpl +0 -15
  325. package/src/cli/create/templates/shared/app/pages/index.ts.tpl +0 -8
  326. package/src/cli/create/templates/shared/index.html.tpl +0 -12
  327. package/src/cli/create/templates/shared/tsconfig.json.tpl +0 -6
  328. package/src/cli/create/templates/spa/cer.config.ts.tpl +0 -6
  329. package/src/cli/create/templates/spa/package.json.tpl +0 -18
  330. package/src/cli/create/templates/ssg/cer.config.ts.tpl +0 -10
  331. package/src/cli/create/templates/ssg/package.json.tpl +0 -19
  332. package/src/cli/create/templates/ssr/cer.config.ts.tpl +0 -6
  333. package/src/cli/create/templates/ssr/package.json.tpl +0 -18
  334. package/src/cli/index.ts +0 -22
  335. package/src/index.ts +0 -20
  336. package/src/plugin/build-ssg.ts +0 -336
  337. package/src/plugin/build-ssr.ts +0 -134
  338. package/src/plugin/content/emitter.ts +0 -50
  339. package/src/plugin/content/index.ts +0 -233
  340. package/src/plugin/content/parser.ts +0 -259
  341. package/src/plugin/content/path-utils.ts +0 -55
  342. package/src/plugin/content/scanner.ts +0 -26
  343. package/src/plugin/content/search.ts +0 -28
  344. package/src/plugin/dev-server.ts +0 -377
  345. package/src/plugin/dts-generator.ts +0 -273
  346. package/src/plugin/generated-dir.ts +0 -121
  347. package/src/plugin/index.ts +0 -553
  348. package/src/plugin/path-utils.ts +0 -186
  349. package/src/plugin/scanner.ts +0 -65
  350. package/src/plugin/transforms/auto-import.ts +0 -206
  351. package/src/plugin/transforms/head-inject.ts +0 -161
  352. package/src/plugin/virtual/composables.ts +0 -28
  353. package/src/plugin/virtual/content-components.ts +0 -83
  354. package/src/plugin/virtual/error.ts +0 -34
  355. package/src/plugin/virtual/layouts.ts +0 -41
  356. package/src/plugin/virtual/loading.ts +0 -32
  357. package/src/plugin/virtual/middleware.ts +0 -45
  358. package/src/plugin/virtual/plugins.ts +0 -46
  359. package/src/plugin/virtual/routes.ts +0 -514
  360. package/src/plugin/virtual/server-api.ts +0 -85
  361. package/src/plugin/virtual/server-middleware.ts +0 -44
  362. package/src/runtime/app-template.ts +0 -380
  363. package/src/runtime/composables/define-middleware.ts +0 -17
  364. package/src/runtime/composables/define-server-middleware.ts +0 -18
  365. package/src/runtime/composables/index.ts +0 -27
  366. package/src/runtime/composables/use-auth.ts +0 -125
  367. package/src/runtime/composables/use-content-search.ts +0 -205
  368. package/src/runtime/composables/use-content.ts +0 -146
  369. package/src/runtime/composables/use-cookie.ts +0 -135
  370. package/src/runtime/composables/use-fetch.ts +0 -438
  371. package/src/runtime/composables/use-head.ts +0 -212
  372. package/src/runtime/composables/use-inject.ts +0 -49
  373. package/src/runtime/composables/use-locale.ts +0 -109
  374. package/src/runtime/composables/use-navigate.ts +0 -58
  375. package/src/runtime/composables/use-page-data.ts +0 -93
  376. package/src/runtime/composables/use-route.ts +0 -71
  377. package/src/runtime/composables/use-runtime-config.ts +0 -123
  378. package/src/runtime/composables/use-seo-meta.ts +0 -80
  379. package/src/runtime/composables/use-session.ts +0 -186
  380. package/src/runtime/composables/use-state.ts +0 -92
  381. package/src/runtime/content/client.ts +0 -168
  382. package/src/runtime/entry-client-template.ts +0 -39
  383. package/src/runtime/entry-server-template.ts +0 -493
  384. package/src/runtime/isr-handler.ts +0 -184
  385. package/src/runtime/oauth/handler.ts +0 -407
  386. package/src/runtime/oauth/index.ts +0 -49
  387. package/src/runtime/oauth/providers.ts +0 -38
  388. package/src/types/api.ts +0 -40
  389. package/src/types/config.ts +0 -371
  390. package/src/types/content.ts +0 -66
  391. package/src/types/index.ts +0 -7
  392. package/src/types/middleware.ts +0 -63
  393. package/src/types/page.ts +0 -117
  394. package/src/types/plugin.ts +0 -34
  395. package/tsconfig.build.json +0 -10
  396. package/tsconfig.json +0 -19
  397. package/vitest.config.ts +0 -33
@@ -1,667 +0,0 @@
1
- # Configuration
2
-
3
- The framework is configured via `cer.config.ts` at the project root. All fields are optional — defaults are listed below.
4
-
5
- ```ts
6
- // cer.config.ts
7
- import { defineConfig } from '@jasonshimmy/vite-plugin-cer-app'
8
-
9
- export default defineConfig({
10
- mode: 'spa',
11
- srcDir: 'app',
12
- port: 3000,
13
-
14
- ssg: {
15
- routes: 'auto',
16
- concurrency: 4,
17
- fallback: false,
18
- },
19
-
20
- router: {
21
- base: '/',
22
- },
23
-
24
- jitCss: {
25
- content: ['./app/pages/**/*.ts', './app/components/**/*.ts', './app/layouts/**/*.ts'],
26
- extendedColors: false,
27
- },
28
-
29
- autoImports: {
30
- components: true,
31
- composables: true,
32
- directives: true,
33
- runtime: true,
34
- },
35
- })
36
- ```
37
-
38
- ---
39
-
40
- ## Top-level options
41
-
42
- ### `mode`
43
-
44
- **Type:** `'spa' | 'ssr' | 'ssg'`
45
- **Default:** `'spa'`
46
-
47
- Selects the rendering strategy for the application.
48
-
49
- - `'spa'` — Client-side only. Standard Vite build, no server rendering.
50
- - `'ssr'` — Server-side rendering. Dual build (client + server bundles). Requires a Node.js server.
51
- - `'ssg'` — Static site generation. All routes rendered to HTML at build time.
52
-
53
- See [Rendering Modes](rendering-modes.md) for full details.
54
-
55
- ---
56
-
57
- ### `srcDir`
58
-
59
- **Type:** `string`
60
- **Default:** `'app'`
61
-
62
- Path to the client app source directory, relative to the project root. All `app/` paths below (`pages/`, `layouts/`, etc.) resolve under this directory.
63
-
64
- ```ts
65
- srcDir: 'src/app' // → pages at src/app/pages/, etc.
66
- ```
67
-
68
- ---
69
-
70
- ### `port`
71
-
72
- **Type:** `number`
73
- **Default:** `3000`
74
-
75
- Dev server port. Overridden by the `--port` CLI flag.
76
-
77
- ---
78
-
79
- ## `ssg` options
80
-
81
- Controls static site generation.
82
-
83
- ```ts
84
- ssg: {
85
- routes: 'auto',
86
- concurrency: 4,
87
- fallback: false,
88
- }
89
- ```
90
-
91
- ### `ssg.routes`
92
-
93
- **Type:** `'auto' | string[]`
94
- **Default:** `'auto'`
95
-
96
- Which paths to generate at build time.
97
-
98
- - `'auto'` — Scans `app/pages/` and generates all static routes. For dynamic routes, calls `meta.ssg.paths()` to enumerate paths. Content-backed catch-all pages that use `queryContent()` can also auto-enumerate concrete paths from the content store.
99
- - `string[]` — Explicit list of paths, e.g. `['/about', '/blog/hello-world']`.
100
-
101
- ### `ssg.concurrency`
102
-
103
- **Type:** `number`
104
- **Default:** `4`
105
-
106
- Number of pages rendered in parallel during the SSG build.
107
-
108
- ### `ssg.fallback`
109
-
110
- **Type:** `boolean`
111
- **Default:** `false`
112
-
113
- When `true`, unenumerated dynamic routes fall back to SSR at request time instead of returning 404.
114
-
115
- ---
116
-
117
- ## `router` options
118
-
119
- Passed to the underlying `useRouter()` call.
120
-
121
- ```ts
122
- router: {
123
- base: '/',
124
- scrollToFragment: { enabled: true, offset: 0 },
125
- }
126
- ```
127
-
128
- ### `router.base`
129
-
130
- **Type:** `string`
131
- **Default:** `'/'`
132
-
133
- Base path for all routes. Use when deploying to a sub-path, e.g. `'/my-app'`.
134
-
135
- ### `router.scrollToFragment`
136
-
137
- **Type:** `boolean | { enabled: boolean; offset: number }`
138
-
139
- Controls scroll-to-fragment (`#anchor`) behavior.
140
-
141
- ---
142
-
143
- ## `jitCss` options
144
-
145
- Passed to the runtime's `cerPlugin` for JIT (just-in-time) CSS generation at build time and to `enableJITCSS()` at runtime.
146
-
147
- ```ts
148
- jitCss: {
149
- content: ['./app/pages/**/*.ts', './app/components/**/*.ts', './app/layouts/**/*.ts'],
150
- extendedColors: false,
151
- customColors: {
152
- brand: { '100': '#ede9fe', '500': '#7c3aed', '900': '#4c1d95' },
153
- surface: { DEFAULT: 'var(--md-sys-color-surface)' },
154
- },
155
- }
156
- ```
157
-
158
- ### `jitCss.content`
159
-
160
- **Type:** `string[]`
161
- **Default:** Pages, components, and layouts directories.
162
-
163
- Glob patterns pointing to files that use utility classes. The JIT compiler scans these files to generate CSS.
164
-
165
- ### `jitCss.extendedColors`
166
-
167
- **Type:** `boolean`
168
- **Default:** `false`
169
-
170
- Enables the extended color palette in the JIT CSS system.
171
-
172
- ### `jitCss.customColors`
173
-
174
- **Type:** `Record<string, Record<string, string>>`
175
- **Default:** `undefined`
176
-
177
- Registers project-specific color families in the JIT CSS engine. Each top-level key is a color family name; its value maps scale steps (or semantic names) to CSS color values. Custom colors are registered at both build time and runtime automatically:
178
-
179
- **Light DOM elements** — covered by the static stylesheet generated from the `content` scan. `customColors` is passed to the build-time scanner, so any custom color utility classes found in your source files are emitted into `virtual:cer-jit-css`, a global document stylesheet that applies to all light DOM elements.
180
-
181
- **Shadow DOM components** — covered at runtime. `customColors` is serialized into the `enableJITCSS()` call in the generated `.cer/app.ts`, so every component that renders after app startup has the custom colors available.
182
-
183
- Color family names must be a single lowercase word (no hyphens). Shade keys can be numeric steps (`'500'`) or semantic names (`'DEFAULT'`, `'on'`, `'container'`). When a utility class omits the shade (e.g. `bg-brand`), the `DEFAULT` shade is used automatically.
184
-
185
- Values can be any valid CSS color — hex strings, `rgb(...)`, `hsl(...)`, or CSS variable references:
186
-
187
- ```ts
188
- jitCss: {
189
- customColors: {
190
- // Numeric scale
191
- brand: { '100': '#ede9fe', '500': '#7c3aed', '900': '#4c1d95' },
192
- // Semantic shades (DEFAULT used when no shade is specified)
193
- accent: { DEFAULT: '#f59e0b', muted: '#fcd34d' },
194
- // CSS variable references (ideal for bridging design-token systems)
195
- mdprimary: { DEFAULT: 'var(--md-sys-color-primary)', on: 'var(--md-sys-color-on-primary)' },
196
- },
197
- }
198
- ```
199
-
200
- Once registered, all standard JIT CSS utility prefixes apply:
201
-
202
- | Utility | Example |
203
- |---|---|
204
- | Background | `bg-brand-500` |
205
- | Text | `text-brand-500` |
206
- | Border | `border-brand-500` |
207
- | Ring | `ring-brand-500` |
208
- | Shadow | `shadow-brand-500` |
209
- | Gradient stops | `from-brand-500 to-brand-900` |
210
- | With opacity modifier | `bg-brand-500/50` |
211
- | With variants | `hover:bg-brand-500 dark:text-brand-100` |
212
-
213
- ---
214
-
215
- ## `autoImports` options
216
-
217
- Controls which identifiers are automatically injected at the top of files in `app/pages/`, `app/layouts/`, and `app/components/`.
218
-
219
- ```ts
220
- autoImports: {
221
- components: true, // per-page component code splitting via cerComponentImports transform
222
- composables: true, // virtual:cer-composables (re-exports app/composables/)
223
- directives: true, // when, each, match, anchorBlock
224
- runtime: true, // component, html, ref, computed, watch, etc.
225
- }
226
- ```
227
-
228
- ### `autoImports.components`
229
-
230
- When `true` (default), the `cerComponentImports` Vite transform plugin is active. It scans each page, layout, and component file for custom element tags in `html\`` templates and automatically injects static `import` statements pointing to the corresponding source files in `app/components/`. This gives Rollup the module graph edges needed to code-split components per page — only the components a page actually uses are bundled into that page's chunk.
231
-
232
- When `false`, no transform runs and no component files are auto-imported. You must import component files manually (e.g. from a plugin or explicit import at the top of each file).
233
-
234
- When `runtime: true`, the following are injected if used and not already imported:
235
-
236
- ```ts
237
- import { component, html, css, ref, computed, watch, watchEffect,
238
- useProps, useEmit, useOnConnected, useOnDisconnected,
239
- useOnAttributeChanged, useOnError, useStyle, useDesignTokens,
240
- useGlobalStyle, useExpose, useSlots, provide, inject,
241
- createComposable, nextTick, defineModel, getCurrentComponentContext,
242
- isReactiveState, unsafeHTML, decodeEntities, useTeleport
243
- } from '@jasonshimmy/custom-elements-runtime'
244
- ```
245
-
246
- When `directives: true`, the following are injected if used and not already imported:
247
-
248
- ```ts
249
- import { when, each, match, anchorBlock } from '@jasonshimmy/custom-elements-runtime/directives'
250
- ```
251
-
252
- The following framework composables are **always** auto-imported when used, regardless of the `runtime` flag — they come from the plugin package:
253
-
254
- ```ts
255
- import {
256
- useHead,
257
- usePageData,
258
- useInject,
259
- useRuntimeConfig,
260
- useRoute,
261
- useState,
262
- useAuth,
263
- useFetch,
264
- useSeoMeta,
265
- useCookie,
266
- useSession,
267
- useLocale,
268
- queryContent,
269
- useContentSearch,
270
- defineMiddleware,
271
- defineServerMiddleware,
272
- navigateTo,
273
- } from '@jasonshimmy/vite-plugin-cer-app/composables'
274
- ```
275
-
276
- Set any flag to `false` to opt out and manage imports manually.
277
-
278
- ---
279
-
280
- ## `adapter`
281
-
282
- **Type:** `'vercel' | 'netlify' | 'cloudflare' | ((root: string) => Promise<void>)`
283
- **Default:** `undefined`
284
-
285
- When set, `cer-app build` automatically runs the adapter after the build completes, producing the platform-specific deployment output alongside `dist/`.
286
-
287
- ### Built-in adapters
288
-
289
- ```ts
290
- export default defineConfig({
291
- mode: 'ssr',
292
- adapter: 'vercel', // or 'netlify' | 'cloudflare'
293
- })
294
- ```
295
-
296
- | Value | Output | Deploy command |
297
- |---|---|---|
298
- | `'vercel'` | `.vercel/output/` (Build Output API v3) | `vercel deploy --prebuilt` |
299
- | `'netlify'` | `netlify/functions/ssr.mjs` + `netlify.toml` | `netlify deploy` |
300
- | `'cloudflare'` | `dist/_worker.js` + `wrangler.toml` | `wrangler pages deploy dist` |
301
-
302
- ### Custom adapter
303
-
304
- Pass an async function to target any platform (Railway, Fly.io, bare Node.js, Docker, etc.). `root` is the absolute path to the project root. Both `dist/client/` and `dist/server/` are already present by the time your function is called.
305
-
306
- ```ts
307
- export default defineConfig({
308
- mode: 'ssr',
309
- adapter: async (root) => {
310
- // Example: copy the server bundle to a custom output location
311
- const { cp, mkdir } = await import('node:fs/promises')
312
- await mkdir(`${root}/deploy`, { recursive: true })
313
- await cp(`${root}/dist`, `${root}/deploy/dist`, { recursive: true })
314
- console.log('[my-adapter] done')
315
- },
316
- })
317
- ```
318
-
319
- ### Running adapters manually
320
-
321
- Adapters can also be run independently (without re-building) using `cer-app adapt`:
322
-
323
- ```sh
324
- cer-app adapt --platform vercel
325
- cer-app adapt --platform netlify
326
- cer-app adapt --platform cloudflare
327
- cer-app adapt --platform custom # runs the function adapter from cer.config.ts
328
- ```
329
-
330
- See [cli.md](./cli.md#cer-app-adapt) for full details.
331
-
332
- ---
333
-
334
- ## `content` options
335
-
336
- Enables the file-based content layer. Drop Markdown or JSON files into `content/` at the project root and query them with `queryContent()` or search with `useContentSearch()`. Custom elements referenced directly inside markdown are also auto-registered from `app/components/`.
337
-
338
- ```ts
339
- export default defineConfig({
340
- content: {
341
- dir: 'content', // default
342
- drafts: false, // default
343
- },
344
- })
345
- ```
346
-
347
- ### `content.dir`
348
-
349
- **Type:** `string`
350
- **Default:** `'content'`
351
-
352
- Content directory relative to the project root. The default resolves to `{root}/content/`.
353
-
354
- ### `content.drafts`
355
-
356
- **Type:** `boolean`
357
- **Default:** `false`
358
-
359
- When `false`, files with `draft: true` in their frontmatter are excluded from the content store and search index in production builds.
360
-
361
- See [content.md](./content.md) for full documentation.
362
-
363
- ---
364
-
365
- ## `i18n` options
366
-
367
- Enables locale-aware URL routing and the `useLocale()` composable. No external package is required.
368
-
369
- ```ts
370
- export default defineConfig({
371
- i18n: {
372
- locales: ['en', 'fr', 'de'],
373
- defaultLocale: 'en',
374
- strategy: 'prefix_except_default',
375
- },
376
- })
377
- ```
378
-
379
- ### `i18n.locales`
380
-
381
- **Type:** `string[]`
382
- **Required**
383
-
384
- All supported locale codes. These must be BCP 47 language tags or short codes (e.g. `'en'`, `'fr'`, `'zh-Hant'`).
385
-
386
- ### `i18n.defaultLocale`
387
-
388
- **Type:** `string`
389
- **Required**
390
-
391
- The fallback locale. Used when no locale can be detected from the URL.
392
-
393
- ### `i18n.strategy`
394
-
395
- **Type:** `'prefix' | 'prefix_except_default' | 'no_prefix'`
396
- **Default:** `'prefix_except_default'`
397
-
398
- Controls how locales appear in URLs:
399
-
400
- | Strategy | Default locale URL | Other locale URL |
401
- |---|---|---|
402
- | `'prefix'` | `/en/about` | `/fr/about` |
403
- | `'prefix_except_default'` | `/about` | `/fr/about` |
404
- | `'no_prefix'` | `/about` | `/about` (locale from cookie/header only) |
405
-
406
- > **Recommendation:** Use `'prefix_except_default'` for most projects. It keeps your existing default-locale URLs intact while adding locale prefixes for other languages.
407
-
408
- See [i18n.md](./i18n.md) for full documentation of routing, `useLocale()`, SSR/SSG behavior, and the locale switcher pattern.
409
-
410
- ---
411
-
412
- ## `runtimeConfig` options
413
-
414
- Expose typed, centralized configuration to your app. Public values are available everywhere; private values are server-only secrets resolved from environment variables at startup.
415
-
416
- ```ts
417
- export default defineConfig({
418
- runtimeConfig: {
419
- public: {
420
- apiBase: process.env.VITE_API_BASE ?? 'https://api.example.com',
421
- appVersion: '1.0.0',
422
- },
423
- private: {
424
- dbUrl: '', // resolved from process.env.DB_URL at server startup
425
- secretKey: '', // resolved from process.env.SECRET_KEY at server startup
426
- },
427
- },
428
- })
429
- ```
430
-
431
- ### `runtimeConfig.public`
432
-
433
- **Type:** `Record<string, unknown>`
434
- **Default:** `{}`
435
-
436
- Values placed here are serialized into `virtual:cer-app-config` at build time and accessible on both server and client via `useRuntimeConfig().public`.
437
-
438
- > **Security:** Only put values here that are safe to expose to the browser. Do not put secrets, tokens, or private keys in `public`.
439
-
440
- > **Serialization:** Values must be JSON-serializable (strings, numbers, booleans, plain objects, arrays). Functions, class instances, `undefined`, and circular references are not supported.
441
-
442
- ```ts
443
- // Any page, layout, component, or composable
444
- component('page-index', () => {
445
- const config = useRuntimeConfig()
446
- // config.public.apiBase → 'https://api.example.com'
447
-
448
- return html`<p>API: ${config.public.apiBase}</p>`
449
- })
450
- ```
451
-
452
- **TypeScript:** Import `RuntimePublicConfig` to type your public config if needed:
453
-
454
- ```ts
455
- import type { RuntimePublicConfig } from '@jasonshimmy/vite-plugin-cer-app/types'
456
- ```
457
-
458
- ---
459
-
460
- ### `runtimeConfig.private`
461
-
462
- **Type:** `Record<string, string>`
463
- **Default:** `{}`
464
-
465
- Server-only secrets. Declare keys with empty-string defaults in `cer.config.ts` for typing purposes. **Private values are never included in the client bundle.**
466
-
467
- **Environment variable resolution order** (at server startup, for each declared key):
468
-
469
- 1. `process.env[key]` — exact case (e.g. `process.env.dbUrl`)
470
- 2. `process.env[UPPER_SNAKE_CASE(key)]` — conventional env var form (e.g. `process.env.DB_URL`)
471
- 3. The declared default value — used as a last-resort fallback
472
-
473
- camelCase keys are automatically converted: `dbUrl` → `DB_URL`, `secretKey` → `SECRET_KEY`.
474
-
475
- ```ts
476
- // cer.config.ts
477
- export default defineConfig({
478
- runtimeConfig: {
479
- private: {
480
- dbUrl: '', // resolved from process.env.dbUrl or process.env.DB_URL
481
- secretKey: '', // resolved from process.env.secretKey or process.env.SECRET_KEY
482
- },
483
- },
484
- })
485
- ```
486
-
487
- ```ts
488
- // app/pages/data.ts — loader (server-only)
489
- export const loader = async () => {
490
- const { private: priv } = useRuntimeConfig()
491
- const rows = await db.query(priv?.dbUrl)
492
- return { rows }
493
- }
494
- ```
495
-
496
- > **Browser enforcement:** Accessing `useRuntimeConfig().private` in a browser context throws a clear runtime error:
497
- > ```
498
- > [cer-app] runtimeConfig.private is not available in the browser.
499
- > Move this access into a server-only loader, middleware, or API handler.
500
- > ```
501
- > This prevents accidental secret leaks — the Proxy is applied automatically with no extra configuration required.
502
-
503
- **TypeScript:** Import `RuntimePrivateConfig` to type your private config:
504
-
505
- ```ts
506
- import type { RuntimePrivateConfig } from '@jasonshimmy/vite-plugin-cer-app/types'
507
- ```
508
-
509
- ---
510
-
511
- ## Observability hooks
512
-
513
- Three optional hooks in `cer.config.ts` give you visibility into every SSR request without modifying any application code.
514
-
515
- > **SSR mode only.** These hooks are invoked by the Node.js SSR request handler. They do **not** fire in SSG or SPA modes:
516
- > - **SSG** — pages are pre-rendered to static HTML at build time and served directly by the file server. No Node.js handler processes individual page requests at runtime, so no hooks fire.
517
- > - **SPA** — there is no server-side render pass; the browser loads `index.html` and renders entirely client-side.
518
- >
519
- > If you need request logging in SSG/SPA deployments, add it at the reverse-proxy or CDN layer instead.
520
-
521
- ### `onRequest`
522
-
523
- Called at the start of every SSR request, before route matching and the data loader. Use this for request logging or to initialise per-request APM transactions.
524
-
525
- **Type:** `(ctx: RequestHookContext) => void | Promise<void>`
526
-
527
- | Field | Type | Description |
528
- |---|---|---|
529
- | `ctx.path` | `string` | URL pathname (e.g. `/about`) |
530
- | `ctx.method` | `string` | HTTP method in upper-case (e.g. `'GET'`) |
531
- | `ctx.req` | `IncomingMessage` | Raw Node.js incoming request |
532
-
533
- Errors thrown inside `onRequest` are silently swallowed — the hook cannot crash the request handler.
534
-
535
- ### `onResponse`
536
-
537
- Called after every SSR response is sent, on both success and error paths. `ctx.duration` contains the elapsed milliseconds from the first byte received to `res.end()`. Use this for latency tracking and access logging.
538
-
539
- **Type:** `(ctx: ResponseHookContext) => void | Promise<void>`
540
-
541
- | Field | Type | Description |
542
- |---|---|---|
543
- | `ctx.path` | `string` | URL pathname |
544
- | `ctx.method` | `string` | HTTP method |
545
- | `ctx.statusCode` | `number` | Final HTTP status code written to the response |
546
- | `ctx.duration` | `number` | Request duration in milliseconds |
547
- | `ctx.req` | `IncomingMessage` | Raw Node.js incoming request |
548
-
549
- Errors thrown inside `onResponse` are silently swallowed.
550
-
551
- ### `onError`
552
-
553
- Called when an error is caught by the framework's SSR error boundaries:
554
-
555
- - **`'loader'`** — the data loader threw
556
- - **`'render'`** — an infrastructure-level render error escaped the runtime
557
- - **`'middleware'`** — a server middleware threw
558
-
559
- Use this to forward errors to Sentry, Datadog, or any error-reporting service.
560
-
561
- **Type:** `(err: unknown, ctx: ErrorHookContext) => void | Promise<void>`
562
-
563
- | Field | Type | Description |
564
- |---|---|---|
565
- | `ctx.type` | `'loader' \| 'render' \| 'middleware'` | Which layer the error originated from |
566
- | `ctx.path` | `string` | URL pathname |
567
- | `ctx.req` | `IncomingMessage` | Raw Node.js incoming request |
568
-
569
- Errors thrown inside `onError` are silently swallowed — the hook cannot crash the request handler.
570
-
571
- ### Example — Sentry integration
572
-
573
- ```ts
574
- // cer.config.ts
575
- import * as Sentry from '@sentry/node'
576
- import { defineConfig } from '@jasonshimmy/vite-plugin-cer-app'
577
-
578
- Sentry.init({ dsn: process.env.SENTRY_DSN })
579
-
580
- export default defineConfig({
581
- onError(err, ctx) {
582
- Sentry.captureException(err, {
583
- tags: { type: ctx.type, path: ctx.path },
584
- })
585
- },
586
-
587
- onRequest(ctx) {
588
- console.log(`→ ${ctx.method} ${ctx.path}`)
589
- },
590
-
591
- onResponse(ctx) {
592
- console.log(`← ${ctx.statusCode} ${ctx.path} (${ctx.duration}ms)`)
593
- },
594
- })
595
- ```
596
-
597
- ### Example — console request logger
598
-
599
- ```ts
600
- // cer.config.ts
601
- import { defineConfig } from '@jasonshimmy/vite-plugin-cer-app'
602
-
603
- export default defineConfig({
604
- onRequest({ method, path }) {
605
- console.log(`[${new Date().toISOString()}] ${method} ${path}`)
606
- },
607
- onResponse({ method, path, statusCode, duration }) {
608
- console.log(`[${new Date().toISOString()}] ${statusCode} ${method} ${path} — ${duration}ms`)
609
- },
610
- })
611
- ```
612
-
613
- ### TypeScript types
614
-
615
- All hook context types are exported from `@jasonshimmy/vite-plugin-cer-app/types`:
616
-
617
- ```ts
618
- import type {
619
- ErrorHookContext,
620
- RequestHookContext,
621
- ResponseHookContext,
622
- } from '@jasonshimmy/vite-plugin-cer-app/types'
623
- ```
624
-
625
- ---
626
-
627
- ## Passing config to the Vite plugin directly
628
-
629
- When using `vite.config.ts` instead of (or alongside) `cer.config.ts`:
630
-
631
- ```ts
632
- // vite.config.ts
633
- import { defineConfig } from 'vite'
634
- import { cerApp } from '@jasonshimmy/vite-plugin-cer-app'
635
-
636
- export default defineConfig({
637
- plugins: [
638
- cerApp({
639
- mode: 'ssr',
640
- }),
641
- ],
642
- })
643
- ```
644
-
645
- `cerApp()` accepts the same `CerAppConfig` object as `defineConfig()`.
646
-
647
- ---
648
-
649
- ## TypeScript types
650
-
651
- All config interfaces are exported from `@jasonshimmy/vite-plugin-cer-app/types`:
652
-
653
- ```ts
654
- import type {
655
- CerAppConfig,
656
- SsgConfig,
657
- JitCssConfig,
658
- AutoImportsConfig,
659
- RuntimeConfig,
660
- RuntimePublicConfig,
661
- RuntimePrivateConfig,
662
- I18nConfig,
663
- ErrorHookContext,
664
- RequestHookContext,
665
- ResponseHookContext,
666
- } from '@jasonshimmy/vite-plugin-cer-app/types'
667
- ```