@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
package/docs/content.md DELETED
@@ -1,570 +0,0 @@
1
- # Content Layer
2
-
3
- CER Content is a file-based content layer built into `vite-plugin-cer-app`. It parses Markdown and JSON files from `content/` at the project root, injects them into the global store, generates a static search index, and exposes them to your pages via `queryContent()` and `useContentSearch()`. No separate server or database is required.
4
-
5
- ---
6
-
7
- ## Overview
8
-
9
- - **Zero config** — drop files into `content/` at the project root and they are available immediately.
10
- - **Markdown + JSON** — Markdown files are parsed with frontmatter, rendered to HTML, have their headings extracted into a table of contents, and auto-register matching custom elements from `app/components/` when those tags appear in the markdown body. JSON files are stored as raw string bodies.
11
- - **Draft support** — items with `draft: true` in frontmatter are excluded from production builds by default.
12
- - **Excerpt extraction** — place `<!-- more -->` in a Markdown file to set the excerpt boundary.
13
- - **Full-text search** — a MiniSearch index is emitted at build time and loaded lazily on the client via `useContentSearch()`.
14
- - **Works in all modes** — SPA (client fetch), SSR (Node.js filesystem), and SSG (pre-rendered).
15
-
16
- ---
17
-
18
- ## Quick start
19
-
20
- ### 1. Add content files
21
-
22
- ```
23
- content/
24
- index.md
25
- blog/
26
- 2026-04-01-hello.md
27
- docs/
28
- getting-started.md
29
- ```
30
-
31
- Numeric ordering prefixes are also supported on both directories and files. A leading `NN.` is used for ordering in the source tree but stripped from the public content path:
32
-
33
- ```
34
- content/
35
- 01.docs/
36
- 01.getting-started.md -> /docs/getting-started
37
- 02.routing.md -> /docs/routing
38
- ```
39
-
40
- ### 2. Query content in a page
41
-
42
- ```ts
43
- // app/pages/blog.ts
44
- component('page-blog', () => {
45
- useHead({ title: 'Blog' })
46
-
47
- const ssrData = usePageData<{ posts: ContentMeta[] }>()
48
- const posts = ref<ContentMeta[]>(ssrData?.posts ?? [])
49
-
50
- useOnConnected(async () => {
51
- if (ssrData) return
52
- posts.value = await queryContent('/blog').find()
53
- })
54
-
55
- return html`
56
- <ul>
57
- ${each(posts.value, p => html`<li><a :href="${p._path}">${p.title}</a></li>`)}
58
- </ul>
59
- `
60
- })
61
-
62
- export const loader = async () => {
63
- const posts = await queryContent('/blog').find()
64
- return { posts }
65
- }
66
- ```
67
-
68
- ---
69
-
70
- ## Configuration
71
-
72
- All options are optional.
73
-
74
- ```ts
75
- // cer.config.ts
76
- export default defineConfig({
77
- content: {
78
- dir: 'content', // default
79
- drafts: false, // default
80
- },
81
- })
82
- ```
83
-
84
- ### `content.dir`
85
-
86
- **Type:** `string`
87
- **Default:** `'content'`
88
-
89
- Content directory relative to the **project root** — at the same level as `app/`, `server/`, and `public/`. The default resolves to `{root}/content/`.
90
-
91
- ### `content.drafts`
92
-
93
- **Type:** `boolean`
94
- **Default:** `false`
95
-
96
- When `false`, any file with `draft: true` in its frontmatter is excluded from the content store and search index. Set to `true` to include drafts (useful for preview environments).
97
-
98
- ---
99
-
100
- ## File format
101
-
102
- ### Markdown files
103
-
104
- Markdown files use [gray-matter](https://github.com/jonschlinkert/gray-matter) for YAML frontmatter. All frontmatter keys are stored in the content item. The body is rendered to HTML using [marked](https://marked.js.org). Heading elements receive an `id` attribute derived from their slug.
105
-
106
- If the rendered markdown body contains custom-element tags that match components registered in `app/components/`, CER automatically imports those component modules for both client and server entry points. That means markdown like `<site-callout>Note</site-callout>` works in SPA, SSR, and SSG without adding manual imports to your page component.
107
-
108
- Props passed from markdown follow normal HTML attribute rules:
109
-
110
- - String props work directly: `<site-callout tone="info" heading="Heads up">…</site-callout>`
111
- - Number and boolean props work when the component declares them via `useProps()` defaults, because the runtime coerces attribute values to the declared primitive type
112
- - Boolean presence attributes are appropriate for flag-style props such as `<site-callout dismissible>`
113
- - All markdown-supplied props are attribute-based, so they must be serializable as plain HTML attribute values
114
- - Arrays, objects, and function props are not passed as rich JavaScript values from markdown
115
- - CER template bindings and directives do not run inside markdown HTML, so syntax like `:bind`, `@click`, `:class`, or `${...}` is treated as plain text/attributes, not live bindings
116
-
117
- In practice, components used from markdown should expose a string/number/boolean attribute API and read those values with `useProps()`.
118
-
119
- ```md
120
- ---
121
- title: Hello World
122
- description: My first post.
123
- date: 2026-04-01
124
- draft: false
125
- ---
126
-
127
- # Hello World
128
-
129
- <!-- more -->
130
-
131
- Everything below the excerpt boundary is in `body` but not in `excerpt`.
132
- ```
133
-
134
- ```md
135
- # Docs
136
-
137
- <site-callout>Remember to configure your content directory.</site-callout>
138
- ```
139
-
140
- ```ts
141
- component('site-callout', () => {
142
- const props = useProps({ tone: 'info', heading: '', dismissible: false, priority: 0 })
143
-
144
- return html`
145
- <aside data-tone="${props.tone}">
146
- ${props.heading ? html`<strong>${props.heading}</strong>` : ''}
147
- <slot></slot>
148
- </aside>
149
- `
150
- })
151
- ```
152
-
153
- ```md
154
- <site-callout tone="warning" heading="Before You Start" dismissible priority="2">
155
- Install dependencies first.
156
- </site-callout>
157
- ```
158
-
159
- Recognized frontmatter keys:
160
-
161
- | Key | Type | Description |
162
- |---|---|---|
163
- | `title` | `string` | Document title. |
164
- | `description` | `string` | Short description for listings and search. |
165
- | `date` | `string` | ISO date string (e.g. `2026-04-01`). |
166
- | `draft` | `boolean` | When `true`, excluded from production builds unless `drafts: true`. |
167
-
168
- Any additional frontmatter keys are stored verbatim in the `ContentMeta` / `ContentItem` object.
169
-
170
- ### Automatic title and description
171
-
172
- When `title` or `description` are absent from frontmatter, the parser derives them from the body:
173
-
174
- - **`title`** — plain text of the first depth-1 heading (`# …`). Only `h1` is considered; `h2`–`h6` are ignored.
175
- - **`description`** — plain text of the first paragraph, truncated to 160 characters (with `…` appended). Inline formatting is stripped.
176
-
177
- Frontmatter values always win — these fallbacks only fill the gaps. JSON files do not receive fallbacks (they have no Markdown body to parse from).
178
-
179
- ```md
180
- # Hello World
181
-
182
- This becomes the description because no description key is in frontmatter.
183
- ```
184
-
185
- Results in `title: 'Hello World'` and `description: 'This becomes the description because no description key is in frontmatter.'`.
186
-
187
- ### Date-prefixed filenames
188
-
189
- Filenames starting with `YYYY-MM-DD-` have the date prefix stripped when computing the content path:
190
-
191
- ```
192
- content/blog/2026-04-01-hello.md → _path: '/blog/hello'
193
- ```
194
-
195
- ### Numeric ordering prefixes
196
-
197
- Directories and filenames starting with `NN.` have that numeric prefix stripped from the computed content path. This lets you control source-tree ordering without exposing the prefix in URLs:
198
-
199
- ```
200
- content/01.docs/02.getting-started.md → _path: '/docs/getting-started'
201
- content/02.blog/01.index.md → _path: '/blog'
202
- ```
203
-
204
- Numeric prefixes are removed from every path segment before the usual `index` and date-prefix handling runs.
205
-
206
- ### Index files
207
-
208
- Files named `index.md` have `/index` stripped from their path:
209
-
210
- ```
211
- content/blog/index.md → _path: '/blog'
212
- content/index.md → _path: '/'
213
- ```
214
-
215
- ### JSON files
216
-
217
- JSON files are read as-is. The `body` is the raw file content string — valid JSON, preserving the original formatting.
218
-
219
- ```
220
- content/data/features.json → _path: '/data/features', _type: 'json'
221
- ```
222
-
223
- ### Excerpt
224
-
225
- Place `<!-- more -->` anywhere in a Markdown file to set the excerpt boundary. Everything before the marker is stored in `item.excerpt` as rendered HTML. The full rendered body (including content after the marker, minus the marker itself) is in `item.body`.
226
-
227
- ```md
228
- This paragraph is the excerpt.
229
-
230
- <!-- more -->
231
-
232
- This paragraph is only in the body.
233
- ```
234
-
235
- ---
236
-
237
- ## TypeScript types
238
-
239
- All types are exported from `@jasonshimmy/vite-plugin-cer-app` and are automatically available as globals inside pages, layouts, and components.
240
-
241
- ```ts
242
- import type {
243
- ContentMeta,
244
- ContentItem,
245
- ContentHeading,
246
- ContentSearchResult,
247
- CerContentConfig,
248
- } from '@jasonshimmy/vite-plugin-cer-app'
249
- ```
250
-
251
- ### `ContentMeta`
252
-
253
- Lean per-document object returned by `.find()` and `.count()`. Does not include `body`, `toc`, or `excerpt`.
254
-
255
- ```ts
256
- interface ContentMeta {
257
- _path: string // URL path, e.g. '/blog/hello'
258
- _type: 'markdown' | 'json'
259
- title?: string
260
- description?: string
261
- date?: string
262
- draft?: boolean
263
- [key: string]: unknown // any additional frontmatter key
264
- }
265
- ```
266
-
267
- ### `ContentItem`
268
-
269
- Full document returned by `.first()`. Extends `ContentMeta` with rendered body, TOC, and excerpt.
270
-
271
- ```ts
272
- interface ContentItem extends ContentMeta {
273
- _file: string // relative source path, e.g. 'blog/hello.md'
274
- body: string // rendered HTML (Markdown) or raw file content (JSON)
275
- toc: ContentHeading[] // extracted headings
276
- excerpt?: string // HTML before <!-- more --> (if marker present)
277
- }
278
- ```
279
-
280
- ### `ContentHeading`
281
-
282
- ```ts
283
- interface ContentHeading {
284
- depth: 1 | 2 | 3 | 4 | 5 | 6
285
- id: string // slugified heading text, matches id= in body HTML
286
- text: string // plain heading text
287
- }
288
- ```
289
-
290
- ### `ContentSearchResult`
291
-
292
- ```ts
293
- interface ContentSearchResult {
294
- _path: string
295
- title: string
296
- description?: string
297
- }
298
- ```
299
-
300
- ---
301
-
302
- ## `queryContent(path?)`
303
-
304
- **Auto-imported** in pages, layouts, and components.
305
-
306
- Returns a `QueryBuilder` scoped to the given path prefix. If `path` is omitted, queries all content.
307
-
308
- ```ts
309
- queryContent() // all items
310
- queryContent('/blog') // items where _path starts with '/blog'
311
- queryContent('/blog/hello') // items where _path starts with '/blog/hello'
312
- ```
313
-
314
- ### `QueryBuilder` methods
315
-
316
- All terminal methods return a `Promise`.
317
-
318
- #### `.where(predicate)`
319
-
320
- Filters results. `predicate` is a function that receives a `ContentMeta` and returns `true` to include the item.
321
-
322
- ```ts
323
- await queryContent('/blog').where(doc => !doc.draft).find()
324
- await queryContent().where(doc => /^\/docs/.test(doc._path)).find()
325
- await queryContent().where(doc => Array.isArray(doc.tags) && (doc.tags as string[]).includes('web')).find()
326
- ```
327
-
328
- #### `.sortBy(field, order?)`
329
-
330
- Sorts results by a field. `order` defaults to `'asc'`.
331
-
332
- ```ts
333
- await queryContent('/blog').sortBy('date', 'desc').find()
334
- ```
335
-
336
- #### `.limit(n)`
337
-
338
- Returns at most `n` items.
339
-
340
- ```ts
341
- await queryContent('/blog').limit(5).find()
342
- ```
343
-
344
- #### `.skip(n)`
345
-
346
- Skips the first `n` items (pagination).
347
-
348
- ```ts
349
- await queryContent('/blog').skip(10).limit(10).find()
350
- ```
351
-
352
- #### `.find()`
353
-
354
- Executes the query and returns `Promise<ContentMeta[]>`.
355
-
356
- ```ts
357
- const posts = await queryContent('/blog').sortBy('date', 'desc').find()
358
- ```
359
-
360
- #### `.first()`
361
-
362
- Returns `Promise<ContentItem | null>` — the first matching full document (includes `body`, `toc`, `excerpt`).
363
-
364
- When a path is set and no other filters or sort are active, `first()` short-circuits to a direct item lookup for efficiency.
365
-
366
- ```ts
367
- const doc = await queryContent('/docs/getting-started').first()
368
- if (doc) {
369
- // doc.body, doc.toc, doc.excerpt
370
- }
371
- ```
372
-
373
- #### `.count()`
374
-
375
- Returns `Promise<number>` — the number of matching items (no body loaded).
376
-
377
- ```ts
378
- const total = await queryContent().count()
379
- ```
380
-
381
- ### Using with a page loader (SSR/SSG)
382
-
383
- ```ts
384
- component('page-blog', () => {
385
- const ssrData = usePageData<{ posts: ContentMeta[] }>()
386
- const posts = ref<ContentMeta[]>(ssrData?.posts ?? [])
387
-
388
- useOnConnected(async () => {
389
- if (ssrData) return // already hydrated from loader
390
- posts.value = await queryContent('/blog').sortBy('date', 'desc').find()
391
- })
392
-
393
- return html`...`
394
- })
395
-
396
- export const loader = async () => {
397
- const posts = await queryContent('/blog').sortBy('date', 'desc').find()
398
- return { posts }
399
- }
400
- ```
401
-
402
- ### Common pattern: catch-all content route
403
-
404
- Content-driven apps often use a catch-all page to resolve the current URL to a content document.
405
-
406
- ```ts
407
- // app/pages/[...all].ts
408
- component('page-all', () => {
409
- const props = useProps({ all: '' })
410
- const ssrData = usePageData<{ doc: ContentItem | null }>()
411
- const doc = ref<ContentItem | null>(ssrData?.doc ?? null)
412
-
413
- const contentPath = normalizeContentPath(props.all)
414
-
415
- useHead({
416
- title: doc.value?.title ?? 'Not found',
417
- meta: doc.value?.description
418
- ? [{ name: 'description', content: doc.value.description }]
419
- : [],
420
- })
421
-
422
- useOnConnected(async () => {
423
- if (ssrData) return
424
- doc.value = await queryContent(contentPath).first()
425
- })
426
-
427
- return html`
428
- <article class="prose">
429
- ${
430
- !doc.value
431
- ? html`
432
- <h1>404</h1>
433
- <p>No content found for <code>${contentPath}</code>.</p>
434
- `
435
- : doc.value._type === 'json'
436
- ? html`
437
- <h1>${doc.value.title ?? contentPath}</h1>
438
- <pre>${doc.value.body}</pre>
439
- `
440
- : html`
441
- <h1>${doc.value.title ?? contentPath}</h1>
442
- ${doc.value.description ? html`<p>${doc.value.description}</p>` : ''}
443
- ${unsafeHTML(doc.value.body)}
444
- `
445
- }
446
- </article>
447
- `
448
- })
449
-
450
- export const loader = async ({ params }) => {
451
- const contentPath = normalizeContentPath(params.all)
452
- const doc = await queryContent(contentPath).first()
453
- return { doc }
454
- }
455
-
456
- function normalizeContentPath(all: string | undefined) {
457
- const slug = String(all ?? '').replace(/^\/+|\/+$/g, '')
458
- return slug ? `/${slug}` : '/'
459
- }
460
- ```
461
-
462
- This pattern works well for documentation sites, blogs, and other apps where the route structure mirrors the `content/` directory. `queryContent('/docs/getting-started').first()` returns the full `ContentItem`, including `body`, `excerpt`, and `toc`.
463
-
464
- Important behavior notes:
465
-
466
- - A content-backed `[...all].ts` route is not treated as a framework 404 by default. If `queryContent()` finds a matching document, SSR/SSG responses stay HTTP 200.
467
- - If no document is found and you want a real HTTP 404, throw a not-found error from the loader instead of only rendering a `404` heading in the template.
468
- - In SSG with `ssg.routes: 'auto'`, catch-all pages that use `queryContent()` can auto-generate concrete output paths from the content store. You only need `meta.ssg.paths` when the URLs come from some other source.
469
-
470
- ---
471
-
472
- ## `useContentSearch()`
473
-
474
- **Auto-imported** in pages, layouts, and components.
475
-
476
- Returns reactive `query`, `results`, and `loading` refs. The MiniSearch index is loaded lazily the first time the component mounts (pre-warmed via `useOnConnected`) and cached for the lifetime of the session. Input is debounced (200 ms) so the index is not queried on every keystroke.
477
-
478
- ```ts
479
- const { query, results, loading } = useContentSearch()
480
- ```
481
-
482
- ### Return value
483
-
484
- ```ts
485
- interface UseContentSearchReturn {
486
- query: Ref<string> // bind with :model or @input
487
- results: Ref<ContentSearchResult[]> // reactive search results
488
- loading: Ref<boolean> // true from first keystroke until results arrive
489
- }
490
- ```
491
-
492
- ### Usage
493
-
494
- ```ts
495
- component('page-search', () => {
496
- const { query, results, loading } = useContentSearch()
497
-
498
- return html`
499
- <input type="search" :model="${query}" placeholder="Search…" />
500
- ${loading.value ? html`<p>Searching…</p>` : ''}
501
- <ul>
502
- ${each(results.value, r => html`
503
- <li><a :href="${r._path}">${r.title}</a></li>
504
- `)}
505
- </ul>
506
- `
507
- })
508
- ```
509
-
510
- `loading` becomes `true` as soon as the user types anything and returns to `false` once results arrive or the query is cleared. An empty query clears results immediately without waiting for the debounce. Search is always client-side — in SSR mode the component renders with empty results and hydrates on mount.
511
-
512
- ### Searched fields
513
-
514
- The MiniSearch index is built over `title` and `description`. The stored fields (`_path`, `title`, `description`) are returned in each result.
515
-
516
- ---
517
-
518
- ## Rendering modes
519
-
520
- ### SPA mode
521
-
522
- On the client, `queryContent()` lazily fetches `/_content/manifest.json` (all `ContentMeta` items) and caches it. Individual full documents (`ContentItem`) are fetched from `/_content/[path].json` on demand (once each, cached).
523
-
524
- ### SSR mode
525
-
526
- In dev mode, `queryContent()` reads synchronously from the in-memory `globalThis.__CER_CONTENT_STORE__` array populated by the Vite plugin's `buildStart` hook. No filesystem or network access is needed per request.
527
-
528
- At production runtime, `__CER_CONTENT_STORE__` is absent — `buildStart` is a build-time hook that does not run at production server startup. The `ContentClient` always falls back to reading `dist/_content/` files via `node:fs`. The manifest and individual documents are cached as module-level singletons, so each file is read and parsed at most once per process lifetime.
529
-
530
- ### SSG mode
531
-
532
- During pre-rendering (`cer-app build --mode ssg`), `queryContent()` reads from `globalThis.__CER_CONTENT_STORE__` just like SSR. After all pages are rendered, the `closeBundle` hook writes the content manifest, individual document JSON files, and search index to `dist/_content/`.
533
-
534
- ---
535
-
536
- ## Search index
537
-
538
- At build time, a `dist/_content/search-index.json` file is written. It is the serialized MiniSearch index for all non-draft content items. The client fetches this file the first time `useContentSearch()` activates a search.
539
-
540
- In dev mode, `/_content/search-index.json` is served from the in-memory store by the dev middleware — no file is written to disk.
541
-
542
- ---
543
-
544
- ## Dev server
545
-
546
- In dev mode, the Vite dev server intercepts all `/_content/*` requests:
547
-
548
- | URL pattern | Response |
549
- |---|---|
550
- | `/_content/manifest.json` | JSON array of all `ContentMeta` items |
551
- | `/_content/search-index.json` | Serialized MiniSearch index |
552
- | `/_content/[path].json` | Full `ContentItem` for `_path === path` |
553
-
554
- Content files are watched for changes. When a Markdown or JSON file in `content/` changes, the store is re-populated and a full-reload HMR event is dispatched to the client.
555
-
556
- ---
557
-
558
- ## Limitations
559
-
560
- - **No aggregation** — `.count()` is the only aggregation terminal. Use `.find()` + `Array.prototype.length` for anything more complex.
561
- - **Search fields only** — MiniSearch is configured to index `title` and `description`. Full-body search is not supported.
562
- - **Content directory is fixed at build time** — changing `content.dir` at runtime has no effect.
563
-
564
- ---
565
-
566
- ## Known edge cases
567
-
568
- - Filenames with multiple `YYYY-MM-DD-` date prefixes have only the leading prefix stripped.
569
- - Markdown files with no headings have an empty `toc` array.
570
- - JSON files with invalid JSON are skipped and a warning is logged to the console. The build continues without that file.