@jasonshimmy/vite-plugin-cer-app 0.23.2 → 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 (392) 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/create/index.d.ts +11 -1
  18. package/dist/cli/create/index.d.ts.map +1 -1
  19. package/dist/cli/create/index.js +135 -65
  20. package/dist/cli/create/index.js.map +1 -1
  21. package/dist/cli/create/templates/spa/package.json.tpl +5 -3
  22. package/dist/cli/create/templates/ssg/cer.config.ts.tpl +2 -0
  23. package/dist/cli/create/templates/ssg/package.json.tpl +5 -3
  24. package/dist/cli/create/templates/ssr/package.json.tpl +5 -3
  25. package/dist/cli/index.js +2 -0
  26. package/dist/cli/index.js.map +1 -1
  27. package/dist/index.d.ts +3 -1
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/plugin/build-ssg.d.ts +22 -6
  30. package/dist/plugin/build-ssg.d.ts.map +1 -1
  31. package/dist/plugin/build-ssg.js +227 -17
  32. package/dist/plugin/build-ssg.js.map +1 -1
  33. package/dist/plugin/content/parser.d.ts.map +1 -1
  34. package/dist/plugin/content/parser.js +54 -10
  35. package/dist/plugin/content/parser.js.map +1 -1
  36. package/dist/plugin/dev-server.d.ts +4 -1
  37. package/dist/plugin/dev-server.d.ts.map +1 -1
  38. package/dist/plugin/dev-server.js.map +1 -1
  39. package/dist/plugin/dts-generator.d.ts.map +1 -1
  40. package/dist/plugin/dts-generator.js +50 -8
  41. package/dist/plugin/dts-generator.js.map +1 -1
  42. package/dist/plugin/generated-dir.d.ts +2 -0
  43. package/dist/plugin/generated-dir.d.ts.map +1 -1
  44. package/dist/plugin/generated-dir.js +17 -6
  45. package/dist/plugin/generated-dir.js.map +1 -1
  46. package/dist/plugin/html-post-process.d.ts +6 -0
  47. package/dist/plugin/html-post-process.d.ts.map +1 -1
  48. package/dist/plugin/html-post-process.js +24 -0
  49. package/dist/plugin/html-post-process.js.map +1 -1
  50. package/dist/plugin/index.d.ts.map +1 -1
  51. package/dist/plugin/index.js +60 -13
  52. package/dist/plugin/index.js.map +1 -1
  53. package/dist/plugin/transforms/auto-import.d.ts.map +1 -1
  54. package/dist/plugin/transforms/auto-import.js +7 -0
  55. package/dist/plugin/transforms/auto-import.js.map +1 -1
  56. package/dist/plugin/transforms/prune-runtime-css.d.ts +8 -0
  57. package/dist/plugin/transforms/prune-runtime-css.d.ts.map +1 -0
  58. package/dist/plugin/transforms/prune-runtime-css.js +40 -0
  59. package/dist/plugin/transforms/prune-runtime-css.js.map +1 -0
  60. package/dist/runtime/app-template.d.ts +1 -1
  61. package/dist/runtime/app-template.d.ts.map +1 -1
  62. package/dist/runtime/app-template.js +206 -36
  63. package/dist/runtime/app-template.js.map +1 -1
  64. package/dist/runtime/composables/index.d.ts +4 -0
  65. package/dist/runtime/composables/index.d.ts.map +1 -1
  66. package/dist/runtime/composables/index.js +2 -0
  67. package/dist/runtime/composables/index.js.map +1 -1
  68. package/dist/runtime/composables/use-active-headings.d.ts +24 -0
  69. package/dist/runtime/composables/use-active-headings.d.ts.map +1 -0
  70. package/dist/runtime/composables/use-active-headings.js +112 -0
  71. package/dist/runtime/composables/use-active-headings.js.map +1 -0
  72. package/dist/runtime/composables/use-content-page.d.ts +45 -0
  73. package/dist/runtime/composables/use-content-page.d.ts.map +1 -0
  74. package/dist/runtime/composables/use-content-page.js +179 -0
  75. package/dist/runtime/composables/use-content-page.js.map +1 -0
  76. package/dist/runtime/composables/use-content-search.d.ts.map +1 -1
  77. package/dist/runtime/composables/use-content-search.js +1 -5
  78. package/dist/runtime/composables/use-content-search.js.map +1 -1
  79. package/dist/runtime/composables/use-fetch.d.ts +2 -1
  80. package/dist/runtime/composables/use-fetch.d.ts.map +1 -1
  81. package/dist/runtime/composables/use-fetch.js +112 -43
  82. package/dist/runtime/composables/use-fetch.js.map +1 -1
  83. package/dist/runtime/composables/use-route.d.ts.map +1 -1
  84. package/dist/runtime/composables/use-route.js +39 -11
  85. package/dist/runtime/composables/use-route.js.map +1 -1
  86. package/dist/runtime/content/client.js +2 -2
  87. package/dist/runtime/content/client.js.map +1 -1
  88. package/dist/runtime/entry-server-template.d.ts +16 -1
  89. package/dist/runtime/entry-server-template.d.ts.map +1 -1
  90. package/dist/runtime/entry-server-template.js +120 -13
  91. package/dist/runtime/entry-server-template.js.map +1 -1
  92. package/dist/types/config.d.ts +45 -4
  93. package/dist/types/config.d.ts.map +1 -1
  94. package/dist/types/config.js.map +1 -1
  95. package/dist/types/middleware.d.ts +2 -2
  96. package/dist/types/middleware.d.ts.map +1 -1
  97. package/package.json +22 -19
  98. package/.github/copilot-instructions.md +0 -169
  99. package/.github/workflows/publish.yml +0 -257
  100. package/.nvmrc +0 -1
  101. package/CHANGELOG.md +0 -236
  102. package/CLAUDE.md +0 -113
  103. package/commits.txt +0 -1
  104. package/cypress.config.ts +0 -16
  105. package/docs/authentication.md +0 -285
  106. package/docs/cli.md +0 -324
  107. package/docs/components.md +0 -237
  108. package/docs/composables.md +0 -907
  109. package/docs/configuration.md +0 -696
  110. package/docs/content.md +0 -570
  111. package/docs/data-loading.md +0 -336
  112. package/docs/getting-started.md +0 -237
  113. package/docs/head-management.md +0 -212
  114. package/docs/i18n.md +0 -159
  115. package/docs/layouts.md +0 -224
  116. package/docs/middleware.md +0 -234
  117. package/docs/plugins.md +0 -170
  118. package/docs/rendering-modes.md +0 -377
  119. package/docs/routing.md +0 -485
  120. package/docs/server-api.md +0 -253
  121. package/docs/testing.md +0 -455
  122. package/docs/use-fetch.md +0 -183
  123. package/e2e/cypress/e2e/api.cy.ts +0 -123
  124. package/e2e/cypress/e2e/async-component.cy.ts +0 -27
  125. package/e2e/cypress/e2e/component-splitting.cy.ts +0 -50
  126. package/e2e/cypress/e2e/content.cy.ts +0 -425
  127. package/e2e/cypress/e2e/cookie.cy.ts +0 -85
  128. package/e2e/cypress/e2e/data.cy.ts +0 -158
  129. package/e2e/cypress/e2e/error-boundary.cy.ts +0 -88
  130. package/e2e/cypress/e2e/fouc.cy.ts +0 -254
  131. package/e2e/cypress/e2e/group-meta.cy.ts +0 -36
  132. package/e2e/cypress/e2e/head.cy.ts +0 -89
  133. package/e2e/cypress/e2e/i18n.cy.ts +0 -79
  134. package/e2e/cypress/e2e/interactive.cy.ts +0 -137
  135. package/e2e/cypress/e2e/isr-nested-runtime.cy.ts +0 -102
  136. package/e2e/cypress/e2e/jit-css-custom-colors.cy.ts +0 -43
  137. package/e2e/cypress/e2e/middleware-chain.cy.ts +0 -89
  138. package/e2e/cypress/e2e/middleware-status.cy.ts +0 -30
  139. package/e2e/cypress/e2e/middleware.cy.ts +0 -45
  140. package/e2e/cypress/e2e/navigate.cy.ts +0 -39
  141. package/e2e/cypress/e2e/observability.cy.ts +0 -77
  142. package/e2e/cypress/e2e/per-route-error.cy.ts +0 -42
  143. package/e2e/cypress/e2e/per-route-render.cy.ts +0 -70
  144. package/e2e/cypress/e2e/preview-hardening.cy.ts +0 -88
  145. package/e2e/cypress/e2e/routes.cy.ts +0 -128
  146. package/e2e/cypress/e2e/seo-meta.cy.ts +0 -108
  147. package/e2e/cypress/e2e/server-middleware.cy.ts +0 -46
  148. package/e2e/cypress/e2e/session-rotation.cy.ts +0 -25
  149. package/e2e/cypress/e2e/session.cy.ts +0 -73
  150. package/e2e/cypress/e2e/ssr-render-error.cy.ts +0 -68
  151. package/e2e/cypress/e2e/synthetic-404.cy.ts +0 -45
  152. package/e2e/cypress/e2e/use-page-data.cy.ts +0 -122
  153. package/e2e/cypress/e2e/use-state.cy.ts +0 -138
  154. package/e2e/cypress/support/commands.ts +0 -120
  155. package/e2e/cypress/support/e2e.ts +0 -10
  156. package/e2e/cypress/tsconfig.json +0 -14
  157. package/e2e/kitchen-sink/app/components/ks-badge.ts +0 -8
  158. package/e2e/kitchen-sink/app/composables/useKsCounter.ts +0 -9
  159. package/e2e/kitchen-sink/app/error.ts +0 -18
  160. package/e2e/kitchen-sink/app/layouts/admin.ts +0 -13
  161. package/e2e/kitchen-sink/app/layouts/default.ts +0 -25
  162. package/e2e/kitchen-sink/app/layouts/group.ts +0 -9
  163. package/e2e/kitchen-sink/app/layouts/minimal.ts +0 -7
  164. package/e2e/kitchen-sink/app/loading.ts +0 -9
  165. package/e2e/kitchen-sink/app/middleware/auth.ts +0 -9
  166. package/e2e/kitchen-sink/app/middleware/custom-log.ts +0 -4
  167. package/e2e/kitchen-sink/app/middleware/group-auth.ts +0 -7
  168. package/e2e/kitchen-sink/app/middleware/logger.ts +0 -14
  169. package/e2e/kitchen-sink/app/pages/(auth)/login.ts +0 -13
  170. package/e2e/kitchen-sink/app/pages/(auth)/protected.ts +0 -16
  171. package/e2e/kitchen-sink/app/pages/404.ts +0 -9
  172. package/e2e/kitchen-sink/app/pages/about.ts +0 -17
  173. package/e2e/kitchen-sink/app/pages/admin/_layout.ts +0 -1
  174. package/e2e/kitchen-sink/app/pages/admin/dashboard.ts +0 -11
  175. package/e2e/kitchen-sink/app/pages/async-component-error-test.ts +0 -18
  176. package/e2e/kitchen-sink/app/pages/async-component-test.ts +0 -18
  177. package/e2e/kitchen-sink/app/pages/blog/[slug].ts +0 -59
  178. package/e2e/kitchen-sink/app/pages/blog/index.ts +0 -51
  179. package/e2e/kitchen-sink/app/pages/content-blog.ts +0 -37
  180. package/e2e/kitchen-sink/app/pages/content-doc.ts +0 -42
  181. package/e2e/kitchen-sink/app/pages/content-fallback.ts +0 -36
  182. package/e2e/kitchen-sink/app/pages/content-guides.ts +0 -35
  183. package/e2e/kitchen-sink/app/pages/content-index.ts +0 -39
  184. package/e2e/kitchen-sink/app/pages/content-search.ts +0 -36
  185. package/e2e/kitchen-sink/app/pages/cookie-test.ts +0 -22
  186. package/e2e/kitchen-sink/app/pages/counter.ts +0 -17
  187. package/e2e/kitchen-sink/app/pages/group-auth-blocked.ts +0 -9
  188. package/e2e/kitchen-sink/app/pages/group-meta-test/_layout.ts +0 -6
  189. package/e2e/kitchen-sink/app/pages/group-meta-test/custom-mw.ts +0 -14
  190. package/e2e/kitchen-sink/app/pages/group-meta-test/page.ts +0 -9
  191. package/e2e/kitchen-sink/app/pages/group-meta-test/protected.ts +0 -8
  192. package/e2e/kitchen-sink/app/pages/head.ts +0 -20
  193. package/e2e/kitchen-sink/app/pages/i18n-test.ts +0 -14
  194. package/e2e/kitchen-sink/app/pages/index.ts +0 -27
  195. package/e2e/kitchen-sink/app/pages/isr-test.ts +0 -17
  196. package/e2e/kitchen-sink/app/pages/items/[id].ts +0 -20
  197. package/e2e/kitchen-sink/app/pages/jit-css-custom-colors-test.ts +0 -14
  198. package/e2e/kitchen-sink/app/pages/loader-error-test.ts +0 -13
  199. package/e2e/kitchen-sink/app/pages/loader-props-test.ts +0 -19
  200. package/e2e/kitchen-sink/app/pages/loader-response-error-test.ts +0 -13
  201. package/e2e/kitchen-sink/app/pages/middleware-chain-test.ts +0 -12
  202. package/e2e/kitchen-sink/app/pages/middleware-status-test.ts +0 -9
  203. package/e2e/kitchen-sink/app/pages/navigate-test.ts +0 -16
  204. package/e2e/kitchen-sink/app/pages/observability-test.ts +0 -25
  205. package/e2e/kitchen-sink/app/pages/per-route-error-test.error.ts +0 -13
  206. package/e2e/kitchen-sink/app/pages/per-route-error-test.ts +0 -15
  207. package/e2e/kitchen-sink/app/pages/plugin-dsd-test.ts +0 -10
  208. package/e2e/kitchen-sink/app/pages/render-error-test.ts +0 -12
  209. package/e2e/kitchen-sink/app/pages/render-server-test.ts +0 -12
  210. package/e2e/kitchen-sink/app/pages/render-spa-test.ts +0 -12
  211. package/e2e/kitchen-sink/app/pages/route-info.ts +0 -14
  212. package/e2e/kitchen-sink/app/pages/seo-test.ts +0 -23
  213. package/e2e/kitchen-sink/app/pages/session-rotation-test.ts +0 -25
  214. package/e2e/kitchen-sink/app/pages/use-state-test.ts +0 -37
  215. package/e2e/kitchen-sink/app/plugins/01.setup.ts +0 -7
  216. package/e2e/kitchen-sink/app/plugins/02.ks-plugin-components.ts +0 -27
  217. package/e2e/kitchen-sink/cer-auto-imports.d.ts +0 -51
  218. package/e2e/kitchen-sink/cer-env.d.ts +0 -35
  219. package/e2e/kitchen-sink/cer-tsconfig.json +0 -30
  220. package/e2e/kitchen-sink/cer.config.ts +0 -43
  221. package/e2e/kitchen-sink/content/01.guides/01.index.md +0 -8
  222. package/e2e/kitchen-sink/content/01.guides/02.intro.md +0 -8
  223. package/e2e/kitchen-sink/content/01.guides/10.advanced.md +0 -8
  224. package/e2e/kitchen-sink/content/blog/2026-04-01-hello.md +0 -26
  225. package/e2e/kitchen-sink/content/blog/2026-04-02-draft.md +0 -10
  226. package/e2e/kitchen-sink/content/blog/index.md +0 -8
  227. package/e2e/kitchen-sink/content/blog/no-frontmatter.md +0 -7
  228. package/e2e/kitchen-sink/content/docs/getting-started.md +0 -48
  229. package/e2e/kitchen-sink/content/index.md +0 -16
  230. package/e2e/kitchen-sink/server/api/echo.ts +0 -12
  231. package/e2e/kitchen-sink/server/api/health.ts +0 -3
  232. package/e2e/kitchen-sink/server/api/posts/[slug].ts +0 -11
  233. package/e2e/kitchen-sink/server/api/posts/index.ts +0 -5
  234. package/e2e/kitchen-sink/server/api/session.ts +0 -23
  235. package/e2e/kitchen-sink/server/data/posts.ts +0 -21
  236. package/e2e/kitchen-sink/server/middleware/01-headers.ts +0 -6
  237. package/e2e/kitchen-sink/server/middleware/02-status-test.ts +0 -10
  238. package/e2e/kitchen-sink/tsconfig.json +0 -3
  239. package/e2e/scripts/clean.mjs +0 -14
  240. package/eslint.config.ts +0 -22
  241. package/src/__tests__/cli/adapters/cloudflare-worker.integration.test.ts +0 -132
  242. package/src/__tests__/cli/adapters/cloudflare.test.ts +0 -332
  243. package/src/__tests__/cli/adapters/netlify-bridge.integration.test.ts +0 -139
  244. package/src/__tests__/cli/adapters/netlify.test.ts +0 -286
  245. package/src/__tests__/cli/adapters/vercel-launcher.integration.test.ts +0 -129
  246. package/src/__tests__/cli/adapters/vercel.test.ts +0 -263
  247. package/src/__tests__/cli/preview-hardening.test.ts +0 -265
  248. package/src/__tests__/cli/preview-isr.test.ts +0 -320
  249. package/src/__tests__/index.test.ts +0 -21
  250. package/src/__tests__/plugin/app-template.test.ts +0 -166
  251. package/src/__tests__/plugin/build-ssg-render.test.ts +0 -155
  252. package/src/__tests__/plugin/build-ssg.test.ts +0 -598
  253. package/src/__tests__/plugin/build-ssr.test.ts +0 -192
  254. package/src/__tests__/plugin/cer-app-plugin.test.ts +0 -552
  255. package/src/__tests__/plugin/content/emitter.test.ts +0 -117
  256. package/src/__tests__/plugin/content/loader.test.ts +0 -154
  257. package/src/__tests__/plugin/content/parser.test.ts +0 -381
  258. package/src/__tests__/plugin/content/path-utils.test.ts +0 -69
  259. package/src/__tests__/plugin/content/search.test.ts +0 -119
  260. package/src/__tests__/plugin/dev-server.test.ts +0 -813
  261. package/src/__tests__/plugin/dts-generator.test.ts +0 -394
  262. package/src/__tests__/plugin/entry-server-template.test.ts +0 -385
  263. package/src/__tests__/plugin/generated-dir.test.ts +0 -144
  264. package/src/__tests__/plugin/html-post-process.test.ts +0 -146
  265. package/src/__tests__/plugin/path-utils.test.ts +0 -411
  266. package/src/__tests__/plugin/resolve-config.test.ts +0 -233
  267. package/src/__tests__/plugin/scanner.test.ts +0 -186
  268. package/src/__tests__/plugin/transforms/auto-import.test.ts +0 -510
  269. package/src/__tests__/plugin/transforms/head-inject.test.ts +0 -178
  270. package/src/__tests__/plugin/virtual/composables.test.ts +0 -57
  271. package/src/__tests__/plugin/virtual/content-components.test.ts +0 -66
  272. package/src/__tests__/plugin/virtual/error.test.ts +0 -71
  273. package/src/__tests__/plugin/virtual/layouts.test.ts +0 -70
  274. package/src/__tests__/plugin/virtual/loading.test.ts +0 -72
  275. package/src/__tests__/plugin/virtual/middleware.test.ts +0 -83
  276. package/src/__tests__/plugin/virtual/plugins.test.ts +0 -129
  277. package/src/__tests__/plugin/virtual/routes.test.ts +0 -884
  278. package/src/__tests__/plugin/virtual/server-api.test.ts +0 -164
  279. package/src/__tests__/plugin/virtual/server-middleware.test.ts +0 -102
  280. package/src/__tests__/runtime/app-template.test.ts +0 -208
  281. package/src/__tests__/runtime/define-middleware.test.ts +0 -64
  282. package/src/__tests__/runtime/define-server-middleware.test.ts +0 -54
  283. package/src/__tests__/runtime/entry-client-template.test.ts +0 -61
  284. package/src/__tests__/runtime/isr-handler.test.ts +0 -338
  285. package/src/__tests__/runtime/oauth/handler.test.ts +0 -358
  286. package/src/__tests__/runtime/oauth/providers.test.ts +0 -47
  287. package/src/__tests__/runtime/oauth-index.test.ts +0 -43
  288. package/src/__tests__/runtime/use-auth.test.ts +0 -169
  289. package/src/__tests__/runtime/use-content-search-composable.test.ts +0 -405
  290. package/src/__tests__/runtime/use-content-search.test.ts +0 -163
  291. package/src/__tests__/runtime/use-content.test.ts +0 -226
  292. package/src/__tests__/runtime/use-cookie.test.ts +0 -277
  293. package/src/__tests__/runtime/use-fetch-component.test.ts +0 -214
  294. package/src/__tests__/runtime/use-fetch.test.ts +0 -377
  295. package/src/__tests__/runtime/use-head.test.ts +0 -311
  296. package/src/__tests__/runtime/use-inject-client.test.ts +0 -67
  297. package/src/__tests__/runtime/use-inject.test.ts +0 -66
  298. package/src/__tests__/runtime/use-locale.test.ts +0 -152
  299. package/src/__tests__/runtime/use-navigate.test.ts +0 -121
  300. package/src/__tests__/runtime/use-page-data.test.ts +0 -298
  301. package/src/__tests__/runtime/use-route.test.ts +0 -156
  302. package/src/__tests__/runtime/use-runtime-config.test.ts +0 -182
  303. package/src/__tests__/runtime/use-seo-meta.test.ts +0 -109
  304. package/src/__tests__/runtime/use-session.test.ts +0 -320
  305. package/src/__tests__/runtime/use-state.test.ts +0 -340
  306. package/src/__tests__/types/config.test.ts +0 -18
  307. package/src/cli/adapters/cloudflare.ts +0 -335
  308. package/src/cli/adapters/netlify.ts +0 -326
  309. package/src/cli/adapters/vercel.ts +0 -311
  310. package/src/cli/commands/adapt.ts +0 -84
  311. package/src/cli/commands/build.ts +0 -165
  312. package/src/cli/commands/dev.ts +0 -125
  313. package/src/cli/commands/generate.ts +0 -91
  314. package/src/cli/commands/preview-isr.ts +0 -172
  315. package/src/cli/commands/preview.ts +0 -523
  316. package/src/cli/create/index.ts +0 -275
  317. package/src/cli/create/templates/shared/.gitignore.tpl +0 -25
  318. package/src/cli/create/templates/shared/app/layouts/default.ts.tpl +0 -15
  319. package/src/cli/create/templates/shared/app/pages/index.ts.tpl +0 -8
  320. package/src/cli/create/templates/shared/index.html.tpl +0 -12
  321. package/src/cli/create/templates/shared/tsconfig.json.tpl +0 -6
  322. package/src/cli/create/templates/spa/cer.config.ts.tpl +0 -6
  323. package/src/cli/create/templates/spa/package.json.tpl +0 -18
  324. package/src/cli/create/templates/ssg/cer.config.ts.tpl +0 -10
  325. package/src/cli/create/templates/ssg/package.json.tpl +0 -19
  326. package/src/cli/create/templates/ssr/cer.config.ts.tpl +0 -6
  327. package/src/cli/create/templates/ssr/package.json.tpl +0 -18
  328. package/src/cli/index.ts +0 -22
  329. package/src/index.ts +0 -20
  330. package/src/plugin/build-ssg.ts +0 -403
  331. package/src/plugin/build-ssr.ts +0 -134
  332. package/src/plugin/content/emitter.ts +0 -50
  333. package/src/plugin/content/index.ts +0 -233
  334. package/src/plugin/content/parser.ts +0 -259
  335. package/src/plugin/content/path-utils.ts +0 -55
  336. package/src/plugin/content/scanner.ts +0 -26
  337. package/src/plugin/content/search.ts +0 -28
  338. package/src/plugin/dev-server.ts +0 -379
  339. package/src/plugin/dts-generator.ts +0 -273
  340. package/src/plugin/generated-dir.ts +0 -121
  341. package/src/plugin/html-post-process.ts +0 -96
  342. package/src/plugin/index.ts +0 -584
  343. package/src/plugin/path-utils.ts +0 -186
  344. package/src/plugin/scanner.ts +0 -65
  345. package/src/plugin/transforms/auto-import.ts +0 -206
  346. package/src/plugin/transforms/head-inject.ts +0 -161
  347. package/src/plugin/virtual/composables.ts +0 -28
  348. package/src/plugin/virtual/content-components.ts +0 -83
  349. package/src/plugin/virtual/error.ts +0 -34
  350. package/src/plugin/virtual/layouts.ts +0 -41
  351. package/src/plugin/virtual/loading.ts +0 -32
  352. package/src/plugin/virtual/middleware.ts +0 -45
  353. package/src/plugin/virtual/plugins.ts +0 -46
  354. package/src/plugin/virtual/routes.ts +0 -514
  355. package/src/plugin/virtual/server-api.ts +0 -85
  356. package/src/plugin/virtual/server-middleware.ts +0 -44
  357. package/src/runtime/app-template.ts +0 -377
  358. package/src/runtime/composables/define-middleware.ts +0 -17
  359. package/src/runtime/composables/define-server-middleware.ts +0 -18
  360. package/src/runtime/composables/index.ts +0 -27
  361. package/src/runtime/composables/use-auth.ts +0 -125
  362. package/src/runtime/composables/use-content-search.ts +0 -205
  363. package/src/runtime/composables/use-content.ts +0 -146
  364. package/src/runtime/composables/use-cookie.ts +0 -135
  365. package/src/runtime/composables/use-fetch.ts +0 -438
  366. package/src/runtime/composables/use-head.ts +0 -234
  367. package/src/runtime/composables/use-inject.ts +0 -49
  368. package/src/runtime/composables/use-locale.ts +0 -109
  369. package/src/runtime/composables/use-navigate.ts +0 -58
  370. package/src/runtime/composables/use-page-data.ts +0 -93
  371. package/src/runtime/composables/use-route.ts +0 -71
  372. package/src/runtime/composables/use-runtime-config.ts +0 -123
  373. package/src/runtime/composables/use-seo-meta.ts +0 -80
  374. package/src/runtime/composables/use-session.ts +0 -186
  375. package/src/runtime/composables/use-state.ts +0 -92
  376. package/src/runtime/content/client.ts +0 -168
  377. package/src/runtime/entry-client-template.ts +0 -39
  378. package/src/runtime/entry-server-template.ts +0 -493
  379. package/src/runtime/isr-handler.ts +0 -184
  380. package/src/runtime/oauth/handler.ts +0 -407
  381. package/src/runtime/oauth/index.ts +0 -49
  382. package/src/runtime/oauth/providers.ts +0 -38
  383. package/src/types/api.ts +0 -40
  384. package/src/types/config.ts +0 -379
  385. package/src/types/content.ts +0 -66
  386. package/src/types/index.ts +0 -7
  387. package/src/types/middleware.ts +0 -63
  388. package/src/types/page.ts +0 -117
  389. package/src/types/plugin.ts +0 -34
  390. package/tsconfig.build.json +0 -10
  391. package/tsconfig.json +0 -19
  392. 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
- ```