@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/middleware.md
DELETED
|
@@ -1,234 +0,0 @@
|
|
|
1
|
-
# Middleware
|
|
2
|
-
|
|
3
|
-
The framework has two kinds of middleware:
|
|
4
|
-
|
|
5
|
-
1. **Route middleware** — runs in the browser before navigation (auth guards, redirects)
|
|
6
|
-
2. **Server middleware** — runs on the server for every HTTP request (CORS, logging)
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## Route middleware
|
|
11
|
-
|
|
12
|
-
### Defining middleware
|
|
13
|
-
|
|
14
|
-
Create a file in `app/middleware/`. Export a default `MiddlewareFn` using `defineMiddleware`:
|
|
15
|
-
|
|
16
|
-
```ts
|
|
17
|
-
// app/middleware/auth.ts
|
|
18
|
-
export default defineMiddleware(async (to, from) => {
|
|
19
|
-
const session = await getSession()
|
|
20
|
-
if (!session) return '/login' // redirect
|
|
21
|
-
return true // allow navigation
|
|
22
|
-
})
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
`defineMiddleware` is a no-op identity helper — it just provides TypeScript types without
|
|
26
|
-
any runtime overhead. It is auto-imported, so you don't need to import it manually.
|
|
27
|
-
|
|
28
|
-
### `MiddlewareFn` signature
|
|
29
|
-
|
|
30
|
-
```ts
|
|
31
|
-
type GuardResult = boolean | string | Promise<boolean | string>
|
|
32
|
-
|
|
33
|
-
type MiddlewareFn = (
|
|
34
|
-
to: RouteState,
|
|
35
|
-
from: RouteState | null,
|
|
36
|
-
next: () => Promise<void>,
|
|
37
|
-
) => GuardResult | void
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
| Return value | Effect |
|
|
41
|
-
|---|---|
|
|
42
|
-
| `true` | Allow navigation |
|
|
43
|
-
| `false` | Block navigation (stay on current route) |
|
|
44
|
-
| `string` | Redirect to that path |
|
|
45
|
-
| `void` / no return | Allow navigation (same as `true`) |
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
### `next()` chaining — wrapper middleware
|
|
50
|
-
|
|
51
|
-
The third parameter `next` lets you build **wrapper middleware** that executes logic both _before_ and _after_ the remaining middleware chain runs. This is useful for logging, timing, and instrumentation.
|
|
52
|
-
|
|
53
|
-
When you call `next()`, the remaining middleware in the chain runs before `next()` resolves. If you do **not** call `next()`, you take full control of the guard result via your return value.
|
|
54
|
-
|
|
55
|
-
```ts
|
|
56
|
-
// app/middleware/logger.ts
|
|
57
|
-
export default defineMiddleware(async (to, from, next) => {
|
|
58
|
-
console.log('[nav] start:', to.path)
|
|
59
|
-
const start = Date.now()
|
|
60
|
-
|
|
61
|
-
await next() // run the rest of the middleware chain
|
|
62
|
-
|
|
63
|
-
console.log('[nav] done:', to.path, `(${Date.now() - start}ms)`)
|
|
64
|
-
// No return value — navigation proceeds based on the downstream result
|
|
65
|
-
})
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
```ts
|
|
69
|
-
// app/pages/admin.ts
|
|
70
|
-
export const meta = {
|
|
71
|
-
middleware: ['logger', 'auth'],
|
|
72
|
-
// Execution: logger (before) → auth (guard) → logger (after)
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
**Key rules:**
|
|
77
|
-
|
|
78
|
-
- If you call `next()` and return no value, the chain result from downstream middleware wins.
|
|
79
|
-
- If you call `next()` but also return `false` or a redirect string, your return value takes precedence.
|
|
80
|
-
- If you do **not** call `next()`, the remaining middleware in the chain is skipped. Your return value controls navigation as normal.
|
|
81
|
-
- If a middleware throws, navigation is blocked (`false`) and the chain stops.
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
### Assigning middleware to a specific page
|
|
86
|
-
|
|
87
|
-
Set `meta.middleware` to an array of middleware names. The name is the filename without the extension:
|
|
88
|
-
|
|
89
|
-
```ts
|
|
90
|
-
// app/pages/dashboard.ts
|
|
91
|
-
export const meta = {
|
|
92
|
-
middleware: ['auth'], // runs app/middleware/auth.ts before this page
|
|
93
|
-
}
|
|
94
|
-
```
|
|
95
|
-
|
|
96
|
-
---
|
|
97
|
-
|
|
98
|
-
### Multiple middleware
|
|
99
|
-
|
|
100
|
-
Middleware runs in the order listed. The first non-`true` result wins:
|
|
101
|
-
|
|
102
|
-
```ts
|
|
103
|
-
// app/pages/admin.ts
|
|
104
|
-
export const meta = {
|
|
105
|
-
middleware: ['auth', 'admin-role'],
|
|
106
|
-
// Runs: auth → admin-role → page render
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
---
|
|
111
|
-
|
|
112
|
-
### Execution order within a navigation
|
|
113
|
-
|
|
114
|
-
1. Route middleware runs for the matched route — all declared middleware executes in order
|
|
115
|
-
2. Route state updates (component renders)
|
|
116
|
-
3. Post-navigation hooks fire (analytics, logging)
|
|
117
|
-
|
|
118
|
-
Redirect loop protection: the router stops after 10 consecutive redirects.
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
### Error handling
|
|
123
|
-
|
|
124
|
-
If a middleware function throws (synchronously or asynchronously), navigation is **blocked** — the framework catches the error, logs it, and returns `false` to keep the user on the current route:
|
|
125
|
-
|
|
126
|
-
```
|
|
127
|
-
[cer-app] Middleware "auth" threw an error: Error: session store unavailable
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
This means a crashing middleware is always safe: the user stays put rather than landing on a broken page or being incorrectly redirected. Subsequent middleware in the same chain does not run.
|
|
131
|
-
|
|
132
|
-
---
|
|
133
|
-
|
|
134
|
-
### TypeScript types
|
|
135
|
-
|
|
136
|
-
`MiddlewareFn` and `GuardResult` are exported from the package if you need them outside of auto-imported files:
|
|
137
|
-
|
|
138
|
-
```ts
|
|
139
|
-
import type { MiddlewareFn, GuardResult } from '@jasonshimmy/vite-plugin-cer-app/types'
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
---
|
|
143
|
-
|
|
144
|
-
### All middleware files
|
|
145
|
-
|
|
146
|
-
All files in `app/middleware/` are registered and available by name. They are exported from `virtual:cer-middleware`:
|
|
147
|
-
|
|
148
|
-
```ts
|
|
149
|
-
import { middleware } from 'virtual:cer-middleware'
|
|
150
|
-
// { auth: [Function], 'admin-role': [Function], ... }
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
---
|
|
154
|
-
|
|
155
|
-
## Server middleware
|
|
156
|
-
|
|
157
|
-
Server middleware runs on the HTTP level — before API routes and before SSR rendering. Place files in `server/middleware/`.
|
|
158
|
-
|
|
159
|
-
```ts
|
|
160
|
-
// server/middleware/cors.ts
|
|
161
|
-
// defineServerMiddleware is auto-imported — no import statement needed
|
|
162
|
-
export default defineServerMiddleware((req, res, next) => {
|
|
163
|
-
res.setHeader('Access-Control-Allow-Origin', '*')
|
|
164
|
-
res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS')
|
|
165
|
-
res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization')
|
|
166
|
-
|
|
167
|
-
if (req.method === 'OPTIONS') {
|
|
168
|
-
res.statusCode = 204
|
|
169
|
-
res.end()
|
|
170
|
-
return // do NOT call next() — response is complete
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
next()
|
|
174
|
-
})
|
|
175
|
-
```
|
|
176
|
-
|
|
177
|
-
If you need it outside `server/middleware/` files, import explicitly:
|
|
178
|
-
|
|
179
|
-
```ts
|
|
180
|
-
import { defineServerMiddleware } from '@jasonshimmy/vite-plugin-cer-app/composables'
|
|
181
|
-
```
|
|
182
|
-
|
|
183
|
-
### `ServerMiddleware` signature
|
|
184
|
-
|
|
185
|
-
```ts
|
|
186
|
-
type ServerMiddleware = (
|
|
187
|
-
req: IncomingMessage,
|
|
188
|
-
res: ServerResponse,
|
|
189
|
-
next: (err?: unknown) => void,
|
|
190
|
-
) => void | Promise<void>
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
- Call `next()` to pass the request to the next handler.
|
|
194
|
-
- Call `next(err)` with an error to short-circuit the chain. The response status defaults to `500`; attach a numeric `.status` to the error object to send a different status code.
|
|
195
|
-
- Throw (synchronously or via a rejected Promise) to produce the same result as `next(err)`.
|
|
196
|
-
- If you do not call `next()` at all (e.g. you called `res.end()`), the chain stops and subsequent handlers (API routes, SSR) will not run.
|
|
197
|
-
|
|
198
|
-
**Custom status codes in server middleware**
|
|
199
|
-
|
|
200
|
-
Throw (or reject) with an object that has a numeric `.status` property to control the HTTP response status:
|
|
201
|
-
|
|
202
|
-
```ts
|
|
203
|
-
// server/middleware/auth.ts
|
|
204
|
-
export default defineServerMiddleware(async (req, _res, next) => {
|
|
205
|
-
const token = req.headers['authorization']
|
|
206
|
-
if (!token) {
|
|
207
|
-
const err = new Error('Unauthorized') as Error & { status: number }
|
|
208
|
-
err.status = 401
|
|
209
|
-
throw err
|
|
210
|
-
}
|
|
211
|
-
next()
|
|
212
|
-
})
|
|
213
|
-
```
|
|
214
|
-
|
|
215
|
-
The framework extracts `err.status` and uses it as `res.statusCode`. If the value is non-numeric or missing, it falls back to `500`. This replaces the old behavior of always returning `500` for all middleware errors.
|
|
216
|
-
|
|
217
|
-
---
|
|
218
|
-
|
|
219
|
-
### Dev server behavior
|
|
220
|
-
|
|
221
|
-
Server middleware is applied in dev via Vite's `configureServer` middleware hook, before API routes and before the SSR HTML renderer.
|
|
222
|
-
|
|
223
|
-
In production (SSR mode), server middleware is exported from the server bundle and applied in the same order.
|
|
224
|
-
|
|
225
|
-
---
|
|
226
|
-
|
|
227
|
-
### Execution order
|
|
228
|
-
|
|
229
|
-
For each request, the order is:
|
|
230
|
-
|
|
231
|
-
1. Server middleware (from `server/middleware/`, in scan order)
|
|
232
|
-
2. API route handlers (from `server/api/`)
|
|
233
|
-
3. SSR HTML renderer (if `mode === 'ssr'` and the request accepts `text/html`)
|
|
234
|
-
4. Vite dev server (dev only — serves assets and handles HMR)
|
package/docs/plugins.md
DELETED
|
@@ -1,170 +0,0 @@
|
|
|
1
|
-
# App Plugins
|
|
2
|
-
|
|
3
|
-
Plugins are loaded once before the app renders. They receive an `app` context with `provide` for dependency injection and `router` for registering global navigation guards.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Creating a plugin
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
// app/plugins/01.store.ts
|
|
11
|
-
import type { AppPlugin } from '@jasonshimmy/vite-plugin-cer-app/types'
|
|
12
|
-
import { createStore } from '@jasonshimmy/custom-elements-runtime/store'
|
|
13
|
-
|
|
14
|
-
export default {
|
|
15
|
-
name: 'app-store',
|
|
16
|
-
setup(app) {
|
|
17
|
-
const store = createStore({ user: null, theme: 'light' })
|
|
18
|
-
app.provide('store', store)
|
|
19
|
-
},
|
|
20
|
-
} satisfies AppPlugin
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
|
|
25
|
-
## Plugin interface
|
|
26
|
-
|
|
27
|
-
```ts
|
|
28
|
-
interface AppPlugin {
|
|
29
|
-
name: string
|
|
30
|
-
setup(app: AppContext): void | Promise<void>
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
interface AppContext {
|
|
34
|
-
provide(key: PropertyKey, value: unknown): void
|
|
35
|
-
router: Router
|
|
36
|
-
config: CerAppConfig // always {} (empty object) at runtime
|
|
37
|
-
}
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
---
|
|
41
|
-
|
|
42
|
-
## Load order
|
|
43
|
-
|
|
44
|
-
Plugins are loaded in filename order. Use a numeric prefix to control sequencing:
|
|
45
|
-
|
|
46
|
-
```
|
|
47
|
-
app/plugins/
|
|
48
|
-
01.store.ts ← loaded first
|
|
49
|
-
02.auth.ts ← loaded second
|
|
50
|
-
03.analytics.ts ← loaded third
|
|
51
|
-
errorHandler.ts ← loaded after all numbered plugins (alphabetical)
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
- Numbered files (e.g. `01.store.ts`) come before unnumbered files.
|
|
55
|
-
- Within the same tier, files are sorted alphabetically.
|
|
56
|
-
- The number is stripped; the actual filename is the plugin name by convention.
|
|
57
|
-
|
|
58
|
-
---
|
|
59
|
-
|
|
60
|
-
## Dependency injection
|
|
61
|
-
|
|
62
|
-
Use `app.provide` in the plugin's `setup` to make values available to all components via `inject`:
|
|
63
|
-
|
|
64
|
-
```ts
|
|
65
|
-
// app/plugins/01.store.ts
|
|
66
|
-
export default {
|
|
67
|
-
name: 'app-store',
|
|
68
|
-
setup(app) {
|
|
69
|
-
const store = createStore({ count: 0 })
|
|
70
|
-
app.provide('store', store)
|
|
71
|
-
},
|
|
72
|
-
}
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
```ts
|
|
76
|
-
// app/pages/index.ts
|
|
77
|
-
component('page-index', () => {
|
|
78
|
-
const store = useInject<Store>('store')
|
|
79
|
-
const count = computed(() => store?.state.count ?? 0)
|
|
80
|
-
|
|
81
|
-
return html`<p>Count: ${count}</p>`
|
|
82
|
-
})
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
## Async plugins
|
|
88
|
-
|
|
89
|
-
Plugins can be async. All plugins are awaited in sequence before the app renders:
|
|
90
|
-
|
|
91
|
-
```ts
|
|
92
|
-
// app/plugins/02.auth.ts
|
|
93
|
-
export default {
|
|
94
|
-
name: 'auth',
|
|
95
|
-
async setup(app) {
|
|
96
|
-
const session = await fetchSession()
|
|
97
|
-
app.provide('session', session)
|
|
98
|
-
},
|
|
99
|
-
}
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
## Router guards in plugins
|
|
105
|
-
|
|
106
|
-
Register global navigation guards via `app.router`:
|
|
107
|
-
|
|
108
|
-
```ts
|
|
109
|
-
// app/plugins/03.analytics.ts
|
|
110
|
-
export default {
|
|
111
|
-
name: 'analytics',
|
|
112
|
-
setup(app) {
|
|
113
|
-
app.router.subscribe((to) => {
|
|
114
|
-
trackPageView(to.path)
|
|
115
|
-
})
|
|
116
|
-
},
|
|
117
|
-
}
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
---
|
|
121
|
-
|
|
122
|
-
## Reading provided values with `useInject`
|
|
123
|
-
|
|
124
|
-
To read values provided by a plugin, use `useInject` instead of the raw `inject()` from the runtime. `useInject` works correctly in **all three modes** — SPA, SSR, and SSG:
|
|
125
|
-
|
|
126
|
-
```ts
|
|
127
|
-
// app/pages/dashboard.ts
|
|
128
|
-
component('page-dashboard', () => {
|
|
129
|
-
const store = useInject<Store>('store')
|
|
130
|
-
|
|
131
|
-
if (!store) return html`<p>Loading…</p>`
|
|
132
|
-
|
|
133
|
-
return html`<p>Count: ${store.state.count}</p>`
|
|
134
|
-
})
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
`useInject` is auto-imported in `app/pages/`, `app/layouts/`, and `app/components/` — no explicit import needed.
|
|
138
|
-
|
|
139
|
-
**Why not raw `inject()`?** In SSR and SSG modes the server renders the component tree directly, without `<cer-layout-view>` establishing the Vue-style provide context. `useInject` bridges this gap:
|
|
140
|
-
|
|
141
|
-
| Mode | How the value is resolved |
|
|
142
|
-
|------|--------------------------|
|
|
143
|
-
| SPA / client | `inject()` walks the component tree (provided by `<cer-layout-view>`) |
|
|
144
|
-
| SSR (dev & prod) | reads from `globalThis.__cerPluginProvides` (set by the server entry at startup) |
|
|
145
|
-
| SSG | same as SSR |
|
|
146
|
-
|
|
147
|
-
If you need `useInject` outside of auto-imported directories, import it explicitly:
|
|
148
|
-
|
|
149
|
-
```ts
|
|
150
|
-
import { useInject } from '@jasonshimmy/vite-plugin-cer-app/composables'
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
---
|
|
154
|
-
|
|
155
|
-
## Virtual module
|
|
156
|
-
|
|
157
|
-
The sorted plugin list is available via `virtual:cer-plugins`:
|
|
158
|
-
|
|
159
|
-
```ts
|
|
160
|
-
import plugins from 'virtual:cer-plugins'
|
|
161
|
-
// plugins is an array of AppPlugin objects in load order
|
|
162
|
-
```
|
|
163
|
-
|
|
164
|
-
In `.cer/app.ts` (the auto-generated framework entry), plugins are executed sequentially before the router initializes:
|
|
165
|
-
|
|
166
|
-
```ts
|
|
167
|
-
for (const plugin of plugins) {
|
|
168
|
-
await plugin.setup(appContext)
|
|
169
|
-
}
|
|
170
|
-
```
|