@jasonshimmy/vite-plugin-cer-app 0.23.2 → 0.25.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 (404) hide show
  1. package/dist/cli/adapters/netlify.js +4 -2
  2. package/dist/cli/adapters/netlify.js.map +1 -1
  3. package/dist/cli/checks/lighthouse.d.ts +26 -0
  4. package/dist/cli/checks/lighthouse.d.ts.map +1 -0
  5. package/dist/cli/checks/lighthouse.js +121 -0
  6. package/dist/cli/checks/lighthouse.js.map +1 -0
  7. package/dist/cli/checks/links.d.ts +12 -0
  8. package/dist/cli/checks/links.d.ts.map +1 -0
  9. package/dist/cli/checks/links.js +89 -0
  10. package/dist/cli/checks/links.js.map +1 -0
  11. package/dist/cli/checks/performance.d.ts +17 -0
  12. package/dist/cli/checks/performance.d.ts.map +1 -0
  13. package/dist/cli/checks/performance.js +61 -0
  14. package/dist/cli/checks/performance.js.map +1 -0
  15. package/dist/cli/commands/check.d.ts +3 -0
  16. package/dist/cli/commands/check.d.ts.map +1 -0
  17. package/dist/cli/commands/check.js +85 -0
  18. package/dist/cli/commands/check.js.map +1 -0
  19. package/dist/cli/commands/preview.d.ts.map +1 -1
  20. package/dist/cli/commands/preview.js +4 -2
  21. package/dist/cli/commands/preview.js.map +1 -1
  22. package/dist/cli/create/index.d.ts +11 -1
  23. package/dist/cli/create/index.d.ts.map +1 -1
  24. package/dist/cli/create/index.js +135 -65
  25. package/dist/cli/create/index.js.map +1 -1
  26. package/dist/cli/create/templates/spa/package.json.tpl +5 -3
  27. package/dist/cli/create/templates/ssg/cer.config.ts.tpl +2 -0
  28. package/dist/cli/create/templates/ssg/package.json.tpl +5 -3
  29. package/dist/cli/create/templates/ssr/package.json.tpl +5 -3
  30. package/dist/cli/index.js +2 -0
  31. package/dist/cli/index.js.map +1 -1
  32. package/dist/index.d.ts +4 -2
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/plugin/build-ssg.d.ts +22 -6
  35. package/dist/plugin/build-ssg.d.ts.map +1 -1
  36. package/dist/plugin/build-ssg.js +226 -17
  37. package/dist/plugin/build-ssg.js.map +1 -1
  38. package/dist/plugin/content/index.d.ts +1 -1
  39. package/dist/plugin/content/index.d.ts.map +1 -1
  40. package/dist/plugin/content/index.js +8 -8
  41. package/dist/plugin/content/index.js.map +1 -1
  42. package/dist/plugin/content/parser.d.ts +3 -3
  43. package/dist/plugin/content/parser.d.ts.map +1 -1
  44. package/dist/plugin/content/parser.js +103 -24
  45. package/dist/plugin/content/parser.js.map +1 -1
  46. package/dist/plugin/dev-server.d.ts +4 -1
  47. package/dist/plugin/dev-server.d.ts.map +1 -1
  48. package/dist/plugin/dev-server.js.map +1 -1
  49. package/dist/plugin/dts-generator.d.ts.map +1 -1
  50. package/dist/plugin/dts-generator.js +50 -8
  51. package/dist/plugin/dts-generator.js.map +1 -1
  52. package/dist/plugin/generated-dir.d.ts +2 -0
  53. package/dist/plugin/generated-dir.d.ts.map +1 -1
  54. package/dist/plugin/generated-dir.js +17 -6
  55. package/dist/plugin/generated-dir.js.map +1 -1
  56. package/dist/plugin/html-post-process.d.ts +7 -0
  57. package/dist/plugin/html-post-process.d.ts.map +1 -1
  58. package/dist/plugin/html-post-process.js +26 -0
  59. package/dist/plugin/html-post-process.js.map +1 -1
  60. package/dist/plugin/index.d.ts.map +1 -1
  61. package/dist/plugin/index.js +60 -13
  62. package/dist/plugin/index.js.map +1 -1
  63. package/dist/plugin/transforms/auto-import.d.ts.map +1 -1
  64. package/dist/plugin/transforms/auto-import.js +7 -0
  65. package/dist/plugin/transforms/auto-import.js.map +1 -1
  66. package/dist/plugin/transforms/prune-runtime-css.d.ts +8 -0
  67. package/dist/plugin/transforms/prune-runtime-css.d.ts.map +1 -0
  68. package/dist/plugin/transforms/prune-runtime-css.js +40 -0
  69. package/dist/plugin/transforms/prune-runtime-css.js.map +1 -0
  70. package/dist/runtime/app-template.d.ts +1 -1
  71. package/dist/runtime/app-template.d.ts.map +1 -1
  72. package/dist/runtime/app-template.js +206 -36
  73. package/dist/runtime/app-template.js.map +1 -1
  74. package/dist/runtime/composables/index.d.ts +4 -0
  75. package/dist/runtime/composables/index.d.ts.map +1 -1
  76. package/dist/runtime/composables/index.js +2 -0
  77. package/dist/runtime/composables/index.js.map +1 -1
  78. package/dist/runtime/composables/use-active-headings.d.ts +24 -0
  79. package/dist/runtime/composables/use-active-headings.d.ts.map +1 -0
  80. package/dist/runtime/composables/use-active-headings.js +112 -0
  81. package/dist/runtime/composables/use-active-headings.js.map +1 -0
  82. package/dist/runtime/composables/use-content-page.d.ts +45 -0
  83. package/dist/runtime/composables/use-content-page.d.ts.map +1 -0
  84. package/dist/runtime/composables/use-content-page.js +181 -0
  85. package/dist/runtime/composables/use-content-page.js.map +1 -0
  86. package/dist/runtime/composables/use-content-search.d.ts.map +1 -1
  87. package/dist/runtime/composables/use-content-search.js +1 -5
  88. package/dist/runtime/composables/use-content-search.js.map +1 -1
  89. package/dist/runtime/composables/use-fetch.d.ts +2 -1
  90. package/dist/runtime/composables/use-fetch.d.ts.map +1 -1
  91. package/dist/runtime/composables/use-fetch.js +112 -43
  92. package/dist/runtime/composables/use-fetch.js.map +1 -1
  93. package/dist/runtime/composables/use-route.d.ts.map +1 -1
  94. package/dist/runtime/composables/use-route.js +39 -11
  95. package/dist/runtime/composables/use-route.js.map +1 -1
  96. package/dist/runtime/content/client.js +2 -2
  97. package/dist/runtime/content/client.js.map +1 -1
  98. package/dist/runtime/entry-server-template.d.ts +16 -1
  99. package/dist/runtime/entry-server-template.d.ts.map +1 -1
  100. package/dist/runtime/entry-server-template.js +120 -13
  101. package/dist/runtime/entry-server-template.js.map +1 -1
  102. package/dist/types/config.d.ts +45 -4
  103. package/dist/types/config.d.ts.map +1 -1
  104. package/dist/types/config.js.map +1 -1
  105. package/dist/types/content.d.ts +18 -1
  106. package/dist/types/content.d.ts.map +1 -1
  107. package/dist/types/middleware.d.ts +2 -2
  108. package/dist/types/middleware.d.ts.map +1 -1
  109. package/package.json +22 -19
  110. package/.github/copilot-instructions.md +0 -169
  111. package/.github/workflows/publish.yml +0 -257
  112. package/.nvmrc +0 -1
  113. package/CHANGELOG.md +0 -236
  114. package/CLAUDE.md +0 -113
  115. package/commits.txt +0 -1
  116. package/cypress.config.ts +0 -16
  117. package/docs/authentication.md +0 -285
  118. package/docs/cli.md +0 -324
  119. package/docs/components.md +0 -237
  120. package/docs/composables.md +0 -907
  121. package/docs/configuration.md +0 -696
  122. package/docs/content.md +0 -570
  123. package/docs/data-loading.md +0 -336
  124. package/docs/getting-started.md +0 -237
  125. package/docs/head-management.md +0 -212
  126. package/docs/i18n.md +0 -159
  127. package/docs/layouts.md +0 -224
  128. package/docs/middleware.md +0 -234
  129. package/docs/plugins.md +0 -170
  130. package/docs/rendering-modes.md +0 -377
  131. package/docs/routing.md +0 -485
  132. package/docs/server-api.md +0 -253
  133. package/docs/testing.md +0 -455
  134. package/docs/use-fetch.md +0 -183
  135. package/e2e/cypress/e2e/api.cy.ts +0 -123
  136. package/e2e/cypress/e2e/async-component.cy.ts +0 -27
  137. package/e2e/cypress/e2e/component-splitting.cy.ts +0 -50
  138. package/e2e/cypress/e2e/content.cy.ts +0 -425
  139. package/e2e/cypress/e2e/cookie.cy.ts +0 -85
  140. package/e2e/cypress/e2e/data.cy.ts +0 -158
  141. package/e2e/cypress/e2e/error-boundary.cy.ts +0 -88
  142. package/e2e/cypress/e2e/fouc.cy.ts +0 -254
  143. package/e2e/cypress/e2e/group-meta.cy.ts +0 -36
  144. package/e2e/cypress/e2e/head.cy.ts +0 -89
  145. package/e2e/cypress/e2e/i18n.cy.ts +0 -79
  146. package/e2e/cypress/e2e/interactive.cy.ts +0 -137
  147. package/e2e/cypress/e2e/isr-nested-runtime.cy.ts +0 -102
  148. package/e2e/cypress/e2e/jit-css-custom-colors.cy.ts +0 -43
  149. package/e2e/cypress/e2e/middleware-chain.cy.ts +0 -89
  150. package/e2e/cypress/e2e/middleware-status.cy.ts +0 -30
  151. package/e2e/cypress/e2e/middleware.cy.ts +0 -45
  152. package/e2e/cypress/e2e/navigate.cy.ts +0 -39
  153. package/e2e/cypress/e2e/observability.cy.ts +0 -77
  154. package/e2e/cypress/e2e/per-route-error.cy.ts +0 -42
  155. package/e2e/cypress/e2e/per-route-render.cy.ts +0 -70
  156. package/e2e/cypress/e2e/preview-hardening.cy.ts +0 -88
  157. package/e2e/cypress/e2e/routes.cy.ts +0 -128
  158. package/e2e/cypress/e2e/seo-meta.cy.ts +0 -108
  159. package/e2e/cypress/e2e/server-middleware.cy.ts +0 -46
  160. package/e2e/cypress/e2e/session-rotation.cy.ts +0 -25
  161. package/e2e/cypress/e2e/session.cy.ts +0 -73
  162. package/e2e/cypress/e2e/ssr-render-error.cy.ts +0 -68
  163. package/e2e/cypress/e2e/synthetic-404.cy.ts +0 -45
  164. package/e2e/cypress/e2e/use-page-data.cy.ts +0 -122
  165. package/e2e/cypress/e2e/use-state.cy.ts +0 -138
  166. package/e2e/cypress/support/commands.ts +0 -120
  167. package/e2e/cypress/support/e2e.ts +0 -10
  168. package/e2e/cypress/tsconfig.json +0 -14
  169. package/e2e/kitchen-sink/app/components/ks-badge.ts +0 -8
  170. package/e2e/kitchen-sink/app/composables/useKsCounter.ts +0 -9
  171. package/e2e/kitchen-sink/app/error.ts +0 -18
  172. package/e2e/kitchen-sink/app/layouts/admin.ts +0 -13
  173. package/e2e/kitchen-sink/app/layouts/default.ts +0 -25
  174. package/e2e/kitchen-sink/app/layouts/group.ts +0 -9
  175. package/e2e/kitchen-sink/app/layouts/minimal.ts +0 -7
  176. package/e2e/kitchen-sink/app/loading.ts +0 -9
  177. package/e2e/kitchen-sink/app/middleware/auth.ts +0 -9
  178. package/e2e/kitchen-sink/app/middleware/custom-log.ts +0 -4
  179. package/e2e/kitchen-sink/app/middleware/group-auth.ts +0 -7
  180. package/e2e/kitchen-sink/app/middleware/logger.ts +0 -14
  181. package/e2e/kitchen-sink/app/pages/(auth)/login.ts +0 -13
  182. package/e2e/kitchen-sink/app/pages/(auth)/protected.ts +0 -16
  183. package/e2e/kitchen-sink/app/pages/404.ts +0 -9
  184. package/e2e/kitchen-sink/app/pages/about.ts +0 -17
  185. package/e2e/kitchen-sink/app/pages/admin/_layout.ts +0 -1
  186. package/e2e/kitchen-sink/app/pages/admin/dashboard.ts +0 -11
  187. package/e2e/kitchen-sink/app/pages/async-component-error-test.ts +0 -18
  188. package/e2e/kitchen-sink/app/pages/async-component-test.ts +0 -18
  189. package/e2e/kitchen-sink/app/pages/blog/[slug].ts +0 -59
  190. package/e2e/kitchen-sink/app/pages/blog/index.ts +0 -51
  191. package/e2e/kitchen-sink/app/pages/content-blog.ts +0 -37
  192. package/e2e/kitchen-sink/app/pages/content-doc.ts +0 -42
  193. package/e2e/kitchen-sink/app/pages/content-fallback.ts +0 -36
  194. package/e2e/kitchen-sink/app/pages/content-guides.ts +0 -35
  195. package/e2e/kitchen-sink/app/pages/content-index.ts +0 -39
  196. package/e2e/kitchen-sink/app/pages/content-search.ts +0 -36
  197. package/e2e/kitchen-sink/app/pages/cookie-test.ts +0 -22
  198. package/e2e/kitchen-sink/app/pages/counter.ts +0 -17
  199. package/e2e/kitchen-sink/app/pages/group-auth-blocked.ts +0 -9
  200. package/e2e/kitchen-sink/app/pages/group-meta-test/_layout.ts +0 -6
  201. package/e2e/kitchen-sink/app/pages/group-meta-test/custom-mw.ts +0 -14
  202. package/e2e/kitchen-sink/app/pages/group-meta-test/page.ts +0 -9
  203. package/e2e/kitchen-sink/app/pages/group-meta-test/protected.ts +0 -8
  204. package/e2e/kitchen-sink/app/pages/head.ts +0 -20
  205. package/e2e/kitchen-sink/app/pages/i18n-test.ts +0 -14
  206. package/e2e/kitchen-sink/app/pages/index.ts +0 -27
  207. package/e2e/kitchen-sink/app/pages/isr-test.ts +0 -17
  208. package/e2e/kitchen-sink/app/pages/items/[id].ts +0 -20
  209. package/e2e/kitchen-sink/app/pages/jit-css-custom-colors-test.ts +0 -14
  210. package/e2e/kitchen-sink/app/pages/loader-error-test.ts +0 -13
  211. package/e2e/kitchen-sink/app/pages/loader-props-test.ts +0 -19
  212. package/e2e/kitchen-sink/app/pages/loader-response-error-test.ts +0 -13
  213. package/e2e/kitchen-sink/app/pages/middleware-chain-test.ts +0 -12
  214. package/e2e/kitchen-sink/app/pages/middleware-status-test.ts +0 -9
  215. package/e2e/kitchen-sink/app/pages/navigate-test.ts +0 -16
  216. package/e2e/kitchen-sink/app/pages/observability-test.ts +0 -25
  217. package/e2e/kitchen-sink/app/pages/per-route-error-test.error.ts +0 -13
  218. package/e2e/kitchen-sink/app/pages/per-route-error-test.ts +0 -15
  219. package/e2e/kitchen-sink/app/pages/plugin-dsd-test.ts +0 -10
  220. package/e2e/kitchen-sink/app/pages/render-error-test.ts +0 -12
  221. package/e2e/kitchen-sink/app/pages/render-server-test.ts +0 -12
  222. package/e2e/kitchen-sink/app/pages/render-spa-test.ts +0 -12
  223. package/e2e/kitchen-sink/app/pages/route-info.ts +0 -14
  224. package/e2e/kitchen-sink/app/pages/seo-test.ts +0 -23
  225. package/e2e/kitchen-sink/app/pages/session-rotation-test.ts +0 -25
  226. package/e2e/kitchen-sink/app/pages/use-state-test.ts +0 -37
  227. package/e2e/kitchen-sink/app/plugins/01.setup.ts +0 -7
  228. package/e2e/kitchen-sink/app/plugins/02.ks-plugin-components.ts +0 -27
  229. package/e2e/kitchen-sink/cer-auto-imports.d.ts +0 -51
  230. package/e2e/kitchen-sink/cer-env.d.ts +0 -35
  231. package/e2e/kitchen-sink/cer-tsconfig.json +0 -30
  232. package/e2e/kitchen-sink/cer.config.ts +0 -43
  233. package/e2e/kitchen-sink/content/01.guides/01.index.md +0 -8
  234. package/e2e/kitchen-sink/content/01.guides/02.intro.md +0 -8
  235. package/e2e/kitchen-sink/content/01.guides/10.advanced.md +0 -8
  236. package/e2e/kitchen-sink/content/blog/2026-04-01-hello.md +0 -26
  237. package/e2e/kitchen-sink/content/blog/2026-04-02-draft.md +0 -10
  238. package/e2e/kitchen-sink/content/blog/index.md +0 -8
  239. package/e2e/kitchen-sink/content/blog/no-frontmatter.md +0 -7
  240. package/e2e/kitchen-sink/content/docs/getting-started.md +0 -48
  241. package/e2e/kitchen-sink/content/index.md +0 -16
  242. package/e2e/kitchen-sink/server/api/echo.ts +0 -12
  243. package/e2e/kitchen-sink/server/api/health.ts +0 -3
  244. package/e2e/kitchen-sink/server/api/posts/[slug].ts +0 -11
  245. package/e2e/kitchen-sink/server/api/posts/index.ts +0 -5
  246. package/e2e/kitchen-sink/server/api/session.ts +0 -23
  247. package/e2e/kitchen-sink/server/data/posts.ts +0 -21
  248. package/e2e/kitchen-sink/server/middleware/01-headers.ts +0 -6
  249. package/e2e/kitchen-sink/server/middleware/02-status-test.ts +0 -10
  250. package/e2e/kitchen-sink/tsconfig.json +0 -3
  251. package/e2e/scripts/clean.mjs +0 -14
  252. package/eslint.config.ts +0 -22
  253. package/src/__tests__/cli/adapters/cloudflare-worker.integration.test.ts +0 -132
  254. package/src/__tests__/cli/adapters/cloudflare.test.ts +0 -332
  255. package/src/__tests__/cli/adapters/netlify-bridge.integration.test.ts +0 -139
  256. package/src/__tests__/cli/adapters/netlify.test.ts +0 -286
  257. package/src/__tests__/cli/adapters/vercel-launcher.integration.test.ts +0 -129
  258. package/src/__tests__/cli/adapters/vercel.test.ts +0 -263
  259. package/src/__tests__/cli/preview-hardening.test.ts +0 -265
  260. package/src/__tests__/cli/preview-isr.test.ts +0 -320
  261. package/src/__tests__/index.test.ts +0 -21
  262. package/src/__tests__/plugin/app-template.test.ts +0 -166
  263. package/src/__tests__/plugin/build-ssg-render.test.ts +0 -155
  264. package/src/__tests__/plugin/build-ssg.test.ts +0 -598
  265. package/src/__tests__/plugin/build-ssr.test.ts +0 -192
  266. package/src/__tests__/plugin/cer-app-plugin.test.ts +0 -552
  267. package/src/__tests__/plugin/content/emitter.test.ts +0 -117
  268. package/src/__tests__/plugin/content/loader.test.ts +0 -154
  269. package/src/__tests__/plugin/content/parser.test.ts +0 -381
  270. package/src/__tests__/plugin/content/path-utils.test.ts +0 -69
  271. package/src/__tests__/plugin/content/search.test.ts +0 -119
  272. package/src/__tests__/plugin/dev-server.test.ts +0 -813
  273. package/src/__tests__/plugin/dts-generator.test.ts +0 -394
  274. package/src/__tests__/plugin/entry-server-template.test.ts +0 -385
  275. package/src/__tests__/plugin/generated-dir.test.ts +0 -144
  276. package/src/__tests__/plugin/html-post-process.test.ts +0 -146
  277. package/src/__tests__/plugin/path-utils.test.ts +0 -411
  278. package/src/__tests__/plugin/resolve-config.test.ts +0 -233
  279. package/src/__tests__/plugin/scanner.test.ts +0 -186
  280. package/src/__tests__/plugin/transforms/auto-import.test.ts +0 -510
  281. package/src/__tests__/plugin/transforms/head-inject.test.ts +0 -178
  282. package/src/__tests__/plugin/virtual/composables.test.ts +0 -57
  283. package/src/__tests__/plugin/virtual/content-components.test.ts +0 -66
  284. package/src/__tests__/plugin/virtual/error.test.ts +0 -71
  285. package/src/__tests__/plugin/virtual/layouts.test.ts +0 -70
  286. package/src/__tests__/plugin/virtual/loading.test.ts +0 -72
  287. package/src/__tests__/plugin/virtual/middleware.test.ts +0 -83
  288. package/src/__tests__/plugin/virtual/plugins.test.ts +0 -129
  289. package/src/__tests__/plugin/virtual/routes.test.ts +0 -884
  290. package/src/__tests__/plugin/virtual/server-api.test.ts +0 -164
  291. package/src/__tests__/plugin/virtual/server-middleware.test.ts +0 -102
  292. package/src/__tests__/runtime/app-template.test.ts +0 -208
  293. package/src/__tests__/runtime/define-middleware.test.ts +0 -64
  294. package/src/__tests__/runtime/define-server-middleware.test.ts +0 -54
  295. package/src/__tests__/runtime/entry-client-template.test.ts +0 -61
  296. package/src/__tests__/runtime/isr-handler.test.ts +0 -338
  297. package/src/__tests__/runtime/oauth/handler.test.ts +0 -358
  298. package/src/__tests__/runtime/oauth/providers.test.ts +0 -47
  299. package/src/__tests__/runtime/oauth-index.test.ts +0 -43
  300. package/src/__tests__/runtime/use-auth.test.ts +0 -169
  301. package/src/__tests__/runtime/use-content-search-composable.test.ts +0 -405
  302. package/src/__tests__/runtime/use-content-search.test.ts +0 -163
  303. package/src/__tests__/runtime/use-content.test.ts +0 -226
  304. package/src/__tests__/runtime/use-cookie.test.ts +0 -277
  305. package/src/__tests__/runtime/use-fetch-component.test.ts +0 -214
  306. package/src/__tests__/runtime/use-fetch.test.ts +0 -377
  307. package/src/__tests__/runtime/use-head.test.ts +0 -311
  308. package/src/__tests__/runtime/use-inject-client.test.ts +0 -67
  309. package/src/__tests__/runtime/use-inject.test.ts +0 -66
  310. package/src/__tests__/runtime/use-locale.test.ts +0 -152
  311. package/src/__tests__/runtime/use-navigate.test.ts +0 -121
  312. package/src/__tests__/runtime/use-page-data.test.ts +0 -298
  313. package/src/__tests__/runtime/use-route.test.ts +0 -156
  314. package/src/__tests__/runtime/use-runtime-config.test.ts +0 -182
  315. package/src/__tests__/runtime/use-seo-meta.test.ts +0 -109
  316. package/src/__tests__/runtime/use-session.test.ts +0 -320
  317. package/src/__tests__/runtime/use-state.test.ts +0 -340
  318. package/src/__tests__/types/config.test.ts +0 -18
  319. package/src/cli/adapters/cloudflare.ts +0 -335
  320. package/src/cli/adapters/netlify.ts +0 -326
  321. package/src/cli/adapters/vercel.ts +0 -311
  322. package/src/cli/commands/adapt.ts +0 -84
  323. package/src/cli/commands/build.ts +0 -165
  324. package/src/cli/commands/dev.ts +0 -125
  325. package/src/cli/commands/generate.ts +0 -91
  326. package/src/cli/commands/preview-isr.ts +0 -172
  327. package/src/cli/commands/preview.ts +0 -523
  328. package/src/cli/create/index.ts +0 -275
  329. package/src/cli/create/templates/shared/.gitignore.tpl +0 -25
  330. package/src/cli/create/templates/shared/app/layouts/default.ts.tpl +0 -15
  331. package/src/cli/create/templates/shared/app/pages/index.ts.tpl +0 -8
  332. package/src/cli/create/templates/shared/index.html.tpl +0 -12
  333. package/src/cli/create/templates/shared/tsconfig.json.tpl +0 -6
  334. package/src/cli/create/templates/spa/cer.config.ts.tpl +0 -6
  335. package/src/cli/create/templates/spa/package.json.tpl +0 -18
  336. package/src/cli/create/templates/ssg/cer.config.ts.tpl +0 -10
  337. package/src/cli/create/templates/ssg/package.json.tpl +0 -19
  338. package/src/cli/create/templates/ssr/cer.config.ts.tpl +0 -6
  339. package/src/cli/create/templates/ssr/package.json.tpl +0 -18
  340. package/src/cli/index.ts +0 -22
  341. package/src/index.ts +0 -20
  342. package/src/plugin/build-ssg.ts +0 -403
  343. package/src/plugin/build-ssr.ts +0 -134
  344. package/src/plugin/content/emitter.ts +0 -50
  345. package/src/plugin/content/index.ts +0 -233
  346. package/src/plugin/content/parser.ts +0 -259
  347. package/src/plugin/content/path-utils.ts +0 -55
  348. package/src/plugin/content/scanner.ts +0 -26
  349. package/src/plugin/content/search.ts +0 -28
  350. package/src/plugin/dev-server.ts +0 -379
  351. package/src/plugin/dts-generator.ts +0 -273
  352. package/src/plugin/generated-dir.ts +0 -121
  353. package/src/plugin/html-post-process.ts +0 -96
  354. package/src/plugin/index.ts +0 -584
  355. package/src/plugin/path-utils.ts +0 -186
  356. package/src/plugin/scanner.ts +0 -65
  357. package/src/plugin/transforms/auto-import.ts +0 -206
  358. package/src/plugin/transforms/head-inject.ts +0 -161
  359. package/src/plugin/virtual/composables.ts +0 -28
  360. package/src/plugin/virtual/content-components.ts +0 -83
  361. package/src/plugin/virtual/error.ts +0 -34
  362. package/src/plugin/virtual/layouts.ts +0 -41
  363. package/src/plugin/virtual/loading.ts +0 -32
  364. package/src/plugin/virtual/middleware.ts +0 -45
  365. package/src/plugin/virtual/plugins.ts +0 -46
  366. package/src/plugin/virtual/routes.ts +0 -514
  367. package/src/plugin/virtual/server-api.ts +0 -85
  368. package/src/plugin/virtual/server-middleware.ts +0 -44
  369. package/src/runtime/app-template.ts +0 -377
  370. package/src/runtime/composables/define-middleware.ts +0 -17
  371. package/src/runtime/composables/define-server-middleware.ts +0 -18
  372. package/src/runtime/composables/index.ts +0 -27
  373. package/src/runtime/composables/use-auth.ts +0 -125
  374. package/src/runtime/composables/use-content-search.ts +0 -205
  375. package/src/runtime/composables/use-content.ts +0 -146
  376. package/src/runtime/composables/use-cookie.ts +0 -135
  377. package/src/runtime/composables/use-fetch.ts +0 -438
  378. package/src/runtime/composables/use-head.ts +0 -234
  379. package/src/runtime/composables/use-inject.ts +0 -49
  380. package/src/runtime/composables/use-locale.ts +0 -109
  381. package/src/runtime/composables/use-navigate.ts +0 -58
  382. package/src/runtime/composables/use-page-data.ts +0 -93
  383. package/src/runtime/composables/use-route.ts +0 -71
  384. package/src/runtime/composables/use-runtime-config.ts +0 -123
  385. package/src/runtime/composables/use-seo-meta.ts +0 -80
  386. package/src/runtime/composables/use-session.ts +0 -186
  387. package/src/runtime/composables/use-state.ts +0 -92
  388. package/src/runtime/content/client.ts +0 -168
  389. package/src/runtime/entry-client-template.ts +0 -39
  390. package/src/runtime/entry-server-template.ts +0 -493
  391. package/src/runtime/isr-handler.ts +0 -184
  392. package/src/runtime/oauth/handler.ts +0 -407
  393. package/src/runtime/oauth/index.ts +0 -49
  394. package/src/runtime/oauth/providers.ts +0 -38
  395. package/src/types/api.ts +0 -40
  396. package/src/types/config.ts +0 -379
  397. package/src/types/content.ts +0 -66
  398. package/src/types/index.ts +0 -7
  399. package/src/types/middleware.ts +0 -63
  400. package/src/types/page.ts +0 -117
  401. package/src/types/plugin.ts +0 -34
  402. package/tsconfig.build.json +0 -10
  403. package/tsconfig.json +0 -19
  404. package/vitest.config.ts +0 -33
@@ -1,696 +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
- ## `siteUrl`
281
-
282
- **Type:** `string`
283
- **Default:** `undefined`
284
-
285
- The canonical origin of the deployed site — scheme, host, and optional port with **no trailing slash**.
286
-
287
- ```ts
288
- // cer.config.ts
289
- export default defineConfig({
290
- siteUrl: 'https://example.com',
291
- })
292
- ```
293
-
294
- When set, the SSG build automatically applies the following to every generated HTML page:
295
-
296
- | Feature | Behaviour |
297
- |---|---|
298
- | **Canonical link** | Injects `<link rel="canonical" href="${siteUrl}${path}">` before `</head>` on every page, unless a canonical is already present |
299
- | **robots.txt** | Writes `dist/robots.txt` with `Allow: /` and a `Sitemap:` directive pointing to `${siteUrl}/sitemap.xml` — skipped when `public/robots.txt` already exists |
300
-
301
- `siteUrl` is also available at runtime via `useRuntimeConfig().public.siteUrl`. User-supplied `runtimeConfig.public.siteUrl` takes precedence over the shorthand.
302
-
303
- > **Note:** `<link rel="icon">` is injected automatically whenever a `favicon.ico`, `favicon.svg`, or `favicon.png` is found in `public/` — this happens regardless of whether `siteUrl` is set.
304
-
305
- > **Note:** Every `<a target="_blank">` link in the generated HTML automatically receives `rel="noopener noreferrer"` if it is missing — also independent of `siteUrl`.
306
-
307
- ---
308
-
309
- ## `adapter`
310
-
311
- **Type:** `'vercel' | 'netlify' | 'cloudflare' | ((root: string) => Promise<void>)`
312
- **Default:** `undefined`
313
-
314
- When set, `cer-app build` automatically runs the adapter after the build completes, producing the platform-specific deployment output alongside `dist/`.
315
-
316
- ### Built-in adapters
317
-
318
- ```ts
319
- export default defineConfig({
320
- mode: 'ssr',
321
- adapter: 'vercel', // or 'netlify' | 'cloudflare'
322
- })
323
- ```
324
-
325
- | Value | Output | Deploy command |
326
- |---|---|---|
327
- | `'vercel'` | `.vercel/output/` (Build Output API v3) | `vercel deploy --prebuilt` |
328
- | `'netlify'` | `netlify/functions/ssr.mjs` + `netlify.toml` | `netlify deploy` |
329
- | `'cloudflare'` | `dist/_worker.js` + `wrangler.toml` | `wrangler pages deploy dist` |
330
-
331
- ### Custom adapter
332
-
333
- 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.
334
-
335
- ```ts
336
- export default defineConfig({
337
- mode: 'ssr',
338
- adapter: async (root) => {
339
- // Example: copy the server bundle to a custom output location
340
- const { cp, mkdir } = await import('node:fs/promises')
341
- await mkdir(`${root}/deploy`, { recursive: true })
342
- await cp(`${root}/dist`, `${root}/deploy/dist`, { recursive: true })
343
- console.log('[my-adapter] done')
344
- },
345
- })
346
- ```
347
-
348
- ### Running adapters manually
349
-
350
- Adapters can also be run independently (without re-building) using `cer-app adapt`:
351
-
352
- ```sh
353
- cer-app adapt --platform vercel
354
- cer-app adapt --platform netlify
355
- cer-app adapt --platform cloudflare
356
- cer-app adapt --platform custom # runs the function adapter from cer.config.ts
357
- ```
358
-
359
- See [cli.md](./cli.md#cer-app-adapt) for full details.
360
-
361
- ---
362
-
363
- ## `content` options
364
-
365
- 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/`.
366
-
367
- ```ts
368
- export default defineConfig({
369
- content: {
370
- dir: 'content', // default
371
- drafts: false, // default
372
- },
373
- })
374
- ```
375
-
376
- ### `content.dir`
377
-
378
- **Type:** `string`
379
- **Default:** `'content'`
380
-
381
- Content directory relative to the project root. The default resolves to `{root}/content/`.
382
-
383
- ### `content.drafts`
384
-
385
- **Type:** `boolean`
386
- **Default:** `false`
387
-
388
- When `false`, files with `draft: true` in their frontmatter are excluded from the content store and search index in production builds.
389
-
390
- See [content.md](./content.md) for full documentation.
391
-
392
- ---
393
-
394
- ## `i18n` options
395
-
396
- Enables locale-aware URL routing and the `useLocale()` composable. No external package is required.
397
-
398
- ```ts
399
- export default defineConfig({
400
- i18n: {
401
- locales: ['en', 'fr', 'de'],
402
- defaultLocale: 'en',
403
- strategy: 'prefix_except_default',
404
- },
405
- })
406
- ```
407
-
408
- ### `i18n.locales`
409
-
410
- **Type:** `string[]`
411
- **Required**
412
-
413
- All supported locale codes. These must be BCP 47 language tags or short codes (e.g. `'en'`, `'fr'`, `'zh-Hant'`).
414
-
415
- ### `i18n.defaultLocale`
416
-
417
- **Type:** `string`
418
- **Required**
419
-
420
- The fallback locale. Used when no locale can be detected from the URL.
421
-
422
- ### `i18n.strategy`
423
-
424
- **Type:** `'prefix' | 'prefix_except_default' | 'no_prefix'`
425
- **Default:** `'prefix_except_default'`
426
-
427
- Controls how locales appear in URLs:
428
-
429
- | Strategy | Default locale URL | Other locale URL |
430
- |---|---|---|
431
- | `'prefix'` | `/en/about` | `/fr/about` |
432
- | `'prefix_except_default'` | `/about` | `/fr/about` |
433
- | `'no_prefix'` | `/about` | `/about` (locale from cookie/header only) |
434
-
435
- > **Recommendation:** Use `'prefix_except_default'` for most projects. It keeps your existing default-locale URLs intact while adding locale prefixes for other languages.
436
-
437
- See [i18n.md](./i18n.md) for full documentation of routing, `useLocale()`, SSR/SSG behavior, and the locale switcher pattern.
438
-
439
- ---
440
-
441
- ## `runtimeConfig` options
442
-
443
- Expose typed, centralized configuration to your app. Public values are available everywhere; private values are server-only secrets resolved from environment variables at startup.
444
-
445
- ```ts
446
- export default defineConfig({
447
- runtimeConfig: {
448
- public: {
449
- apiBase: process.env.VITE_API_BASE ?? 'https://api.example.com',
450
- appVersion: '1.0.0',
451
- },
452
- private: {
453
- dbUrl: '', // resolved from process.env.DB_URL at server startup
454
- secretKey: '', // resolved from process.env.SECRET_KEY at server startup
455
- },
456
- },
457
- })
458
- ```
459
-
460
- ### `runtimeConfig.public`
461
-
462
- **Type:** `Record<string, unknown>`
463
- **Default:** `{}`
464
-
465
- Values placed here are serialized into `virtual:cer-app-config` at build time and accessible on both server and client via `useRuntimeConfig().public`.
466
-
467
- > **Security:** Only put values here that are safe to expose to the browser. Do not put secrets, tokens, or private keys in `public`.
468
-
469
- > **Serialization:** Values must be JSON-serializable (strings, numbers, booleans, plain objects, arrays). Functions, class instances, `undefined`, and circular references are not supported.
470
-
471
- ```ts
472
- // Any page, layout, component, or composable
473
- component('page-index', () => {
474
- const config = useRuntimeConfig()
475
- // config.public.apiBase → 'https://api.example.com'
476
-
477
- return html`<p>API: ${config.public.apiBase}</p>`
478
- })
479
- ```
480
-
481
- **TypeScript:** Import `RuntimePublicConfig` to type your public config if needed:
482
-
483
- ```ts
484
- import type { RuntimePublicConfig } from '@jasonshimmy/vite-plugin-cer-app/types'
485
- ```
486
-
487
- ---
488
-
489
- ### `runtimeConfig.private`
490
-
491
- **Type:** `Record<string, string>`
492
- **Default:** `{}`
493
-
494
- 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.**
495
-
496
- **Environment variable resolution order** (at server startup, for each declared key):
497
-
498
- 1. `process.env[key]` — exact case (e.g. `process.env.dbUrl`)
499
- 2. `process.env[UPPER_SNAKE_CASE(key)]` — conventional env var form (e.g. `process.env.DB_URL`)
500
- 3. The declared default value — used as a last-resort fallback
501
-
502
- camelCase keys are automatically converted: `dbUrl` → `DB_URL`, `secretKey` → `SECRET_KEY`.
503
-
504
- ```ts
505
- // cer.config.ts
506
- export default defineConfig({
507
- runtimeConfig: {
508
- private: {
509
- dbUrl: '', // resolved from process.env.dbUrl or process.env.DB_URL
510
- secretKey: '', // resolved from process.env.secretKey or process.env.SECRET_KEY
511
- },
512
- },
513
- })
514
- ```
515
-
516
- ```ts
517
- // app/pages/data.ts — loader (server-only)
518
- export const loader = async () => {
519
- const { private: priv } = useRuntimeConfig()
520
- const rows = await db.query(priv?.dbUrl)
521
- return { rows }
522
- }
523
- ```
524
-
525
- > **Browser enforcement:** Accessing `useRuntimeConfig().private` in a browser context throws a clear runtime error:
526
- > ```
527
- > [cer-app] runtimeConfig.private is not available in the browser.
528
- > Move this access into a server-only loader, middleware, or API handler.
529
- > ```
530
- > This prevents accidental secret leaks — the Proxy is applied automatically with no extra configuration required.
531
-
532
- **TypeScript:** Import `RuntimePrivateConfig` to type your private config:
533
-
534
- ```ts
535
- import type { RuntimePrivateConfig } from '@jasonshimmy/vite-plugin-cer-app/types'
536
- ```
537
-
538
- ---
539
-
540
- ## Observability hooks
541
-
542
- Three optional hooks in `cer.config.ts` give you visibility into every SSR request without modifying any application code.
543
-
544
- > **SSR mode only.** These hooks are invoked by the Node.js SSR request handler. They do **not** fire in SSG or SPA modes:
545
- > - **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.
546
- > - **SPA** — there is no server-side render pass; the browser loads `index.html` and renders entirely client-side.
547
- >
548
- > If you need request logging in SSG/SPA deployments, add it at the reverse-proxy or CDN layer instead.
549
-
550
- ### `onRequest`
551
-
552
- 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.
553
-
554
- **Type:** `(ctx: RequestHookContext) => void | Promise<void>`
555
-
556
- | Field | Type | Description |
557
- |---|---|---|
558
- | `ctx.path` | `string` | URL pathname (e.g. `/about`) |
559
- | `ctx.method` | `string` | HTTP method in upper-case (e.g. `'GET'`) |
560
- | `ctx.req` | `IncomingMessage` | Raw Node.js incoming request |
561
-
562
- Errors thrown inside `onRequest` are silently swallowed — the hook cannot crash the request handler.
563
-
564
- ### `onResponse`
565
-
566
- 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.
567
-
568
- **Type:** `(ctx: ResponseHookContext) => void | Promise<void>`
569
-
570
- | Field | Type | Description |
571
- |---|---|---|
572
- | `ctx.path` | `string` | URL pathname |
573
- | `ctx.method` | `string` | HTTP method |
574
- | `ctx.statusCode` | `number` | Final HTTP status code written to the response |
575
- | `ctx.duration` | `number` | Request duration in milliseconds |
576
- | `ctx.req` | `IncomingMessage` | Raw Node.js incoming request |
577
-
578
- Errors thrown inside `onResponse` are silently swallowed.
579
-
580
- ### `onError`
581
-
582
- Called when an error is caught by the framework's SSR error boundaries:
583
-
584
- - **`'loader'`** — the data loader threw
585
- - **`'render'`** — an infrastructure-level render error escaped the runtime
586
- - **`'middleware'`** — a server middleware threw
587
-
588
- Use this to forward errors to Sentry, Datadog, or any error-reporting service.
589
-
590
- **Type:** `(err: unknown, ctx: ErrorHookContext) => void | Promise<void>`
591
-
592
- | Field | Type | Description |
593
- |---|---|---|
594
- | `ctx.type` | `'loader' \| 'render' \| 'middleware'` | Which layer the error originated from |
595
- | `ctx.path` | `string` | URL pathname |
596
- | `ctx.req` | `IncomingMessage` | Raw Node.js incoming request |
597
-
598
- Errors thrown inside `onError` are silently swallowed — the hook cannot crash the request handler.
599
-
600
- ### Example — Sentry integration
601
-
602
- ```ts
603
- // cer.config.ts
604
- import * as Sentry from '@sentry/node'
605
- import { defineConfig } from '@jasonshimmy/vite-plugin-cer-app'
606
-
607
- Sentry.init({ dsn: process.env.SENTRY_DSN })
608
-
609
- export default defineConfig({
610
- onError(err, ctx) {
611
- Sentry.captureException(err, {
612
- tags: { type: ctx.type, path: ctx.path },
613
- })
614
- },
615
-
616
- onRequest(ctx) {
617
- console.log(`→ ${ctx.method} ${ctx.path}`)
618
- },
619
-
620
- onResponse(ctx) {
621
- console.log(`← ${ctx.statusCode} ${ctx.path} (${ctx.duration}ms)`)
622
- },
623
- })
624
- ```
625
-
626
- ### Example — console request logger
627
-
628
- ```ts
629
- // cer.config.ts
630
- import { defineConfig } from '@jasonshimmy/vite-plugin-cer-app'
631
-
632
- export default defineConfig({
633
- onRequest({ method, path }) {
634
- console.log(`[${new Date().toISOString()}] ${method} ${path}`)
635
- },
636
- onResponse({ method, path, statusCode, duration }) {
637
- console.log(`[${new Date().toISOString()}] ${statusCode} ${method} ${path} — ${duration}ms`)
638
- },
639
- })
640
- ```
641
-
642
- ### TypeScript types
643
-
644
- All hook context types are exported from `@jasonshimmy/vite-plugin-cer-app/types`:
645
-
646
- ```ts
647
- import type {
648
- ErrorHookContext,
649
- RequestHookContext,
650
- ResponseHookContext,
651
- } from '@jasonshimmy/vite-plugin-cer-app/types'
652
- ```
653
-
654
- ---
655
-
656
- ## Passing config to the Vite plugin directly
657
-
658
- When using `vite.config.ts` instead of (or alongside) `cer.config.ts`:
659
-
660
- ```ts
661
- // vite.config.ts
662
- import { defineConfig } from 'vite'
663
- import { cerApp } from '@jasonshimmy/vite-plugin-cer-app'
664
-
665
- export default defineConfig({
666
- plugins: [
667
- cerApp({
668
- mode: 'ssr',
669
- }),
670
- ],
671
- })
672
- ```
673
-
674
- `cerApp()` accepts the same `CerAppConfig` object as `defineConfig()`.
675
-
676
- ---
677
-
678
- ## TypeScript types
679
-
680
- All config interfaces are exported from `@jasonshimmy/vite-plugin-cer-app/types`:
681
-
682
- ```ts
683
- import type {
684
- CerAppConfig,
685
- SsgConfig,
686
- JitCssConfig,
687
- AutoImportsConfig,
688
- RuntimeConfig,
689
- RuntimePublicConfig,
690
- RuntimePrivateConfig,
691
- I18nConfig,
692
- ErrorHookContext,
693
- RequestHookContext,
694
- ResponseHookContext,
695
- } from '@jasonshimmy/vite-plugin-cer-app/types'
696
- ```