@jasonshimmy/vite-plugin-cer-app 0.23.2 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/adapters/netlify.js +4 -2
- package/dist/cli/adapters/netlify.js.map +1 -1
- 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/commands/preview.d.ts.map +1 -1
- package/dist/cli/commands/preview.js +4 -2
- package/dist/cli/commands/preview.js.map +1 -1
- 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 +4 -2
- 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 +226 -17
- package/dist/plugin/build-ssg.js.map +1 -1
- package/dist/plugin/content/index.d.ts +1 -1
- package/dist/plugin/content/index.d.ts.map +1 -1
- package/dist/plugin/content/index.js +8 -8
- package/dist/plugin/content/index.js.map +1 -1
- package/dist/plugin/content/parser.d.ts +3 -3
- package/dist/plugin/content/parser.d.ts.map +1 -1
- package/dist/plugin/content/parser.js +103 -24
- 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 +7 -0
- package/dist/plugin/html-post-process.d.ts.map +1 -1
- package/dist/plugin/html-post-process.js +26 -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 +181 -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/content.d.ts +18 -1
- package/dist/types/content.d.ts.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/data-loading.md
DELETED
|
@@ -1,336 +0,0 @@
|
|
|
1
|
-
# Data Loading
|
|
2
|
-
|
|
3
|
-
Each page can export a `loader` function that runs on the server before the page renders. The data is serialized into the HTML response and rehydrated on the client without a second fetch.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## Defining a loader
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
// app/pages/blog/[slug].ts
|
|
11
|
-
import type { PageLoader } from '@jasonshimmy/vite-plugin-cer-app/types'
|
|
12
|
-
|
|
13
|
-
component('page-blog-slug', () => {
|
|
14
|
-
const data = usePageData<{ title: string; body: string }>()
|
|
15
|
-
|
|
16
|
-
return html`
|
|
17
|
-
<article>
|
|
18
|
-
<h1>${data?.title ?? ''}</h1>
|
|
19
|
-
<div>${data?.body ?? ''}</div>
|
|
20
|
-
</article>
|
|
21
|
-
`
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
export const loader: PageLoader = async ({ params }) => {
|
|
25
|
-
const { data: post } = await useFetch(`https://api.example.com/posts/${params.slug}`)
|
|
26
|
-
return { title: post?.title, body: post?.body }
|
|
27
|
-
}
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
The object returned by `loader` is made available via `usePageData()` in the page component. Primitive values (strings, numbers, booleans) are also forwarded as HTML element attributes so `useProps()` can read them.
|
|
31
|
-
|
|
32
|
-
---
|
|
33
|
-
|
|
34
|
-
## `PageLoader` signature
|
|
35
|
-
|
|
36
|
-
```ts
|
|
37
|
-
type PageLoader<
|
|
38
|
-
Params extends Record<string, string> = Record<string, string>,
|
|
39
|
-
Data = Record<string, unknown>,
|
|
40
|
-
> = (ctx: PageLoaderContext<Params>) => Promise<Data> | Data
|
|
41
|
-
|
|
42
|
-
interface PageLoaderContext<P extends Record<string, string>> {
|
|
43
|
-
params: P // URL path parameters
|
|
44
|
-
query: Record<string, string> // Parsed query string
|
|
45
|
-
req?: IncomingMessage // Raw Node.js request (present during SSR/SSG server render; absent during client-side navigation)
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## SSR data flow
|
|
52
|
-
|
|
53
|
-
1. A request arrives for `/blog/hello-world`
|
|
54
|
-
2. The router matches `app/pages/blog/[slug].ts`
|
|
55
|
-
3. The server calls `loader({ params: { slug: 'hello-world' }, query, req })`
|
|
56
|
-
4. The returned data is serialized as `window.__CER_DATA__` in a `<script>` tag in the HTML `<head>`:
|
|
57
|
-
```html
|
|
58
|
-
<script>window.__CER_DATA__ = {"title":"Hello World","body":"..."}</script>
|
|
59
|
-
```
|
|
60
|
-
5. The server renders `<page-blog-slug>` directly into the layout using Declarative Shadow DOM
|
|
61
|
-
6. The full HTML (pre-rendered content + client scripts) is sent to the browser
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## Client hydration flow
|
|
66
|
-
|
|
67
|
-
1. Browser receives the full HTML — content is immediately visible via Declarative Shadow DOM before any JS runs
|
|
68
|
-
2. Client JS boots; `usePageData()` reads `window.__CER_DATA__` and returns the hydrated values
|
|
69
|
-
3. After the initial `router.replace()` in `.cer/app.ts` completes, `.cer/app.ts` clears the loader data from `globalThis` so subsequent client-side navigations trigger a fresh fetch instead of reusing stale server data
|
|
70
|
-
4. Components that received SSR data skip their `useOnConnected` fetch — no duplicate request
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## Client-side navigation and loaders
|
|
75
|
-
|
|
76
|
-
Loaders run on the client too — before every navigation. This means `useProps()` and `usePageData()` both work correctly for client-side route transitions, not just on initial SSR/SSG load.
|
|
77
|
-
|
|
78
|
-
When `router.push('/path')` is called:
|
|
79
|
-
1. The route module is dynamically imported
|
|
80
|
-
2. If the module exports a `loader`, it is called with `{ params, query }`
|
|
81
|
-
3. Primitive return values (strings, numbers, booleans) are set as HTML attributes on the page element so `useProps()` can read them
|
|
82
|
-
4. All return values are stored in `globalThis.__CER_DATA__` so `usePageData()` also returns them
|
|
83
|
-
5. The page component renders with the correct data immediately — no loading flash or re-render
|
|
84
|
-
|
|
85
|
-
```ts
|
|
86
|
-
// app/pages/profile.ts
|
|
87
|
-
component('page-profile', () => {
|
|
88
|
-
// Works on initial load AND client navigation
|
|
89
|
-
const props = useProps<{ username: string; bio: string }>({ username: '', bio: '' })
|
|
90
|
-
|
|
91
|
-
return html`
|
|
92
|
-
<h1>${props.username}</h1>
|
|
93
|
-
<p>${props.bio}</p>
|
|
94
|
-
`
|
|
95
|
-
})
|
|
96
|
-
|
|
97
|
-
export const loader = async ({ params }: { params: { id: string } }) => {
|
|
98
|
-
const { data: user } = await useFetch(`/api/users/${params.id}`)
|
|
99
|
-
return { username: user?.name, bio: user?.bio }
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
> **Note:** Only primitive values (strings, numbers, booleans) are forwarded as element attributes. Complex objects (arrays, nested objects) should be accessed via `usePageData()` instead of `useProps()`.
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
## Accessing loader data in components
|
|
108
|
-
|
|
109
|
-
Use `usePageData()` to read loader data — it receives everything the loader returned (primitives and complex objects alike) and works in all modes: SSR, SSG, and client-side navigation.
|
|
110
|
-
|
|
111
|
-
```ts
|
|
112
|
-
component('page-user', () => {
|
|
113
|
-
const ssrData = usePageData<{ user: { id: string; name: string; email: string } }>()
|
|
114
|
-
const user = ref(ssrData?.user ?? { id: '', name: '', email: '' })
|
|
115
|
-
|
|
116
|
-
useOnConnected(async () => {
|
|
117
|
-
if (ssrData) return // already hydrated
|
|
118
|
-
const { data } = await useFetch(`/api/users/${user.value.id}`)
|
|
119
|
-
if (data) user.value = data
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
return html`
|
|
123
|
-
<h1>Hello, ${user.value.name}</h1>
|
|
124
|
-
<p>${user.value.email}</p>
|
|
125
|
-
`
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
export const loader: PageLoader<{ id: string }> = async ({ params }) => {
|
|
129
|
-
const user = await fetchUser(params.id)
|
|
130
|
-
return { user }
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
`useProps()` is an alternative for **primitive values only** (strings, numbers, booleans). It reads element HTML attributes rather than the loader payload directly, which means it also picks up attributes passed by parent components in the component tree — but it cannot receive arrays or objects.
|
|
135
|
-
|
|
136
|
-
```ts
|
|
137
|
-
component('page-profile', () => {
|
|
138
|
-
// Works for primitives only — use usePageData() if you need objects or arrays
|
|
139
|
-
const props = useProps<{ username: string; bio: string }>({ username: '', bio: '' })
|
|
140
|
-
|
|
141
|
-
return html`
|
|
142
|
-
<h1>${props.username}</h1>
|
|
143
|
-
<p>${props.bio}</p>
|
|
144
|
-
`
|
|
145
|
-
})
|
|
146
|
-
|
|
147
|
-
export const loader = async ({ params }: { params: { id: string } }) => {
|
|
148
|
-
const { data: user } = await useFetch(`/api/users/${params.id}`)
|
|
149
|
-
return { username: user?.name, bio: user?.bio } // primitives only
|
|
150
|
-
}
|
|
151
|
-
```
|
|
152
|
-
|
|
153
|
-
> **Rule of thumb:** reach for `usePageData()` first. Only prefer `useProps()` when you specifically need the element attribute binding model — for example, when the same component is also used as a child that receives attributes from a parent.
|
|
154
|
-
|
|
155
|
-
---
|
|
156
|
-
|
|
157
|
-
## SSG and loaders
|
|
158
|
-
|
|
159
|
-
In SSG mode, `loader` is called at build time for each generated path. The data is baked into the static HTML file and no server is required at runtime.
|
|
160
|
-
|
|
161
|
-
```ts
|
|
162
|
-
// app/pages/blog/[slug].ts
|
|
163
|
-
export const meta = {
|
|
164
|
-
ssg: {
|
|
165
|
-
paths: async () => [
|
|
166
|
-
{ params: { slug: 'hello-world' } },
|
|
167
|
-
{ params: { slug: 'second-post' } },
|
|
168
|
-
],
|
|
169
|
-
},
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
export const loader: PageLoader<{ slug: string }> = async ({ params }) => {
|
|
173
|
-
// Called once per path during `cer-app generate`
|
|
174
|
-
const post = await fetchPost(params.slug)
|
|
175
|
-
return { post }
|
|
176
|
-
}
|
|
177
|
-
```
|
|
178
|
-
|
|
179
|
-
---
|
|
180
|
-
|
|
181
|
-
## Dev server behavior
|
|
182
|
-
|
|
183
|
-
In `mode: 'ssr'` and `mode: 'ssg'`, the dev server runs the server entry module and calls your `loader` on every HTML request — matching production behaviour. Both `usePageData()` and `useProps()` receive real loader data during development.
|
|
184
|
-
|
|
185
|
-
In `mode: 'spa'`, no loaders run in the dev server. `usePageData()` always returns `null` and `useProps()` returns its defaults. Use `useOnConnected` to fetch data client-side in SPA mode.
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
## Error handling in loaders
|
|
190
|
-
|
|
191
|
-
When a `loader` throws, the SSR error boundary intercepts it:
|
|
192
|
-
|
|
193
|
-
- If `app/error.ts` exists, the server renders the `page-error` component instead of the normal page and returns the appropriate HTTP status.
|
|
194
|
-
- If `app/error.ts` does not exist, the error is logged to the server console and a blank 500 response is returned.
|
|
195
|
-
|
|
196
|
-
To send a specific HTTP status code from a loader, attach a `status` property to the thrown error:
|
|
197
|
-
|
|
198
|
-
```ts
|
|
199
|
-
export const loader: PageLoader<{ id: string }> = async ({ params }) => {
|
|
200
|
-
const item = await db.item.findById(params.id)
|
|
201
|
-
if (!item) {
|
|
202
|
-
const err = Object.assign(new Error('Not Found'), { status: 404 })
|
|
203
|
-
throw err
|
|
204
|
-
}
|
|
205
|
-
return { item }
|
|
206
|
-
}
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
Unhandled errors without a `status` property default to HTTP 500.
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## Error boundary — `app/error.ts`
|
|
214
|
-
|
|
215
|
-
Create `app/error.ts` to define a custom error page shown when navigation fails. The file must export a custom element named `page-error`:
|
|
216
|
-
|
|
217
|
-
```ts
|
|
218
|
-
// app/error.ts
|
|
219
|
-
component('page-error', () => {
|
|
220
|
-
const props = useProps<{ error: string; status: string }>({
|
|
221
|
-
error: 'An unexpected error occurred.',
|
|
222
|
-
status: '500',
|
|
223
|
-
})
|
|
224
|
-
|
|
225
|
-
return html`
|
|
226
|
-
<div style="padding:2rem">
|
|
227
|
-
<h2 style="color:#c00">Error ${props.status}</h2>
|
|
228
|
-
<p>${props.error}</p>
|
|
229
|
-
<button @click="${() => (globalThis as any).resetError?.()}">
|
|
230
|
-
Try again
|
|
231
|
-
</button>
|
|
232
|
-
</div>
|
|
233
|
-
`
|
|
234
|
-
})
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### Props received by `page-error`
|
|
238
|
-
|
|
239
|
-
| Prop | Type | Source |
|
|
240
|
-
|------|------|--------|
|
|
241
|
-
| `error` | `string` | Error message from the thrown value |
|
|
242
|
-
| `status` | `string` | HTTP status code as a string (`"404"`, `"500"`, etc.) — **SSR only** |
|
|
243
|
-
|
|
244
|
-
### `resetError()`
|
|
245
|
-
|
|
246
|
-
The framework exposes `globalThis.resetError()` as a global function. Calling it clears the error state and re-navigates to the current path, giving the user a way to recover without a full page reload.
|
|
247
|
-
|
|
248
|
-
```ts
|
|
249
|
-
// Call from a button click handler inside page-error
|
|
250
|
-
(globalThis as any).resetError?.()
|
|
251
|
-
```
|
|
252
|
-
|
|
253
|
-
### SSR vs. client-side behavior
|
|
254
|
-
|
|
255
|
-
| Scenario | Behavior |
|
|
256
|
-
|----------|----------|
|
|
257
|
-
| **Loader throws during SSR** | Server renders `page-error` with `error` and `status` props; response uses the thrown status code |
|
|
258
|
-
| **Navigation throws on the client** | `cer-layout-view` renders `page-error` with `error` prop only (no HTTP status in the browser) |
|
|
259
|
-
| **No `app/error.ts` defined (SSR)** | Error is logged to the server console; blank 500 response |
|
|
260
|
-
| **No `app/error.ts` defined (client)** | Raw error message rendered in a `<div>` |
|
|
261
|
-
|
|
262
|
-
> **SPA mode:** There is no server-side error boundary in SPA mode. The `loader` function is never called server-side, so `page-error` is only rendered for client-side navigation errors. To handle loading failures in SPA, catch errors inside `useOnConnected` and render an error state manually.
|
|
263
|
-
|
|
264
|
-
---
|
|
265
|
-
|
|
266
|
-
## Loader vs. client-side fetching
|
|
267
|
-
|
|
268
|
-
Use `loader` for data that:
|
|
269
|
-
- Must be present on initial render (SEO, no loading spinner)
|
|
270
|
-
- Is fetched from a database or internal service not accessible from the browser
|
|
271
|
-
- Benefits from server-side caching or authentication via cookies
|
|
272
|
-
|
|
273
|
-
Use client-side fetching (`fetch` or composables) for:
|
|
274
|
-
- Data loaded after user interaction
|
|
275
|
-
- Paginated or infinite-scroll content
|
|
276
|
-
- Real-time updates
|
|
277
|
-
|
|
278
|
-
---
|
|
279
|
-
|
|
280
|
-
## TypeScript generics
|
|
281
|
-
|
|
282
|
-
The `PageLoader` type accepts two generics:
|
|
283
|
-
|
|
284
|
-
```ts
|
|
285
|
-
// PageLoader<Params, Data>
|
|
286
|
-
export const loader: PageLoader<
|
|
287
|
-
{ id: string }, // URL params shape
|
|
288
|
-
{ user: User; posts: Post[] } // Return data shape
|
|
289
|
-
> = async ({ params }) => {
|
|
290
|
-
return { user: await fetchUser(params.id), posts: await fetchPosts(params.id) }
|
|
291
|
-
}
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
---
|
|
295
|
-
|
|
296
|
-
## Multi-mode data loading (SPA fallback)
|
|
297
|
-
|
|
298
|
-
When building a page that needs to work in **all three modes** — SSR/SSG (with a `loader`) and SPA (no server, no loader) — use the following pattern:
|
|
299
|
-
|
|
300
|
-
1. In SSR/SSG, the server runs `loader` and injects the data via `window.__CER_DATA__`. `usePageData()` returns it immediately; `useOnConnected` sees `ssrData` and skips the client fetch.
|
|
301
|
-
2. In SPA mode there is no server, so `ssrData` is `null`. The client tries the API first, then falls back to a direct module import.
|
|
302
|
-
|
|
303
|
-
```ts
|
|
304
|
-
// app/pages/blog/index.ts
|
|
305
|
-
component('page-blog-index', () => {
|
|
306
|
-
const ssrData = usePageData<{ posts: Post[] }>()
|
|
307
|
-
const posts = ref<Post[]>(ssrData?.posts ?? [])
|
|
308
|
-
|
|
309
|
-
useOnConnected(async () => {
|
|
310
|
-
if (ssrData) return // SSR/SSG: already hydrated, skip the fetch
|
|
311
|
-
|
|
312
|
-
// SPA: try the API server first
|
|
313
|
-
try {
|
|
314
|
-
const r = await fetch('/api/posts')
|
|
315
|
-
if (r.ok) {
|
|
316
|
-
posts.value = await r.json()
|
|
317
|
-
return
|
|
318
|
-
}
|
|
319
|
-
} catch { /* no API server in static preview */ }
|
|
320
|
-
|
|
321
|
-
// SPA static fallback: import data directly from source
|
|
322
|
-
const { posts: staticPosts } = await import('../data/posts')
|
|
323
|
-
posts.value = staticPosts
|
|
324
|
-
})
|
|
325
|
-
|
|
326
|
-
return html`<ul>${posts.value.map(p => html`<li>${p.title}</li>`)}</ul>`
|
|
327
|
-
})
|
|
328
|
-
|
|
329
|
-
// loader runs in SSR and SSG only
|
|
330
|
-
export const loader = async () => {
|
|
331
|
-
const { data: posts } = await useFetch<Post[]>('/api/posts')
|
|
332
|
-
return { posts: posts ?? [] }
|
|
333
|
-
}
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
The key rule: **always check `ssrData` before fetching on the client**. This prevents a redundant network request when the data was already serialized by the server.
|
package/docs/getting-started.md
DELETED
|
@@ -1,237 +0,0 @@
|
|
|
1
|
-
# Getting Started
|
|
2
|
-
|
|
3
|
-
## Prerequisites
|
|
4
|
-
|
|
5
|
-
- Node.js 18+
|
|
6
|
-
- `@jasonshimmy/custom-elements-runtime` ≥ 3.0.0
|
|
7
|
-
- Vite ≥ 5.0.0
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## Option A — Scaffold with `create-cer-app` (recommended)
|
|
12
|
-
|
|
13
|
-
```sh
|
|
14
|
-
npx --package @jasonshimmy/vite-plugin-cer-app create-cer-app my-app
|
|
15
|
-
```
|
|
16
|
-
|
|
17
|
-
The interactive prompt asks for a project name and rendering mode:
|
|
18
|
-
|
|
19
|
-
```
|
|
20
|
-
Welcome to create-cer-app!
|
|
21
|
-
|
|
22
|
-
Project name: my-app
|
|
23
|
-
Select app mode:
|
|
24
|
-
1. spa — Single-Page App (client-side rendering)
|
|
25
|
-
2. ssr — Server-Side Rendering
|
|
26
|
-
3. ssg — Static Site Generation
|
|
27
|
-
Mode [1/2/3]: 1
|
|
28
|
-
|
|
29
|
-
Creating SPA project: my-app
|
|
30
|
-
Directory: /path/to/my-app
|
|
31
|
-
|
|
32
|
-
Project created! To get started:
|
|
33
|
-
|
|
34
|
-
cd my-app
|
|
35
|
-
npm install
|
|
36
|
-
npm run dev
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
You can also skip the prompts with flags:
|
|
40
|
-
|
|
41
|
-
```sh
|
|
42
|
-
npx --package @jasonshimmy/vite-plugin-cer-app create-cer-app my-app --mode ssr
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## Option B — Add to an existing Vite project
|
|
48
|
-
|
|
49
|
-
### 1. Install
|
|
50
|
-
|
|
51
|
-
```sh
|
|
52
|
-
npm install -D @jasonshimmy/vite-plugin-cer-app
|
|
53
|
-
npm install @jasonshimmy/custom-elements-runtime
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### 2. Configure Vite
|
|
57
|
-
|
|
58
|
-
```ts
|
|
59
|
-
// vite.config.ts
|
|
60
|
-
import { defineConfig } from 'vite'
|
|
61
|
-
import { cerApp } from '@jasonshimmy/vite-plugin-cer-app'
|
|
62
|
-
|
|
63
|
-
export default defineConfig({
|
|
64
|
-
plugins: [cerApp()],
|
|
65
|
-
})
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
Or use a separate `cer.config.ts` (picked up automatically by the CLI, and passed manually to `cerApp()` if using `vite.config.ts`):
|
|
69
|
-
|
|
70
|
-
```ts
|
|
71
|
-
// cer.config.ts
|
|
72
|
-
import { defineConfig } from '@jasonshimmy/vite-plugin-cer-app'
|
|
73
|
-
|
|
74
|
-
export default defineConfig({
|
|
75
|
-
mode: 'spa',
|
|
76
|
-
})
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
```ts
|
|
80
|
-
// vite.config.ts (when using cer.config.ts)
|
|
81
|
-
import { defineConfig } from 'vite'
|
|
82
|
-
import { cerApp } from '@jasonshimmy/vite-plugin-cer-app'
|
|
83
|
-
import cerConfig from './cer.config.ts'
|
|
84
|
-
|
|
85
|
-
export default defineConfig({
|
|
86
|
-
plugins: [cerApp(cerConfig)],
|
|
87
|
-
})
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
### 3. Create the app structure
|
|
91
|
-
|
|
92
|
-
```sh
|
|
93
|
-
mkdir -p app/pages app/layouts app/components app/composables app/plugins app/middleware
|
|
94
|
-
mkdir -p server/api server/middleware
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
### 4. Write your first page
|
|
98
|
-
|
|
99
|
-
```ts
|
|
100
|
-
// app/pages/index.ts
|
|
101
|
-
// No imports needed — component, html are auto-injected
|
|
102
|
-
component('page-index', () => {
|
|
103
|
-
return html`<h1>Hello, World!</h1>`
|
|
104
|
-
})
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
### 5. Write a layout
|
|
108
|
-
|
|
109
|
-
```ts
|
|
110
|
-
// app/layouts/default.ts
|
|
111
|
-
component('layout-default', () => {
|
|
112
|
-
return html`
|
|
113
|
-
<header><h1>My App</h1></header>
|
|
114
|
-
<main><slot></slot></main>
|
|
115
|
-
`
|
|
116
|
-
})
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### 6. Create `index.html`
|
|
120
|
-
|
|
121
|
-
```html
|
|
122
|
-
<!DOCTYPE html>
|
|
123
|
-
<html lang="en">
|
|
124
|
-
<head>
|
|
125
|
-
<meta charset="UTF-8" />
|
|
126
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
127
|
-
<title>My App</title>
|
|
128
|
-
</head>
|
|
129
|
-
<body>
|
|
130
|
-
<cer-layout-view></cer-layout-view>
|
|
131
|
-
<script type="module" src="/.cer/app.ts"></script>
|
|
132
|
-
</body>
|
|
133
|
-
</html>
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
> **Note:** The framework bootstrap lives in `.cer/app.ts` and is regenerated automatically on every dev server start and build. You never edit or own this file — updates to the plugin propagate to it immediately, just like Nuxt's `.nuxt/` directory.
|
|
137
|
-
|
|
138
|
-
---
|
|
139
|
-
|
|
140
|
-
## TypeScript path aliases
|
|
141
|
-
|
|
142
|
-
The framework automatically generates `.cer/tsconfig.json` with `~/` path aliases on every dev server start and build. To enable IDE autocomplete and type-checking for these aliases, extend it from your project `tsconfig.json`:
|
|
143
|
-
|
|
144
|
-
```json
|
|
145
|
-
// tsconfig.json
|
|
146
|
-
{
|
|
147
|
-
"extends": "./.cer/tsconfig.json"
|
|
148
|
-
}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
The generated aliases map:
|
|
152
|
-
|
|
153
|
-
| Alias | Resolves to |
|
|
154
|
-
|---|---|
|
|
155
|
-
| `~/*` | `app/*` |
|
|
156
|
-
| `~/pages/*` | `app/pages/*` |
|
|
157
|
-
| `~/layouts/*` | `app/layouts/*` |
|
|
158
|
-
| `~/components/*` | `app/components/*` |
|
|
159
|
-
| `~/composables/*` | `app/composables/*` |
|
|
160
|
-
| `~/plugins/*` | `app/plugins/*` |
|
|
161
|
-
| `~/middleware/*` | `app/middleware/*` |
|
|
162
|
-
| `~/assets/*` | `app/assets/*` |
|
|
163
|
-
|
|
164
|
-
```ts
|
|
165
|
-
// Before — relative import
|
|
166
|
-
import { useTheme } from '../../composables/useTheme'
|
|
167
|
-
|
|
168
|
-
// After — alias import
|
|
169
|
-
import { useTheme } from '~/composables/useTheme'
|
|
170
|
-
```
|
|
171
|
-
|
|
172
|
-
> `.cer/tsconfig.json` is auto-generated — do not edit or commit it. It is regenerated on every `cer-app dev` and `cer-app build`. Add `.cer/` to `.gitignore`.
|
|
173
|
-
|
|
174
|
-
---
|
|
175
|
-
|
|
176
|
-
## Running the dev server
|
|
177
|
-
|
|
178
|
-
```sh
|
|
179
|
-
# Using the CLI (reads cer.config.ts automatically)
|
|
180
|
-
npx cer-app dev
|
|
181
|
-
|
|
182
|
-
# Or via npm scripts (after scaffolding)
|
|
183
|
-
npm run dev
|
|
184
|
-
```
|
|
185
|
-
|
|
186
|
-
The dev server starts on `http://localhost:3000` by default.
|
|
187
|
-
|
|
188
|
-
---
|
|
189
|
-
|
|
190
|
-
## Building for production
|
|
191
|
-
|
|
192
|
-
```sh
|
|
193
|
-
# SPA build
|
|
194
|
-
npx cer-app build
|
|
195
|
-
|
|
196
|
-
# SSR build (dual client + server bundles)
|
|
197
|
-
npx cer-app build --mode ssr
|
|
198
|
-
|
|
199
|
-
# SSG build (renders all routes to static HTML at build time)
|
|
200
|
-
npx cer-app build --mode ssg
|
|
201
|
-
# or equivalently:
|
|
202
|
-
npx cer-app generate
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
### Build outputs
|
|
206
|
-
|
|
207
|
-
| Mode | Output |
|
|
208
|
-
|---|---|
|
|
209
|
-
| `spa` | `dist/` — standard Vite client bundle |
|
|
210
|
-
| `ssr` | `dist/client/` + `dist/server/server.js` |
|
|
211
|
-
| `ssg` | `dist/<route>/index.html` per page + `dist/ssg-manifest.json` |
|
|
212
|
-
|
|
213
|
-
---
|
|
214
|
-
|
|
215
|
-
## Previewing the build
|
|
216
|
-
|
|
217
|
-
```sh
|
|
218
|
-
# SPA / SSG (static file server)
|
|
219
|
-
npx cer-app preview
|
|
220
|
-
|
|
221
|
-
# SSR (loads dist/server/server.js as the request handler)
|
|
222
|
-
npx cer-app preview --ssr
|
|
223
|
-
```
|
|
224
|
-
|
|
225
|
-
Preview runs on `http://localhost:4173` by default.
|
|
226
|
-
|
|
227
|
-
---
|
|
228
|
-
|
|
229
|
-
## Scaffolded project scripts
|
|
230
|
-
|
|
231
|
-
All three modes produce a `package.json` with these scripts:
|
|
232
|
-
|
|
233
|
-
| Mode | `dev` | `build` | `preview` | `generate` |
|
|
234
|
-
|---|---|---|---|---|
|
|
235
|
-
| SPA | `cer-app dev` | `cer-app build` | `cer-app preview` | — |
|
|
236
|
-
| SSR | `cer-app dev` | `cer-app build` | `cer-app preview --ssr` | — |
|
|
237
|
-
| SSG | `cer-app dev` | `cer-app build` | `cer-app preview` | `cer-app generate` |
|