@jasonshimmy/vite-plugin-cer-app 0.23.2 → 0.25.0

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