@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.
- package/dist/cli/checks/lighthouse.d.ts +26 -0
- package/dist/cli/checks/lighthouse.d.ts.map +1 -0
- package/dist/cli/checks/lighthouse.js +121 -0
- package/dist/cli/checks/lighthouse.js.map +1 -0
- package/dist/cli/checks/links.d.ts +12 -0
- package/dist/cli/checks/links.d.ts.map +1 -0
- package/dist/cli/checks/links.js +89 -0
- package/dist/cli/checks/links.js.map +1 -0
- package/dist/cli/checks/performance.d.ts +17 -0
- package/dist/cli/checks/performance.d.ts.map +1 -0
- package/dist/cli/checks/performance.js +61 -0
- package/dist/cli/checks/performance.js.map +1 -0
- package/dist/cli/commands/check.d.ts +3 -0
- package/dist/cli/commands/check.d.ts.map +1 -0
- package/dist/cli/commands/check.js +85 -0
- package/dist/cli/commands/check.js.map +1 -0
- package/dist/cli/create/index.d.ts +11 -1
- package/dist/cli/create/index.d.ts.map +1 -1
- package/dist/cli/create/index.js +135 -65
- package/dist/cli/create/index.js.map +1 -1
- package/dist/cli/create/templates/spa/package.json.tpl +5 -3
- package/dist/cli/create/templates/ssg/cer.config.ts.tpl +2 -0
- package/dist/cli/create/templates/ssg/package.json.tpl +5 -3
- package/dist/cli/create/templates/ssr/package.json.tpl +5 -3
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/plugin/build-ssg.d.ts +22 -6
- package/dist/plugin/build-ssg.d.ts.map +1 -1
- package/dist/plugin/build-ssg.js +227 -17
- package/dist/plugin/build-ssg.js.map +1 -1
- package/dist/plugin/content/parser.d.ts.map +1 -1
- package/dist/plugin/content/parser.js +54 -10
- package/dist/plugin/content/parser.js.map +1 -1
- package/dist/plugin/dev-server.d.ts +4 -1
- package/dist/plugin/dev-server.d.ts.map +1 -1
- package/dist/plugin/dev-server.js.map +1 -1
- package/dist/plugin/dts-generator.d.ts.map +1 -1
- package/dist/plugin/dts-generator.js +50 -8
- package/dist/plugin/dts-generator.js.map +1 -1
- package/dist/plugin/generated-dir.d.ts +2 -0
- package/dist/plugin/generated-dir.d.ts.map +1 -1
- package/dist/plugin/generated-dir.js +17 -6
- package/dist/plugin/generated-dir.js.map +1 -1
- package/dist/plugin/html-post-process.d.ts +6 -0
- package/dist/plugin/html-post-process.d.ts.map +1 -1
- package/dist/plugin/html-post-process.js +24 -0
- package/dist/plugin/html-post-process.js.map +1 -1
- package/dist/plugin/index.d.ts.map +1 -1
- package/dist/plugin/index.js +60 -13
- package/dist/plugin/index.js.map +1 -1
- package/dist/plugin/transforms/auto-import.d.ts.map +1 -1
- package/dist/plugin/transforms/auto-import.js +7 -0
- package/dist/plugin/transforms/auto-import.js.map +1 -1
- package/dist/plugin/transforms/prune-runtime-css.d.ts +8 -0
- package/dist/plugin/transforms/prune-runtime-css.d.ts.map +1 -0
- package/dist/plugin/transforms/prune-runtime-css.js +40 -0
- package/dist/plugin/transforms/prune-runtime-css.js.map +1 -0
- package/dist/runtime/app-template.d.ts +1 -1
- package/dist/runtime/app-template.d.ts.map +1 -1
- package/dist/runtime/app-template.js +206 -36
- package/dist/runtime/app-template.js.map +1 -1
- package/dist/runtime/composables/index.d.ts +4 -0
- package/dist/runtime/composables/index.d.ts.map +1 -1
- package/dist/runtime/composables/index.js +2 -0
- package/dist/runtime/composables/index.js.map +1 -1
- package/dist/runtime/composables/use-active-headings.d.ts +24 -0
- package/dist/runtime/composables/use-active-headings.d.ts.map +1 -0
- package/dist/runtime/composables/use-active-headings.js +112 -0
- package/dist/runtime/composables/use-active-headings.js.map +1 -0
- package/dist/runtime/composables/use-content-page.d.ts +45 -0
- package/dist/runtime/composables/use-content-page.d.ts.map +1 -0
- package/dist/runtime/composables/use-content-page.js +179 -0
- package/dist/runtime/composables/use-content-page.js.map +1 -0
- package/dist/runtime/composables/use-content-search.d.ts.map +1 -1
- package/dist/runtime/composables/use-content-search.js +1 -5
- package/dist/runtime/composables/use-content-search.js.map +1 -1
- package/dist/runtime/composables/use-fetch.d.ts +2 -1
- package/dist/runtime/composables/use-fetch.d.ts.map +1 -1
- package/dist/runtime/composables/use-fetch.js +112 -43
- package/dist/runtime/composables/use-fetch.js.map +1 -1
- package/dist/runtime/composables/use-route.d.ts.map +1 -1
- package/dist/runtime/composables/use-route.js +39 -11
- package/dist/runtime/composables/use-route.js.map +1 -1
- package/dist/runtime/content/client.js +2 -2
- package/dist/runtime/content/client.js.map +1 -1
- package/dist/runtime/entry-server-template.d.ts +16 -1
- package/dist/runtime/entry-server-template.d.ts.map +1 -1
- package/dist/runtime/entry-server-template.js +120 -13
- package/dist/runtime/entry-server-template.js.map +1 -1
- package/dist/types/config.d.ts +45 -4
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/config.js.map +1 -1
- package/dist/types/middleware.d.ts +2 -2
- package/dist/types/middleware.d.ts.map +1 -1
- package/package.json +22 -19
- package/.github/copilot-instructions.md +0 -169
- package/.github/workflows/publish.yml +0 -257
- package/.nvmrc +0 -1
- package/CHANGELOG.md +0 -236
- package/CLAUDE.md +0 -113
- package/commits.txt +0 -1
- package/cypress.config.ts +0 -16
- package/docs/authentication.md +0 -285
- package/docs/cli.md +0 -324
- package/docs/components.md +0 -237
- package/docs/composables.md +0 -907
- package/docs/configuration.md +0 -696
- package/docs/content.md +0 -570
- package/docs/data-loading.md +0 -336
- package/docs/getting-started.md +0 -237
- package/docs/head-management.md +0 -212
- package/docs/i18n.md +0 -159
- package/docs/layouts.md +0 -224
- package/docs/middleware.md +0 -234
- package/docs/plugins.md +0 -170
- package/docs/rendering-modes.md +0 -377
- package/docs/routing.md +0 -485
- package/docs/server-api.md +0 -253
- package/docs/testing.md +0 -455
- package/docs/use-fetch.md +0 -183
- package/e2e/cypress/e2e/api.cy.ts +0 -123
- package/e2e/cypress/e2e/async-component.cy.ts +0 -27
- package/e2e/cypress/e2e/component-splitting.cy.ts +0 -50
- package/e2e/cypress/e2e/content.cy.ts +0 -425
- package/e2e/cypress/e2e/cookie.cy.ts +0 -85
- package/e2e/cypress/e2e/data.cy.ts +0 -158
- package/e2e/cypress/e2e/error-boundary.cy.ts +0 -88
- package/e2e/cypress/e2e/fouc.cy.ts +0 -254
- package/e2e/cypress/e2e/group-meta.cy.ts +0 -36
- package/e2e/cypress/e2e/head.cy.ts +0 -89
- package/e2e/cypress/e2e/i18n.cy.ts +0 -79
- package/e2e/cypress/e2e/interactive.cy.ts +0 -137
- package/e2e/cypress/e2e/isr-nested-runtime.cy.ts +0 -102
- package/e2e/cypress/e2e/jit-css-custom-colors.cy.ts +0 -43
- package/e2e/cypress/e2e/middleware-chain.cy.ts +0 -89
- package/e2e/cypress/e2e/middleware-status.cy.ts +0 -30
- package/e2e/cypress/e2e/middleware.cy.ts +0 -45
- package/e2e/cypress/e2e/navigate.cy.ts +0 -39
- package/e2e/cypress/e2e/observability.cy.ts +0 -77
- package/e2e/cypress/e2e/per-route-error.cy.ts +0 -42
- package/e2e/cypress/e2e/per-route-render.cy.ts +0 -70
- package/e2e/cypress/e2e/preview-hardening.cy.ts +0 -88
- package/e2e/cypress/e2e/routes.cy.ts +0 -128
- package/e2e/cypress/e2e/seo-meta.cy.ts +0 -108
- package/e2e/cypress/e2e/server-middleware.cy.ts +0 -46
- package/e2e/cypress/e2e/session-rotation.cy.ts +0 -25
- package/e2e/cypress/e2e/session.cy.ts +0 -73
- package/e2e/cypress/e2e/ssr-render-error.cy.ts +0 -68
- package/e2e/cypress/e2e/synthetic-404.cy.ts +0 -45
- package/e2e/cypress/e2e/use-page-data.cy.ts +0 -122
- package/e2e/cypress/e2e/use-state.cy.ts +0 -138
- package/e2e/cypress/support/commands.ts +0 -120
- package/e2e/cypress/support/e2e.ts +0 -10
- package/e2e/cypress/tsconfig.json +0 -14
- package/e2e/kitchen-sink/app/components/ks-badge.ts +0 -8
- package/e2e/kitchen-sink/app/composables/useKsCounter.ts +0 -9
- package/e2e/kitchen-sink/app/error.ts +0 -18
- package/e2e/kitchen-sink/app/layouts/admin.ts +0 -13
- package/e2e/kitchen-sink/app/layouts/default.ts +0 -25
- package/e2e/kitchen-sink/app/layouts/group.ts +0 -9
- package/e2e/kitchen-sink/app/layouts/minimal.ts +0 -7
- package/e2e/kitchen-sink/app/loading.ts +0 -9
- package/e2e/kitchen-sink/app/middleware/auth.ts +0 -9
- package/e2e/kitchen-sink/app/middleware/custom-log.ts +0 -4
- package/e2e/kitchen-sink/app/middleware/group-auth.ts +0 -7
- package/e2e/kitchen-sink/app/middleware/logger.ts +0 -14
- package/e2e/kitchen-sink/app/pages/(auth)/login.ts +0 -13
- package/e2e/kitchen-sink/app/pages/(auth)/protected.ts +0 -16
- package/e2e/kitchen-sink/app/pages/404.ts +0 -9
- package/e2e/kitchen-sink/app/pages/about.ts +0 -17
- package/e2e/kitchen-sink/app/pages/admin/_layout.ts +0 -1
- package/e2e/kitchen-sink/app/pages/admin/dashboard.ts +0 -11
- package/e2e/kitchen-sink/app/pages/async-component-error-test.ts +0 -18
- package/e2e/kitchen-sink/app/pages/async-component-test.ts +0 -18
- package/e2e/kitchen-sink/app/pages/blog/[slug].ts +0 -59
- package/e2e/kitchen-sink/app/pages/blog/index.ts +0 -51
- package/e2e/kitchen-sink/app/pages/content-blog.ts +0 -37
- package/e2e/kitchen-sink/app/pages/content-doc.ts +0 -42
- package/e2e/kitchen-sink/app/pages/content-fallback.ts +0 -36
- package/e2e/kitchen-sink/app/pages/content-guides.ts +0 -35
- package/e2e/kitchen-sink/app/pages/content-index.ts +0 -39
- package/e2e/kitchen-sink/app/pages/content-search.ts +0 -36
- package/e2e/kitchen-sink/app/pages/cookie-test.ts +0 -22
- package/e2e/kitchen-sink/app/pages/counter.ts +0 -17
- package/e2e/kitchen-sink/app/pages/group-auth-blocked.ts +0 -9
- package/e2e/kitchen-sink/app/pages/group-meta-test/_layout.ts +0 -6
- package/e2e/kitchen-sink/app/pages/group-meta-test/custom-mw.ts +0 -14
- package/e2e/kitchen-sink/app/pages/group-meta-test/page.ts +0 -9
- package/e2e/kitchen-sink/app/pages/group-meta-test/protected.ts +0 -8
- package/e2e/kitchen-sink/app/pages/head.ts +0 -20
- package/e2e/kitchen-sink/app/pages/i18n-test.ts +0 -14
- package/e2e/kitchen-sink/app/pages/index.ts +0 -27
- package/e2e/kitchen-sink/app/pages/isr-test.ts +0 -17
- package/e2e/kitchen-sink/app/pages/items/[id].ts +0 -20
- package/e2e/kitchen-sink/app/pages/jit-css-custom-colors-test.ts +0 -14
- package/e2e/kitchen-sink/app/pages/loader-error-test.ts +0 -13
- package/e2e/kitchen-sink/app/pages/loader-props-test.ts +0 -19
- package/e2e/kitchen-sink/app/pages/loader-response-error-test.ts +0 -13
- package/e2e/kitchen-sink/app/pages/middleware-chain-test.ts +0 -12
- package/e2e/kitchen-sink/app/pages/middleware-status-test.ts +0 -9
- package/e2e/kitchen-sink/app/pages/navigate-test.ts +0 -16
- package/e2e/kitchen-sink/app/pages/observability-test.ts +0 -25
- package/e2e/kitchen-sink/app/pages/per-route-error-test.error.ts +0 -13
- package/e2e/kitchen-sink/app/pages/per-route-error-test.ts +0 -15
- package/e2e/kitchen-sink/app/pages/plugin-dsd-test.ts +0 -10
- package/e2e/kitchen-sink/app/pages/render-error-test.ts +0 -12
- package/e2e/kitchen-sink/app/pages/render-server-test.ts +0 -12
- package/e2e/kitchen-sink/app/pages/render-spa-test.ts +0 -12
- package/e2e/kitchen-sink/app/pages/route-info.ts +0 -14
- package/e2e/kitchen-sink/app/pages/seo-test.ts +0 -23
- package/e2e/kitchen-sink/app/pages/session-rotation-test.ts +0 -25
- package/e2e/kitchen-sink/app/pages/use-state-test.ts +0 -37
- package/e2e/kitchen-sink/app/plugins/01.setup.ts +0 -7
- package/e2e/kitchen-sink/app/plugins/02.ks-plugin-components.ts +0 -27
- package/e2e/kitchen-sink/cer-auto-imports.d.ts +0 -51
- package/e2e/kitchen-sink/cer-env.d.ts +0 -35
- package/e2e/kitchen-sink/cer-tsconfig.json +0 -30
- package/e2e/kitchen-sink/cer.config.ts +0 -43
- package/e2e/kitchen-sink/content/01.guides/01.index.md +0 -8
- package/e2e/kitchen-sink/content/01.guides/02.intro.md +0 -8
- package/e2e/kitchen-sink/content/01.guides/10.advanced.md +0 -8
- package/e2e/kitchen-sink/content/blog/2026-04-01-hello.md +0 -26
- package/e2e/kitchen-sink/content/blog/2026-04-02-draft.md +0 -10
- package/e2e/kitchen-sink/content/blog/index.md +0 -8
- package/e2e/kitchen-sink/content/blog/no-frontmatter.md +0 -7
- package/e2e/kitchen-sink/content/docs/getting-started.md +0 -48
- package/e2e/kitchen-sink/content/index.md +0 -16
- package/e2e/kitchen-sink/server/api/echo.ts +0 -12
- package/e2e/kitchen-sink/server/api/health.ts +0 -3
- package/e2e/kitchen-sink/server/api/posts/[slug].ts +0 -11
- package/e2e/kitchen-sink/server/api/posts/index.ts +0 -5
- package/e2e/kitchen-sink/server/api/session.ts +0 -23
- package/e2e/kitchen-sink/server/data/posts.ts +0 -21
- package/e2e/kitchen-sink/server/middleware/01-headers.ts +0 -6
- package/e2e/kitchen-sink/server/middleware/02-status-test.ts +0 -10
- package/e2e/kitchen-sink/tsconfig.json +0 -3
- package/e2e/scripts/clean.mjs +0 -14
- package/eslint.config.ts +0 -22
- package/src/__tests__/cli/adapters/cloudflare-worker.integration.test.ts +0 -132
- package/src/__tests__/cli/adapters/cloudflare.test.ts +0 -332
- package/src/__tests__/cli/adapters/netlify-bridge.integration.test.ts +0 -139
- package/src/__tests__/cli/adapters/netlify.test.ts +0 -286
- package/src/__tests__/cli/adapters/vercel-launcher.integration.test.ts +0 -129
- package/src/__tests__/cli/adapters/vercel.test.ts +0 -263
- package/src/__tests__/cli/preview-hardening.test.ts +0 -265
- package/src/__tests__/cli/preview-isr.test.ts +0 -320
- package/src/__tests__/index.test.ts +0 -21
- package/src/__tests__/plugin/app-template.test.ts +0 -166
- package/src/__tests__/plugin/build-ssg-render.test.ts +0 -155
- package/src/__tests__/plugin/build-ssg.test.ts +0 -598
- package/src/__tests__/plugin/build-ssr.test.ts +0 -192
- package/src/__tests__/plugin/cer-app-plugin.test.ts +0 -552
- package/src/__tests__/plugin/content/emitter.test.ts +0 -117
- package/src/__tests__/plugin/content/loader.test.ts +0 -154
- package/src/__tests__/plugin/content/parser.test.ts +0 -381
- package/src/__tests__/plugin/content/path-utils.test.ts +0 -69
- package/src/__tests__/plugin/content/search.test.ts +0 -119
- package/src/__tests__/plugin/dev-server.test.ts +0 -813
- package/src/__tests__/plugin/dts-generator.test.ts +0 -394
- package/src/__tests__/plugin/entry-server-template.test.ts +0 -385
- package/src/__tests__/plugin/generated-dir.test.ts +0 -144
- package/src/__tests__/plugin/html-post-process.test.ts +0 -146
- package/src/__tests__/plugin/path-utils.test.ts +0 -411
- package/src/__tests__/plugin/resolve-config.test.ts +0 -233
- package/src/__tests__/plugin/scanner.test.ts +0 -186
- package/src/__tests__/plugin/transforms/auto-import.test.ts +0 -510
- package/src/__tests__/plugin/transforms/head-inject.test.ts +0 -178
- package/src/__tests__/plugin/virtual/composables.test.ts +0 -57
- package/src/__tests__/plugin/virtual/content-components.test.ts +0 -66
- package/src/__tests__/plugin/virtual/error.test.ts +0 -71
- package/src/__tests__/plugin/virtual/layouts.test.ts +0 -70
- package/src/__tests__/plugin/virtual/loading.test.ts +0 -72
- package/src/__tests__/plugin/virtual/middleware.test.ts +0 -83
- package/src/__tests__/plugin/virtual/plugins.test.ts +0 -129
- package/src/__tests__/plugin/virtual/routes.test.ts +0 -884
- package/src/__tests__/plugin/virtual/server-api.test.ts +0 -164
- package/src/__tests__/plugin/virtual/server-middleware.test.ts +0 -102
- package/src/__tests__/runtime/app-template.test.ts +0 -208
- package/src/__tests__/runtime/define-middleware.test.ts +0 -64
- package/src/__tests__/runtime/define-server-middleware.test.ts +0 -54
- package/src/__tests__/runtime/entry-client-template.test.ts +0 -61
- package/src/__tests__/runtime/isr-handler.test.ts +0 -338
- package/src/__tests__/runtime/oauth/handler.test.ts +0 -358
- package/src/__tests__/runtime/oauth/providers.test.ts +0 -47
- package/src/__tests__/runtime/oauth-index.test.ts +0 -43
- package/src/__tests__/runtime/use-auth.test.ts +0 -169
- package/src/__tests__/runtime/use-content-search-composable.test.ts +0 -405
- package/src/__tests__/runtime/use-content-search.test.ts +0 -163
- package/src/__tests__/runtime/use-content.test.ts +0 -226
- package/src/__tests__/runtime/use-cookie.test.ts +0 -277
- package/src/__tests__/runtime/use-fetch-component.test.ts +0 -214
- package/src/__tests__/runtime/use-fetch.test.ts +0 -377
- package/src/__tests__/runtime/use-head.test.ts +0 -311
- package/src/__tests__/runtime/use-inject-client.test.ts +0 -67
- package/src/__tests__/runtime/use-inject.test.ts +0 -66
- package/src/__tests__/runtime/use-locale.test.ts +0 -152
- package/src/__tests__/runtime/use-navigate.test.ts +0 -121
- package/src/__tests__/runtime/use-page-data.test.ts +0 -298
- package/src/__tests__/runtime/use-route.test.ts +0 -156
- package/src/__tests__/runtime/use-runtime-config.test.ts +0 -182
- package/src/__tests__/runtime/use-seo-meta.test.ts +0 -109
- package/src/__tests__/runtime/use-session.test.ts +0 -320
- package/src/__tests__/runtime/use-state.test.ts +0 -340
- package/src/__tests__/types/config.test.ts +0 -18
- package/src/cli/adapters/cloudflare.ts +0 -335
- package/src/cli/adapters/netlify.ts +0 -326
- package/src/cli/adapters/vercel.ts +0 -311
- package/src/cli/commands/adapt.ts +0 -84
- package/src/cli/commands/build.ts +0 -165
- package/src/cli/commands/dev.ts +0 -125
- package/src/cli/commands/generate.ts +0 -91
- package/src/cli/commands/preview-isr.ts +0 -172
- package/src/cli/commands/preview.ts +0 -523
- package/src/cli/create/index.ts +0 -275
- package/src/cli/create/templates/shared/.gitignore.tpl +0 -25
- package/src/cli/create/templates/shared/app/layouts/default.ts.tpl +0 -15
- package/src/cli/create/templates/shared/app/pages/index.ts.tpl +0 -8
- package/src/cli/create/templates/shared/index.html.tpl +0 -12
- package/src/cli/create/templates/shared/tsconfig.json.tpl +0 -6
- package/src/cli/create/templates/spa/cer.config.ts.tpl +0 -6
- package/src/cli/create/templates/spa/package.json.tpl +0 -18
- package/src/cli/create/templates/ssg/cer.config.ts.tpl +0 -10
- package/src/cli/create/templates/ssg/package.json.tpl +0 -19
- package/src/cli/create/templates/ssr/cer.config.ts.tpl +0 -6
- package/src/cli/create/templates/ssr/package.json.tpl +0 -18
- package/src/cli/index.ts +0 -22
- package/src/index.ts +0 -20
- package/src/plugin/build-ssg.ts +0 -403
- package/src/plugin/build-ssr.ts +0 -134
- package/src/plugin/content/emitter.ts +0 -50
- package/src/plugin/content/index.ts +0 -233
- package/src/plugin/content/parser.ts +0 -259
- package/src/plugin/content/path-utils.ts +0 -55
- package/src/plugin/content/scanner.ts +0 -26
- package/src/plugin/content/search.ts +0 -28
- package/src/plugin/dev-server.ts +0 -379
- package/src/plugin/dts-generator.ts +0 -273
- package/src/plugin/generated-dir.ts +0 -121
- package/src/plugin/html-post-process.ts +0 -96
- package/src/plugin/index.ts +0 -584
- package/src/plugin/path-utils.ts +0 -186
- package/src/plugin/scanner.ts +0 -65
- package/src/plugin/transforms/auto-import.ts +0 -206
- package/src/plugin/transforms/head-inject.ts +0 -161
- package/src/plugin/virtual/composables.ts +0 -28
- package/src/plugin/virtual/content-components.ts +0 -83
- package/src/plugin/virtual/error.ts +0 -34
- package/src/plugin/virtual/layouts.ts +0 -41
- package/src/plugin/virtual/loading.ts +0 -32
- package/src/plugin/virtual/middleware.ts +0 -45
- package/src/plugin/virtual/plugins.ts +0 -46
- package/src/plugin/virtual/routes.ts +0 -514
- package/src/plugin/virtual/server-api.ts +0 -85
- package/src/plugin/virtual/server-middleware.ts +0 -44
- package/src/runtime/app-template.ts +0 -377
- package/src/runtime/composables/define-middleware.ts +0 -17
- package/src/runtime/composables/define-server-middleware.ts +0 -18
- package/src/runtime/composables/index.ts +0 -27
- package/src/runtime/composables/use-auth.ts +0 -125
- package/src/runtime/composables/use-content-search.ts +0 -205
- package/src/runtime/composables/use-content.ts +0 -146
- package/src/runtime/composables/use-cookie.ts +0 -135
- package/src/runtime/composables/use-fetch.ts +0 -438
- package/src/runtime/composables/use-head.ts +0 -234
- package/src/runtime/composables/use-inject.ts +0 -49
- package/src/runtime/composables/use-locale.ts +0 -109
- package/src/runtime/composables/use-navigate.ts +0 -58
- package/src/runtime/composables/use-page-data.ts +0 -93
- package/src/runtime/composables/use-route.ts +0 -71
- package/src/runtime/composables/use-runtime-config.ts +0 -123
- package/src/runtime/composables/use-seo-meta.ts +0 -80
- package/src/runtime/composables/use-session.ts +0 -186
- package/src/runtime/composables/use-state.ts +0 -92
- package/src/runtime/content/client.ts +0 -168
- package/src/runtime/entry-client-template.ts +0 -39
- package/src/runtime/entry-server-template.ts +0 -493
- package/src/runtime/isr-handler.ts +0 -184
- package/src/runtime/oauth/handler.ts +0 -407
- package/src/runtime/oauth/index.ts +0 -49
- package/src/runtime/oauth/providers.ts +0 -38
- package/src/types/api.ts +0 -40
- package/src/types/config.ts +0 -379
- package/src/types/content.ts +0 -66
- package/src/types/index.ts +0 -7
- package/src/types/middleware.ts +0 -63
- package/src/types/page.ts +0 -117
- package/src/types/plugin.ts +0 -34
- package/tsconfig.build.json +0 -10
- package/tsconfig.json +0 -19
- 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
|
-
```
|
package/docs/components.md
DELETED
|
@@ -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.
|