@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,379 +0,0 @@
1
- import type { RouterConfig } from '@jasonshimmy/custom-elements-runtime/router'
2
- import type { IncomingMessage } from 'node:http'
3
-
4
- // ─── Observability hook context types ─────────────────────────────────────────
5
-
6
- /**
7
- * Context passed to the `onError` hook.
8
- * `type` indicates which layer the error originated from so reporters can
9
- * tag or route errors appropriately.
10
- */
11
- export interface ErrorHookContext {
12
- /** The layer that threw the error. */
13
- type: 'loader' | 'render' | 'middleware'
14
- /** The request URL pathname (e.g. `/about`). */
15
- path: string
16
- /** The raw Node.js incoming request. */
17
- req: IncomingMessage
18
- }
19
-
20
- /**
21
- * Context passed to the `onRequest` hook.
22
- * Fires at the start of every SSR request, before the route is matched
23
- * or the loader runs.
24
- */
25
- export interface RequestHookContext {
26
- /** The request URL pathname (e.g. `/about`). */
27
- path: string
28
- /** HTTP method in upper-case (e.g. `'GET'`). */
29
- method: string
30
- /** The raw Node.js incoming request. */
31
- req: IncomingMessage
32
- }
33
-
34
- /**
35
- * Context passed to the `onResponse` hook.
36
- * Fires after the response has been sent (both success and error paths).
37
- * Use this for latency tracking and request logging.
38
- */
39
- export interface ResponseHookContext {
40
- /** The request URL pathname (e.g. `/about`). */
41
- path: string
42
- /** HTTP method in upper-case (e.g. `'GET'`). */
43
- method: string
44
- /** Final HTTP status code written to the response. */
45
- statusCode: number
46
- /** Request duration in milliseconds from the first byte received to `res.end()`. */
47
- duration: number
48
- /** The raw Node.js incoming request. */
49
- req: IncomingMessage
50
- }
51
-
52
- // ─── OAuth / Auth types ───────────────────────────────────────────────────────
53
-
54
- /** Token payload returned by an OAuth provider after a successful authorization code exchange. */
55
- export interface OAuthTokens {
56
- accessToken: string
57
- refreshToken?: string
58
- expiresIn?: number
59
- tokenType: string
60
- }
61
-
62
- /** Configuration for a single OAuth 2.0 provider (Google, GitHub, Discord, or a custom provider). */
63
- export interface OAuthProviderConfig {
64
- /** OAuth application client ID. */
65
- clientId: string
66
- /** OAuth application client secret. Never serialized into the client bundle. */
67
- clientSecret: string
68
- /** Override the default OAuth scopes for this provider. */
69
- scope?: string[]
70
- /** Override the provider's authorization endpoint URL (custom/self-hosted providers). */
71
- authorizationUrl?: string
72
- /** Override the provider's token exchange endpoint URL. */
73
- tokenUrl?: string
74
- /** Override the provider's user-info endpoint URL. */
75
- userInfoUrl?: string
76
- /**
77
- * Transform the raw provider profile into the object stored in the auth session.
78
- * Return any serializable object — it becomes `useAuth().user` on both server and client.
79
- * If omitted the framework normalises the profile to `{ provider, id, name, email, avatar }`.
80
- */
81
- mapUser?: (profile: Record<string, unknown>, tokens: OAuthTokens) => Record<string, unknown>
82
- }
83
-
84
- /** Authentication configuration. Enables OAuth login flows and auto-generates `/api/auth/*` routes. */
85
- export interface AuthConfig {
86
- /**
87
- * OAuth provider configurations keyed by provider name.
88
- * Built-in providers: `'google'`, `'github'`, `'discord'`.
89
- * Custom providers must supply `authorizationUrl`, `tokenUrl`, and `userInfoUrl`.
90
- */
91
- providers?: {
92
- google?: OAuthProviderConfig
93
- github?: OAuthProviderConfig
94
- discord?: OAuthProviderConfig
95
- [key: string]: OAuthProviderConfig | undefined
96
- }
97
- /** Path to redirect to after a successful login. Defaults to `'/'`. */
98
- redirectAfterLogin?: string
99
- /** Path to redirect to after logout. Defaults to `'/'`. */
100
- redirectAfterLogout?: string
101
- /**
102
- * Session cookie name used to store the authenticated user.
103
- * Defaults to `'auth'`. Must not collide with other `useSession()` names.
104
- */
105
- sessionKey?: string
106
- }
107
-
108
- /** Internationalisation routing configuration. When set, locale-aware URL routes are generated and `useLocale()` is enabled. */
109
- export interface I18nConfig {
110
- /**
111
- * All supported locale codes. e.g. `['en', 'fr', 'de']`.
112
- */
113
- locales: string[]
114
- /**
115
- * The default locale. Used as the fallback when no locale is detected in the URL.
116
- */
117
- defaultLocale: string
118
- /**
119
- * URL strategy for locale routing.
120
- * - `'prefix'` — every locale (including default) gets a URL prefix: `/en/about`, `/fr/about`
121
- * - `'prefix_except_default'` — default locale has no prefix (`/about`), others do (`/fr/about`). **Default.**
122
- * - `'no_prefix'` — locale is not reflected in the URL (read from cookie or header only)
123
- */
124
- strategy?: 'prefix' | 'prefix_except_default' | 'no_prefix'
125
- }
126
-
127
- /** Global Static Site Generation (SSG) configuration. Controls which routes are pre-rendered and at what concurrency. */
128
- export interface SsgConfig {
129
- /**
130
- * Routes to pre-render.
131
- * - `'auto'` (default) — pre-render every static route discovered in `app/pages/`.
132
- * - `string[]` — explicit list of paths (e.g. `['/about', '/contact']`).
133
- */
134
- routes?: 'auto' | string[]
135
- /** Maximum number of pages rendered in parallel. Defaults to `1`. Increase for faster SSG builds at the cost of higher memory usage. */
136
- concurrency?: number
137
- /** When `true`, unenumerated routes fall back to SSR at runtime instead of returning 404. */
138
- fallback?: boolean
139
- }
140
-
141
- /** JIT (Just-In-Time) CSS configuration for shadow-DOM style injection. */
142
- export interface JitCssConfig {
143
- /** Additional glob patterns for content files scanned by the JIT CSS engine. */
144
- content?: string[]
145
- /** Enable the extended color palette. Defaults to `false`. */
146
- extendedColors?: boolean
147
- /**
148
- * Project-specific color families registered in the JIT CSS engine at both
149
- * build time and runtime. Each key is a color family name (e.g. `brand`);
150
- * its value is a map of scale steps to CSS color values.
151
- *
152
- * Color family names must be a single lowercase word (no hyphens). Shades
153
- * can be any string key — numeric steps (`'500'`) or semantic names
154
- * (`'DEFAULT'`, `'on'`, `'container'`). When no shade is specified in a
155
- * utility class (e.g. `bg-brand`), the `DEFAULT` shade is used.
156
- *
157
- * @example
158
- * ```ts
159
- * customColors: {
160
- * brand: { '100': '#ede9fe', '500': '#7c3aed', '900': '#4c1d95' },
161
- * surface: { DEFAULT: 'var(--md-sys-color-surface)' },
162
- * }
163
- * ```
164
- */
165
- customColors?: Record<string, Record<string, string>>
166
- }
167
-
168
- /** Fine-grained control over which auto-import categories are injected into page/layout/component files. All categories are enabled by default. */
169
- export interface AutoImportsConfig {
170
- /** Auto-import components defined in `app/components/`. Defaults to `true`. */
171
- components?: boolean
172
- /** Auto-import framework composables (`useHead`, `useState`, etc.). Defaults to `true`. */
173
- composables?: boolean
174
- /** Auto-import template directives (`when`, `each`, `bind`). Defaults to `true`. */
175
- directives?: boolean
176
- /** Auto-import runtime primitives (`component`, `html`, `ref`, etc.). Defaults to `true`. */
177
- runtime?: boolean
178
- }
179
-
180
- /** Arbitrary public runtime values serialized into the virtual module at build time. Available on both server and client via `useRuntimeConfig().public`. */
181
- export interface RuntimePublicConfig {
182
- [key: string]: unknown
183
- }
184
-
185
- /** Server-only secrets resolved from `process.env` at startup. Never serialized into the client bundle. Available via `useRuntimeConfig().private` in loaders and server middleware only. */
186
- export interface RuntimePrivateConfig {
187
- /**
188
- * HMAC-SHA-256 signing secret(s) for `useSession()`.
189
- *
190
- * Pass a single string for simple usage, or an **array** to support secret
191
- * rotation without logging everyone out:
192
- * - The **first** element is the active key — new sessions are signed with it.
193
- * - Subsequent elements are accepted for **verification only** — old sessions
194
- * signed with them continue to work until they expire.
195
- *
196
- * ```ts
197
- * // cer.config.ts
198
- * runtimeConfig: {
199
- * private: {
200
- * sessionSecret: [
201
- * process.env.SESSION_SECRET_NEW!, // signs new sessions
202
- * process.env.SESSION_SECRET_OLD!, // still accepted during rotation
203
- * ],
204
- * },
205
- * }
206
- * ```
207
- */
208
- sessionSecret?: string | string[]
209
- [key: string]: string | string[] | undefined
210
- }
211
-
212
- /** Runtime configuration split into `public` (client + server) and `private` (server-only) sections. */
213
- export interface RuntimeConfig {
214
- /**
215
- * Public runtime config — available on both server and client via
216
- * `useRuntimeConfig().public`. Values are serialized into the virtual module
217
- * at build time, so only use static/env-var values here.
218
- *
219
- * @example
220
- * runtimeConfig: {
221
- * public: {
222
- * apiBase: process.env.VITE_API_BASE ?? 'https://api.example.com',
223
- * }
224
- * }
225
- */
226
- public?: RuntimePublicConfig
227
- /**
228
- * Server-only secrets — never serialized into the client bundle.
229
- * Declare keys with empty-string defaults here; at server startup each key
230
- * is resolved from `process.env[KEY]` (case-insensitive, ALL_CAPS preferred).
231
- *
232
- * @example
233
- * runtimeConfig: {
234
- * private: { dbUrl: '', secretKey: '' },
235
- * }
236
- */
237
- private?: RuntimePrivateConfig
238
- }
239
-
240
- /** Root configuration object for `cer.config.ts`. Pass to `defineConfig()` for type-safe configuration. */
241
- export interface CerAppConfig {
242
- mode?: 'spa' | 'ssr' | 'ssg'
243
- srcDir?: string // defaults to 'app'
244
- /**
245
- * The canonical origin of the site (e.g. `'https://example.com'`).
246
- * No trailing slash. When set, the SSG build automatically:
247
- * - Injects `<link rel="canonical" href="${siteUrl}${path}">` into every page.
248
- * - Writes a `robots.txt` to `dist/` (skipped when a `public/robots.txt` already exists).
249
- * Also available at runtime via `useRuntimeConfig().public.siteUrl`.
250
- */
251
- siteUrl?: string
252
- /** File-based content layer configuration. Reads from `content/` at the project root by default. */
253
- content?: import('./content.js').CerContentConfig
254
- /**
255
- * Internationalisation (i18n) routing configuration.
256
- * When set, the framework generates locale-aware URL routes and enables `useLocale()`.
257
- *
258
- * @example
259
- * ```ts
260
- * i18n: {
261
- * locales: ['en', 'fr', 'de'],
262
- * defaultLocale: 'en',
263
- * strategy: 'prefix_except_default',
264
- * }
265
- * ```
266
- */
267
- i18n?: I18nConfig
268
- ssg?: SsgConfig
269
- router?: Pick<RouterConfig, 'base' | 'scrollToFragment'>
270
- jitCss?: JitCssConfig
271
- autoImports?: AutoImportsConfig
272
- port?: number
273
- /**
274
- * Runtime configuration accessible via `useRuntimeConfig()`.
275
- * Only `public` values are exposed to the client; keep secrets
276
- * out of `public`.
277
- */
278
- runtimeConfig?: RuntimeConfig
279
- /**
280
- * Deployment platform adapter.
281
- * When set, `cer-app build` automatically runs the adapter after the build
282
- * completes, producing the platform-specific output alongside `dist/`.
283
- *
284
- * Built-in string values:
285
- * - `'vercel'` — Vercel Build Output API v3 (`.vercel/output/`)
286
- * - `'netlify'` — Netlify Functions v2 + `netlify.toml`
287
- * - `'cloudflare'` — Cloudflare Pages `_worker.js` + `wrangler.toml`
288
- *
289
- * Pass a function for a **custom adapter** (Railway, Fly.io, bare Node, Docker, …):
290
- * ```ts
291
- * adapter: async (root) => {
292
- * // root is the absolute project root directory
293
- * // dist/client/ and dist/server/ are already present after the build
294
- * await myPlatformDeploy(root)
295
- * }
296
- * ```
297
- *
298
- * You can also run the built-in adapters independently with `cer-app adapt --platform <name>`.
299
- */
300
- adapter?: 'vercel' | 'netlify' | 'cloudflare' | ((root: string) => Promise<void>)
301
- /**
302
- * Authentication configuration.
303
- * Enables OAuth login flows via `useAuth()` and auto-generates
304
- * `/api/auth/:provider`, `/api/auth/callback/:provider`, and `/api/auth/logout` routes.
305
- *
306
- * @example
307
- * ```ts
308
- * import { defineConfig, defineOAuthProvider } from '@jasonshimmy/vite-plugin-cer-app'
309
- *
310
- * export default defineConfig({
311
- * auth: {
312
- * providers: {
313
- * github: defineOAuthProvider({
314
- * clientId: process.env.GITHUB_CLIENT_ID!,
315
- * clientSecret: process.env.GITHUB_CLIENT_SECRET!,
316
- * }),
317
- * },
318
- * },
319
- * })
320
- * ```
321
- */
322
- auth?: AuthConfig
323
- /**
324
- * Called when an error is caught by the framework's SSR error boundaries
325
- * (loader throws, render crash, or server middleware throws). Use this to
326
- * forward errors to Sentry, Datadog, or any other error-reporting service.
327
- *
328
- * Errors in this hook are silently swallowed so they cannot crash the request handler.
329
- *
330
- * @example
331
- * ```ts
332
- * import * as Sentry from '@sentry/node'
333
- * export default defineConfig({
334
- * onError(err, ctx) {
335
- * Sentry.captureException(err, { tags: { type: ctx.type, path: ctx.path } })
336
- * },
337
- * })
338
- * ```
339
- */
340
- onError?: (err: unknown, ctx: ErrorHookContext) => void | Promise<void>
341
- /**
342
- * Called at the start of every SSR request, before route matching and the loader.
343
- * Use this for request logging or to initialise per-request APM transactions.
344
- *
345
- * Errors in this hook are silently swallowed.
346
- */
347
- onRequest?: (ctx: RequestHookContext) => void | Promise<void>
348
- /**
349
- * Called after every SSR response is sent (both success and error paths).
350
- * `ctx.duration` contains the elapsed milliseconds from first byte to `res.end()`.
351
- * Use this for latency tracking and access logging.
352
- *
353
- * Errors in this hook are silently swallowed.
354
- */
355
- onResponse?: (ctx: ResponseHookContext) => void | Promise<void>
356
- }
357
-
358
- /**
359
- * Define the framework configuration with full TypeScript intellisense.
360
- * This is a pass-through helper — it returns `config` unchanged and exists
361
- * solely to provide type checking and IDE autocompletion in `cer.config.ts`.
362
- *
363
- * @example
364
- * ```ts
365
- * // cer.config.ts
366
- * import { defineConfig } from '@jasonshimmy/vite-plugin-cer-app'
367
- *
368
- * export default defineConfig({
369
- * mode: 'ssr',
370
- * runtimeConfig: {
371
- * public: { apiBase: 'https://api.example.com' },
372
- * private: { dbUrl: '' },
373
- * },
374
- * })
375
- * ```
376
- */
377
- export function defineConfig(config: CerAppConfig): CerAppConfig {
378
- return config
379
- }
@@ -1,66 +0,0 @@
1
- /** Heading extracted from Markdown during parsing. The `id` is slugified from the heading text and added as an HTML `id` attribute. */
2
- export interface ContentHeading {
3
- depth: 1 | 2 | 3 | 4 | 5 | 6
4
- /** Slugified heading text — matches the `id` attribute in the rendered body HTML. */
5
- id: string
6
- /** Plain text of the heading. */
7
- text: string
8
- }
9
-
10
- /**
11
- * Lean per-document metadata — returned by `.find()` and `.count()`.
12
- * Kept small deliberately: no `body`, no `toc`, no `excerpt`.
13
- * Use `description` for listing previews; set it in frontmatter.
14
- */
15
- export interface ContentMeta {
16
- /** URL path (e.g. `"/blog/hello"`). */
17
- _path: string
18
- /** Source file type. */
19
- _type: 'markdown' | 'json'
20
- title?: string
21
- /** Use for listing previews — included in search index. */
22
- description?: string
23
- date?: string
24
- draft?: boolean
25
- /** Any other frontmatter key. */
26
- [key: string]: unknown
27
- }
28
-
29
- /**
30
- * Full document — returned by `.first()`.
31
- * Superset of `ContentMeta`; includes `body`, `toc`, `_file`, and optional `excerpt`.
32
- */
33
- export interface ContentItem extends ContentMeta {
34
- /** Relative path from `content/` at the project root (e.g. `"blog/hello.md"`). */
35
- _file: string
36
- /** Rendered HTML (Markdown) or the raw file contents (JSON files). */
37
- body: string
38
- /** Extracted headings. Empty array for JSON files. */
39
- toc: ContentHeading[]
40
- /** HTML content before `<!-- more -->`. Absent when the marker is not present. */
41
- excerpt?: string
42
- }
43
-
44
- /**
45
- * Search result item returned by `useContentSearch()`.
46
- * Contains only the MiniSearch stored fields: `_path`, `title`, `description`.
47
- */
48
- export interface ContentSearchResult {
49
- _path: string
50
- title: string
51
- description?: string
52
- }
53
-
54
- /** Content layer configuration. Controls the directory and draft behaviour. */
55
- export interface CerContentConfig {
56
- /**
57
- * Content directory relative to the project root. Defaults to `'content'`,
58
- * which resolves to `{root}/content/` — at the same level as `app/`, `server/`, and `public/`.
59
- */
60
- dir?: string
61
- /**
62
- * When `true`, draft items (`draft: true` in frontmatter) are included in
63
- * production builds. Defaults to `false`.
64
- */
65
- drafts?: boolean
66
- }
@@ -1,7 +0,0 @@
1
- export type { CerAppConfig, SsgConfig, JitCssConfig, AutoImportsConfig, RuntimeConfig, RuntimePublicConfig, RuntimePrivateConfig, I18nConfig, ErrorHookContext, RequestHookContext, ResponseHookContext } from './config.js'
2
- export { defineConfig } from './config.js'
3
- export type { HydrateStrategy, SsgPathsContext, PageSsgConfig, PageMeta, PageLoaderContext, PageLoader } from './page.js'
4
- export type { ApiRequest, ApiResponse, ApiHandler, ApiContext } from './api.js'
5
- export type { AppContext, AppPlugin } from './plugin.js'
6
- export type { MiddlewareFn, GuardResult, ServerMiddleware } from './middleware.js'
7
- export type { LocaleComposable } from '../runtime/composables/use-locale.js'
@@ -1,63 +0,0 @@
1
- import type { RouteState } from '@jasonshimmy/custom-elements-runtime/router'
2
- import type { IncomingMessage, ServerResponse } from 'node:http'
3
-
4
- /**
5
- * Return value from a route middleware function:
6
- * - `true` — allow navigation
7
- * - `false` — block navigation
8
- * - `string` — redirect to that path
9
- */
10
- export type GuardResult = boolean | string | Promise<boolean | string>
11
-
12
- /**
13
- * Route middleware function.
14
- *
15
- * Return `true`/`false`/a redirect path to guard navigation, **or** call
16
- * `next()` to explicitly pass control to the next middleware in the chain
17
- * (useful for wrapper middleware that needs to run code before AND after
18
- * downstream middleware completes).
19
- *
20
- * @example — guard
21
- * ```ts
22
- * export default defineMiddleware((to, from) => {
23
- * if (!isLoggedIn()) return '/login'
24
- * return true
25
- * })
26
- * ```
27
- *
28
- * @example — wrapper with next()
29
- * ```ts
30
- * export default defineMiddleware(async (to, from, next) => {
31
- * console.time('nav')
32
- * await next()
33
- * console.timeEnd('nav')
34
- * })
35
- * ```
36
- */
37
- export type MiddlewareFn = (
38
- to: RouteState,
39
- from: RouteState | null,
40
- next: () => Promise<void>,
41
- ) => GuardResult | void
42
-
43
- /**
44
- * Server middleware function. Receives the raw Node.js `req`/`res` pair and a `next`
45
- * callback. Call `next()` to pass control to the next middleware in the chain,
46
- * or call `next(err)` to signal an error (sets the response status from `err.status`,
47
- * defaulting to 500).
48
- *
49
- * Defined with `defineServerMiddleware()` and placed in `app/middleware/`.
50
- *
51
- * @example
52
- * ```ts
53
- * export default defineServerMiddleware((req, res, next) => {
54
- * res.setHeader('X-Request-Id', crypto.randomUUID())
55
- * next()
56
- * })
57
- * ```
58
- */
59
- export type ServerMiddleware = (
60
- req: IncomingMessage,
61
- res: ServerResponse,
62
- next: (err?: unknown) => void,
63
- ) => void | Promise<void>
package/src/types/page.ts DELETED
@@ -1,117 +0,0 @@
1
- import type { IncomingMessage } from 'node:http'
2
-
3
- /**
4
- * Controls when the client-side JS activates a pre-rendered page component.
5
- *
6
- * - `'load'` — activate immediately on page load (default).
7
- * - `'idle'` — defer until `requestIdleCallback` fires (browser idle time).
8
- * - `'visible'` — defer until `cer-layout-view` enters the viewport (IntersectionObserver).
9
- * - `'none'` — never activate; SSR HTML is served as static markup with no JS.
10
- */
11
- export type HydrateStrategy = 'load' | 'idle' | 'visible' | 'none'
12
-
13
- /** Context object passed to a page's `ssg.paths()` function. Contains resolved route params for one path variant. */
14
- export interface SsgPathsContext {
15
- params: Record<string, string>
16
- }
17
-
18
- /** Per-page SSG / ISR configuration. Export as `export const meta = { ssg: { ... } }` from any page file. */
19
- export interface PageSsgConfig {
20
- /**
21
- * Factory that returns the set of param combinations to pre-render for dynamic routes.
22
- * Required for dynamic routes (e.g. `/posts/[slug]`) — without it the route is skipped
23
- * during the static build.
24
- *
25
- * @example
26
- * ```ts
27
- * export const meta = {
28
- * ssg: {
29
- * paths: async () => {
30
- * const slugs = await fetchAllSlugs()
31
- * return slugs.map(slug => ({ params: { slug } }))
32
- * },
33
- * },
34
- * }
35
- * ```
36
- */
37
- paths?: () => Promise<SsgPathsContext[]> | SsgPathsContext[]
38
- /**
39
- * Seconds before a cached SSR response is stale and should be re-rendered.
40
- * Enables Incremental Static Regeneration (ISR) in the preview server and
41
- * any production adapter that reads `meta.ssg.revalidate`.
42
- *
43
- * @example export const meta = { ssg: { revalidate: 60 } }
44
- */
45
- revalidate?: number
46
- }
47
-
48
- /**
49
- * Per-page metadata. Export as `export const meta = { ... }` from any page file.
50
- * Values are read at build time and embedded into the route manifest.
51
- */
52
- export interface PageMeta {
53
- /** Layout component to wrap this page. Must match a file in `app/layouts/`. Defaults to `'default'`. */
54
- layout?: string
55
- /** Named middleware files from `app/middleware/` to run before this route activates. */
56
- middleware?: string[]
57
- hydrate?: HydrateStrategy
58
- ssg?: PageSsgConfig
59
- /**
60
- * CSS transition name applied to the page during route changes.
61
- * Set to `true` to use the default 'page' transition name.
62
- * The framework adds/removes `[data-transition="<name>"]` on the root element
63
- * so you can target it with CSS animations.
64
- *
65
- * @example export const meta = { transition: 'fade' }
66
- */
67
- transition?: string | boolean
68
- /**
69
- * Per-route rendering strategy. Overrides the global `mode` for this route.
70
- *
71
- * - `'server'` — always render server-side, never pre-render. In SSG mode
72
- * the route is skipped during the static build.
73
- * - `'static'` — always serve pre-rendered static HTML. In the SSR preview
74
- * server the pre-rendered file is served from disk; falls back to SSR if
75
- * not found.
76
- * - `'spa'` — client-only. In SSR mode the server returns the SPA shell
77
- * (index.html) without rendering. In SSG mode the route is skipped.
78
- *
79
- * @example export const meta = { render: 'server' }
80
- */
81
- render?: 'static' | 'server' | 'spa'
82
- }
83
-
84
- /**
85
- * Context object passed to a page's `loader` function.
86
- * Available on the server only — the loader runs before the page component renders.
87
- */
88
- export interface PageLoaderContext<P extends Record<string, string> = Record<string, string>> {
89
- params: P
90
- query: Record<string, string>
91
- /** Present during SSR/SSG server render. Absent (`undefined`) during client-side navigation. */
92
- req?: IncomingMessage
93
- }
94
-
95
- /**
96
- * Server-side data loader for a page. Export as `export const loader` (or `export async function loader`)
97
- * from any page file. The returned object is:
98
- * - Made available via `usePageData()` inside the page component.
99
- * - Primitive values are also forwarded as element attributes so `useProps()` works.
100
- * - Serialized into `window.__CER_DATA__` for client-side hydration.
101
- *
102
- * Throwing an error (with an optional `.status` property) renders the page's error component
103
- * and sets the HTTP response status code.
104
- *
105
- * @example
106
- * ```ts
107
- * export const loader: PageLoader<{ slug: string }, { post: Post }> = async ({ params }) => {
108
- * const post = await fetchPost(params.slug)
109
- * if (!post) throw Object.assign(new Error('Not found'), { status: 404 })
110
- * return { post }
111
- * }
112
- * ```
113
- */
114
- export type PageLoader<
115
- P extends Record<string, string> = Record<string, string>,
116
- D = Record<string, unknown>,
117
- > = (ctx: PageLoaderContext<P>) => Promise<D> | D
@@ -1,34 +0,0 @@
1
- import type { Router } from '@jasonshimmy/custom-elements-runtime/router'
2
- import type { CerAppConfig } from './config.js'
3
-
4
- /**
5
- * Application context passed to each plugin's `setup()` function.
6
- * Use it to provide values to the component tree, access the router,
7
- * or read the resolved config.
8
- */
9
- export interface AppContext {
10
- provide(key: PropertyKey, value: unknown): void
11
- router: Router
12
- config: CerAppConfig
13
- }
14
-
15
- /**
16
- * A framework plugin. Plugins run once at app startup (both server and client) before
17
- * the first route renders. Use them for global setup: registering provide/inject values,
18
- * subscribing to router events, or initialising third-party libraries.
19
- *
20
- * @example
21
- * ```ts
22
- * // app/plugins/analytics.ts
23
- * export default {
24
- * name: 'analytics',
25
- * async setup({ router }) {
26
- * router.subscribe(({ path }) => trackPageView(path))
27
- * },
28
- * } satisfies AppPlugin
29
- * ```
30
- */
31
- export interface AppPlugin {
32
- name: string
33
- setup(app: AppContext): void | Promise<void>
34
- }
@@ -1,10 +0,0 @@
1
- {
2
- "extends": "./tsconfig.json",
3
- "compilerOptions": {
4
- "declaration": true,
5
- "declarationMap": true,
6
- "outDir": "dist",
7
- "rootDir": "src"
8
- },
9
- "exclude": ["node_modules", "dist", "src/cli/create/templates", "src/__tests__"]
10
- }