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,202 @@
|
|
|
1
|
+
import { renderRouteToHtml } from "../runtime/render.js";
|
|
2
|
+
/**
|
|
3
|
+
* HTML rendering cache for performance optimization.
|
|
4
|
+
* Cache key is URL pathname. Useful for frequently accessed pages.
|
|
5
|
+
* In production, consider using Redis or external cache for distributed rendering.
|
|
6
|
+
*/
|
|
7
|
+
const renderCache = new Map();
|
|
8
|
+
let cacheConfig = {
|
|
9
|
+
enabled: true,
|
|
10
|
+
ttlSeconds: 3600, // Default: 1 hour
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Configure the SSR HTML cache behavior.
|
|
14
|
+
*
|
|
15
|
+
* @param config Cache configuration options
|
|
16
|
+
*/
|
|
17
|
+
export function configureSsrCache(config) {
|
|
18
|
+
cacheConfig = { ...cacheConfig, ...config };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Clear the entire SSR render cache.
|
|
22
|
+
* Useful in development or when data has changed.
|
|
23
|
+
*/
|
|
24
|
+
export function clearSsrCache() {
|
|
25
|
+
renderCache.clear();
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Clear a specific cached page by URL pathname.
|
|
29
|
+
*
|
|
30
|
+
* @param pathname URL pathname to invalidate
|
|
31
|
+
*/
|
|
32
|
+
export function invalidateSsrCache(pathname) {
|
|
33
|
+
renderCache.delete(pathname);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get cached HTML for a page if it exists and hasn't expired.
|
|
37
|
+
*
|
|
38
|
+
* @param pathname URL pathname
|
|
39
|
+
* @returns Cached HTML string, or null if not cached/expired
|
|
40
|
+
*/
|
|
41
|
+
function getCachedHtml(pathname) {
|
|
42
|
+
if (!cacheConfig.enabled) return null;
|
|
43
|
+
const cached = renderCache.get(pathname);
|
|
44
|
+
if (!cached) return null;
|
|
45
|
+
const age = (Date.now() - cached.timestamp) / 1000;
|
|
46
|
+
if (age > cacheConfig.ttlSeconds) {
|
|
47
|
+
renderCache.delete(pathname);
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
return cached.html;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Cache rendered HTML for a page.
|
|
54
|
+
*
|
|
55
|
+
* @param pathname URL pathname
|
|
56
|
+
* @param html Complete HTML string to cache
|
|
57
|
+
*/
|
|
58
|
+
function cacheHtml(pathname, html) {
|
|
59
|
+
if (!cacheConfig.enabled) return;
|
|
60
|
+
renderCache.set(pathname, { html, timestamp: Date.now() });
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Core SSR render function: converts a component/template to HTML string.
|
|
64
|
+
* This is the main entry point for server-side rendering in Jen.js.
|
|
65
|
+
*
|
|
66
|
+
* Handles:
|
|
67
|
+
* 1. Cache lookup for performance
|
|
68
|
+
* 2. Module compilation (TS/JSX/Vue/Svelte → JS)
|
|
69
|
+
* 3. Route middleware execution
|
|
70
|
+
* 4. Loader function invocation (getServerSideProps pattern)
|
|
71
|
+
* 5. Component rendering to HTML string
|
|
72
|
+
* 6. Head management and hydration script injection
|
|
73
|
+
* 7. HTML caching for subsequent requests
|
|
74
|
+
*
|
|
75
|
+
* @param config Framework configuration
|
|
76
|
+
* @param route Route entry being rendered
|
|
77
|
+
* @param ctx Complete SSR context with request/response and metadata
|
|
78
|
+
* @returns Complete HTML document as a string
|
|
79
|
+
* @throws Error if rendering fails
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* const html = await render(config, route, {
|
|
84
|
+
* req, res, url, params, query, headers, cookies
|
|
85
|
+
* });
|
|
86
|
+
* res.setHeader("content-type", "text/html; charset=utf-8");
|
|
87
|
+
* res.end(html);
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
export async function render(config, route, ctx) {
|
|
91
|
+
const pathname = ctx.url.pathname;
|
|
92
|
+
// Check cache first
|
|
93
|
+
const cached = getCachedHtml(pathname);
|
|
94
|
+
if (cached) {
|
|
95
|
+
return cached;
|
|
96
|
+
}
|
|
97
|
+
// Render the page
|
|
98
|
+
const html = await renderRouteToHtml({
|
|
99
|
+
config,
|
|
100
|
+
route,
|
|
101
|
+
req: ctx.req,
|
|
102
|
+
res: ctx.res,
|
|
103
|
+
url: ctx.url,
|
|
104
|
+
params: ctx.params,
|
|
105
|
+
query: ctx.query,
|
|
106
|
+
headers: ctx.headers,
|
|
107
|
+
cookies: ctx.cookies,
|
|
108
|
+
});
|
|
109
|
+
// Cache for next request
|
|
110
|
+
cacheHtml(pathname, html);
|
|
111
|
+
return html;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Advanced SSR render with optional caching control.
|
|
115
|
+
* Allows per-request cache bypass for revalidation.
|
|
116
|
+
*
|
|
117
|
+
* @param config Framework configuration
|
|
118
|
+
* @param route Route entry being rendered
|
|
119
|
+
* @param ctx Complete SSR context
|
|
120
|
+
* @param options Render options
|
|
121
|
+
* @param options.cache Whether to use/update cache (default: true)
|
|
122
|
+
* @returns Complete HTML document
|
|
123
|
+
*
|
|
124
|
+
* @example
|
|
125
|
+
* ```typescript
|
|
126
|
+
* const html = await renderWithOptions(config, route, ctx, {
|
|
127
|
+
* cache: false // Bypass cache for this request
|
|
128
|
+
* });
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
export async function renderWithOptions(config, route, ctx, options = {}) {
|
|
132
|
+
const { cache = true } = options;
|
|
133
|
+
const pathname = ctx.url.pathname;
|
|
134
|
+
// Check cache if enabled
|
|
135
|
+
if (cache) {
|
|
136
|
+
const cached = getCachedHtml(pathname);
|
|
137
|
+
if (cached) return cached;
|
|
138
|
+
}
|
|
139
|
+
// Render the page
|
|
140
|
+
const html = await renderRouteToHtml({
|
|
141
|
+
config,
|
|
142
|
+
route,
|
|
143
|
+
req: ctx.req,
|
|
144
|
+
res: ctx.res,
|
|
145
|
+
url: ctx.url,
|
|
146
|
+
params: ctx.params,
|
|
147
|
+
query: ctx.query,
|
|
148
|
+
headers: ctx.headers,
|
|
149
|
+
cookies: ctx.cookies,
|
|
150
|
+
});
|
|
151
|
+
// Cache if enabled
|
|
152
|
+
if (cache) {
|
|
153
|
+
cacheHtml(pathname, html);
|
|
154
|
+
}
|
|
155
|
+
return html;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Manual HTML rendering of a component to string (no full document).
|
|
159
|
+
* Useful when you need just the component HTML without head/body wrapper.
|
|
160
|
+
*
|
|
161
|
+
* This is a low-level API primarily for internal use.
|
|
162
|
+
* For typical routing, use render() instead.
|
|
163
|
+
*
|
|
164
|
+
* @param config Framework configuration
|
|
165
|
+
* @param route Route to render
|
|
166
|
+
* @param ctx SSR context
|
|
167
|
+
* @returns Just the component body HTML (no <!doctype>, no <head>, no hydration)
|
|
168
|
+
*/
|
|
169
|
+
export async function renderComponentToString(config, route, ctx) {
|
|
170
|
+
// For now, we render the full HTML and extract the body
|
|
171
|
+
const html = await renderRouteToHtml({
|
|
172
|
+
config,
|
|
173
|
+
route,
|
|
174
|
+
req: ctx.req,
|
|
175
|
+
res: ctx.res,
|
|
176
|
+
url: ctx.url,
|
|
177
|
+
params: ctx.params,
|
|
178
|
+
query: ctx.query,
|
|
179
|
+
headers: ctx.headers,
|
|
180
|
+
cookies: ctx.cookies,
|
|
181
|
+
});
|
|
182
|
+
// Extract body content
|
|
183
|
+
const bodyMatch = html.match(/<div id="app">([\s\S]*?)<\/div>/);
|
|
184
|
+
return bodyMatch ? bodyMatch[1] : "";
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Get cache statistics for monitoring and debugging.
|
|
188
|
+
*
|
|
189
|
+
* @returns Cache statistics
|
|
190
|
+
*/
|
|
191
|
+
export function getSsrCacheStats() {
|
|
192
|
+
return {
|
|
193
|
+
size: renderCache.size,
|
|
194
|
+
enabled: cacheConfig.enabled,
|
|
195
|
+
ttlSeconds: cacheConfig.ttlSeconds,
|
|
196
|
+
entries: Array.from(renderCache.entries()).map(([key, value]) => ({
|
|
197
|
+
pathname: key,
|
|
198
|
+
age: (Date.now() - value.timestamp) / 1000,
|
|
199
|
+
size: value.html.length,
|
|
200
|
+
})),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get current timestamp in ISO 8601 format.
|
|
3
|
+
* Used to prefix all log messages with precise UTC time information for debugging and monitoring.
|
|
4
|
+
*
|
|
5
|
+
* @returns ISO 8601 timestamp string (e.g., "2026-02-19T15:30:45.123Z")
|
|
6
|
+
*/
|
|
7
|
+
function ts() {
|
|
8
|
+
return new Date().toISOString();
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Structured logging utility for the Jen.js framework.
|
|
12
|
+
* Provides three log levels (info, warn, error) that output to appropriate streams.
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* - log.info(): Development and progress messages
|
|
16
|
+
* - log.warn(): Warnings and non-fatal issues
|
|
17
|
+
* - log.error(): Critical errors that may require attention
|
|
18
|
+
*
|
|
19
|
+
* Format:
|
|
20
|
+
* All logs include an ISO 8601 timestamp and a level prefix.
|
|
21
|
+
* Example: "[2026-02-19T15:30:45.123Z] [INFO] Building 42 routes"
|
|
22
|
+
*
|
|
23
|
+
* Output:
|
|
24
|
+
* - info() -> console.log (stdout)
|
|
25
|
+
* - warn() -> console.warn (stderr)
|
|
26
|
+
* - error() -> console.error (stderr)
|
|
27
|
+
*
|
|
28
|
+
* This is used throughout the framework for build output, server status, and diagnostics.
|
|
29
|
+
*/
|
|
30
|
+
export const log = {
|
|
31
|
+
/**
|
|
32
|
+
* Logs an informational message with timestamp and [INFO] prefix.
|
|
33
|
+
* Used for progress updates, build completion, server startup, etc.
|
|
34
|
+
*
|
|
35
|
+
* @param msg Message to log
|
|
36
|
+
*
|
|
37
|
+
* @example log.info("Server running on port 3000");
|
|
38
|
+
*/
|
|
39
|
+
info(msg) {
|
|
40
|
+
console.log(`[${ts()}] [INFO] ${msg}`);
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* Logs a warning message with timestamp and [WARN] prefix.
|
|
44
|
+
* Used for non-fatal issues, deprecated usage, or recoverable problems.
|
|
45
|
+
*
|
|
46
|
+
* @param msg Warning message to log
|
|
47
|
+
*
|
|
48
|
+
* @example log.warn("Configuration file not found, using defaults");
|
|
49
|
+
*/
|
|
50
|
+
warn(msg) {
|
|
51
|
+
console.warn(`[${ts()}] [WARN] ${msg}`);
|
|
52
|
+
},
|
|
53
|
+
/**
|
|
54
|
+
* Logs an error message with timestamp and [ERROR] prefix.
|
|
55
|
+
* Used for critical failures that require immediate attention.
|
|
56
|
+
*
|
|
57
|
+
* @param msg Error message to log
|
|
58
|
+
*
|
|
59
|
+
* @example log.error("Failed to compile SCSS: syntax error on line 42");
|
|
60
|
+
*/
|
|
61
|
+
error(msg) {
|
|
62
|
+
console.error(`[${ts()}] [ERROR] ${msg}`);
|
|
63
|
+
},
|
|
64
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "jen-app",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "node server.js dev",
|
|
7
|
+
"build": "node build.js"
|
|
8
|
+
},
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"@vue/compiler-sfc": "^3.5.28",
|
|
11
|
+
"esbuild": "^0.25.0",
|
|
12
|
+
"glob": "^13.0.5",
|
|
13
|
+
"preact": "^10.25.4",
|
|
14
|
+
"preact-render-to-string": "^6.5.13",
|
|
15
|
+
"sass": "^1.97.3",
|
|
16
|
+
"sirv": "^3.0.1",
|
|
17
|
+
"svelte": "^5.51.3"
|
|
18
|
+
},
|
|
19
|
+
"devDependencies": {
|
|
20
|
+
"@types/node": "^22.10.0",
|
|
21
|
+
"typescript": "^5.7.2"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { createServer } from "node:http";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
4
|
+
import esbuild from "esbuild";
|
|
5
|
+
|
|
6
|
+
const colors = {
|
|
7
|
+
reset: "\x1b[0m",
|
|
8
|
+
dim: "\x1b[2m",
|
|
9
|
+
cyan: "\x1b[36m",
|
|
10
|
+
red: "\x1b[31m",
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
const ts = () => new Date().toISOString().replace("T", " ").slice(0, 19);
|
|
14
|
+
|
|
15
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
16
|
+
const currentDir = dirname(__filename);
|
|
17
|
+
const rootDir = join(currentDir, ".");
|
|
18
|
+
|
|
19
|
+
const mode = process.argv[2] ?? "dev";
|
|
20
|
+
const isDev = mode === "dev";
|
|
21
|
+
|
|
22
|
+
// Embedded Minifier Logic
|
|
23
|
+
const Minifier = {
|
|
24
|
+
html(input) {
|
|
25
|
+
return input
|
|
26
|
+
.replace(/<!--[\s\S]*?-->/g, "")
|
|
27
|
+
.replace(/>\s+</g, "><")
|
|
28
|
+
.replace(/\s+/g, " ")
|
|
29
|
+
.replace(/\s*([{};:,=])\s*/g, "$1")
|
|
30
|
+
.trim();
|
|
31
|
+
},
|
|
32
|
+
css(input) {
|
|
33
|
+
return input
|
|
34
|
+
.replace(/\/\*[\s\S]*?\*\//g, "")
|
|
35
|
+
.replace(/\/\/.*/g, "")
|
|
36
|
+
.replace(/\s*([{}:;,])\s*/g, "$1")
|
|
37
|
+
.replace(/\s+/g, " ")
|
|
38
|
+
.replace(/;\s*}/g, "}")
|
|
39
|
+
.trim();
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
async function main() {
|
|
44
|
+
console.log(
|
|
45
|
+
`${colors.dim}[${ts()}]${colors.reset} ${colors.cyan}[INFO]${colors.reset} Starting SSR+ISR server in ${isDev ? "DEV" : "PROD"} mode...`,
|
|
46
|
+
);
|
|
47
|
+
|
|
48
|
+
const configPath = join(currentDir, "jen.config.ts");
|
|
49
|
+
const outdir = join(currentDir, ".esbuild");
|
|
50
|
+
|
|
51
|
+
await esbuild.build({
|
|
52
|
+
entryPoints: [configPath],
|
|
53
|
+
outdir,
|
|
54
|
+
format: "esm",
|
|
55
|
+
platform: "node",
|
|
56
|
+
target: "es2022",
|
|
57
|
+
minify: true,
|
|
58
|
+
jsx: "automatic",
|
|
59
|
+
jsxImportSource: "preact",
|
|
60
|
+
bundle: true,
|
|
61
|
+
loader: { ".ts": "ts" },
|
|
62
|
+
logLevel: "silent",
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
const configFile = join(outdir, "jen.config.js");
|
|
66
|
+
const config = (await import(pathToFileURL(configFile).href)).default;
|
|
67
|
+
|
|
68
|
+
const appPath = pathToFileURL(join(rootDir, "lib/server/app.js")).href;
|
|
69
|
+
const { createApp } = await import(appPath);
|
|
70
|
+
|
|
71
|
+
// Load banner
|
|
72
|
+
const bannerPath = pathToFileURL(join(rootDir, "lib/cli/banner.js")).href;
|
|
73
|
+
const { printBanner } = await import(bannerPath);
|
|
74
|
+
|
|
75
|
+
const app = await createApp({
|
|
76
|
+
config,
|
|
77
|
+
mode: isDev ? "dev" : "prod",
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const server = createServer(async (req, res) => {
|
|
81
|
+
// Intercept response to minify
|
|
82
|
+
const originalEnd = res.end;
|
|
83
|
+
res.end = function (chunk, encoding, callback) {
|
|
84
|
+
if (chunk) {
|
|
85
|
+
const type = res.getHeader("content-type");
|
|
86
|
+
if (typeof type === "string") {
|
|
87
|
+
if (type.includes("text/html")) {
|
|
88
|
+
try {
|
|
89
|
+
chunk = Minifier.html(chunk.toString());
|
|
90
|
+
res.removeHeader("content-length");
|
|
91
|
+
} catch (e) {
|
|
92
|
+
console.error(
|
|
93
|
+
`${colors.dim}[${ts()}]${colors.reset} ${colors.red}[ERROR]${colors.reset} HTML Minification failed:`,
|
|
94
|
+
e,
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
} else if (type.includes("text/css")) {
|
|
98
|
+
try {
|
|
99
|
+
chunk = Minifier.css(chunk.toString());
|
|
100
|
+
res.removeHeader("content-length");
|
|
101
|
+
} catch (e) {
|
|
102
|
+
console.error(
|
|
103
|
+
`${colors.dim}[${ts()}]${colors.reset} ${colors.red}[ERROR]${colors.reset} CSS Minification failed:`,
|
|
104
|
+
e,
|
|
105
|
+
);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return originalEnd.call(this, chunk, encoding, callback);
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
try {
|
|
114
|
+
await app.handle(req, res);
|
|
115
|
+
} catch (err) {
|
|
116
|
+
res.statusCode = 500;
|
|
117
|
+
res.setHeader("content-type", "text/plain; charset=utf-8");
|
|
118
|
+
res.end("Internal Server Error\n\n" + (err?.stack ?? String(err)));
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
server.listen(config.server.port, config.server.hostname, () => {
|
|
123
|
+
const actualPort = server.address().port;
|
|
124
|
+
printBanner(actualPort, isDev ? "development" : "production");
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
* {
|
|
2
|
+
margin: 0;
|
|
3
|
+
padding: 0;
|
|
4
|
+
box-sizing: border-box;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
html {
|
|
8
|
+
font-family:
|
|
9
|
+
-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue",
|
|
10
|
+
Arial, sans-serif;
|
|
11
|
+
line-height: 1.5;
|
|
12
|
+
color: #333;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
body {
|
|
16
|
+
background-color: #f5f5f5;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
main {
|
|
20
|
+
max-width: 1200px;
|
|
21
|
+
margin: 0 auto;
|
|
22
|
+
padding: 2rem;
|
|
23
|
+
background: white;
|
|
24
|
+
border-radius: 8px;
|
|
25
|
+
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
h1 {
|
|
29
|
+
font-size: 2.5rem;
|
|
30
|
+
margin-bottom: 1rem;
|
|
31
|
+
color: #0066cc;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
p {
|
|
35
|
+
margin-bottom: 1rem;
|
|
36
|
+
font-size: 1.1rem;
|
|
37
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
|
5
|
+
|
|
6
|
+
"module": "ESNext",
|
|
7
|
+
"moduleResolution": "Bundler",
|
|
8
|
+
|
|
9
|
+
"jsx": "react-jsx",
|
|
10
|
+
"jsxImportSource": "preact",
|
|
11
|
+
|
|
12
|
+
"strict": true,
|
|
13
|
+
"skipLibCheck": true,
|
|
14
|
+
|
|
15
|
+
"baseUrl": ".",
|
|
16
|
+
"paths": {
|
|
17
|
+
"@src/*": ["lib/*"]
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
"types": ["node"],
|
|
21
|
+
|
|
22
|
+
"outDir": "dist",
|
|
23
|
+
"rootDir": ".",
|
|
24
|
+
|
|
25
|
+
"allowJs": false,
|
|
26
|
+
"resolveJsonModule": true,
|
|
27
|
+
|
|
28
|
+
"esModuleInterop": true,
|
|
29
|
+
"forceConsistentCasingInFileNames": true
|
|
30
|
+
},
|
|
31
|
+
"include": [
|
|
32
|
+
"site/**/*.ts",
|
|
33
|
+
"site/**/*.tsx",
|
|
34
|
+
"server.ts",
|
|
35
|
+
"build.ts",
|
|
36
|
+
"jen.config.ts"
|
|
37
|
+
],
|
|
38
|
+
"exclude": ["node_modules", "dist"]
|
|
39
|
+
}
|
|
@@ -1,21 +1,3 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* This file is part of Jen.js.
|
|
3
|
-
* Copyright (C) 2026 oopsio
|
|
4
|
-
*
|
|
5
|
-
* This program is free software: you can redistribute it and/or modify
|
|
6
|
-
* it under the terms of the GNU General Public License as published by
|
|
7
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
* (at your option) any later version.
|
|
9
|
-
*
|
|
10
|
-
* This program is distributed in the hope that it will be useful,
|
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
* GNU General Public License for more details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU General Public License
|
|
16
|
-
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
1
|
import { dirname, join } from "node:path";
|
|
20
2
|
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
21
3
|
import { readdir, stat, readFile, writeFile } from "node:fs/promises";
|
|
@@ -25,6 +7,30 @@ const __filename = fileURLToPath(import.meta.url);
|
|
|
25
7
|
const currentDir = dirname(__filename);
|
|
26
8
|
const rootDir = join(currentDir, ".");
|
|
27
9
|
|
|
10
|
+
async function analyze() {
|
|
11
|
+
console.log("[ANALYZE] Loading bundle analyzer...");
|
|
12
|
+
const analyzerPath = pathToFileURL(
|
|
13
|
+
join(rootDir, "lib/build/bundle-analyzer.js"),
|
|
14
|
+
).href;
|
|
15
|
+
const { runBundleAnalyzer } = await import(analyzerPath);
|
|
16
|
+
const configPath = join(currentDir, "jen.config.ts");
|
|
17
|
+
const outdir = join(currentDir, ".esbuild");
|
|
18
|
+
await esbuild.build({
|
|
19
|
+
entryPoints: [configPath],
|
|
20
|
+
outdir,
|
|
21
|
+
format: "esm",
|
|
22
|
+
platform: "node",
|
|
23
|
+
target: "es2022",
|
|
24
|
+
bundle: true,
|
|
25
|
+
loader: { ".ts": "ts" },
|
|
26
|
+
logLevel: "silent",
|
|
27
|
+
});
|
|
28
|
+
const configFile = join(outdir, "jen.config.js");
|
|
29
|
+
const config = (await import(pathToFileURL(configFile).href)).default;
|
|
30
|
+
await runBundleAnalyzer(config);
|
|
31
|
+
console.log("[ANALYZE] Bundle analysis complete!");
|
|
32
|
+
}
|
|
33
|
+
|
|
28
34
|
// Embedded Minifier Logic
|
|
29
35
|
const Minifier = {
|
|
30
36
|
html(input) {
|
|
@@ -47,6 +53,12 @@ const Minifier = {
|
|
|
47
53
|
};
|
|
48
54
|
|
|
49
55
|
async function main() {
|
|
56
|
+
const args = process.argv.slice(2);
|
|
57
|
+
if (args.includes("analyze")) {
|
|
58
|
+
await analyze();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
50
62
|
console.log("[BUILD] Starting build...");
|
|
51
63
|
|
|
52
64
|
const configPath = join(currentDir, "jen.config.ts");
|
|
@@ -1,21 +1,3 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* This file is part of Jen.js.
|
|
3
|
-
* Copyright (C) 2026 oopsio
|
|
4
|
-
*
|
|
5
|
-
* This program is free software: you can redistribute it and/or modify
|
|
6
|
-
* it under the terms of the GNU General Public License as published by
|
|
7
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
* (at your option) any later version.
|
|
9
|
-
*
|
|
10
|
-
* This program is distributed in the hope that it will be useful,
|
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
* GNU General Public License for more details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU General Public License
|
|
16
|
-
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
1
|
const config: FrameworkConfig = {
|
|
20
2
|
siteDir: "site",
|
|
21
3
|
distDir: "dist",
|
|
@@ -1,21 +1,3 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* This file is part of Jen.js.
|
|
3
|
-
* Copyright (C) 2026 oopsio
|
|
4
|
-
*
|
|
5
|
-
* This program is free software: you can redistribute it and/or modify
|
|
6
|
-
* it under the terms of the GNU General Public License as published by
|
|
7
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
* (at your option) any later version.
|
|
9
|
-
*
|
|
10
|
-
* This program is distributed in the hope that it will be useful,
|
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
* GNU General Public License for more details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU General Public License
|
|
16
|
-
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
1
|
declare module "@jenjs/master" {
|
|
20
2
|
export * from "@jenjs/master";
|
|
21
3
|
}
|
|
@@ -1,20 +1,3 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* This file is part of Jen.js.
|
|
3
|
-
* Copyright (C) 2026 oopsio
|
|
4
|
-
*
|
|
5
|
-
* This program is free software: you can redistribute it and/or modify
|
|
6
|
-
* it under the terms of the GNU General Public License as published by
|
|
7
|
-
* the Free Software Foundation, either version 3 of the License, or
|
|
8
|
-
* (at your option) any later version.
|
|
9
|
-
*
|
|
10
|
-
* This program is distributed in the hope that it will be useful,
|
|
11
|
-
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
12
|
-
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
13
|
-
* GNU General Public License for more details.
|
|
14
|
-
*
|
|
15
|
-
* You should have received a copy of the GNU General Public License
|
|
16
|
-
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
17
|
-
*/
|
|
18
1
|
export default async function handler(ctx) {
|
|
19
2
|
return {
|
|
20
3
|
ok: true,
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Example Catch-All API Route: GET /api/files/[...slug]
|
|
3
|
+
*
|
|
4
|
+
* Example showing catch-all dynamic routes for file paths
|
|
5
|
+
* Matches: /api/files/a, /api/files/a/b, /api/files/a/b/c, etc.
|
|
6
|
+
*/
|
|
7
|
+
export default async function handler(req, res) {
|
|
8
|
+
const { slug } = req.params;
|
|
9
|
+
// slug will be an array of path segments
|
|
10
|
+
// /api/files/docs/readme.md -> slug = ['docs', 'readme.md']
|
|
11
|
+
// /api/files/a/b/c -> slug = ['a', 'b', 'c']
|
|
12
|
+
const filePath = Array.isArray(slug) ? slug.join("/") : slug;
|
|
13
|
+
if (req.method === "GET") {
|
|
14
|
+
res.status(200).json({
|
|
15
|
+
message: "File resource",
|
|
16
|
+
path: filePath,
|
|
17
|
+
segments: slug,
|
|
18
|
+
});
|
|
19
|
+
} else {
|
|
20
|
+
res.status(405).json({ error: "Method not allowed" });
|
|
21
|
+
}
|
|
22
|
+
}
|