@jasonshimmy/vite-plugin-cer-app 0.23.1 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (397) hide show
  1. package/dist/cli/checks/lighthouse.d.ts +26 -0
  2. package/dist/cli/checks/lighthouse.d.ts.map +1 -0
  3. package/dist/cli/checks/lighthouse.js +121 -0
  4. package/dist/cli/checks/lighthouse.js.map +1 -0
  5. package/dist/cli/checks/links.d.ts +12 -0
  6. package/dist/cli/checks/links.d.ts.map +1 -0
  7. package/dist/cli/checks/links.js +89 -0
  8. package/dist/cli/checks/links.js.map +1 -0
  9. package/dist/cli/checks/performance.d.ts +17 -0
  10. package/dist/cli/checks/performance.d.ts.map +1 -0
  11. package/dist/cli/checks/performance.js +61 -0
  12. package/dist/cli/checks/performance.js.map +1 -0
  13. package/dist/cli/commands/check.d.ts +3 -0
  14. package/dist/cli/commands/check.d.ts.map +1 -0
  15. package/dist/cli/commands/check.js +85 -0
  16. package/dist/cli/commands/check.js.map +1 -0
  17. package/dist/cli/commands/preview.d.ts.map +1 -1
  18. package/dist/cli/commands/preview.js +37 -4
  19. package/dist/cli/commands/preview.js.map +1 -1
  20. package/dist/cli/create/index.d.ts +11 -1
  21. package/dist/cli/create/index.d.ts.map +1 -1
  22. package/dist/cli/create/index.js +135 -65
  23. package/dist/cli/create/index.js.map +1 -1
  24. package/dist/cli/create/templates/spa/package.json.tpl +5 -3
  25. package/dist/cli/create/templates/ssg/cer.config.ts.tpl +2 -0
  26. package/dist/cli/create/templates/ssg/package.json.tpl +5 -3
  27. package/dist/cli/create/templates/ssr/package.json.tpl +5 -3
  28. package/dist/cli/index.js +2 -0
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/index.d.ts +3 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/plugin/build-ssg.d.ts +22 -4
  33. package/dist/plugin/build-ssg.d.ts.map +1 -1
  34. package/dist/plugin/build-ssg.js +273 -13
  35. package/dist/plugin/build-ssg.js.map +1 -1
  36. package/dist/plugin/content/parser.d.ts.map +1 -1
  37. package/dist/plugin/content/parser.js +54 -10
  38. package/dist/plugin/content/parser.js.map +1 -1
  39. package/dist/plugin/dev-server.d.ts +6 -1
  40. package/dist/plugin/dev-server.d.ts.map +1 -1
  41. package/dist/plugin/dev-server.js.map +1 -1
  42. package/dist/plugin/dts-generator.d.ts.map +1 -1
  43. package/dist/plugin/dts-generator.js +50 -8
  44. package/dist/plugin/dts-generator.js.map +1 -1
  45. package/dist/plugin/generated-dir.d.ts +2 -0
  46. package/dist/plugin/generated-dir.d.ts.map +1 -1
  47. package/dist/plugin/generated-dir.js +17 -6
  48. package/dist/plugin/generated-dir.js.map +1 -1
  49. package/dist/plugin/html-post-process.d.ts +35 -0
  50. package/dist/plugin/html-post-process.d.ts.map +1 -0
  51. package/dist/plugin/html-post-process.js +112 -0
  52. package/dist/plugin/html-post-process.js.map +1 -0
  53. package/dist/plugin/index.d.ts +9 -0
  54. package/dist/plugin/index.d.ts.map +1 -1
  55. package/dist/plugin/index.js +89 -14
  56. package/dist/plugin/index.js.map +1 -1
  57. package/dist/plugin/transforms/auto-import.d.ts.map +1 -1
  58. package/dist/plugin/transforms/auto-import.js +7 -0
  59. package/dist/plugin/transforms/auto-import.js.map +1 -1
  60. package/dist/plugin/transforms/prune-runtime-css.d.ts +8 -0
  61. package/dist/plugin/transforms/prune-runtime-css.d.ts.map +1 -0
  62. package/dist/plugin/transforms/prune-runtime-css.js +40 -0
  63. package/dist/plugin/transforms/prune-runtime-css.js.map +1 -0
  64. package/dist/runtime/app-template.d.ts +1 -4
  65. package/dist/runtime/app-template.d.ts.map +1 -1
  66. package/dist/runtime/app-template.js +211 -40
  67. package/dist/runtime/app-template.js.map +1 -1
  68. package/dist/runtime/composables/index.d.ts +4 -0
  69. package/dist/runtime/composables/index.d.ts.map +1 -1
  70. package/dist/runtime/composables/index.js +2 -0
  71. package/dist/runtime/composables/index.js.map +1 -1
  72. package/dist/runtime/composables/use-active-headings.d.ts +24 -0
  73. package/dist/runtime/composables/use-active-headings.d.ts.map +1 -0
  74. package/dist/runtime/composables/use-active-headings.js +112 -0
  75. package/dist/runtime/composables/use-active-headings.js.map +1 -0
  76. package/dist/runtime/composables/use-content-page.d.ts +45 -0
  77. package/dist/runtime/composables/use-content-page.d.ts.map +1 -0
  78. package/dist/runtime/composables/use-content-page.js +179 -0
  79. package/dist/runtime/composables/use-content-page.js.map +1 -0
  80. package/dist/runtime/composables/use-content-search.d.ts.map +1 -1
  81. package/dist/runtime/composables/use-content-search.js +1 -5
  82. package/dist/runtime/composables/use-content-search.js.map +1 -1
  83. package/dist/runtime/composables/use-fetch.d.ts +2 -1
  84. package/dist/runtime/composables/use-fetch.d.ts.map +1 -1
  85. package/dist/runtime/composables/use-fetch.js +112 -43
  86. package/dist/runtime/composables/use-fetch.js.map +1 -1
  87. package/dist/runtime/composables/use-head.d.ts.map +1 -1
  88. package/dist/runtime/composables/use-head.js +30 -6
  89. package/dist/runtime/composables/use-head.js.map +1 -1
  90. package/dist/runtime/composables/use-route.d.ts.map +1 -1
  91. package/dist/runtime/composables/use-route.js +39 -11
  92. package/dist/runtime/composables/use-route.js.map +1 -1
  93. package/dist/runtime/content/client.js +2 -2
  94. package/dist/runtime/content/client.js.map +1 -1
  95. package/dist/runtime/entry-server-template.d.ts +16 -1
  96. package/dist/runtime/entry-server-template.d.ts.map +1 -1
  97. package/dist/runtime/entry-server-template.js +120 -13
  98. package/dist/runtime/entry-server-template.js.map +1 -1
  99. package/dist/types/config.d.ts +53 -4
  100. package/dist/types/config.d.ts.map +1 -1
  101. package/dist/types/config.js.map +1 -1
  102. package/dist/types/middleware.d.ts +2 -2
  103. package/dist/types/middleware.d.ts.map +1 -1
  104. package/package.json +22 -19
  105. package/.github/copilot-instructions.md +0 -169
  106. package/.github/workflows/publish.yml +0 -257
  107. package/.nvmrc +0 -1
  108. package/CHANGELOG.md +0 -232
  109. package/CLAUDE.md +0 -113
  110. package/commits.txt +0 -1
  111. package/cypress.config.ts +0 -16
  112. package/docs/authentication.md +0 -285
  113. package/docs/cli.md +0 -324
  114. package/docs/components.md +0 -237
  115. package/docs/composables.md +0 -907
  116. package/docs/configuration.md +0 -667
  117. package/docs/content.md +0 -570
  118. package/docs/data-loading.md +0 -336
  119. package/docs/getting-started.md +0 -237
  120. package/docs/head-management.md +0 -212
  121. package/docs/i18n.md +0 -159
  122. package/docs/layouts.md +0 -224
  123. package/docs/middleware.md +0 -234
  124. package/docs/plugins.md +0 -170
  125. package/docs/rendering-modes.md +0 -377
  126. package/docs/routing.md +0 -485
  127. package/docs/server-api.md +0 -253
  128. package/docs/testing.md +0 -455
  129. package/docs/use-fetch.md +0 -183
  130. package/e2e/cypress/e2e/api.cy.ts +0 -123
  131. package/e2e/cypress/e2e/async-component.cy.ts +0 -27
  132. package/e2e/cypress/e2e/component-splitting.cy.ts +0 -50
  133. package/e2e/cypress/e2e/content.cy.ts +0 -425
  134. package/e2e/cypress/e2e/cookie.cy.ts +0 -85
  135. package/e2e/cypress/e2e/data.cy.ts +0 -158
  136. package/e2e/cypress/e2e/error-boundary.cy.ts +0 -88
  137. package/e2e/cypress/e2e/fouc.cy.ts +0 -254
  138. package/e2e/cypress/e2e/group-meta.cy.ts +0 -36
  139. package/e2e/cypress/e2e/head.cy.ts +0 -89
  140. package/e2e/cypress/e2e/i18n.cy.ts +0 -79
  141. package/e2e/cypress/e2e/interactive.cy.ts +0 -137
  142. package/e2e/cypress/e2e/isr-nested-runtime.cy.ts +0 -102
  143. package/e2e/cypress/e2e/jit-css-custom-colors.cy.ts +0 -43
  144. package/e2e/cypress/e2e/middleware-chain.cy.ts +0 -89
  145. package/e2e/cypress/e2e/middleware-status.cy.ts +0 -30
  146. package/e2e/cypress/e2e/middleware.cy.ts +0 -45
  147. package/e2e/cypress/e2e/navigate.cy.ts +0 -39
  148. package/e2e/cypress/e2e/observability.cy.ts +0 -77
  149. package/e2e/cypress/e2e/per-route-error.cy.ts +0 -42
  150. package/e2e/cypress/e2e/per-route-render.cy.ts +0 -70
  151. package/e2e/cypress/e2e/preview-hardening.cy.ts +0 -88
  152. package/e2e/cypress/e2e/routes.cy.ts +0 -128
  153. package/e2e/cypress/e2e/seo-meta.cy.ts +0 -108
  154. package/e2e/cypress/e2e/server-middleware.cy.ts +0 -46
  155. package/e2e/cypress/e2e/session-rotation.cy.ts +0 -25
  156. package/e2e/cypress/e2e/session.cy.ts +0 -73
  157. package/e2e/cypress/e2e/ssr-render-error.cy.ts +0 -68
  158. package/e2e/cypress/e2e/synthetic-404.cy.ts +0 -45
  159. package/e2e/cypress/e2e/use-page-data.cy.ts +0 -122
  160. package/e2e/cypress/e2e/use-state.cy.ts +0 -138
  161. package/e2e/cypress/support/commands.ts +0 -120
  162. package/e2e/cypress/support/e2e.ts +0 -10
  163. package/e2e/cypress/tsconfig.json +0 -14
  164. package/e2e/kitchen-sink/app/components/ks-badge.ts +0 -8
  165. package/e2e/kitchen-sink/app/composables/useKsCounter.ts +0 -9
  166. package/e2e/kitchen-sink/app/error.ts +0 -18
  167. package/e2e/kitchen-sink/app/layouts/admin.ts +0 -13
  168. package/e2e/kitchen-sink/app/layouts/default.ts +0 -25
  169. package/e2e/kitchen-sink/app/layouts/group.ts +0 -9
  170. package/e2e/kitchen-sink/app/layouts/minimal.ts +0 -7
  171. package/e2e/kitchen-sink/app/loading.ts +0 -9
  172. package/e2e/kitchen-sink/app/middleware/auth.ts +0 -9
  173. package/e2e/kitchen-sink/app/middleware/custom-log.ts +0 -4
  174. package/e2e/kitchen-sink/app/middleware/group-auth.ts +0 -7
  175. package/e2e/kitchen-sink/app/middleware/logger.ts +0 -14
  176. package/e2e/kitchen-sink/app/pages/(auth)/login.ts +0 -13
  177. package/e2e/kitchen-sink/app/pages/(auth)/protected.ts +0 -16
  178. package/e2e/kitchen-sink/app/pages/404.ts +0 -9
  179. package/e2e/kitchen-sink/app/pages/about.ts +0 -17
  180. package/e2e/kitchen-sink/app/pages/admin/_layout.ts +0 -1
  181. package/e2e/kitchen-sink/app/pages/admin/dashboard.ts +0 -11
  182. package/e2e/kitchen-sink/app/pages/async-component-error-test.ts +0 -18
  183. package/e2e/kitchen-sink/app/pages/async-component-test.ts +0 -18
  184. package/e2e/kitchen-sink/app/pages/blog/[slug].ts +0 -59
  185. package/e2e/kitchen-sink/app/pages/blog/index.ts +0 -51
  186. package/e2e/kitchen-sink/app/pages/content-blog.ts +0 -37
  187. package/e2e/kitchen-sink/app/pages/content-doc.ts +0 -42
  188. package/e2e/kitchen-sink/app/pages/content-fallback.ts +0 -36
  189. package/e2e/kitchen-sink/app/pages/content-guides.ts +0 -35
  190. package/e2e/kitchen-sink/app/pages/content-index.ts +0 -39
  191. package/e2e/kitchen-sink/app/pages/content-search.ts +0 -36
  192. package/e2e/kitchen-sink/app/pages/cookie-test.ts +0 -22
  193. package/e2e/kitchen-sink/app/pages/counter.ts +0 -17
  194. package/e2e/kitchen-sink/app/pages/group-auth-blocked.ts +0 -9
  195. package/e2e/kitchen-sink/app/pages/group-meta-test/_layout.ts +0 -6
  196. package/e2e/kitchen-sink/app/pages/group-meta-test/custom-mw.ts +0 -14
  197. package/e2e/kitchen-sink/app/pages/group-meta-test/page.ts +0 -9
  198. package/e2e/kitchen-sink/app/pages/group-meta-test/protected.ts +0 -8
  199. package/e2e/kitchen-sink/app/pages/head.ts +0 -20
  200. package/e2e/kitchen-sink/app/pages/i18n-test.ts +0 -14
  201. package/e2e/kitchen-sink/app/pages/index.ts +0 -27
  202. package/e2e/kitchen-sink/app/pages/isr-test.ts +0 -17
  203. package/e2e/kitchen-sink/app/pages/items/[id].ts +0 -20
  204. package/e2e/kitchen-sink/app/pages/jit-css-custom-colors-test.ts +0 -14
  205. package/e2e/kitchen-sink/app/pages/loader-error-test.ts +0 -13
  206. package/e2e/kitchen-sink/app/pages/loader-props-test.ts +0 -19
  207. package/e2e/kitchen-sink/app/pages/loader-response-error-test.ts +0 -13
  208. package/e2e/kitchen-sink/app/pages/middleware-chain-test.ts +0 -12
  209. package/e2e/kitchen-sink/app/pages/middleware-status-test.ts +0 -9
  210. package/e2e/kitchen-sink/app/pages/navigate-test.ts +0 -16
  211. package/e2e/kitchen-sink/app/pages/observability-test.ts +0 -25
  212. package/e2e/kitchen-sink/app/pages/per-route-error-test.error.ts +0 -13
  213. package/e2e/kitchen-sink/app/pages/per-route-error-test.ts +0 -15
  214. package/e2e/kitchen-sink/app/pages/plugin-dsd-test.ts +0 -10
  215. package/e2e/kitchen-sink/app/pages/render-error-test.ts +0 -12
  216. package/e2e/kitchen-sink/app/pages/render-server-test.ts +0 -12
  217. package/e2e/kitchen-sink/app/pages/render-spa-test.ts +0 -12
  218. package/e2e/kitchen-sink/app/pages/route-info.ts +0 -14
  219. package/e2e/kitchen-sink/app/pages/seo-test.ts +0 -23
  220. package/e2e/kitchen-sink/app/pages/session-rotation-test.ts +0 -25
  221. package/e2e/kitchen-sink/app/pages/use-state-test.ts +0 -37
  222. package/e2e/kitchen-sink/app/plugins/01.setup.ts +0 -7
  223. package/e2e/kitchen-sink/app/plugins/02.ks-plugin-components.ts +0 -27
  224. package/e2e/kitchen-sink/cer-auto-imports.d.ts +0 -51
  225. package/e2e/kitchen-sink/cer-env.d.ts +0 -35
  226. package/e2e/kitchen-sink/cer-tsconfig.json +0 -30
  227. package/e2e/kitchen-sink/cer.config.ts +0 -43
  228. package/e2e/kitchen-sink/content/01.guides/01.index.md +0 -8
  229. package/e2e/kitchen-sink/content/01.guides/02.intro.md +0 -8
  230. package/e2e/kitchen-sink/content/01.guides/10.advanced.md +0 -8
  231. package/e2e/kitchen-sink/content/blog/2026-04-01-hello.md +0 -26
  232. package/e2e/kitchen-sink/content/blog/2026-04-02-draft.md +0 -10
  233. package/e2e/kitchen-sink/content/blog/index.md +0 -8
  234. package/e2e/kitchen-sink/content/blog/no-frontmatter.md +0 -7
  235. package/e2e/kitchen-sink/content/docs/getting-started.md +0 -48
  236. package/e2e/kitchen-sink/content/index.md +0 -16
  237. package/e2e/kitchen-sink/server/api/echo.ts +0 -12
  238. package/e2e/kitchen-sink/server/api/health.ts +0 -3
  239. package/e2e/kitchen-sink/server/api/posts/[slug].ts +0 -11
  240. package/e2e/kitchen-sink/server/api/posts/index.ts +0 -5
  241. package/e2e/kitchen-sink/server/api/session.ts +0 -23
  242. package/e2e/kitchen-sink/server/data/posts.ts +0 -21
  243. package/e2e/kitchen-sink/server/middleware/01-headers.ts +0 -6
  244. package/e2e/kitchen-sink/server/middleware/02-status-test.ts +0 -10
  245. package/e2e/kitchen-sink/tsconfig.json +0 -3
  246. package/e2e/scripts/clean.mjs +0 -14
  247. package/eslint.config.ts +0 -22
  248. package/src/__tests__/cli/adapters/cloudflare-worker.integration.test.ts +0 -132
  249. package/src/__tests__/cli/adapters/cloudflare.test.ts +0 -332
  250. package/src/__tests__/cli/adapters/netlify-bridge.integration.test.ts +0 -139
  251. package/src/__tests__/cli/adapters/netlify.test.ts +0 -286
  252. package/src/__tests__/cli/adapters/vercel-launcher.integration.test.ts +0 -129
  253. package/src/__tests__/cli/adapters/vercel.test.ts +0 -263
  254. package/src/__tests__/cli/preview-hardening.test.ts +0 -265
  255. package/src/__tests__/cli/preview-isr.test.ts +0 -320
  256. package/src/__tests__/index.test.ts +0 -21
  257. package/src/__tests__/plugin/app-template.test.ts +0 -112
  258. package/src/__tests__/plugin/build-ssg-render.test.ts +0 -155
  259. package/src/__tests__/plugin/build-ssg.test.ts +0 -598
  260. package/src/__tests__/plugin/build-ssr.test.ts +0 -192
  261. package/src/__tests__/plugin/cer-app-plugin.test.ts +0 -552
  262. package/src/__tests__/plugin/content/emitter.test.ts +0 -117
  263. package/src/__tests__/plugin/content/loader.test.ts +0 -154
  264. package/src/__tests__/plugin/content/parser.test.ts +0 -381
  265. package/src/__tests__/plugin/content/path-utils.test.ts +0 -69
  266. package/src/__tests__/plugin/content/search.test.ts +0 -119
  267. package/src/__tests__/plugin/dev-server.test.ts +0 -813
  268. package/src/__tests__/plugin/dts-generator.test.ts +0 -394
  269. package/src/__tests__/plugin/entry-server-template.test.ts +0 -385
  270. package/src/__tests__/plugin/generated-dir.test.ts +0 -144
  271. package/src/__tests__/plugin/path-utils.test.ts +0 -411
  272. package/src/__tests__/plugin/resolve-config.test.ts +0 -200
  273. package/src/__tests__/plugin/scanner.test.ts +0 -186
  274. package/src/__tests__/plugin/transforms/auto-import.test.ts +0 -510
  275. package/src/__tests__/plugin/transforms/head-inject.test.ts +0 -178
  276. package/src/__tests__/plugin/virtual/composables.test.ts +0 -57
  277. package/src/__tests__/plugin/virtual/content-components.test.ts +0 -66
  278. package/src/__tests__/plugin/virtual/error.test.ts +0 -71
  279. package/src/__tests__/plugin/virtual/layouts.test.ts +0 -70
  280. package/src/__tests__/plugin/virtual/loading.test.ts +0 -72
  281. package/src/__tests__/plugin/virtual/middleware.test.ts +0 -83
  282. package/src/__tests__/plugin/virtual/plugins.test.ts +0 -129
  283. package/src/__tests__/plugin/virtual/routes.test.ts +0 -884
  284. package/src/__tests__/plugin/virtual/server-api.test.ts +0 -164
  285. package/src/__tests__/plugin/virtual/server-middleware.test.ts +0 -102
  286. package/src/__tests__/runtime/app-template.test.ts +0 -198
  287. package/src/__tests__/runtime/define-middleware.test.ts +0 -64
  288. package/src/__tests__/runtime/define-server-middleware.test.ts +0 -54
  289. package/src/__tests__/runtime/entry-client-template.test.ts +0 -61
  290. package/src/__tests__/runtime/isr-handler.test.ts +0 -338
  291. package/src/__tests__/runtime/oauth/handler.test.ts +0 -358
  292. package/src/__tests__/runtime/oauth/providers.test.ts +0 -47
  293. package/src/__tests__/runtime/oauth-index.test.ts +0 -43
  294. package/src/__tests__/runtime/use-auth.test.ts +0 -169
  295. package/src/__tests__/runtime/use-content-search-composable.test.ts +0 -405
  296. package/src/__tests__/runtime/use-content-search.test.ts +0 -163
  297. package/src/__tests__/runtime/use-content.test.ts +0 -226
  298. package/src/__tests__/runtime/use-cookie.test.ts +0 -277
  299. package/src/__tests__/runtime/use-fetch-component.test.ts +0 -214
  300. package/src/__tests__/runtime/use-fetch.test.ts +0 -377
  301. package/src/__tests__/runtime/use-head.test.ts +0 -266
  302. package/src/__tests__/runtime/use-inject-client.test.ts +0 -67
  303. package/src/__tests__/runtime/use-inject.test.ts +0 -66
  304. package/src/__tests__/runtime/use-locale.test.ts +0 -152
  305. package/src/__tests__/runtime/use-navigate.test.ts +0 -121
  306. package/src/__tests__/runtime/use-page-data.test.ts +0 -298
  307. package/src/__tests__/runtime/use-route.test.ts +0 -156
  308. package/src/__tests__/runtime/use-runtime-config.test.ts +0 -182
  309. package/src/__tests__/runtime/use-seo-meta.test.ts +0 -109
  310. package/src/__tests__/runtime/use-session.test.ts +0 -320
  311. package/src/__tests__/runtime/use-state.test.ts +0 -340
  312. package/src/__tests__/types/config.test.ts +0 -18
  313. package/src/cli/adapters/cloudflare.ts +0 -335
  314. package/src/cli/adapters/netlify.ts +0 -326
  315. package/src/cli/adapters/vercel.ts +0 -311
  316. package/src/cli/commands/adapt.ts +0 -84
  317. package/src/cli/commands/build.ts +0 -165
  318. package/src/cli/commands/dev.ts +0 -125
  319. package/src/cli/commands/generate.ts +0 -91
  320. package/src/cli/commands/preview-isr.ts +0 -172
  321. package/src/cli/commands/preview.ts +0 -489
  322. package/src/cli/create/index.ts +0 -275
  323. package/src/cli/create/templates/shared/.gitignore.tpl +0 -25
  324. package/src/cli/create/templates/shared/app/layouts/default.ts.tpl +0 -15
  325. package/src/cli/create/templates/shared/app/pages/index.ts.tpl +0 -8
  326. package/src/cli/create/templates/shared/index.html.tpl +0 -12
  327. package/src/cli/create/templates/shared/tsconfig.json.tpl +0 -6
  328. package/src/cli/create/templates/spa/cer.config.ts.tpl +0 -6
  329. package/src/cli/create/templates/spa/package.json.tpl +0 -18
  330. package/src/cli/create/templates/ssg/cer.config.ts.tpl +0 -10
  331. package/src/cli/create/templates/ssg/package.json.tpl +0 -19
  332. package/src/cli/create/templates/ssr/cer.config.ts.tpl +0 -6
  333. package/src/cli/create/templates/ssr/package.json.tpl +0 -18
  334. package/src/cli/index.ts +0 -22
  335. package/src/index.ts +0 -20
  336. package/src/plugin/build-ssg.ts +0 -336
  337. package/src/plugin/build-ssr.ts +0 -134
  338. package/src/plugin/content/emitter.ts +0 -50
  339. package/src/plugin/content/index.ts +0 -233
  340. package/src/plugin/content/parser.ts +0 -259
  341. package/src/plugin/content/path-utils.ts +0 -55
  342. package/src/plugin/content/scanner.ts +0 -26
  343. package/src/plugin/content/search.ts +0 -28
  344. package/src/plugin/dev-server.ts +0 -377
  345. package/src/plugin/dts-generator.ts +0 -273
  346. package/src/plugin/generated-dir.ts +0 -121
  347. package/src/plugin/index.ts +0 -553
  348. package/src/plugin/path-utils.ts +0 -186
  349. package/src/plugin/scanner.ts +0 -65
  350. package/src/plugin/transforms/auto-import.ts +0 -206
  351. package/src/plugin/transforms/head-inject.ts +0 -161
  352. package/src/plugin/virtual/composables.ts +0 -28
  353. package/src/plugin/virtual/content-components.ts +0 -83
  354. package/src/plugin/virtual/error.ts +0 -34
  355. package/src/plugin/virtual/layouts.ts +0 -41
  356. package/src/plugin/virtual/loading.ts +0 -32
  357. package/src/plugin/virtual/middleware.ts +0 -45
  358. package/src/plugin/virtual/plugins.ts +0 -46
  359. package/src/plugin/virtual/routes.ts +0 -514
  360. package/src/plugin/virtual/server-api.ts +0 -85
  361. package/src/plugin/virtual/server-middleware.ts +0 -44
  362. package/src/runtime/app-template.ts +0 -380
  363. package/src/runtime/composables/define-middleware.ts +0 -17
  364. package/src/runtime/composables/define-server-middleware.ts +0 -18
  365. package/src/runtime/composables/index.ts +0 -27
  366. package/src/runtime/composables/use-auth.ts +0 -125
  367. package/src/runtime/composables/use-content-search.ts +0 -205
  368. package/src/runtime/composables/use-content.ts +0 -146
  369. package/src/runtime/composables/use-cookie.ts +0 -135
  370. package/src/runtime/composables/use-fetch.ts +0 -438
  371. package/src/runtime/composables/use-head.ts +0 -212
  372. package/src/runtime/composables/use-inject.ts +0 -49
  373. package/src/runtime/composables/use-locale.ts +0 -109
  374. package/src/runtime/composables/use-navigate.ts +0 -58
  375. package/src/runtime/composables/use-page-data.ts +0 -93
  376. package/src/runtime/composables/use-route.ts +0 -71
  377. package/src/runtime/composables/use-runtime-config.ts +0 -123
  378. package/src/runtime/composables/use-seo-meta.ts +0 -80
  379. package/src/runtime/composables/use-session.ts +0 -186
  380. package/src/runtime/composables/use-state.ts +0 -92
  381. package/src/runtime/content/client.ts +0 -168
  382. package/src/runtime/entry-client-template.ts +0 -39
  383. package/src/runtime/entry-server-template.ts +0 -493
  384. package/src/runtime/isr-handler.ts +0 -184
  385. package/src/runtime/oauth/handler.ts +0 -407
  386. package/src/runtime/oauth/index.ts +0 -49
  387. package/src/runtime/oauth/providers.ts +0 -38
  388. package/src/types/api.ts +0 -40
  389. package/src/types/config.ts +0 -371
  390. package/src/types/content.ts +0 -66
  391. package/src/types/index.ts +0 -7
  392. package/src/types/middleware.ts +0 -63
  393. package/src/types/page.ts +0 -117
  394. package/src/types/plugin.ts +0 -34
  395. package/tsconfig.build.json +0 -10
  396. package/tsconfig.json +0 -19
  397. package/vitest.config.ts +0 -33
@@ -1,489 +0,0 @@
1
- import { Command } from 'commander'
2
- import { createServer as createHttpServer, type IncomingMessage, type ServerResponse } from 'node:http'
3
- import { createReadStream, existsSync, statSync } from 'node:fs'
4
- import { resolve, join, extname } from 'pathe'
5
- import { pathToFileURL } from 'node:url'
6
- import {
7
- type IsrCacheEntry,
8
- type SsrHandlerFn,
9
- isPathBounded,
10
- findRevalidate,
11
- findRenderMode,
12
- renderForIsr,
13
- serveFromIsrCache,
14
- } from './preview-isr.js'
15
-
16
- // ─── API route matching & body parsing ───────────────────────────────────────
17
-
18
- /**
19
- * Matches an API route pattern (e.g. '/api/items/:id') against a URL path.
20
- * Returns a params object on match, or null if the pattern does not match.
21
- */
22
- function matchApiPattern(pattern: string, urlPath: string): Record<string, string> | null {
23
- const patternParts = pattern.split('/')
24
- const urlParts = urlPath.split('/')
25
- if (patternParts.length !== urlParts.length) return null
26
- const params: Record<string, string> = {}
27
- for (let i = 0; i < patternParts.length; i++) {
28
- const p = patternParts[i]
29
- const u = urlParts[i]
30
- if (p.startsWith(':')) {
31
- params[p.slice(1)] = decodeURIComponent(u)
32
- } else if (p !== u) {
33
- return null
34
- }
35
- }
36
- return params
37
- }
38
-
39
- const MIME_TYPES: Record<string, string> = {
40
- '.html': 'text/html; charset=utf-8',
41
- '.js': 'application/javascript; charset=utf-8',
42
- '.mjs': 'application/javascript; charset=utf-8',
43
- '.css': 'text/css; charset=utf-8',
44
- '.json': 'application/json; charset=utf-8',
45
- '.png': 'image/png',
46
- '.jpg': 'image/jpeg',
47
- '.jpeg': 'image/jpeg',
48
- '.gif': 'image/gif',
49
- '.svg': 'image/svg+xml',
50
- '.ico': 'image/x-icon',
51
- '.woff': 'font/woff',
52
- '.woff2': 'font/woff2',
53
- '.ttf': 'font/ttf',
54
- '.eot': 'application/vnd.ms-fontobject',
55
- '.map': 'application/json',
56
- }
57
-
58
- /**
59
- * Reads the raw body from an IncomingMessage as a Buffer.
60
- */
61
- function readBody(req: IncomingMessage): Promise<Buffer> {
62
- return new Promise((resolve, reject) => {
63
- const chunks: Buffer[] = []
64
- req.on('data', (chunk: Buffer) => chunks.push(chunk))
65
- req.on('end', () => resolve(Buffer.concat(chunks)))
66
- req.on('error', reject)
67
- })
68
- }
69
-
70
- /**
71
- * Parses URL query string into a plain object.
72
- */
73
- function parseQuery(url: string): Record<string, string> {
74
- const qIndex = url.indexOf('?')
75
- if (qIndex === -1) return {}
76
- const qs = url.slice(qIndex + 1)
77
- const result: Record<string, string> = {}
78
- for (const part of qs.split('&')) {
79
- if (!part) continue
80
- const eqIdx = part.indexOf('=')
81
- if (eqIdx === -1) {
82
- result[decodeURIComponent(part)] = ''
83
- } else {
84
- result[decodeURIComponent(part.slice(0, eqIdx))] = decodeURIComponent(part.slice(eqIdx + 1))
85
- }
86
- }
87
- return result
88
- }
89
-
90
- /**
91
- * Parses the request body for JSON content types.
92
- * Returns the parsed object for application/json, raw Buffer for other
93
- * bodies, or undefined for methods that carry no body.
94
- */
95
- async function parseBody(req: IncomingMessage): Promise<unknown> {
96
- const contentType = req.headers['content-type'] ?? ''
97
- const method = req.method?.toUpperCase() ?? 'GET'
98
- if (!['POST', 'PUT', 'PATCH'].includes(method)) return undefined
99
- const buf = await readBody(req)
100
- if (contentType.includes('application/json')) {
101
- try { return JSON.parse(buf.toString('utf-8')) } catch { return undefined }
102
- }
103
- return buf
104
- }
105
-
106
- function getMimeType(filePath: string): string {
107
- const ext = extname(filePath).toLowerCase()
108
- return MIME_TYPES[ext] ?? 'application/octet-stream'
109
- }
110
-
111
- /**
112
- * Returns the appropriate Cache-Control header value for a file.
113
- * Vite content-hashes assets placed in the /assets/ directory, so they
114
- * can be cached indefinitely. Everything else (HTML, etc.) must not be cached.
115
- */
116
- function getCacheControl(filePath: string): string {
117
- if (filePath.includes('/assets/')) return 'public, max-age=31536000, immutable'
118
- return 'no-cache'
119
- }
120
-
121
- /**
122
- * Sets standard security headers on every response.
123
- */
124
- function setSecurityHeaders(res: ServerResponse): void {
125
- res.setHeader('X-Content-Type-Options', 'nosniff')
126
- res.setHeader('X-Frame-Options', 'DENY')
127
- res.setHeader('Referrer-Policy', 'strict-origin-when-cross-origin')
128
- }
129
-
130
- /**
131
- * Serves a static file from the dist directory.
132
- * Returns true if the file was served, false otherwise.
133
- */
134
- function serveStaticFile(
135
- req: IncomingMessage,
136
- res: ServerResponse,
137
- distDir: string,
138
- ): boolean {
139
- const urlPath = (req.url ?? '/').split('?')[0]
140
-
141
- // Guard against path traversal: resolved path must stay within distDir.
142
- if (!isPathBounded(distDir, urlPath)) {
143
- res.statusCode = 400
144
- res.end('Bad Request')
145
- return true
146
- }
147
-
148
- // Try exact file path
149
- let filePath = join(distDir, urlPath)
150
-
151
- if (!existsSync(filePath) || statSync(filePath).isDirectory()) {
152
- // Try index.html in the directory
153
- const indexPath = join(distDir, urlPath, 'index.html')
154
- if (existsSync(indexPath)) {
155
- filePath = indexPath
156
- } else if (existsSync(join(distDir, 'index.html'))) {
157
- // SPA fallback: serve root index.html
158
- filePath = join(distDir, 'index.html')
159
- } else {
160
- return false
161
- }
162
- }
163
-
164
- res.setHeader('Content-Type', getMimeType(filePath))
165
- res.setHeader('Cache-Control', getCacheControl(filePath))
166
- setSecurityHeaders(res)
167
- createReadStream(filePath).pipe(res)
168
- return true
169
- }
170
-
171
- /**
172
- * Registers SIGTERM/SIGINT handlers that gracefully drain the server before exiting.
173
- * Waits up to 10 seconds for in-flight requests to complete, then force-exits.
174
- */
175
- function registerGracefulShutdown(server: ReturnType<typeof createHttpServer>): void {
176
- function shutdown(signal: string): void {
177
- console.log(`[cer-app] Received ${signal}, shutting down gracefully...`)
178
- server.close(() => {
179
- console.log('[cer-app] Server closed.')
180
- process.exit(0)
181
- })
182
- // Force exit if connections haven't drained within 10 seconds.
183
- const t = setTimeout(() => {
184
- console.error('[cer-app] Forced shutdown after 10 s — connections did not drain.')
185
- process.exit(1)
186
- }, 10_000)
187
- // Allow the Node.js event loop to exit before the timeout fires if all other work is done.
188
- t.unref()
189
- }
190
-
191
- process.on('SIGTERM', () => shutdown('SIGTERM'))
192
- process.on('SIGINT', () => shutdown('SIGINT'))
193
- }
194
-
195
- export function previewCommand(): Command {
196
- return new Command('preview')
197
- .description('Preview the production build')
198
- .option('-p, --port <port>', 'Port to listen on', '4173')
199
- .option('--host <host>', 'Host to bind to', 'localhost')
200
- .option('--root <root>', 'Project root directory', process.cwd())
201
- .option('--ssr', 'Serve using SSR handler from dist/server/server.js')
202
- .action(async (options) => {
203
- const root = resolve(options.root)
204
- const port = parseInt(options.port, 10)
205
- const distDir = join(root, 'dist')
206
- const serverBundle = join(distDir, 'server/server.js')
207
-
208
- // Check if SSR server bundle exists.
209
- // An SSG build also produces a server bundle, but previewing SSG means serving
210
- // the pre-rendered static HTML — detect the SSG manifest to avoid switching to
211
- // live SSR mode for SSG builds.
212
- const hasServerBundle = existsSync(serverBundle)
213
- const hasSsgManifest = existsSync(join(distDir, 'ssg-manifest.json'))
214
- const useSSR = options.ssr || (hasServerBundle && !hasSsgManifest)
215
-
216
- if (useSSR && hasServerBundle) {
217
- console.log('[cer-app] Starting SSR preview server...')
218
-
219
- // Load the server bundle
220
- let serverMod: {
221
- handler?: SsrHandlerFn
222
- default?: SsrHandlerFn
223
- runServerMiddleware?: (req: IncomingMessage, res: ServerResponse) => Promise<boolean>
224
- runWithRequestContext?: <T>(req: IncomingMessage, res: ServerResponse, fn: () => Promise<T>) => Promise<T>
225
- apiRoutes?: Array<{ path: string; handlers: Record<string, unknown> }>
226
- }
227
- try {
228
- // Expose the app root so the server bundle can resolve content files at runtime.
229
- process.env.__CER_APP_ROOT__ = root
230
- serverMod = await import(pathToFileURL(serverBundle).href)
231
- } catch (err) {
232
- console.error('[cer-app] Failed to load server bundle:', err)
233
- process.exit(1)
234
- }
235
-
236
- const handler = serverMod.handler ?? serverMod.default
237
- if (typeof handler !== 'function') {
238
- console.error('[cer-app] Server bundle does not export a handler function.')
239
- process.exit(1)
240
- }
241
-
242
- // Server middleware chain exported by the server bundle
243
- const runServerMiddleware = serverMod.runServerMiddleware
244
- // Request context wrapper — runs fn inside _cerReqStore so useCookie / useSession work in API handlers
245
- const runWithRequestContext = serverMod.runWithRequestContext
246
-
247
- // API route array exported by the server bundle: [{ path, handlers }]
248
- const apiRoutes: Array<{ path: string; handlers: Record<string, unknown> }> =
249
- Array.isArray(serverMod.apiRoutes) ? serverMod.apiRoutes : []
250
-
251
- // Page routes exported by the server bundle (used for ISR revalidate lookup).
252
- const pageRoutes: Array<{ path: string; meta?: Record<string, unknown> }> =
253
- Array.isArray((serverMod as { routes?: unknown }).routes)
254
- ? (serverMod as { routes: Array<{ path: string; meta?: Record<string, unknown> }> }).routes
255
- : []
256
-
257
- // ISR cache: path → cached render entry.
258
- const isrCache = new Map<string, IsrCacheEntry>()
259
-
260
- const server = createHttpServer(async (req: IncomingMessage, res: ServerResponse) => {
261
- setSecurityHeaders(res)
262
- // Default: HTML and API responses must not be cached. Asset paths below
263
- // override this with getCacheControl() for content-hashed files.
264
- res.setHeader('Cache-Control', 'no-cache')
265
-
266
- const url = req.url ?? '/'
267
- const urlPath = url.split('?')[0]
268
- const method = req.method ?? 'GET'
269
-
270
- // Run server middleware before routing — stops chain if it returns false
271
- if (runServerMiddleware && !(await runServerMiddleware(req, res))) return
272
-
273
- // Route /api/* requests to the server bundle's API handlers
274
- if (urlPath.startsWith('/api/')) {
275
- for (const route of apiRoutes) {
276
- const matched = matchApiPattern(route.path, urlPath)
277
- if (matched !== null) {
278
- const augReq = req as IncomingMessage & { params: Record<string, string>; query: Record<string, string>; body: unknown }
279
- augReq.params = matched
280
- augReq.query = parseQuery(url)
281
- augReq.body = await parseBody(req)
282
- const augRes = res as ServerResponse & {
283
- json(data: unknown): void
284
- status(code: number): typeof augRes
285
- }
286
- augRes.json = function (data) {
287
- this.setHeader('Content-Type', 'application/json; charset=utf-8')
288
- this.end(JSON.stringify(data))
289
- }
290
- augRes.status = function (code) { this.statusCode = code; return this }
291
-
292
- type ApiHandlerFn = (req: typeof augReq, res: typeof augRes) => void | Promise<void>
293
- const handlerFn =
294
- (route.handlers[method.toLowerCase()] as ApiHandlerFn | undefined) ??
295
- (route.handlers[method.toUpperCase()] as ApiHandlerFn | undefined) ??
296
- (route.handlers['default'] as ApiHandlerFn | undefined)
297
-
298
- if (typeof handlerFn === 'function') {
299
- try {
300
- const invoke = () => Promise.resolve(handlerFn(augReq, augRes))
301
- await (runWithRequestContext ? runWithRequestContext(req, res, invoke) : invoke())
302
- } catch (err) {
303
- console.error(`[cer-app] API handler error at ${route.path}:`, err)
304
- res.statusCode = 500
305
- res.setHeader('Content-Type', 'application/json')
306
- res.end(JSON.stringify({ error: 'Internal Server Error' }))
307
- }
308
- return
309
- }
310
- }
311
- }
312
- res.statusCode = 404
313
- res.end('Not Found')
314
- return
315
- }
316
-
317
- // Serve static assets from dist/client first
318
- const clientDist = join(distDir, 'client')
319
- if (existsSync(clientDist) && url !== '/' && url.includes('.')) {
320
- const served = serveStaticFile(req, res, clientDist)
321
- if (served) return
322
- }
323
-
324
- // Per-route render strategy — checked before ISR.
325
- const renderMode = findRenderMode(pageRoutes, urlPath)
326
-
327
- // render: 'spa' — skip SSR, serve the client index.html shell.
328
- if (renderMode === 'spa') {
329
- const spaIndex = join(distDir, 'client/index.html')
330
- if (existsSync(spaIndex)) {
331
- res.setHeader('Content-Type', 'text/html; charset=utf-8')
332
- res.setHeader('Cache-Control', 'no-cache')
333
- createReadStream(spaIndex).pipe(res)
334
- } else {
335
- res.statusCode = 404
336
- res.setHeader('Content-Type', 'text/plain')
337
- res.end('Not Found')
338
- }
339
- return
340
- }
341
-
342
- // render: 'static' — try pre-rendered HTML from dist/, fall through to SSR.
343
- if (renderMode === 'static') {
344
- const staticFile = urlPath === '/'
345
- ? join(distDir, 'index.html')
346
- : join(distDir, urlPath.replace(/^\//, ''), 'index.html')
347
- if (existsSync(staticFile)) {
348
- res.setHeader('Content-Type', 'text/html; charset=utf-8')
349
- res.setHeader('Cache-Control', 'no-cache')
350
- createReadStream(staticFile).pipe(res)
351
- return
352
- }
353
- // Fall through to SSR if no pre-rendered file exists.
354
- }
355
-
356
- // render: 'server' — always SSR, bypass ISR cache.
357
- if (renderMode === 'server') {
358
- try {
359
- await handler(req, res)
360
- } catch (err) {
361
- console.error('[cer-app] SSR handler error:', err)
362
- res.statusCode = 500
363
- res.setHeader('Content-Type', 'text/plain')
364
- res.end('Internal Server Error')
365
- }
366
- return
367
- }
368
-
369
- // ISR: check whether this route has a revalidate TTL.
370
- const revalidate = findRevalidate(pageRoutes, urlPath)
371
- if (revalidate !== null) {
372
- const cached = isrCache.get(urlPath)
373
- const now = Date.now()
374
-
375
- if (cached) {
376
- const ageSeconds = (now - cached.builtAt) / 1000
377
- if (ageSeconds < cached.revalidate) {
378
- // Fresh — serve from cache.
379
- serveFromIsrCache(cached, res, 'HIT')
380
- return
381
- }
382
- // Stale — serve stale immediately, revalidate in background.
383
- if (!cached.revalidating) {
384
- cached.revalidating = true
385
- serveFromIsrCache(cached, res, 'STALE')
386
- const revalidateTimeout = setTimeout(() => {
387
- if (cached) cached.revalidating = false
388
- }, 30_000)
389
- renderForIsr(urlPath, handler, revalidate).then((entry) => {
390
- clearTimeout(revalidateTimeout)
391
- if (entry) isrCache.set(urlPath, entry)
392
- else if (cached) cached.revalidating = false
393
- }).catch(() => {
394
- clearTimeout(revalidateTimeout)
395
- if (cached) cached.revalidating = false
396
- })
397
- return
398
- }
399
- // Already revalidating — serve stale without spawning another render.
400
- serveFromIsrCache(cached, res, 'STALE')
401
- return
402
- }
403
-
404
- // Cache miss — render, cache, then serve.
405
- try {
406
- const entry = await renderForIsr(urlPath, handler, revalidate)
407
- if (entry) {
408
- isrCache.set(urlPath, entry)
409
- serveFromIsrCache(entry, res, 'HIT')
410
- } else {
411
- await handler(req, res)
412
- }
413
- } catch (err) {
414
- console.error('[cer-app] ISR render error:', err)
415
- res.statusCode = 500
416
- res.end('Internal Server Error')
417
- }
418
- return
419
- }
420
-
421
- // Non-ISR: fall through to SSR handler directly.
422
- try {
423
- await handler(req, res)
424
- } catch (err) {
425
- console.error('[cer-app] SSR handler error:', err)
426
- res.statusCode = 500
427
- res.end('Internal Server Error')
428
- }
429
- })
430
-
431
- // Protect against slow-send attacks: abort requests that stall during
432
- // header delivery or that take too long to complete.
433
- server.headersTimeout = 10_000 // 10 s to receive all request headers
434
- server.requestTimeout = 30_000 // 30 s for the full request/response cycle
435
-
436
- server.listen(port, options.host, () => {
437
- console.log(`[cer-app] SSR preview running at http://${options.host}:${port}`)
438
- })
439
-
440
- registerGracefulShutdown(server)
441
- } else {
442
- // Static file server (SPA / SSG)
443
- console.log('[cer-app] Starting static preview server...')
444
-
445
- if (!existsSync(distDir)) {
446
- console.error(`[cer-app] No dist/ directory found at ${distDir}. Run 'cer-app build' first.`)
447
- process.exit(1)
448
- }
449
-
450
- const server = createHttpServer((req: IncomingMessage, res: ServerResponse) => {
451
- setSecurityHeaders(res)
452
- res.setHeader('Cache-Control', 'no-cache')
453
-
454
- const urlPath = (req.url ?? '/').split('?')[0]
455
- // SSG builds put assets in dist/client/ while HTML lives in dist/.
456
- // For requests with a non-HTML file extension, check dist/client/ first
457
- // so the static server finds the Vite-built JS/CSS bundles.
458
- const clientDist = join(distDir, 'client')
459
- const ext = extname(urlPath).toLowerCase()
460
- if (ext && ext !== '.html' && existsSync(clientDist)) {
461
- const assetPath = join(clientDist, urlPath)
462
- if (
463
- isPathBounded(clientDist, urlPath) &&
464
- existsSync(assetPath) && !statSync(assetPath).isDirectory()
465
- ) {
466
- res.setHeader('Content-Type', getMimeType(assetPath))
467
- res.setHeader('Cache-Control', getCacheControl(assetPath))
468
- createReadStream(assetPath).pipe(res)
469
- return
470
- }
471
- }
472
- const served = serveStaticFile(req, res, distDir)
473
- if (!served) {
474
- res.statusCode = 404
475
- res.end('Not Found')
476
- }
477
- })
478
-
479
- server.headersTimeout = 10_000
480
- server.requestTimeout = 30_000
481
-
482
- server.listen(port, options.host, () => {
483
- console.log(`[cer-app] Static preview running at http://${options.host}:${port}`)
484
- })
485
-
486
- registerGracefulShutdown(server)
487
- }
488
- })
489
- }