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

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