create-jen-app 1.2.3 → 1.2.4
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/colors.js +0 -17
- package/dist/create.js +5 -17
- package/dist/generator.js +14 -31
- package/dist/index.js +6 -1
- package/package.json +1 -1
- package/templates/ssr-isr/README.md +77 -0
- package/templates/ssr-isr/build.js +118 -0
- package/templates/ssr-isr/jen.config.ts +109 -0
- package/templates/ssr-isr/jenjs.d.ts +22 -0
- package/templates/ssr-isr/lib/api/(hello).js +9 -0
- package/templates/ssr-isr/lib/auth/cookie-utils.js +79 -0
- package/templates/ssr-isr/lib/auth/index.js +2 -0
- package/templates/ssr-isr/lib/auth/jwt.js +57 -0
- package/templates/ssr-isr/lib/auth/session.js +92 -0
- package/templates/ssr-isr/lib/build/asset-hashing.d.ts +10 -0
- package/templates/ssr-isr/lib/build/asset-hashing.js +25 -0
- package/templates/ssr-isr/lib/build/asset-manifest.d.ts +11 -0
- package/templates/ssr-isr/lib/build/asset-manifest.js +21 -0
- package/templates/{static → ssr-isr}/lib/build/build.d.ts +1 -1
- package/templates/ssr-isr/lib/build/build.js +141 -0
- package/templates/{static → ssr-isr}/lib/build/island-hydration.d.ts +8 -5
- package/templates/ssr-isr/lib/build/island-hydration.js +44 -0
- package/templates/ssr-isr/lib/build/minifier.d.ts +20 -0
- package/templates/ssr-isr/lib/build/minifier.js +46 -0
- package/templates/ssr-isr/lib/build/page-renderer.d.ts +17 -0
- package/templates/ssr-isr/lib/build/page-renderer.js +28 -0
- package/templates/ssr-isr/lib/build/production-build.d.ts +10 -0
- package/templates/ssr-isr/lib/build/production-build.js +13 -0
- package/templates/ssr-isr/lib/build/ssg-pipeline.d.ts +15 -0
- package/templates/ssr-isr/lib/build/ssg-pipeline.js +113 -0
- package/templates/ssr-isr/lib/build-tools/build-site.js +36 -0
- package/templates/ssr-isr/lib/cache/index.js +10 -0
- package/templates/ssr-isr/lib/cache/memory.js +40 -0
- package/templates/ssr-isr/lib/cache/redis.js +61 -0
- package/templates/ssr-isr/lib/cli/banner.js +28 -0
- package/templates/ssr-isr/lib/cli/templates/ssg/jen.config.js +32 -0
- package/templates/ssr-isr/lib/cli/templates/ssg/site/index.js +9 -0
- package/templates/ssr-isr/lib/cli/templates/ssr/jen.config.js +32 -0
- package/templates/ssr-isr/lib/cli/templates/ssr/site/index.js +9 -0
- package/templates/ssr-isr/lib/compilers/esbuild-plugins.js +111 -0
- package/templates/ssr-isr/lib/compilers/svelte.js +44 -0
- package/templates/ssr-isr/lib/compilers/vue.js +90 -0
- package/templates/ssr-isr/lib/core/http.js +71 -0
- package/templates/ssr-isr/lib/core/middleware-hooks.js +97 -0
- package/templates/ssr-isr/lib/core/paths.js +39 -0
- package/templates/ssr-isr/lib/core/routes/match.js +47 -0
- package/templates/ssr-isr/lib/core/routes/scan.js +190 -0
- package/templates/ssr-isr/lib/core/types.js +1 -0
- package/templates/ssr-isr/lib/css/compiler.js +74 -0
- package/templates/ssr-isr/lib/db/connector.js +42 -0
- package/templates/ssr-isr/lib/db/drivers/jdb.js +44 -0
- package/templates/ssr-isr/lib/db/drivers/sql.js +182 -0
- package/templates/ssr-isr/lib/db/index.js +48 -0
- package/templates/ssr-isr/lib/db/types.js +1 -0
- package/templates/ssr-isr/lib/graphql/index.js +52 -0
- package/templates/ssr-isr/lib/graphql/resolvers.js +25 -0
- package/templates/ssr-isr/lib/graphql/schema.js +35 -0
- package/templates/ssr-isr/lib/i18n/en.json +4 -0
- package/templates/ssr-isr/lib/i18n/es.json +4 -0
- package/templates/ssr-isr/lib/i18n/index.js +15 -0
- package/templates/ssr-isr/lib/import/jen-import.js +161 -0
- package/templates/ssr-isr/lib/index.js +116 -0
- package/templates/ssr-isr/lib/jdb/engine.js +275 -0
- package/templates/ssr-isr/lib/jdb/index.js +34 -0
- package/templates/ssr-isr/lib/jdb/types.js +1 -0
- package/templates/ssr-isr/lib/jdb/utils.js +176 -0
- package/templates/{static → ssr-isr}/lib/middleware/builtins/body-parser.js +0 -17
- package/templates/ssr-isr/lib/middleware/builtins/cors.js +54 -0
- package/templates/{static → ssr-isr}/lib/middleware/builtins/logger.js +0 -17
- package/templates/{static → ssr-isr}/lib/middleware/builtins/rate-limit.js +0 -17
- package/templates/{static → ssr-isr}/lib/middleware/builtins/request-id.js +0 -17
- package/templates/{static → ssr-isr}/lib/middleware/builtins/security-headers.js +0 -17
- package/templates/ssr-isr/lib/middleware/context.js +124 -0
- package/templates/{static → ssr-isr}/lib/middleware/decorators.js +0 -17
- package/templates/{static → ssr-isr}/lib/middleware/errors/handler.js +0 -17
- package/templates/ssr-isr/lib/middleware/errors/http-error.js +10 -0
- package/templates/ssr-isr/lib/middleware/kernel.js +85 -0
- package/templates/ssr-isr/lib/middleware/pipeline.js +148 -0
- package/templates/ssr-isr/lib/middleware/registry.js +85 -0
- package/templates/ssr-isr/lib/middleware/response.js +107 -0
- package/templates/ssr-isr/lib/middleware/types.d.ts +1 -0
- package/templates/ssr-isr/lib/middleware/types.js +1 -0
- package/templates/ssr-isr/lib/middleware/utils/matcher.js +13 -0
- package/templates/{static → ssr-isr}/lib/native/bundle.js +0 -17
- package/templates/{static → ssr-isr}/lib/native/dev-server.js +0 -17
- package/templates/{static → ssr-isr}/lib/native/index.js +0 -17
- package/templates/{static → ssr-isr}/lib/native/optimizer.js +0 -17
- package/templates/ssr-isr/lib/native/style-compiler.js +19 -0
- package/templates/ssr-isr/lib/plugin/loader.js +36 -0
- package/templates/ssr-isr/lib/runtime/client-runtime.js +25 -0
- package/templates/ssr-isr/lib/runtime/hmr.js +59 -0
- package/templates/ssr-isr/lib/runtime/hydrate.js +55 -0
- package/templates/ssr-isr/lib/runtime/island-hydration-client.js +146 -0
- package/templates/ssr-isr/lib/runtime/islands.js +110 -0
- package/templates/ssr-isr/lib/runtime/render.js +244 -0
- package/templates/ssr-isr/lib/server/api-routes.js +237 -0
- package/templates/ssr-isr/lib/server/api.js +108 -0
- package/templates/ssr-isr/lib/server/app.js +438 -0
- package/templates/ssr-isr/lib/server/runtimeServe.js +169 -0
- package/templates/ssr-isr/lib/server/ssr.js +202 -0
- package/templates/ssr-isr/lib/shared/log.js +64 -0
- package/templates/ssr-isr/package.json +23 -0
- package/templates/ssr-isr/server.js +128 -0
- package/templates/ssr-isr/site/pages/(index).tsx +11 -0
- package/templates/ssr-isr/site/styles/global.scss +37 -0
- package/templates/ssr-isr/tsconfig.json +39 -0
- package/templates/static/build.js +30 -18
- package/templates/static/jen.config.ts +0 -18
- package/templates/static/jenjs.d.ts +0 -18
- package/templates/static/lib/api/(hello).js +0 -17
- package/templates/static/lib/api/examples/files/[...slug].js +22 -0
- package/templates/static/lib/api/examples/hello.js +11 -0
- package/templates/static/lib/api/examples/posts/[id].js +37 -0
- package/templates/static/lib/api/examples/posts.js +37 -0
- package/templates/static/lib/api/examples/search.js +23 -0
- package/templates/static/lib/api/index.js +41 -0
- package/templates/static/lib/api/loader.js +234 -0
- package/templates/static/lib/api/router.js +259 -0
- package/templates/static/lib/assets/types.js +1 -0
- package/templates/static/lib/auth/cookie-utils.js +3 -16
- package/templates/static/lib/auth/index.js +0 -17
- package/templates/static/lib/auth/jwt.js +0 -17
- package/templates/static/lib/auth/session.js +0 -17
- package/templates/static/lib/build/asset-hashing.js +44 -36
- package/templates/static/lib/build/asset-manifest.js +16 -33
- package/templates/static/lib/build/build.js +270 -125
- package/templates/static/lib/build/bundle-analyzer-ui.js +417 -0
- package/templates/static/lib/build/bundle-analyzer.js +945 -0
- package/templates/static/lib/build/code-splitter.js +194 -0
- package/templates/static/lib/build/feature-analyzer.js +190 -0
- package/templates/static/lib/build/feature-gate.js +257 -0
- package/templates/static/lib/build/island-hydration.js +17 -35
- package/templates/static/lib/build/lazy-loader.js +322 -0
- package/templates/static/lib/build/minifier.js +40 -59
- package/templates/static/lib/build/page-renderer.js +23 -40
- package/templates/static/lib/build/production-build.js +9 -26
- package/templates/static/lib/build/rust-hashing.js +71 -0
- package/templates/static/lib/build/script-optimizer.js +285 -0
- package/templates/static/lib/build/ssg-pipeline.js +100 -106
- package/templates/static/lib/build/vercel-output.js +298 -0
- package/templates/static/lib/build-tools/build-site.js +0 -17
- package/templates/static/lib/cache/index.js +0 -17
- package/templates/static/lib/cache/memory.js +0 -17
- package/templates/static/lib/cache/redis.js +0 -17
- package/templates/static/lib/cli/banner.js +0 -17
- package/templates/static/lib/cli/templates/ssg/jen.config.js +0 -17
- package/templates/static/lib/cli/templates/ssr/jen.config.js +0 -17
- package/templates/static/lib/client/Image.js +42 -0
- package/templates/static/lib/client/Link.js +190 -0
- package/templates/static/lib/client/PWA.js +46 -0
- package/templates/static/lib/client/Seo.js +97 -0
- package/templates/static/lib/client/index.js +9 -0
- package/templates/static/lib/client/useNavigation.js +25 -0
- package/templates/static/lib/client/useRouter.js +64 -0
- package/templates/static/lib/client-routing/Link.js +17 -0
- package/templates/static/lib/client-routing/index.js +19 -0
- package/templates/static/lib/client-routing/router.js +151 -0
- package/templates/static/lib/client-routing/signal.js +147 -0
- package/templates/static/lib/compilers/esbuild-plugins.js +0 -17
- package/templates/static/lib/compilers/svelte.js +0 -17
- package/templates/static/lib/compilers/vue.js +0 -17
- package/templates/static/lib/core/config.js +0 -17
- package/templates/static/lib/core/feature-guard.js +136 -0
- package/templates/static/lib/core/features.js +99 -0
- package/templates/static/lib/core/http.js +0 -17
- package/templates/static/lib/core/layouts/index.js +10 -0
- package/templates/static/lib/core/layouts/render.js +158 -0
- package/templates/static/lib/core/layouts/scan.js +112 -0
- package/templates/static/lib/core/layouts/types.js +1 -0
- package/templates/static/lib/core/lifecycle.js +129 -0
- package/templates/static/lib/core/loader-schema.js +81 -0
- package/templates/static/lib/core/middleware-hooks.js +0 -17
- package/templates/static/lib/core/paths.js +0 -17
- package/templates/static/lib/core/routes/advanced.js +114 -0
- package/templates/static/lib/core/routes/handlers.js +181 -0
- package/templates/static/lib/core/routes/match.js +89 -17
- package/templates/static/lib/core/routes/orchestrator.js +171 -0
- package/templates/static/lib/core/routes/rendering-config.js +131 -0
- package/templates/static/lib/core/routes/scan.js +0 -17
- package/templates/static/lib/core/types.js +0 -17
- package/templates/static/lib/css/compiler.js +1 -18
- package/templates/static/lib/data-fetching/cache.js +223 -0
- package/templates/static/lib/data-fetching/client.js +202 -0
- package/templates/static/lib/data-fetching/feature-guard.js +29 -0
- package/templates/static/lib/data-fetching/graphql.js +265 -0
- package/templates/static/lib/data-fetching/index.js +57 -0
- package/templates/static/lib/data-fetching/rest.js +256 -0
- package/templates/static/lib/data-fetching/server.js +182 -0
- package/templates/static/lib/data-fetching/types.js +5 -0
- package/templates/static/lib/db/connector.js +0 -17
- package/templates/static/lib/db/drivers/jdb.js +0 -17
- package/templates/static/lib/db/drivers/sql.js +0 -17
- package/templates/static/lib/db/index.js +0 -17
- package/templates/static/lib/db/types.js +0 -17
- package/templates/static/lib/devtools/component-tree.js +106 -0
- package/templates/static/lib/devtools/devtools.js +638 -0
- package/templates/static/lib/devtools/event-bus.js +29 -0
- package/templates/static/lib/devtools/event-logger.js +67 -0
- package/templates/static/lib/devtools/index.js +9 -0
- package/templates/static/lib/devtools/integration.js +149 -0
- package/templates/static/lib/devtools/performance.js +84 -0
- package/templates/static/lib/devtools/persistence.js +57 -0
- package/templates/static/lib/devtools/plugins.js +97 -0
- package/templates/static/lib/devtools/search.js +89 -0
- package/templates/static/lib/devtools/ui.js +769 -0
- package/templates/static/lib/features/api/handler.js +10 -0
- package/templates/static/lib/features/api/index.js +5 -0
- package/templates/static/lib/features/api/types.js +4 -0
- package/templates/static/lib/features/middleware/compiled.js +7 -0
- package/templates/static/lib/features/middleware/index.js +5 -0
- package/templates/static/lib/features/middleware/types.js +4 -0
- package/templates/static/lib/fonts/index.js +46 -0
- package/templates/static/lib/fonts/inject.js +125 -0
- package/templates/static/lib/fonts/loader.js +196 -0
- package/templates/static/lib/fonts/types.js +1 -0
- package/templates/static/lib/graphql/index.js +1 -18
- package/templates/static/lib/graphql/resolvers.js +20 -13
- package/templates/static/lib/graphql/schema.js +0 -17
- package/templates/static/lib/i18n/index.js +7 -19
- package/templates/static/lib/import/jen-import.js +1 -18
- package/templates/static/lib/index.js +79 -125
- package/templates/static/lib/jdb/engine.js +0 -17
- package/templates/static/lib/jdb/index.js +1 -18
- package/templates/static/lib/jdb/types.js +0 -17
- package/templates/static/lib/jdb/utils.js +0 -17
- package/templates/static/lib/middleware/builtins/cors.js +3 -16
- package/templates/static/lib/middleware/context.js +0 -17
- package/templates/static/lib/middleware/kernel.js +117 -25
- package/templates/static/lib/middleware/pipeline.js +0 -17
- package/templates/static/lib/middleware/registry.js +0 -17
- package/templates/static/lib/middleware/response.js +0 -17
- package/templates/static/lib/plugin/examples/analytics-plugin.js +183 -0
- package/templates/static/lib/plugin/examples/cdn-upload-plugin.js +94 -0
- package/templates/static/lib/plugin/loader.js +0 -17
- package/templates/static/lib/plugin/plugin-manager.js +177 -0
- package/templates/static/lib/plugin/types.js +28 -0
- package/templates/static/lib/runtime/client-runtime.js +0 -17
- package/templates/static/lib/runtime/hmr.js +0 -17
- package/templates/static/lib/runtime/hydrate.js +0 -17
- package/templates/static/lib/runtime/island-hydration-client.js +0 -17
- package/templates/static/lib/runtime/islands.js +0 -17
- package/templates/static/lib/runtime/render.js +208 -50
- package/templates/static/lib/security/security-config.js +60 -0
- package/templates/static/lib/security/security-middleware.js +229 -0
- package/templates/static/lib/server/api-routes.js +153 -43
- package/templates/static/lib/server/api.js +0 -17
- package/templates/static/lib/server/app.js +539 -223
- package/templates/static/lib/server/isr.js +365 -0
- package/templates/static/lib/server/runtimeServe.js +31 -24
- package/templates/static/lib/server/ssr.js +98 -22
- package/templates/static/lib/server-actions/handler.js +180 -0
- package/templates/static/lib/server-actions/index.js +19 -0
- package/templates/static/lib/server-actions/middleware.js +146 -0
- package/templates/static/lib/server-actions/scan.js +152 -0
- package/templates/static/lib/server-actions/types.js +1 -0
- package/templates/static/lib/server-actions/validators.js +156 -0
- package/templates/static/lib/shared/log.js +19 -20
- package/templates/static/lib/telemetry/api/rate-limiter.js +32 -0
- package/templates/static/lib/telemetry/api/validator.js +67 -0
- package/templates/static/lib/telemetry/client.js +121 -0
- package/templates/static/lib/telemetry/tests/rate-limiter.test.js +46 -0
- package/templates/static/lib/telemetry/tests/validator.test.js +62 -0
- package/templates/static/lib/vendor/glob/glob.js +4766 -0
- package/templates/static/lib/vendor/preact/LICENSE +21 -0
- package/templates/static/lib/vendor/preact/preact.module.js +797 -0
- package/templates/static/lib/vendor/sass/sass.node.mjs +212 -0
- package/templates/static/package.json +4 -0
- package/templates/static/server.js +22 -22
- package/templates/static/site/(home).tsx +0 -18
- package/templates/static/tsconfig.json +5 -1
- package/templates/static/.esbuild/jen.config.js +0 -19
- package/templates/static/lib/build/asset-hashing.d.ts +0 -10
- package/templates/static/lib/build/asset-manifest.d.ts +0 -11
- package/templates/static/lib/build/minifier.d.ts +0 -20
- package/templates/static/lib/build/page-renderer.d.ts +0 -17
- package/templates/static/lib/build/production-build.d.ts +0 -10
- package/templates/static/lib/build/ssg-pipeline.d.ts +0 -15
- package/templates/static/lib/middleware/errors/http-error.js +0 -27
- package/templates/static/lib/middleware/types.js +0 -18
- package/templates/static/lib/middleware/utils/matcher.js +0 -30
- package/templates/static/lib/native/style-compiler.js +0 -36
- /package/templates/{static → ssr-isr}/lib/api/(hello).d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/auth/cookie-utils.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/auth/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/auth/jwt.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/auth/session.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/build-tools/build-site.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cache/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cache/memory.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cache/redis.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cli/banner.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cli/templates/ssg/jen.config.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cli/templates/ssg/site/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cli/templates/ssr/jen.config.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/cli/templates/ssr/site/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/compilers/esbuild-plugins.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/compilers/svelte.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/compilers/vue.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/core/config.d.ts +0 -0
- /package/templates/{static/lib/middleware/types.d.ts → ssr-isr/lib/core/config.js} +0 -0
- /package/templates/{static → ssr-isr}/lib/core/http.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/core/middleware-hooks.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/core/paths.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/core/routes/match.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/core/routes/scan.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/core/types.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/css/compiler.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/db/connector.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/db/drivers/jdb.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/db/drivers/sql.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/db/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/db/types.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/graphql/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/graphql/resolvers.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/graphql/schema.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/i18n/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/import/jen-import.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/jdb/engine.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/jdb/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/jdb/types.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/jdb/utils.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/builtins/body-parser.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/builtins/cors.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/builtins/logger.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/builtins/rate-limit.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/builtins/request-id.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/builtins/security-headers.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/context.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/decorators.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/errors/handler.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/errors/http-error.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/kernel.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/pipeline.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/registry.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/response.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/middleware/utils/matcher.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/native/bundle.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/native/dev-server.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/native/index.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/native/optimizer.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/native/style-compiler.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/plugin/loader.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/runtime/client-runtime.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/runtime/hmr.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/runtime/hydrate.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/runtime/island-hydration-client.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/runtime/islands.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/runtime/render.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/server/api-routes.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/server/api.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/server/app.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/server/runtimeServe.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/server/ssr.d.ts +0 -0
- /package/templates/{static → ssr-isr}/lib/shared/log.d.ts +0 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Intelligent code splitting analyzer
|
|
3
|
+
*
|
|
4
|
+
* Splits bundles into logical chunks:
|
|
5
|
+
* - Vendor: node_modules dependencies (high cache hit rate)
|
|
6
|
+
* - Runtime: Framework runtime/hydration (shared across all pages)
|
|
7
|
+
* - Common: Shared components (used by multiple routes)
|
|
8
|
+
* - Route: Per-route chunks (lazy-loaded on demand)
|
|
9
|
+
* - Entry: Main application bundle
|
|
10
|
+
*/
|
|
11
|
+
export class CodeSplitter {
|
|
12
|
+
strategies = [];
|
|
13
|
+
routeAnalysis = new Map();
|
|
14
|
+
constructor() {
|
|
15
|
+
this.initializeDefaultStrategies();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Initialize default splitting strategies in priority order
|
|
19
|
+
*/
|
|
20
|
+
initializeDefaultStrategies() {
|
|
21
|
+
// Vendor chunks (highest priority - most stable)
|
|
22
|
+
this.strategies.push({
|
|
23
|
+
name: "vendor",
|
|
24
|
+
test: (path) => {
|
|
25
|
+
return /node_modules/.test(path) && !this.isFrameworkInternal(path);
|
|
26
|
+
},
|
|
27
|
+
priority: 100,
|
|
28
|
+
});
|
|
29
|
+
// Framework runtime (stable, shared across all pages)
|
|
30
|
+
this.strategies.push({
|
|
31
|
+
name: "runtime",
|
|
32
|
+
test: (path) => {
|
|
33
|
+
return (
|
|
34
|
+
this.isFrameworkInternal(path) && /runtime|hydrate|ssr/.test(path)
|
|
35
|
+
);
|
|
36
|
+
},
|
|
37
|
+
priority: 90,
|
|
38
|
+
});
|
|
39
|
+
// Common utilities (shared components)
|
|
40
|
+
this.strategies.push({
|
|
41
|
+
name: "common",
|
|
42
|
+
test: (path) => {
|
|
43
|
+
return /components|utils|helpers/.test(path);
|
|
44
|
+
},
|
|
45
|
+
priority: 80,
|
|
46
|
+
});
|
|
47
|
+
// Route-specific chunks (lazy-loaded)
|
|
48
|
+
this.strategies.push({
|
|
49
|
+
name: "route",
|
|
50
|
+
test: (path) => {
|
|
51
|
+
return /pages|routes|site/.test(path);
|
|
52
|
+
},
|
|
53
|
+
priority: 50,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Determine which chunk a module should belong to
|
|
58
|
+
*/
|
|
59
|
+
determineChunk(modulePath) {
|
|
60
|
+
// Sort by priority (descending)
|
|
61
|
+
const sorted = [...this.strategies].sort((a, b) => b.priority - a.priority);
|
|
62
|
+
for (const strategy of sorted) {
|
|
63
|
+
if (strategy.test(modulePath)) {
|
|
64
|
+
return strategy.name;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return "entry"; // Default to main entry chunk
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Analyze route dependencies for splitting decisions
|
|
71
|
+
*
|
|
72
|
+
* @param routePath Path to route file
|
|
73
|
+
* @param dependencies List of imported module paths
|
|
74
|
+
*/
|
|
75
|
+
analyzeRouteDependencies(routePath, dependencies) {
|
|
76
|
+
this.routeAnalysis.set(routePath, dependencies);
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Generate esbuild manual chunks configuration
|
|
80
|
+
*
|
|
81
|
+
* Implements intelligent bundling:
|
|
82
|
+
* - Vendor libraries in separate chunk (external dependencies)
|
|
83
|
+
* - Runtime/hydration in separate chunk (framework internals)
|
|
84
|
+
* - Common code in separate chunk (shared components)
|
|
85
|
+
* - Route-specific code in separate chunks (per-route lazy-loading)
|
|
86
|
+
*/
|
|
87
|
+
generateManualChunks() {
|
|
88
|
+
const chunks = {};
|
|
89
|
+
// Vendor chunk patterns
|
|
90
|
+
chunks.vendor = [
|
|
91
|
+
"preact",
|
|
92
|
+
"preact/compat",
|
|
93
|
+
"preact/hooks",
|
|
94
|
+
"preact/compat/scheduler",
|
|
95
|
+
"htm",
|
|
96
|
+
];
|
|
97
|
+
// Runtime chunk patterns
|
|
98
|
+
chunks.runtime = [
|
|
99
|
+
"../runtime/hydrate.js",
|
|
100
|
+
"../runtime/render.js",
|
|
101
|
+
"../runtime/ssr.js",
|
|
102
|
+
];
|
|
103
|
+
// Common utilities patterns
|
|
104
|
+
chunks.common = [];
|
|
105
|
+
return chunks;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Generate esbuild splitting configuration
|
|
109
|
+
*/
|
|
110
|
+
generateSplittingConfig() {
|
|
111
|
+
return {
|
|
112
|
+
splitting: true,
|
|
113
|
+
format: "esm",
|
|
114
|
+
chunkNames: "[name]-[hash]",
|
|
115
|
+
manualChunks: this.generateManualChunks(),
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Generate chunk dependency graph for debugging
|
|
120
|
+
*
|
|
121
|
+
* Shows which chunks depend on which others, useful for:
|
|
122
|
+
* - Understanding load order
|
|
123
|
+
* - Optimizing prefetching
|
|
124
|
+
* - Detecting circular dependencies
|
|
125
|
+
*/
|
|
126
|
+
generateDependencyGraph() {
|
|
127
|
+
let graph = "# Chunk Dependency Graph\n\n";
|
|
128
|
+
graph += "## Splitting Strategy\n";
|
|
129
|
+
graph += "- **vendor**: External dependencies (preact, utilities)\n";
|
|
130
|
+
graph += "- **runtime**: Framework runtime (hydration, SSR, hooks)\n";
|
|
131
|
+
graph += "- **common**: Shared components and utilities\n";
|
|
132
|
+
graph += "- **route**: Per-route lazy-loaded chunks\n";
|
|
133
|
+
graph += "- **entry**: Main application bundle\n\n";
|
|
134
|
+
graph += "## Load Order\n";
|
|
135
|
+
graph += "1. Entry (main bundle) - executes immediately\n";
|
|
136
|
+
graph += "2. Vendor - loaded on demand, cached long-term\n";
|
|
137
|
+
graph += "3. Runtime - loaded before any route rendering\n";
|
|
138
|
+
graph += "4. Common - loaded when needed by routes\n";
|
|
139
|
+
graph += "5. Route chunks - lazy-loaded per page\n\n";
|
|
140
|
+
graph += "## Cache Strategy\n";
|
|
141
|
+
graph +=
|
|
142
|
+
"- Vendor: `max-age=31536000, immutable` (1 year, never changes)\n";
|
|
143
|
+
graph += "- Runtime: `max-age=2592000` (30 days, updated with framework)\n";
|
|
144
|
+
graph += "- Entry: `max-age=3600` (1 hour, updated frequently)\n";
|
|
145
|
+
graph += "- Routes: `max-age=86400` (1 day, per-route updates)\n\n";
|
|
146
|
+
return graph;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Check if path is internal framework code
|
|
150
|
+
*/
|
|
151
|
+
isFrameworkInternal(path) {
|
|
152
|
+
return /@src|src\//.test(path);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Register custom splitting strategy
|
|
156
|
+
*/
|
|
157
|
+
registerStrategy(strategy) {
|
|
158
|
+
this.strategies.push(strategy);
|
|
159
|
+
// Re-sort by priority
|
|
160
|
+
this.strategies.sort((a, b) => b.priority - a.priority);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Generate splitting report
|
|
164
|
+
*/
|
|
165
|
+
generateReport() {
|
|
166
|
+
let report = "# Code Splitting Report\n\n";
|
|
167
|
+
report += "## Active Strategies\n";
|
|
168
|
+
for (const strategy of this.strategies) {
|
|
169
|
+
report += `- **${strategy.name}** (priority: ${strategy.priority})\n`;
|
|
170
|
+
}
|
|
171
|
+
report += "\n## Route Analysis\n";
|
|
172
|
+
if (this.routeAnalysis.size === 0) {
|
|
173
|
+
report += "No routes analyzed yet.\n";
|
|
174
|
+
} else {
|
|
175
|
+
for (const [route, deps] of this.routeAnalysis) {
|
|
176
|
+
report += `- **${route}**: ${deps.length} dependencies\n`;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
return report;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Helper: Create esbuild configuration for code splitting
|
|
184
|
+
*/
|
|
185
|
+
export function createSplitConfig(outdir = "dist") {
|
|
186
|
+
const splitter = new CodeSplitter();
|
|
187
|
+
return {
|
|
188
|
+
...splitter.generateSplittingConfig(),
|
|
189
|
+
outdir,
|
|
190
|
+
minify: true,
|
|
191
|
+
format: "esm",
|
|
192
|
+
target: "es2022",
|
|
193
|
+
};
|
|
194
|
+
}
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import {
|
|
2
|
+
resolveFeatures,
|
|
3
|
+
getEnabledFeatures,
|
|
4
|
+
createBuildMetadata,
|
|
5
|
+
} from "../core/features.js";
|
|
6
|
+
/**
|
|
7
|
+
* Build-time feature analyzer.
|
|
8
|
+
* Determines which features are enabled and generates metadata.
|
|
9
|
+
* Used to inform bundling decisions and eliminate unused code.
|
|
10
|
+
*/
|
|
11
|
+
export class FeatureAnalyzer {
|
|
12
|
+
config;
|
|
13
|
+
resolved;
|
|
14
|
+
metadata;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.config = config;
|
|
17
|
+
this.resolved = resolveFeatures(config.features);
|
|
18
|
+
this.metadata = createBuildMetadata(this.resolved, config.features);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Returns resolved feature configuration.
|
|
22
|
+
*/
|
|
23
|
+
getResolved() {
|
|
24
|
+
return this.resolved;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Returns build metadata for debugging/introspection.
|
|
28
|
+
*/
|
|
29
|
+
getMetadata() {
|
|
30
|
+
return this.metadata;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Checks if a feature is enabled.
|
|
34
|
+
*/
|
|
35
|
+
isEnabled(feature) {
|
|
36
|
+
return this.resolved[feature] ?? false;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Gets list of enabled features.
|
|
40
|
+
*/
|
|
41
|
+
getEnabled() {
|
|
42
|
+
return getEnabledFeatures(this.resolved);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Generates feature metadata JSON string.
|
|
46
|
+
*/
|
|
47
|
+
generateMetadataJson() {
|
|
48
|
+
return JSON.stringify(this.metadata, null, 2);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Generates a feature flag constant object for runtime checks.
|
|
52
|
+
* Can be tree-shaken by bundler for disabled features.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* ```typescript
|
|
56
|
+
* export const FEATURES = {
|
|
57
|
+
* api: true,
|
|
58
|
+
* middleware: true,
|
|
59
|
+
* cache: false,
|
|
60
|
+
* // ... rest
|
|
61
|
+
* } as const;
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
generateFeatureFlagsCode() {
|
|
65
|
+
const features = this.resolved;
|
|
66
|
+
const lines = Object.entries(features).map(
|
|
67
|
+
([name, enabled]) => ` ${name}: ${enabled},`,
|
|
68
|
+
);
|
|
69
|
+
return `
|
|
70
|
+
/**
|
|
71
|
+
* Build-time feature flags.
|
|
72
|
+
* Disabled features are tree-shaken by the bundler.
|
|
73
|
+
*/
|
|
74
|
+
export const FEATURES = {
|
|
75
|
+
${lines.join("\n")}
|
|
76
|
+
} as const;
|
|
77
|
+
|
|
78
|
+
export type EnabledFeatures = {
|
|
79
|
+
${getEnabledFeatures(this.resolved)
|
|
80
|
+
.map((f) => `${f}: typeof FEATURES.${f}`)
|
|
81
|
+
.join(";\n ")};
|
|
82
|
+
};
|
|
83
|
+
`;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Generates TypeScript definitions for feature-gated code.
|
|
87
|
+
* Enables type-safe access to enabled features only.
|
|
88
|
+
*/
|
|
89
|
+
generateTypeDefinitions() {
|
|
90
|
+
const enabled = getEnabledFeatures(this.resolved);
|
|
91
|
+
return `
|
|
92
|
+
/**
|
|
93
|
+
* Auto-generated feature type definitions
|
|
94
|
+
* Features not listed here are disabled and not available at runtime
|
|
95
|
+
*/
|
|
96
|
+
|
|
97
|
+
declare global {
|
|
98
|
+
interface FeatureFlags {
|
|
99
|
+
${enabled.map((f) => `${f}: true;`).join("\n ")}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export {};
|
|
104
|
+
`;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Generates a dynamic import guard for feature modules.
|
|
108
|
+
* Prevents importing disabled feature modules.
|
|
109
|
+
*/
|
|
110
|
+
generateFeatureGuard(feature) {
|
|
111
|
+
const isEnabled = this.isEnabled(feature);
|
|
112
|
+
return `
|
|
113
|
+
if (!${isEnabled}) {
|
|
114
|
+
throw new Error(
|
|
115
|
+
'Feature "${feature}" is not enabled. ' +
|
|
116
|
+
'Enable it in jen.config.ts: features: { ${feature}: true }'
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
`;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Generates code to conditionally include feature handlers.
|
|
123
|
+
* Used in server request handlers.
|
|
124
|
+
*/
|
|
125
|
+
generateConditionalHandlers() {
|
|
126
|
+
const enabled = getEnabledFeatures(this.resolved);
|
|
127
|
+
let code = `
|
|
128
|
+
// Auto-generated feature handlers
|
|
129
|
+
// Only enabled features are included
|
|
130
|
+
|
|
131
|
+
`;
|
|
132
|
+
if (enabled.includes("api")) {
|
|
133
|
+
code += `
|
|
134
|
+
// API Routes Handler
|
|
135
|
+
import { tryHandleApiRoute } from "../server/api-routes.js";
|
|
136
|
+
`;
|
|
137
|
+
}
|
|
138
|
+
if (enabled.includes("middleware")) {
|
|
139
|
+
code += `
|
|
140
|
+
// Middleware Handler
|
|
141
|
+
import { Kernel } from "../middleware/kernel.js";
|
|
142
|
+
`;
|
|
143
|
+
}
|
|
144
|
+
if (enabled.includes("cache")) {
|
|
145
|
+
code += `
|
|
146
|
+
// Cache Handler
|
|
147
|
+
import { MemoryCache } from "../cache/memory.js";
|
|
148
|
+
`;
|
|
149
|
+
}
|
|
150
|
+
if (enabled.includes("streaming")) {
|
|
151
|
+
code += `
|
|
152
|
+
// Streaming Handler
|
|
153
|
+
import renderToString from "preact-render-to-string";
|
|
154
|
+
`;
|
|
155
|
+
}
|
|
156
|
+
if (enabled.includes("auth")) {
|
|
157
|
+
code += `
|
|
158
|
+
// Auth Handler
|
|
159
|
+
// (to be implemented in future release)
|
|
160
|
+
`;
|
|
161
|
+
}
|
|
162
|
+
return code;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Generates summary report of feature configuration.
|
|
166
|
+
*/
|
|
167
|
+
generateReport() {
|
|
168
|
+
const enabled = getEnabledFeatures(this.resolved);
|
|
169
|
+
const disabled = Object.entries(this.resolved)
|
|
170
|
+
.filter(([, e]) => !e)
|
|
171
|
+
.map(([name]) => name);
|
|
172
|
+
return `
|
|
173
|
+
Feature Configuration Report
|
|
174
|
+
=============================
|
|
175
|
+
|
|
176
|
+
Build Time: ${this.metadata.buildTime}
|
|
177
|
+
|
|
178
|
+
Enabled (${enabled.length}):
|
|
179
|
+
${enabled.length > 0 ? enabled.map((f) => ` ✓ ${f}`).join("\n") : " (none - core only)"}
|
|
180
|
+
|
|
181
|
+
Disabled (${disabled.length}):
|
|
182
|
+
${disabled.length > 0 ? disabled.map((f) => ` ✗ ${f}`).join("\n") : " (all features enabled)"}
|
|
183
|
+
|
|
184
|
+
Bundle Impact:
|
|
185
|
+
Core modules: Always included
|
|
186
|
+
Enabled features: Included in bundle
|
|
187
|
+
Disabled features: Completely removed (tree-shaken)
|
|
188
|
+
`;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
import { resolveFeatures, getEnabledFeatures } from "../core/features.js";
|
|
2
|
+
/**
|
|
3
|
+
* Feature gate compiler that generates optimized request handlers based on enabled features.
|
|
4
|
+
* Statically analyzes feature configuration at build time and generates only the necessary code.
|
|
5
|
+
*
|
|
6
|
+
* This approach ensures:
|
|
7
|
+
* 1. Unused features are completely tree-shaken from the bundle
|
|
8
|
+
* 2. No runtime feature detection overhead
|
|
9
|
+
* 3. Type-safe access to enabled features
|
|
10
|
+
* 4. Build-time validation of feature compatibility
|
|
11
|
+
*/
|
|
12
|
+
export class FeatureGateCompiler {
|
|
13
|
+
resolved;
|
|
14
|
+
config;
|
|
15
|
+
constructor(config) {
|
|
16
|
+
this.config = config;
|
|
17
|
+
this.resolved = resolveFeatures(config.features);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Generates a TypeScript handler file that includes only enabled features.
|
|
21
|
+
* This file is generated at build time and imported by the request handler.
|
|
22
|
+
*
|
|
23
|
+
* @returns Generated TypeScript code as string
|
|
24
|
+
*/
|
|
25
|
+
generateHandlerCode() {
|
|
26
|
+
const enabled = getEnabledFeatures(this.resolved);
|
|
27
|
+
const imports = this.generateImports(enabled);
|
|
28
|
+
const middleware = this.generateMiddlewareChain(enabled);
|
|
29
|
+
const handlers = this.generateHandlers(enabled);
|
|
30
|
+
return `
|
|
31
|
+
/*
|
|
32
|
+
* AUTO-GENERATED: This file is generated at build time based on enabled features.
|
|
33
|
+
* DO NOT EDIT MANUALLY - your changes will be overwritten on next build.
|
|
34
|
+
*
|
|
35
|
+
* Enabled features: ${enabled.join(", ") || "none (core only)"}
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
${imports}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Build-time compiled request handler with only enabled features.
|
|
42
|
+
* Each feature is statically included or excluded based on configuration.
|
|
43
|
+
*/
|
|
44
|
+
export async function handleRequest(req: any, res: any, context: any) {
|
|
45
|
+
${middleware}
|
|
46
|
+
${handlers}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Feature flags for runtime checks (constant-folded at build time).
|
|
51
|
+
* TypeScript will eliminate dead code paths for disabled features.
|
|
52
|
+
*/
|
|
53
|
+
export const FEATURES = {
|
|
54
|
+
${enabled.map((f) => `${f}: true`).join(",\n ")},
|
|
55
|
+
${Object.entries(this.resolved)
|
|
56
|
+
.filter(([, enabled]) => !enabled)
|
|
57
|
+
.map(([name]) => `${name}: false`)
|
|
58
|
+
.join(",\n ")},
|
|
59
|
+
} as const;
|
|
60
|
+
`;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Generates import statements only for enabled features.
|
|
64
|
+
*
|
|
65
|
+
* @param enabled List of enabled feature names
|
|
66
|
+
* @returns Import statement code
|
|
67
|
+
*/
|
|
68
|
+
generateImports(enabled) {
|
|
69
|
+
const imports = [];
|
|
70
|
+
if (enabled.includes("api")) {
|
|
71
|
+
imports.push(
|
|
72
|
+
'import { handleApiRoutes } from "../features/api/handler.js";',
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
if (enabled.includes("middleware")) {
|
|
76
|
+
imports.push(
|
|
77
|
+
'import { compiledMiddlewareChain } from "../features/middleware/compiled.js";',
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
if (enabled.includes("cache")) {
|
|
81
|
+
imports.push(
|
|
82
|
+
'import { getCachedResponse, setCachedResponse } from "../features/cache/handler.js";',
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
if (enabled.includes("streaming")) {
|
|
86
|
+
imports.push(
|
|
87
|
+
'import { StreamingRenderer } from "../features/streaming/renderer.js";',
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
if (enabled.includes("auth")) {
|
|
91
|
+
imports.push(
|
|
92
|
+
'import { authMiddleware } from "../features/auth/middleware.js";',
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
// Always import core
|
|
96
|
+
imports.unshift('import type { RouteHandler } from "../core/types.js";');
|
|
97
|
+
return imports.join("\n");
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Generates middleware chain initialization code.
|
|
101
|
+
*
|
|
102
|
+
* @param enabled List of enabled feature names
|
|
103
|
+
* @returns Middleware setup code
|
|
104
|
+
*/
|
|
105
|
+
generateMiddlewareChain(enabled) {
|
|
106
|
+
if (!enabled.includes("middleware")) {
|
|
107
|
+
return "// Middleware disabled";
|
|
108
|
+
}
|
|
109
|
+
return `
|
|
110
|
+
// Apply compiled middleware chain (pre-resolved at build time)
|
|
111
|
+
const middlewareResult = await compiledMiddlewareChain(req, res, context);
|
|
112
|
+
if (middlewareResult.handled) return;
|
|
113
|
+
context.middleware = middlewareResult.data;
|
|
114
|
+
`;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Generates request handler logic for enabled features.
|
|
118
|
+
*
|
|
119
|
+
* @param enabled List of enabled feature names
|
|
120
|
+
* @returns Handler code
|
|
121
|
+
*/
|
|
122
|
+
generateHandlers(enabled) {
|
|
123
|
+
const handlers = [];
|
|
124
|
+
// Always handle core routing
|
|
125
|
+
handlers.push(`
|
|
126
|
+
// Core routing
|
|
127
|
+
const route = context.routes.get(req.url);
|
|
128
|
+
if (!route) {
|
|
129
|
+
res.statusCode = 404;
|
|
130
|
+
res.end("Not Found");
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
`);
|
|
134
|
+
// API routes
|
|
135
|
+
if (enabled.includes("api")) {
|
|
136
|
+
handlers.push(`
|
|
137
|
+
// Try API routes first
|
|
138
|
+
const apiResult = await handleApiRoutes(req, res, route, context);
|
|
139
|
+
if (apiResult.handled) return;
|
|
140
|
+
`);
|
|
141
|
+
}
|
|
142
|
+
// Caching
|
|
143
|
+
if (enabled.includes("cache")) {
|
|
144
|
+
handlers.push(`
|
|
145
|
+
// Check response cache
|
|
146
|
+
const cached = await getCachedResponse(route, context);
|
|
147
|
+
if (cached) {
|
|
148
|
+
res.setHeader("X-Cache", "HIT");
|
|
149
|
+
res.end(cached);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
`);
|
|
153
|
+
}
|
|
154
|
+
// SSR rendering
|
|
155
|
+
handlers.push(`
|
|
156
|
+
// Render route
|
|
157
|
+
const component = await import(route.moduleId);
|
|
158
|
+
const data = await component.loader?.(context) ?? {};
|
|
159
|
+
const html = await renderToString(component.default, { data });
|
|
160
|
+
`);
|
|
161
|
+
// Cache response
|
|
162
|
+
if (enabled.includes("cache")) {
|
|
163
|
+
handlers.push(`
|
|
164
|
+
await setCachedResponse(route, html, context);
|
|
165
|
+
`);
|
|
166
|
+
}
|
|
167
|
+
// Stream or buffered response
|
|
168
|
+
if (enabled.includes("streaming")) {
|
|
169
|
+
handlers.push(`
|
|
170
|
+
// Stream response
|
|
171
|
+
const renderer = new StreamingRenderer(res);
|
|
172
|
+
await renderer.sendHead(route.head);
|
|
173
|
+
await renderer.sendBody(html);
|
|
174
|
+
await renderer.sendFooter();
|
|
175
|
+
`);
|
|
176
|
+
} else {
|
|
177
|
+
handlers.push(`
|
|
178
|
+
// Send buffered response
|
|
179
|
+
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
180
|
+
res.end(html);
|
|
181
|
+
`);
|
|
182
|
+
}
|
|
183
|
+
return handlers.join("\n");
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Generates type definitions for enabled features.
|
|
187
|
+
* Ensures TypeScript knows about enabled/disabled features.
|
|
188
|
+
*
|
|
189
|
+
* @returns TypeScript type definition code
|
|
190
|
+
*/
|
|
191
|
+
generateTypeDefinitions() {
|
|
192
|
+
const enabled = getEnabledFeatures(this.resolved);
|
|
193
|
+
return `
|
|
194
|
+
// Auto-generated feature type definitions
|
|
195
|
+
declare global {
|
|
196
|
+
interface FeatureContext {
|
|
197
|
+
api: ${enabled.includes("api") ? "ApiFeature" : "never"};
|
|
198
|
+
middleware: ${enabled.includes("middleware") ? "MiddlewareFeature" : "never"};
|
|
199
|
+
cache: ${enabled.includes("cache") ? "CacheFeature" : "never"};
|
|
200
|
+
streaming: ${enabled.includes("streaming") ? "StreamingFeature" : "never"};
|
|
201
|
+
auth: ${enabled.includes("auth") ? "AuthFeature" : "never"};
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export {};
|
|
206
|
+
`;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Generates build metadata for debugging and introspection.
|
|
210
|
+
*
|
|
211
|
+
* @returns Metadata as JSON string
|
|
212
|
+
*/
|
|
213
|
+
generateMetadata() {
|
|
214
|
+
return JSON.stringify(
|
|
215
|
+
{
|
|
216
|
+
buildTime: new Date().toISOString(),
|
|
217
|
+
enabledFeatures: getEnabledFeatures(this.resolved),
|
|
218
|
+
disabledFeatures: Object.entries(this.resolved)
|
|
219
|
+
.filter(([, enabled]) => !enabled)
|
|
220
|
+
.map(([name]) => name),
|
|
221
|
+
config: this.config.features,
|
|
222
|
+
},
|
|
223
|
+
null,
|
|
224
|
+
2,
|
|
225
|
+
);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Creates an esbuild plugin that generates feature-gated code during build.
|
|
230
|
+
*
|
|
231
|
+
* @param config Framework configuration
|
|
232
|
+
* @returns esbuild plugin object
|
|
233
|
+
*/
|
|
234
|
+
export function featureGatePlugin(config) {
|
|
235
|
+
const compiler = new FeatureGateCompiler(config);
|
|
236
|
+
return {
|
|
237
|
+
name: "feature-gate",
|
|
238
|
+
resolveId(id) {
|
|
239
|
+
if (id === "virtual-feature-handler") {
|
|
240
|
+
return id;
|
|
241
|
+
}
|
|
242
|
+
if (id === "virtual-feature-metadata") {
|
|
243
|
+
return id;
|
|
244
|
+
}
|
|
245
|
+
return null;
|
|
246
|
+
},
|
|
247
|
+
load(id) {
|
|
248
|
+
if (id === "virtual-feature-handler") {
|
|
249
|
+
return compiler.generateHandlerCode();
|
|
250
|
+
}
|
|
251
|
+
if (id === "virtual-feature-metadata") {
|
|
252
|
+
return `export default ${compiler.generateMetadata()}`;
|
|
253
|
+
}
|
|
254
|
+
return null;
|
|
255
|
+
},
|
|
256
|
+
};
|
|
257
|
+
}
|