@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/cli.md DELETED
@@ -1,324 +0,0 @@
1
- # CLI Reference
2
-
3
- The framework provides two CLI programs:
4
-
5
- - **`cer-app`** — dev server, build, preview, and generate commands
6
- - **`create-cer-app`** — project scaffolding
7
-
8
- Both are available after installing `@jasonshimmy/vite-plugin-cer-app` as a dev dependency, or globally:
9
-
10
- ```sh
11
- npm install -g @jasonshimmy/vite-plugin-cer-app
12
- ```
13
-
14
- ---
15
-
16
- ## `cer-app`
17
-
18
- ### `cer-app dev`
19
-
20
- Starts the Vite development server. Reads `cer.config.ts` from the current directory.
21
-
22
- ```sh
23
- cer-app dev [options]
24
- ```
25
-
26
- | Option | Default | Description |
27
- |---|---|---|
28
- | `-p, --port <port>` | `3000` | Port to listen on |
29
- | `--host <host>` | `localhost` | Host to bind to |
30
- | `--root <root>` | `process.cwd()` | Project root directory |
31
-
32
- **Examples:**
33
-
34
- ```sh
35
- cer-app dev
36
- cer-app dev --port 4000
37
- cer-app dev --host 0.0.0.0 --port 8080
38
- cer-app dev --root ./packages/my-app
39
- ```
40
-
41
- **Behavior:**
42
-
43
- - Loads and transpiles `cer.config.ts` (or `cer.config.js`)
44
- - Starts the Vite dev server with `cerApp()` plugins applied
45
- - In SSR mode: intercepts HTML requests and renders server-side
46
- - In SPA mode: standard Vite HMR
47
- - Watches `app/` and `server/` directories; full-reloads when pages or components are added/removed
48
- - Responds to `SIGTERM` and `SIGINT` with graceful shutdown
49
-
50
- ---
51
-
52
- ### `cer-app build`
53
-
54
- Builds the application for production.
55
-
56
- ```sh
57
- cer-app build [options]
58
- ```
59
-
60
- | Option | Default | Description |
61
- |---|---|---|
62
- | `--root <root>` | `process.cwd()` | Project root directory |
63
- | `--mode <mode>` | From `cer.config.ts` | Override rendering mode: `spa`, `ssr`, or `ssg` |
64
-
65
- **Examples:**
66
-
67
- ```sh
68
- cer-app build
69
- cer-app build --mode ssr
70
- cer-app build --mode ssg
71
- cer-app build --root ./packages/my-app
72
- ```
73
-
74
- **Per-mode behavior:**
75
-
76
- | Mode | Actions |
77
- |---|---|
78
- | `spa` | Standard `vite build` to `dist/` |
79
- | `ssr` | Dual build: client bundle to `dist/client/`, server bundle to `dist/server/server.js` |
80
- | `ssg` | Dual build + enumerate routes + render all paths to `dist/<path>/index.html` |
81
-
82
- ---
83
-
84
- ### `cer-app preview`
85
-
86
- Serves the production build locally.
87
-
88
- ```sh
89
- cer-app preview [options]
90
- ```
91
-
92
- | Option | Default | Description |
93
- |---|---|---|
94
- | `-p, --port <port>` | `4173` | Port to listen on |
95
- | `--host <host>` | `localhost` | Host to bind to |
96
- | `--root <root>` | `process.cwd()` | Project root directory |
97
- | `--ssr` | Auto-detected | Load `dist/server/server.js` as the request handler |
98
-
99
- **Examples:**
100
-
101
- ```sh
102
- cer-app preview # SPA/SSG static file server
103
- cer-app preview --ssr # SSR server using dist/server/server.js
104
- cer-app preview --port 8080
105
- ```
106
-
107
- **Behavior:**
108
-
109
- - If `dist/server/server.js` exists (or `--ssr` is passed), starts an SSR preview server
110
- - Static assets from `dist/client/` are served first; HTML requests fall through to the SSR handler
111
- - Otherwise, starts a static file server with SPA fallback (serves `index.html` for unknown paths)
112
- - Returns 404 for paths not found in `dist/` (static mode only)
113
- - **Path traversal protection:** all file requests are validated against the `dist/` root — requests attempting to escape it (e.g. `GET /../../../../etc/passwd`) receive a `400` response
114
- - **Security headers:** every response includes `X-Content-Type-Options: nosniff`, `X-Frame-Options: DENY`, and `Referrer-Policy: strict-origin-when-cross-origin`
115
- - **Smart Cache-Control:** Vite content-hashes assets placed in `/assets/` — these are served with `Cache-Control: public, max-age=31536000, immutable`. All other files (HTML, etc.) use `Cache-Control: no-cache` so browsers always revalidate
116
- - **Graceful shutdown:** on `SIGTERM` or `SIGINT`, the server stops accepting new connections and waits for in-flight requests to finish before exiting. A 10-second timeout triggers a forced exit if connections do not drain
117
- - **Request timeouts:** `headersTimeout` (10 s) aborts connections that stall while sending headers; `requestTimeout` (30 s) limits the total time allowed per request/response cycle, protecting against slow-client attacks
118
-
119
- ---
120
-
121
- ### `cer-app generate`
122
-
123
- Runs the SSG build pipeline. Alias for `cer-app build --mode ssg`.
124
-
125
- ```sh
126
- cer-app generate [options]
127
- ```
128
-
129
- | Option | Default | Description |
130
- |---|---|---|
131
- | `--root <root>` | `process.cwd()` | Project root directory |
132
-
133
- **Example:**
134
-
135
- ```sh
136
- cer-app generate
137
- ```
138
-
139
- **Output:**
140
-
141
- ```
142
- dist/
143
- index.html
144
- about/index.html
145
- blog/
146
- hello-world/index.html
147
- ssg-manifest.json
148
- ```
149
-
150
- ---
151
-
152
- ### `cer-app adapt`
153
-
154
- Adapts the production build for a deployment platform.
155
-
156
- Run this after `cer-app build` to produce the platform-specific output alongside `dist/`.
157
- You can also configure `adapter` in `cer.config.ts` so the adapter runs automatically at the end of every build.
158
-
159
- ```sh
160
- cer-app adapt [options]
161
- ```
162
-
163
- | Option | Default | Description |
164
- |---|---|---|
165
- | `--platform <platform>` | *(required)* | Target platform: `vercel`, `netlify`, or `cloudflare` |
166
- | `--root <root>` | `process.cwd()` | Project root directory |
167
-
168
- **Examples:**
169
-
170
- ```sh
171
- cer-app adapt --platform vercel
172
- cer-app adapt --platform netlify
173
- cer-app adapt --platform cloudflare
174
- cer-app adapt --platform vercel --root ./packages/my-app
175
- ```
176
-
177
- **Vercel behavior (`--platform vercel`):**
178
-
179
- - Writes `.vercel/output/` following the [Vercel Build Output API v3](https://vercel.com/docs/build-output-api/v3).
180
- - SSR builds: creates a Node.js Serverless Function at `.vercel/output/functions/index.func/` that routes `/api/*` to the exported API handlers and passes everything else to the SSR handler. Content-hashed assets are copied to `.vercel/output/static/` for CDN delivery.
181
- - SPA/SSG builds: copies static files to `.vercel/output/static/` with a SPA fallback route.
182
- - Deploy with `vercel deploy --prebuilt`.
183
-
184
- **Netlify behavior (`--platform netlify`):**
185
-
186
- - Writes `netlify/functions/ssr.mjs` — a Netlify Functions v2 bridge that converts the Web `Request`/`Response` API to the Node.js-style handler used by the server bundle. Handles `/api/*` routing inline.
187
- - Copies content-hashed assets to `.netlify/publish/` (no `index.html` — HTML is served by the function).
188
- - Writes `netlify.toml` with the publish directory, `Cache-Control` headers for assets, and a catch-all redirect to the SSR function.
189
- - SPA/SSG builds: writes `netlify.toml` only (no function needed).
190
- - SSR responses are streamed via the Web Streams `TransformStream` API — HTML chunks are forwarded to the client as they are written rather than waiting for the full page to render.
191
- - Deploy with `netlify deploy`.
192
-
193
- **Cloudflare behavior (`--platform cloudflare`):**
194
-
195
- - Writes `dist/_worker.js` — a Cloudflare Pages [Advanced Mode](https://developers.cloudflare.com/pages/functions/advanced-mode/) worker. The client HTML template is inlined in the worker as a string constant so `node:fs` is never needed at runtime.
196
- - Requires the `nodejs_compat` compatibility flag (written automatically into `wrangler.toml`) for `AsyncLocalStorage` and `node:stream` support.
197
- - Copies content-hashed assets to `dist/` alongside the worker. Cloudflare Pages CDN serves matched static files first; all other requests fall through to `_worker.js`.
198
- - SPA/SSG builds: no worker generated — Cloudflare Pages serves `dist/` as a static site.
199
- - SSR responses are streamed via the Web Streams `TransformStream` API — HTML chunks are forwarded to the client as they are written rather than waiting for the full page to render.
200
- - Deploy with `wrangler pages deploy dist`.
201
-
202
- **Auto-run via `cer.config.ts`:**
203
-
204
- ```ts
205
- // cer.config.ts — built-in adapter
206
- export default defineConfig({
207
- mode: 'ssr',
208
- adapter: 'vercel', // 'vercel' | 'netlify' | 'cloudflare'
209
- })
210
- ```
211
-
212
- ```ts
213
- // cer.config.ts — custom adapter (Railway, Fly.io, bare Node.js, Docker, …)
214
- export default defineConfig({
215
- mode: 'ssr',
216
- adapter: async (root) => {
217
- const { cp, mkdir } = await import('node:fs/promises')
218
- await mkdir(`${root}/deploy`, { recursive: true })
219
- await cp(`${root}/dist`, `${root}/deploy/dist`, { recursive: true })
220
- },
221
- })
222
- ```
223
-
224
- Pass `--platform custom` to `cer-app adapt` to run a function adapter without re-building:
225
-
226
- ```sh
227
- cer-app adapt --platform custom
228
- ```
229
-
230
- See [`adapter` in configuration.md](./configuration.md#adapter) for the full options reference.
231
-
232
- ---
233
-
234
- ## `create-cer-app`
235
-
236
- Scaffolds a new project from a template.
237
-
238
- > **Note:** Because the scaffolder is bundled inside `@jasonshimmy/vite-plugin-cer-app` rather than published as a standalone `create-cer-app` package, you must use the `--package` flag with `npx`:
239
- >
240
- > ```sh
241
- > npx --package @jasonshimmy/vite-plugin-cer-app create-cer-app [project-name] [options]
242
- > ```
243
-
244
- | Argument / Option | Description |
245
- |---|---|
246
- | `[project-name]` | Name of the project (also used as the output directory) |
247
- | `--mode <mode>` | Rendering mode: `spa`, `ssr`, or `ssg` (skips interactive prompt) |
248
- | `--dir <dir>` | Output directory (defaults to `project-name`) |
249
-
250
- **Examples:**
251
-
252
- ```sh
253
- npx --package @jasonshimmy/vite-plugin-cer-app create-cer-app # interactive prompts
254
- npx --package @jasonshimmy/vite-plugin-cer-app create-cer-app my-app # prompts for mode
255
- npx --package @jasonshimmy/vite-plugin-cer-app create-cer-app my-app --mode ssr # no prompts
256
- npx --package @jasonshimmy/vite-plugin-cer-app create-cer-app my-blog --mode ssg --dir ./sites/blog
257
- ```
258
-
259
- **Scaffolded files (all modes):**
260
-
261
- ```
262
- my-app/
263
- app/
264
- app.ts ← framework bootstrap (router, plugins, layout shell)
265
- pages/index.ts
266
- layouts/default.ts
267
- index.html
268
- cer.config.ts
269
- package.json
270
- ```
271
-
272
- **Per-mode differences:**
273
-
274
- | Mode | `cer.config.ts` | `package.json` scripts |
275
- |---|---|---|
276
- | SPA | `mode: 'spa'` | `dev`, `build`, `preview` |
277
- | SSR | `mode: 'ssr'` | `dev`, `build`, `preview --ssr` |
278
- | SSG | `mode: 'ssg'`, `ssg.routes: 'auto'` | `dev`, `build`, `preview`, `generate` |
279
-
280
- ---
281
-
282
- ## Config file loading
283
-
284
- Both `cer-app dev` and `cer-app build` load `cer.config.ts` by:
285
-
286
- 1. Bundling it with Vite into a temporary `.mjs` file in `node_modules/.cer-app-cache/`
287
- 2. Dynamically importing the result
288
-
289
- This allows TypeScript syntax in `cer.config.ts` with full type checking. The cached bundle is regenerated on every CLI invocation.
290
-
291
- If no `cer.config.ts` or `cer.config.js` is found, defaults are used and a warning is printed.
292
-
293
- ---
294
-
295
- ## Using with `npm run`
296
-
297
- After scaffolding, scripts are already set up in `package.json`:
298
-
299
- ```json
300
- {
301
- "scripts": {
302
- "dev": "cer-app dev",
303
- "build": "cer-app build",
304
- "preview": "cer-app preview",
305
- "generate": "cer-app generate"
306
- }
307
- }
308
- ```
309
-
310
- ```sh
311
- npm run dev
312
- npm run build
313
- npm run preview
314
- ```
315
-
316
- ---
317
-
318
- ## Using with `npx` (no global install)
319
-
320
- ```sh
321
- npx cer-app dev
322
- npx cer-app build
323
- npx --package @jasonshimmy/vite-plugin-cer-app create-cer-app my-app
324
- ```
@@ -1,237 +0,0 @@
1
- # Components
2
-
3
- Files in `app/components/` are automatically registered as custom elements and available throughout the application — no explicit import required.
4
-
5
- ---
6
-
7
- ## Creating a component
8
-
9
- ```ts
10
- // app/components/ui/my-button.ts
11
- component('my-button', () => {
12
- const props = useProps({ label: 'Click me', disabled: false })
13
-
14
- return html`
15
- <button :disabled="${props.disabled}">
16
- ${props.label}
17
- </button>
18
- `
19
- })
20
- ```
21
-
22
- Use it in any page or layout:
23
-
24
- ```ts
25
- // app/pages/index.ts
26
- component('page-index', () => {
27
- return html`
28
- <div>
29
- <my-button label="Submit"></my-button>
30
- </div>
31
- `
32
- })
33
- ```
34
-
35
- No import is needed. The framework scans each file's `html\`` templates and injects static `import` statements automatically.
36
-
37
- ---
38
-
39
- ## File → tag name
40
-
41
- The tag name is derived from the file path relative to `app/components/`, with path separators replaced by dashes. The file must call `component()` with the matching tag name.
42
-
43
- | File | Expected tag name |
44
- |---|---|
45
- | `app/components/my-button.ts` | `my-button` |
46
- | `app/components/ui/card.ts` | `ui-card` (or any name — tag name is from the `component()` call, not the path) |
47
- | `app/components/forms/text-input.ts` | `forms-text-input` |
48
-
49
- > **Note:** The tag name comes from the `component('tag-name', …)` call inside the file — the file path does not enforce a specific tag name.
50
-
51
- ---
52
-
53
- ## Code splitting
54
-
55
- Components are automatically code-split per page. Only the components a given page actually uses are loaded when that page is visited.
56
-
57
- The framework's build plugin (`cerComponentImports`) scans each page, layout, and component file for custom element tags in `html\`` template literals. For every tag it finds, it injects a static `import` at the top of that file pointing to the component's source file. Rollup then uses these graph edges to split components into the chunk for the page that uses them.
58
-
59
- **Example:** A project with 500 components where `/home` uses `<ks-badge>` and `/about` uses nothing will produce:
60
-
61
- - `home` chunk: includes `ks-badge.ts` + transitive deps
62
- - `about` chunk: does not include any component files
63
-
64
- Transitive dependencies are handled automatically: if `ks-card` uses `<ks-badge>` in its own template, the transform injects a `ks-badge` import into `ks-card.ts`, and Rollup traces the full dependency graph.
65
-
66
- **Components used in layouts** load eagerly by design. Since layouts are imported for every route, their component imports are always included in the initial bundle.
67
-
68
- ---
69
-
70
- ## Auto-import behavior
71
-
72
- When `autoImports.components` is `true` (the default), the framework's Vite transform hook:
73
-
74
- 1. Builds a manifest mapping tag names → source files by scanning `app/components/`
75
- 2. Transforms each page, layout, and component file: reads its `html\`` templates, extracts custom element tag names, and prepends static `import` statements for the matching source files
76
- 3. Rollup uses these imports as graph edges for automatic chunk splitting
77
-
78
- No generated virtual module is involved. Component registration is purely driven by the module graph.
79
-
80
- ---
81
-
82
- ## Opting out
83
-
84
- If you need to manage component registration manually, set `autoImports.components: false` in `cer.config.ts` and import components explicitly:
85
-
86
- ```ts
87
- // cer.config.ts
88
- export default defineConfig({
89
- autoImports: { components: false },
90
- })
91
- ```
92
-
93
- ```ts
94
- // app/plugins/components.ts — import from a plugin so they register before the first render
95
- import '../components/ui/my-button.ts'
96
- import '../components/forms/text-input.ts'
97
- ```
98
-
99
- ---
100
-
101
- ## Runtime auto-imports inside component files
102
-
103
- Files in `app/components/` also benefit from `autoImports.runtime`. When `runtime: true` (the default), `component`, `html`, `ref`, `useProps`, `useEmit`, and all other runtime identifiers are injected automatically at the top of each component file if they are used.
104
-
105
- This means you can write:
106
-
107
- ```ts
108
- // app/components/my-counter.ts
109
- component('my-counter', () => {
110
- const count = ref(0)
111
- return html`
112
- <button @click="${() => count.value++}">Count: ${count}</button>
113
- `
114
- })
115
- ```
116
-
117
- Without needing to add:
118
-
119
- ```ts
120
- import { component, html, ref } from '@jasonshimmy/custom-elements-runtime'
121
- ```
122
-
123
- ---
124
-
125
- ## Accessing slot content with `useSlots()`
126
-
127
- Use `useSlots()` inside a component's render function to read the content passed to named or default slots:
128
-
129
- ```ts
130
- // app/components/ui-badge.ts
131
- component('ui-badge', () => {
132
- const slots = useSlots()
133
-
134
- return html`
135
- <span class="badge">
136
- ${slots.default ?? 'badge'}
137
- </span>
138
- `
139
- })
140
- ```
141
-
142
- Usage in a page:
143
-
144
- ```ts
145
- // app/pages/index.ts
146
- component('page-index', () => {
147
- return html`
148
- <ui-badge>v1.0.0</ui-badge>
149
- <ui-badge>beta</ui-badge>
150
- `
151
- })
152
- ```
153
-
154
- `slots.default` contains the light-DOM children passed to the component. Named slots are accessed by their slot name:
155
-
156
- ```ts
157
- // app/components/app-card.ts
158
- component('app-card', () => {
159
- const slots = useSlots()
160
-
161
- return html`
162
- <div class="card">
163
- <header>${slots.header}</header>
164
- <main>${slots.default}</main>
165
- <footer>${slots.footer}</footer>
166
- </div>
167
- `
168
- })
169
- ```
170
-
171
- ```html
172
- <!-- usage -->
173
- <app-card>
174
- <span slot="header">Title</span>
175
- Body content goes here
176
- <span slot="footer">Footer</span>
177
- </app-card>
178
- ```
179
-
180
- ---
181
-
182
- ## `defineAsyncComponent`
183
-
184
- `defineAsyncComponent` registers a custom element whose implementation is loaded asynchronously. Use it for heavy components that should not block the initial render.
185
-
186
- ```ts
187
- defineAsyncComponent(
188
- 'ks-chart',
189
- () => import('./chart-impl').then(m => m.render), // returns a render fn
190
- {
191
- loading: () => html`<p>Loading chart…</p>`, // shown while loading
192
- error: () => html`<p>Failed to load chart.</p>`, // shown on rejection
193
- timeout: 5000, // ms before showing error (optional)
194
- },
195
- )
196
- ```
197
-
198
- The element transitions through four states:
199
-
200
- | State | Description |
201
- |---|---|
202
- | `loading` | Loader promise is pending. The `loading` template is rendered if provided. |
203
- | `resolved` | Loader resolved. The returned render function is called and its output is rendered. |
204
- | `error` | Loader rejected or timeout exceeded. The `error` template is rendered if provided. |
205
- | `idle` | No loader started yet (element connected before the loader is called). |
206
-
207
- **Loader return value:** The promise must resolve with a render function `() => TemplateResult | string`. The render function is called inside the component's normal reactive context — `useProps`, `ref`, etc. are available.
208
-
209
- **Timeout:** If `timeout` is set and the loader does not resolve within that many milliseconds, the state moves to `error` and the `error` template is rendered.
210
-
211
- **Options:**
212
-
213
- ```ts
214
- interface AsyncComponentOptions {
215
- loading?: () => TemplateResult | string // rendered while pending
216
- error?: () => TemplateResult | string // rendered on failure
217
- timeout?: number // milliseconds before treating as error
218
- }
219
- ```
220
-
221
- `defineAsyncComponent` is auto-imported — no import statement is needed in files under `app/`.
222
-
223
- If you need it outside auto-imported directories:
224
-
225
- ```ts
226
- import { defineAsyncComponent } from '@jasonshimmy/custom-elements-runtime'
227
- ```
228
-
229
- ---
230
-
231
- ## HMR
232
-
233
- Changes to a component file's render logic trigger standard Vite HMR — no full reload required, because the static import edge is already in Vite's module graph.
234
-
235
- If a component file's registered tag name changes (e.g. the `component('old-name', …)` call is edited to `component('new-name', …)`), the framework detects the manifest change and sends a full-reload so all pages pick up the updated import graph.
236
-
237
- When a new component file is added to `app/components/`, the manifest is updated synchronously via `watchChange`, and a full reload is triggered so the new tag becomes available.