@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/configuration.md
DELETED
|
@@ -1,696 +0,0 @@
|
|
|
1
|
-
# Configuration
|
|
2
|
-
|
|
3
|
-
The framework is configured via `cer.config.ts` at the project root. All fields are optional — defaults are listed below.
|
|
4
|
-
|
|
5
|
-
```ts
|
|
6
|
-
// cer.config.ts
|
|
7
|
-
import { defineConfig } from '@jasonshimmy/vite-plugin-cer-app'
|
|
8
|
-
|
|
9
|
-
export default defineConfig({
|
|
10
|
-
mode: 'spa',
|
|
11
|
-
srcDir: 'app',
|
|
12
|
-
port: 3000,
|
|
13
|
-
|
|
14
|
-
ssg: {
|
|
15
|
-
routes: 'auto',
|
|
16
|
-
concurrency: 4,
|
|
17
|
-
fallback: false,
|
|
18
|
-
},
|
|
19
|
-
|
|
20
|
-
router: {
|
|
21
|
-
base: '/',
|
|
22
|
-
},
|
|
23
|
-
|
|
24
|
-
jitCss: {
|
|
25
|
-
content: ['./app/pages/**/*.ts', './app/components/**/*.ts', './app/layouts/**/*.ts'],
|
|
26
|
-
extendedColors: false,
|
|
27
|
-
},
|
|
28
|
-
|
|
29
|
-
autoImports: {
|
|
30
|
-
components: true,
|
|
31
|
-
composables: true,
|
|
32
|
-
directives: true,
|
|
33
|
-
runtime: true,
|
|
34
|
-
},
|
|
35
|
-
})
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
---
|
|
39
|
-
|
|
40
|
-
## Top-level options
|
|
41
|
-
|
|
42
|
-
### `mode`
|
|
43
|
-
|
|
44
|
-
**Type:** `'spa' | 'ssr' | 'ssg'`
|
|
45
|
-
**Default:** `'spa'`
|
|
46
|
-
|
|
47
|
-
Selects the rendering strategy for the application.
|
|
48
|
-
|
|
49
|
-
- `'spa'` — Client-side only. Standard Vite build, no server rendering.
|
|
50
|
-
- `'ssr'` — Server-side rendering. Dual build (client + server bundles). Requires a Node.js server.
|
|
51
|
-
- `'ssg'` — Static site generation. All routes rendered to HTML at build time.
|
|
52
|
-
|
|
53
|
-
See [Rendering Modes](rendering-modes.md) for full details.
|
|
54
|
-
|
|
55
|
-
---
|
|
56
|
-
|
|
57
|
-
### `srcDir`
|
|
58
|
-
|
|
59
|
-
**Type:** `string`
|
|
60
|
-
**Default:** `'app'`
|
|
61
|
-
|
|
62
|
-
Path to the client app source directory, relative to the project root. All `app/` paths below (`pages/`, `layouts/`, etc.) resolve under this directory.
|
|
63
|
-
|
|
64
|
-
```ts
|
|
65
|
-
srcDir: 'src/app' // → pages at src/app/pages/, etc.
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
### `port`
|
|
71
|
-
|
|
72
|
-
**Type:** `number`
|
|
73
|
-
**Default:** `3000`
|
|
74
|
-
|
|
75
|
-
Dev server port. Overridden by the `--port` CLI flag.
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## `ssg` options
|
|
80
|
-
|
|
81
|
-
Controls static site generation.
|
|
82
|
-
|
|
83
|
-
```ts
|
|
84
|
-
ssg: {
|
|
85
|
-
routes: 'auto',
|
|
86
|
-
concurrency: 4,
|
|
87
|
-
fallback: false,
|
|
88
|
-
}
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
### `ssg.routes`
|
|
92
|
-
|
|
93
|
-
**Type:** `'auto' | string[]`
|
|
94
|
-
**Default:** `'auto'`
|
|
95
|
-
|
|
96
|
-
Which paths to generate at build time.
|
|
97
|
-
|
|
98
|
-
- `'auto'` — Scans `app/pages/` and generates all static routes. For dynamic routes, calls `meta.ssg.paths()` to enumerate paths. Content-backed catch-all pages that use `queryContent()` can also auto-enumerate concrete paths from the content store.
|
|
99
|
-
- `string[]` — Explicit list of paths, e.g. `['/about', '/blog/hello-world']`.
|
|
100
|
-
|
|
101
|
-
### `ssg.concurrency`
|
|
102
|
-
|
|
103
|
-
**Type:** `number`
|
|
104
|
-
**Default:** `4`
|
|
105
|
-
|
|
106
|
-
Number of pages rendered in parallel during the SSG build.
|
|
107
|
-
|
|
108
|
-
### `ssg.fallback`
|
|
109
|
-
|
|
110
|
-
**Type:** `boolean`
|
|
111
|
-
**Default:** `false`
|
|
112
|
-
|
|
113
|
-
When `true`, unenumerated dynamic routes fall back to SSR at request time instead of returning 404.
|
|
114
|
-
|
|
115
|
-
---
|
|
116
|
-
|
|
117
|
-
## `router` options
|
|
118
|
-
|
|
119
|
-
Passed to the underlying `useRouter()` call.
|
|
120
|
-
|
|
121
|
-
```ts
|
|
122
|
-
router: {
|
|
123
|
-
base: '/',
|
|
124
|
-
scrollToFragment: { enabled: true, offset: 0 },
|
|
125
|
-
}
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
### `router.base`
|
|
129
|
-
|
|
130
|
-
**Type:** `string`
|
|
131
|
-
**Default:** `'/'`
|
|
132
|
-
|
|
133
|
-
Base path for all routes. Use when deploying to a sub-path, e.g. `'/my-app'`.
|
|
134
|
-
|
|
135
|
-
### `router.scrollToFragment`
|
|
136
|
-
|
|
137
|
-
**Type:** `boolean | { enabled: boolean; offset: number }`
|
|
138
|
-
|
|
139
|
-
Controls scroll-to-fragment (`#anchor`) behavior.
|
|
140
|
-
|
|
141
|
-
---
|
|
142
|
-
|
|
143
|
-
## `jitCss` options
|
|
144
|
-
|
|
145
|
-
Passed to the runtime's `cerPlugin` for JIT (just-in-time) CSS generation at build time and to `enableJITCSS()` at runtime.
|
|
146
|
-
|
|
147
|
-
```ts
|
|
148
|
-
jitCss: {
|
|
149
|
-
content: ['./app/pages/**/*.ts', './app/components/**/*.ts', './app/layouts/**/*.ts'],
|
|
150
|
-
extendedColors: false,
|
|
151
|
-
customColors: {
|
|
152
|
-
brand: { '100': '#ede9fe', '500': '#7c3aed', '900': '#4c1d95' },
|
|
153
|
-
surface: { DEFAULT: 'var(--md-sys-color-surface)' },
|
|
154
|
-
},
|
|
155
|
-
}
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### `jitCss.content`
|
|
159
|
-
|
|
160
|
-
**Type:** `string[]`
|
|
161
|
-
**Default:** Pages, components, and layouts directories.
|
|
162
|
-
|
|
163
|
-
Glob patterns pointing to files that use utility classes. The JIT compiler scans these files to generate CSS.
|
|
164
|
-
|
|
165
|
-
### `jitCss.extendedColors`
|
|
166
|
-
|
|
167
|
-
**Type:** `boolean`
|
|
168
|
-
**Default:** `false`
|
|
169
|
-
|
|
170
|
-
Enables the extended color palette in the JIT CSS system.
|
|
171
|
-
|
|
172
|
-
### `jitCss.customColors`
|
|
173
|
-
|
|
174
|
-
**Type:** `Record<string, Record<string, string>>`
|
|
175
|
-
**Default:** `undefined`
|
|
176
|
-
|
|
177
|
-
Registers project-specific color families in the JIT CSS engine. Each top-level key is a color family name; its value maps scale steps (or semantic names) to CSS color values. Custom colors are registered at both build time and runtime automatically:
|
|
178
|
-
|
|
179
|
-
**Light DOM elements** — covered by the static stylesheet generated from the `content` scan. `customColors` is passed to the build-time scanner, so any custom color utility classes found in your source files are emitted into `virtual:cer-jit-css`, a global document stylesheet that applies to all light DOM elements.
|
|
180
|
-
|
|
181
|
-
**Shadow DOM components** — covered at runtime. `customColors` is serialized into the `enableJITCSS()` call in the generated `.cer/app.ts`, so every component that renders after app startup has the custom colors available.
|
|
182
|
-
|
|
183
|
-
Color family names must be a single lowercase word (no hyphens). Shade keys can be numeric steps (`'500'`) or semantic names (`'DEFAULT'`, `'on'`, `'container'`). When a utility class omits the shade (e.g. `bg-brand`), the `DEFAULT` shade is used automatically.
|
|
184
|
-
|
|
185
|
-
Values can be any valid CSS color — hex strings, `rgb(...)`, `hsl(...)`, or CSS variable references:
|
|
186
|
-
|
|
187
|
-
```ts
|
|
188
|
-
jitCss: {
|
|
189
|
-
customColors: {
|
|
190
|
-
// Numeric scale
|
|
191
|
-
brand: { '100': '#ede9fe', '500': '#7c3aed', '900': '#4c1d95' },
|
|
192
|
-
// Semantic shades (DEFAULT used when no shade is specified)
|
|
193
|
-
accent: { DEFAULT: '#f59e0b', muted: '#fcd34d' },
|
|
194
|
-
// CSS variable references (ideal for bridging design-token systems)
|
|
195
|
-
mdprimary: { DEFAULT: 'var(--md-sys-color-primary)', on: 'var(--md-sys-color-on-primary)' },
|
|
196
|
-
},
|
|
197
|
-
}
|
|
198
|
-
```
|
|
199
|
-
|
|
200
|
-
Once registered, all standard JIT CSS utility prefixes apply:
|
|
201
|
-
|
|
202
|
-
| Utility | Example |
|
|
203
|
-
|---|---|
|
|
204
|
-
| Background | `bg-brand-500` |
|
|
205
|
-
| Text | `text-brand-500` |
|
|
206
|
-
| Border | `border-brand-500` |
|
|
207
|
-
| Ring | `ring-brand-500` |
|
|
208
|
-
| Shadow | `shadow-brand-500` |
|
|
209
|
-
| Gradient stops | `from-brand-500 to-brand-900` |
|
|
210
|
-
| With opacity modifier | `bg-brand-500/50` |
|
|
211
|
-
| With variants | `hover:bg-brand-500 dark:text-brand-100` |
|
|
212
|
-
|
|
213
|
-
---
|
|
214
|
-
|
|
215
|
-
## `autoImports` options
|
|
216
|
-
|
|
217
|
-
Controls which identifiers are automatically injected at the top of files in `app/pages/`, `app/layouts/`, and `app/components/`.
|
|
218
|
-
|
|
219
|
-
```ts
|
|
220
|
-
autoImports: {
|
|
221
|
-
components: true, // per-page component code splitting via cerComponentImports transform
|
|
222
|
-
composables: true, // virtual:cer-composables (re-exports app/composables/)
|
|
223
|
-
directives: true, // when, each, match, anchorBlock
|
|
224
|
-
runtime: true, // component, html, ref, computed, watch, etc.
|
|
225
|
-
}
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
### `autoImports.components`
|
|
229
|
-
|
|
230
|
-
When `true` (default), the `cerComponentImports` Vite transform plugin is active. It scans each page, layout, and component file for custom element tags in `html\`` templates and automatically injects static `import` statements pointing to the corresponding source files in `app/components/`. This gives Rollup the module graph edges needed to code-split components per page — only the components a page actually uses are bundled into that page's chunk.
|
|
231
|
-
|
|
232
|
-
When `false`, no transform runs and no component files are auto-imported. You must import component files manually (e.g. from a plugin or explicit import at the top of each file).
|
|
233
|
-
|
|
234
|
-
When `runtime: true`, the following are injected if used and not already imported:
|
|
235
|
-
|
|
236
|
-
```ts
|
|
237
|
-
import { component, html, css, ref, computed, watch, watchEffect,
|
|
238
|
-
useProps, useEmit, useOnConnected, useOnDisconnected,
|
|
239
|
-
useOnAttributeChanged, useOnError, useStyle, useDesignTokens,
|
|
240
|
-
useGlobalStyle, useExpose, useSlots, provide, inject,
|
|
241
|
-
createComposable, nextTick, defineModel, getCurrentComponentContext,
|
|
242
|
-
isReactiveState, unsafeHTML, decodeEntities, useTeleport
|
|
243
|
-
} from '@jasonshimmy/custom-elements-runtime'
|
|
244
|
-
```
|
|
245
|
-
|
|
246
|
-
When `directives: true`, the following are injected if used and not already imported:
|
|
247
|
-
|
|
248
|
-
```ts
|
|
249
|
-
import { when, each, match, anchorBlock } from '@jasonshimmy/custom-elements-runtime/directives'
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
The following framework composables are **always** auto-imported when used, regardless of the `runtime` flag — they come from the plugin package:
|
|
253
|
-
|
|
254
|
-
```ts
|
|
255
|
-
import {
|
|
256
|
-
useHead,
|
|
257
|
-
usePageData,
|
|
258
|
-
useInject,
|
|
259
|
-
useRuntimeConfig,
|
|
260
|
-
useRoute,
|
|
261
|
-
useState,
|
|
262
|
-
useAuth,
|
|
263
|
-
useFetch,
|
|
264
|
-
useSeoMeta,
|
|
265
|
-
useCookie,
|
|
266
|
-
useSession,
|
|
267
|
-
useLocale,
|
|
268
|
-
queryContent,
|
|
269
|
-
useContentSearch,
|
|
270
|
-
defineMiddleware,
|
|
271
|
-
defineServerMiddleware,
|
|
272
|
-
navigateTo,
|
|
273
|
-
} from '@jasonshimmy/vite-plugin-cer-app/composables'
|
|
274
|
-
```
|
|
275
|
-
|
|
276
|
-
Set any flag to `false` to opt out and manage imports manually.
|
|
277
|
-
|
|
278
|
-
---
|
|
279
|
-
|
|
280
|
-
## `siteUrl`
|
|
281
|
-
|
|
282
|
-
**Type:** `string`
|
|
283
|
-
**Default:** `undefined`
|
|
284
|
-
|
|
285
|
-
The canonical origin of the deployed site — scheme, host, and optional port with **no trailing slash**.
|
|
286
|
-
|
|
287
|
-
```ts
|
|
288
|
-
// cer.config.ts
|
|
289
|
-
export default defineConfig({
|
|
290
|
-
siteUrl: 'https://example.com',
|
|
291
|
-
})
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
When set, the SSG build automatically applies the following to every generated HTML page:
|
|
295
|
-
|
|
296
|
-
| Feature | Behaviour |
|
|
297
|
-
|---|---|
|
|
298
|
-
| **Canonical link** | Injects `<link rel="canonical" href="${siteUrl}${path}">` before `</head>` on every page, unless a canonical is already present |
|
|
299
|
-
| **robots.txt** | Writes `dist/robots.txt` with `Allow: /` and a `Sitemap:` directive pointing to `${siteUrl}/sitemap.xml` — skipped when `public/robots.txt` already exists |
|
|
300
|
-
|
|
301
|
-
`siteUrl` is also available at runtime via `useRuntimeConfig().public.siteUrl`. User-supplied `runtimeConfig.public.siteUrl` takes precedence over the shorthand.
|
|
302
|
-
|
|
303
|
-
> **Note:** `<link rel="icon">` is injected automatically whenever a `favicon.ico`, `favicon.svg`, or `favicon.png` is found in `public/` — this happens regardless of whether `siteUrl` is set.
|
|
304
|
-
|
|
305
|
-
> **Note:** Every `<a target="_blank">` link in the generated HTML automatically receives `rel="noopener noreferrer"` if it is missing — also independent of `siteUrl`.
|
|
306
|
-
|
|
307
|
-
---
|
|
308
|
-
|
|
309
|
-
## `adapter`
|
|
310
|
-
|
|
311
|
-
**Type:** `'vercel' | 'netlify' | 'cloudflare' | ((root: string) => Promise<void>)`
|
|
312
|
-
**Default:** `undefined`
|
|
313
|
-
|
|
314
|
-
When set, `cer-app build` automatically runs the adapter after the build completes, producing the platform-specific deployment output alongside `dist/`.
|
|
315
|
-
|
|
316
|
-
### Built-in adapters
|
|
317
|
-
|
|
318
|
-
```ts
|
|
319
|
-
export default defineConfig({
|
|
320
|
-
mode: 'ssr',
|
|
321
|
-
adapter: 'vercel', // or 'netlify' | 'cloudflare'
|
|
322
|
-
})
|
|
323
|
-
```
|
|
324
|
-
|
|
325
|
-
| Value | Output | Deploy command |
|
|
326
|
-
|---|---|---|
|
|
327
|
-
| `'vercel'` | `.vercel/output/` (Build Output API v3) | `vercel deploy --prebuilt` |
|
|
328
|
-
| `'netlify'` | `netlify/functions/ssr.mjs` + `netlify.toml` | `netlify deploy` |
|
|
329
|
-
| `'cloudflare'` | `dist/_worker.js` + `wrangler.toml` | `wrangler pages deploy dist` |
|
|
330
|
-
|
|
331
|
-
### Custom adapter
|
|
332
|
-
|
|
333
|
-
Pass an async function to target any platform (Railway, Fly.io, bare Node.js, Docker, etc.). `root` is the absolute path to the project root. Both `dist/client/` and `dist/server/` are already present by the time your function is called.
|
|
334
|
-
|
|
335
|
-
```ts
|
|
336
|
-
export default defineConfig({
|
|
337
|
-
mode: 'ssr',
|
|
338
|
-
adapter: async (root) => {
|
|
339
|
-
// Example: copy the server bundle to a custom output location
|
|
340
|
-
const { cp, mkdir } = await import('node:fs/promises')
|
|
341
|
-
await mkdir(`${root}/deploy`, { recursive: true })
|
|
342
|
-
await cp(`${root}/dist`, `${root}/deploy/dist`, { recursive: true })
|
|
343
|
-
console.log('[my-adapter] done')
|
|
344
|
-
},
|
|
345
|
-
})
|
|
346
|
-
```
|
|
347
|
-
|
|
348
|
-
### Running adapters manually
|
|
349
|
-
|
|
350
|
-
Adapters can also be run independently (without re-building) using `cer-app adapt`:
|
|
351
|
-
|
|
352
|
-
```sh
|
|
353
|
-
cer-app adapt --platform vercel
|
|
354
|
-
cer-app adapt --platform netlify
|
|
355
|
-
cer-app adapt --platform cloudflare
|
|
356
|
-
cer-app adapt --platform custom # runs the function adapter from cer.config.ts
|
|
357
|
-
```
|
|
358
|
-
|
|
359
|
-
See [cli.md](./cli.md#cer-app-adapt) for full details.
|
|
360
|
-
|
|
361
|
-
---
|
|
362
|
-
|
|
363
|
-
## `content` options
|
|
364
|
-
|
|
365
|
-
Enables the file-based content layer. Drop Markdown or JSON files into `content/` at the project root and query them with `queryContent()` or search with `useContentSearch()`. Custom elements referenced directly inside markdown are also auto-registered from `app/components/`.
|
|
366
|
-
|
|
367
|
-
```ts
|
|
368
|
-
export default defineConfig({
|
|
369
|
-
content: {
|
|
370
|
-
dir: 'content', // default
|
|
371
|
-
drafts: false, // default
|
|
372
|
-
},
|
|
373
|
-
})
|
|
374
|
-
```
|
|
375
|
-
|
|
376
|
-
### `content.dir`
|
|
377
|
-
|
|
378
|
-
**Type:** `string`
|
|
379
|
-
**Default:** `'content'`
|
|
380
|
-
|
|
381
|
-
Content directory relative to the project root. The default resolves to `{root}/content/`.
|
|
382
|
-
|
|
383
|
-
### `content.drafts`
|
|
384
|
-
|
|
385
|
-
**Type:** `boolean`
|
|
386
|
-
**Default:** `false`
|
|
387
|
-
|
|
388
|
-
When `false`, files with `draft: true` in their frontmatter are excluded from the content store and search index in production builds.
|
|
389
|
-
|
|
390
|
-
See [content.md](./content.md) for full documentation.
|
|
391
|
-
|
|
392
|
-
---
|
|
393
|
-
|
|
394
|
-
## `i18n` options
|
|
395
|
-
|
|
396
|
-
Enables locale-aware URL routing and the `useLocale()` composable. No external package is required.
|
|
397
|
-
|
|
398
|
-
```ts
|
|
399
|
-
export default defineConfig({
|
|
400
|
-
i18n: {
|
|
401
|
-
locales: ['en', 'fr', 'de'],
|
|
402
|
-
defaultLocale: 'en',
|
|
403
|
-
strategy: 'prefix_except_default',
|
|
404
|
-
},
|
|
405
|
-
})
|
|
406
|
-
```
|
|
407
|
-
|
|
408
|
-
### `i18n.locales`
|
|
409
|
-
|
|
410
|
-
**Type:** `string[]`
|
|
411
|
-
**Required**
|
|
412
|
-
|
|
413
|
-
All supported locale codes. These must be BCP 47 language tags or short codes (e.g. `'en'`, `'fr'`, `'zh-Hant'`).
|
|
414
|
-
|
|
415
|
-
### `i18n.defaultLocale`
|
|
416
|
-
|
|
417
|
-
**Type:** `string`
|
|
418
|
-
**Required**
|
|
419
|
-
|
|
420
|
-
The fallback locale. Used when no locale can be detected from the URL.
|
|
421
|
-
|
|
422
|
-
### `i18n.strategy`
|
|
423
|
-
|
|
424
|
-
**Type:** `'prefix' | 'prefix_except_default' | 'no_prefix'`
|
|
425
|
-
**Default:** `'prefix_except_default'`
|
|
426
|
-
|
|
427
|
-
Controls how locales appear in URLs:
|
|
428
|
-
|
|
429
|
-
| Strategy | Default locale URL | Other locale URL |
|
|
430
|
-
|---|---|---|
|
|
431
|
-
| `'prefix'` | `/en/about` | `/fr/about` |
|
|
432
|
-
| `'prefix_except_default'` | `/about` | `/fr/about` |
|
|
433
|
-
| `'no_prefix'` | `/about` | `/about` (locale from cookie/header only) |
|
|
434
|
-
|
|
435
|
-
> **Recommendation:** Use `'prefix_except_default'` for most projects. It keeps your existing default-locale URLs intact while adding locale prefixes for other languages.
|
|
436
|
-
|
|
437
|
-
See [i18n.md](./i18n.md) for full documentation of routing, `useLocale()`, SSR/SSG behavior, and the locale switcher pattern.
|
|
438
|
-
|
|
439
|
-
---
|
|
440
|
-
|
|
441
|
-
## `runtimeConfig` options
|
|
442
|
-
|
|
443
|
-
Expose typed, centralized configuration to your app. Public values are available everywhere; private values are server-only secrets resolved from environment variables at startup.
|
|
444
|
-
|
|
445
|
-
```ts
|
|
446
|
-
export default defineConfig({
|
|
447
|
-
runtimeConfig: {
|
|
448
|
-
public: {
|
|
449
|
-
apiBase: process.env.VITE_API_BASE ?? 'https://api.example.com',
|
|
450
|
-
appVersion: '1.0.0',
|
|
451
|
-
},
|
|
452
|
-
private: {
|
|
453
|
-
dbUrl: '', // resolved from process.env.DB_URL at server startup
|
|
454
|
-
secretKey: '', // resolved from process.env.SECRET_KEY at server startup
|
|
455
|
-
},
|
|
456
|
-
},
|
|
457
|
-
})
|
|
458
|
-
```
|
|
459
|
-
|
|
460
|
-
### `runtimeConfig.public`
|
|
461
|
-
|
|
462
|
-
**Type:** `Record<string, unknown>`
|
|
463
|
-
**Default:** `{}`
|
|
464
|
-
|
|
465
|
-
Values placed here are serialized into `virtual:cer-app-config` at build time and accessible on both server and client via `useRuntimeConfig().public`.
|
|
466
|
-
|
|
467
|
-
> **Security:** Only put values here that are safe to expose to the browser. Do not put secrets, tokens, or private keys in `public`.
|
|
468
|
-
|
|
469
|
-
> **Serialization:** Values must be JSON-serializable (strings, numbers, booleans, plain objects, arrays). Functions, class instances, `undefined`, and circular references are not supported.
|
|
470
|
-
|
|
471
|
-
```ts
|
|
472
|
-
// Any page, layout, component, or composable
|
|
473
|
-
component('page-index', () => {
|
|
474
|
-
const config = useRuntimeConfig()
|
|
475
|
-
// config.public.apiBase → 'https://api.example.com'
|
|
476
|
-
|
|
477
|
-
return html`<p>API: ${config.public.apiBase}</p>`
|
|
478
|
-
})
|
|
479
|
-
```
|
|
480
|
-
|
|
481
|
-
**TypeScript:** Import `RuntimePublicConfig` to type your public config if needed:
|
|
482
|
-
|
|
483
|
-
```ts
|
|
484
|
-
import type { RuntimePublicConfig } from '@jasonshimmy/vite-plugin-cer-app/types'
|
|
485
|
-
```
|
|
486
|
-
|
|
487
|
-
---
|
|
488
|
-
|
|
489
|
-
### `runtimeConfig.private`
|
|
490
|
-
|
|
491
|
-
**Type:** `Record<string, string>`
|
|
492
|
-
**Default:** `{}`
|
|
493
|
-
|
|
494
|
-
Server-only secrets. Declare keys with empty-string defaults in `cer.config.ts` for typing purposes. **Private values are never included in the client bundle.**
|
|
495
|
-
|
|
496
|
-
**Environment variable resolution order** (at server startup, for each declared key):
|
|
497
|
-
|
|
498
|
-
1. `process.env[key]` — exact case (e.g. `process.env.dbUrl`)
|
|
499
|
-
2. `process.env[UPPER_SNAKE_CASE(key)]` — conventional env var form (e.g. `process.env.DB_URL`)
|
|
500
|
-
3. The declared default value — used as a last-resort fallback
|
|
501
|
-
|
|
502
|
-
camelCase keys are automatically converted: `dbUrl` → `DB_URL`, `secretKey` → `SECRET_KEY`.
|
|
503
|
-
|
|
504
|
-
```ts
|
|
505
|
-
// cer.config.ts
|
|
506
|
-
export default defineConfig({
|
|
507
|
-
runtimeConfig: {
|
|
508
|
-
private: {
|
|
509
|
-
dbUrl: '', // resolved from process.env.dbUrl or process.env.DB_URL
|
|
510
|
-
secretKey: '', // resolved from process.env.secretKey or process.env.SECRET_KEY
|
|
511
|
-
},
|
|
512
|
-
},
|
|
513
|
-
})
|
|
514
|
-
```
|
|
515
|
-
|
|
516
|
-
```ts
|
|
517
|
-
// app/pages/data.ts — loader (server-only)
|
|
518
|
-
export const loader = async () => {
|
|
519
|
-
const { private: priv } = useRuntimeConfig()
|
|
520
|
-
const rows = await db.query(priv?.dbUrl)
|
|
521
|
-
return { rows }
|
|
522
|
-
}
|
|
523
|
-
```
|
|
524
|
-
|
|
525
|
-
> **Browser enforcement:** Accessing `useRuntimeConfig().private` in a browser context throws a clear runtime error:
|
|
526
|
-
> ```
|
|
527
|
-
> [cer-app] runtimeConfig.private is not available in the browser.
|
|
528
|
-
> Move this access into a server-only loader, middleware, or API handler.
|
|
529
|
-
> ```
|
|
530
|
-
> This prevents accidental secret leaks — the Proxy is applied automatically with no extra configuration required.
|
|
531
|
-
|
|
532
|
-
**TypeScript:** Import `RuntimePrivateConfig` to type your private config:
|
|
533
|
-
|
|
534
|
-
```ts
|
|
535
|
-
import type { RuntimePrivateConfig } from '@jasonshimmy/vite-plugin-cer-app/types'
|
|
536
|
-
```
|
|
537
|
-
|
|
538
|
-
---
|
|
539
|
-
|
|
540
|
-
## Observability hooks
|
|
541
|
-
|
|
542
|
-
Three optional hooks in `cer.config.ts` give you visibility into every SSR request without modifying any application code.
|
|
543
|
-
|
|
544
|
-
> **SSR mode only.** These hooks are invoked by the Node.js SSR request handler. They do **not** fire in SSG or SPA modes:
|
|
545
|
-
> - **SSG** — pages are pre-rendered to static HTML at build time and served directly by the file server. No Node.js handler processes individual page requests at runtime, so no hooks fire.
|
|
546
|
-
> - **SPA** — there is no server-side render pass; the browser loads `index.html` and renders entirely client-side.
|
|
547
|
-
>
|
|
548
|
-
> If you need request logging in SSG/SPA deployments, add it at the reverse-proxy or CDN layer instead.
|
|
549
|
-
|
|
550
|
-
### `onRequest`
|
|
551
|
-
|
|
552
|
-
Called at the start of every SSR request, before route matching and the data loader. Use this for request logging or to initialise per-request APM transactions.
|
|
553
|
-
|
|
554
|
-
**Type:** `(ctx: RequestHookContext) => void | Promise<void>`
|
|
555
|
-
|
|
556
|
-
| Field | Type | Description |
|
|
557
|
-
|---|---|---|
|
|
558
|
-
| `ctx.path` | `string` | URL pathname (e.g. `/about`) |
|
|
559
|
-
| `ctx.method` | `string` | HTTP method in upper-case (e.g. `'GET'`) |
|
|
560
|
-
| `ctx.req` | `IncomingMessage` | Raw Node.js incoming request |
|
|
561
|
-
|
|
562
|
-
Errors thrown inside `onRequest` are silently swallowed — the hook cannot crash the request handler.
|
|
563
|
-
|
|
564
|
-
### `onResponse`
|
|
565
|
-
|
|
566
|
-
Called after every SSR response is sent, on both success and error paths. `ctx.duration` contains the elapsed milliseconds from the first byte received to `res.end()`. Use this for latency tracking and access logging.
|
|
567
|
-
|
|
568
|
-
**Type:** `(ctx: ResponseHookContext) => void | Promise<void>`
|
|
569
|
-
|
|
570
|
-
| Field | Type | Description |
|
|
571
|
-
|---|---|---|
|
|
572
|
-
| `ctx.path` | `string` | URL pathname |
|
|
573
|
-
| `ctx.method` | `string` | HTTP method |
|
|
574
|
-
| `ctx.statusCode` | `number` | Final HTTP status code written to the response |
|
|
575
|
-
| `ctx.duration` | `number` | Request duration in milliseconds |
|
|
576
|
-
| `ctx.req` | `IncomingMessage` | Raw Node.js incoming request |
|
|
577
|
-
|
|
578
|
-
Errors thrown inside `onResponse` are silently swallowed.
|
|
579
|
-
|
|
580
|
-
### `onError`
|
|
581
|
-
|
|
582
|
-
Called when an error is caught by the framework's SSR error boundaries:
|
|
583
|
-
|
|
584
|
-
- **`'loader'`** — the data loader threw
|
|
585
|
-
- **`'render'`** — an infrastructure-level render error escaped the runtime
|
|
586
|
-
- **`'middleware'`** — a server middleware threw
|
|
587
|
-
|
|
588
|
-
Use this to forward errors to Sentry, Datadog, or any error-reporting service.
|
|
589
|
-
|
|
590
|
-
**Type:** `(err: unknown, ctx: ErrorHookContext) => void | Promise<void>`
|
|
591
|
-
|
|
592
|
-
| Field | Type | Description |
|
|
593
|
-
|---|---|---|
|
|
594
|
-
| `ctx.type` | `'loader' \| 'render' \| 'middleware'` | Which layer the error originated from |
|
|
595
|
-
| `ctx.path` | `string` | URL pathname |
|
|
596
|
-
| `ctx.req` | `IncomingMessage` | Raw Node.js incoming request |
|
|
597
|
-
|
|
598
|
-
Errors thrown inside `onError` are silently swallowed — the hook cannot crash the request handler.
|
|
599
|
-
|
|
600
|
-
### Example — Sentry integration
|
|
601
|
-
|
|
602
|
-
```ts
|
|
603
|
-
// cer.config.ts
|
|
604
|
-
import * as Sentry from '@sentry/node'
|
|
605
|
-
import { defineConfig } from '@jasonshimmy/vite-plugin-cer-app'
|
|
606
|
-
|
|
607
|
-
Sentry.init({ dsn: process.env.SENTRY_DSN })
|
|
608
|
-
|
|
609
|
-
export default defineConfig({
|
|
610
|
-
onError(err, ctx) {
|
|
611
|
-
Sentry.captureException(err, {
|
|
612
|
-
tags: { type: ctx.type, path: ctx.path },
|
|
613
|
-
})
|
|
614
|
-
},
|
|
615
|
-
|
|
616
|
-
onRequest(ctx) {
|
|
617
|
-
console.log(`→ ${ctx.method} ${ctx.path}`)
|
|
618
|
-
},
|
|
619
|
-
|
|
620
|
-
onResponse(ctx) {
|
|
621
|
-
console.log(`← ${ctx.statusCode} ${ctx.path} (${ctx.duration}ms)`)
|
|
622
|
-
},
|
|
623
|
-
})
|
|
624
|
-
```
|
|
625
|
-
|
|
626
|
-
### Example — console request logger
|
|
627
|
-
|
|
628
|
-
```ts
|
|
629
|
-
// cer.config.ts
|
|
630
|
-
import { defineConfig } from '@jasonshimmy/vite-plugin-cer-app'
|
|
631
|
-
|
|
632
|
-
export default defineConfig({
|
|
633
|
-
onRequest({ method, path }) {
|
|
634
|
-
console.log(`[${new Date().toISOString()}] ${method} ${path}`)
|
|
635
|
-
},
|
|
636
|
-
onResponse({ method, path, statusCode, duration }) {
|
|
637
|
-
console.log(`[${new Date().toISOString()}] ${statusCode} ${method} ${path} — ${duration}ms`)
|
|
638
|
-
},
|
|
639
|
-
})
|
|
640
|
-
```
|
|
641
|
-
|
|
642
|
-
### TypeScript types
|
|
643
|
-
|
|
644
|
-
All hook context types are exported from `@jasonshimmy/vite-plugin-cer-app/types`:
|
|
645
|
-
|
|
646
|
-
```ts
|
|
647
|
-
import type {
|
|
648
|
-
ErrorHookContext,
|
|
649
|
-
RequestHookContext,
|
|
650
|
-
ResponseHookContext,
|
|
651
|
-
} from '@jasonshimmy/vite-plugin-cer-app/types'
|
|
652
|
-
```
|
|
653
|
-
|
|
654
|
-
---
|
|
655
|
-
|
|
656
|
-
## Passing config to the Vite plugin directly
|
|
657
|
-
|
|
658
|
-
When using `vite.config.ts` instead of (or alongside) `cer.config.ts`:
|
|
659
|
-
|
|
660
|
-
```ts
|
|
661
|
-
// vite.config.ts
|
|
662
|
-
import { defineConfig } from 'vite'
|
|
663
|
-
import { cerApp } from '@jasonshimmy/vite-plugin-cer-app'
|
|
664
|
-
|
|
665
|
-
export default defineConfig({
|
|
666
|
-
plugins: [
|
|
667
|
-
cerApp({
|
|
668
|
-
mode: 'ssr',
|
|
669
|
-
}),
|
|
670
|
-
],
|
|
671
|
-
})
|
|
672
|
-
```
|
|
673
|
-
|
|
674
|
-
`cerApp()` accepts the same `CerAppConfig` object as `defineConfig()`.
|
|
675
|
-
|
|
676
|
-
---
|
|
677
|
-
|
|
678
|
-
## TypeScript types
|
|
679
|
-
|
|
680
|
-
All config interfaces are exported from `@jasonshimmy/vite-plugin-cer-app/types`:
|
|
681
|
-
|
|
682
|
-
```ts
|
|
683
|
-
import type {
|
|
684
|
-
CerAppConfig,
|
|
685
|
-
SsgConfig,
|
|
686
|
-
JitCssConfig,
|
|
687
|
-
AutoImportsConfig,
|
|
688
|
-
RuntimeConfig,
|
|
689
|
-
RuntimePublicConfig,
|
|
690
|
-
RuntimePrivateConfig,
|
|
691
|
-
I18nConfig,
|
|
692
|
-
ErrorHookContext,
|
|
693
|
-
RequestHookContext,
|
|
694
|
-
ResponseHookContext,
|
|
695
|
-
} from '@jasonshimmy/vite-plugin-cer-app/types'
|
|
696
|
-
```
|