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
package/dist/colors.js
CHANGED
|
@@ -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
|
// ANSI color codes for beautiful terminal output
|
|
19
2
|
export const colors = {
|
|
20
3
|
// Main colors
|
package/dist/create.js
CHANGED
|
@@ -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
|
import fs from "fs";
|
|
19
2
|
import path from "path";
|
|
20
3
|
import { fileURLToPath } from "url";
|
|
@@ -75,6 +58,11 @@ export async function createJenApp() {
|
|
|
75
58
|
value: "static",
|
|
76
59
|
hint: "Fast, lightweight static sites",
|
|
77
60
|
},
|
|
61
|
+
{
|
|
62
|
+
label: `${pc.green("SSR & ISR")} - Server-side rendering with incremental static regeneration`,
|
|
63
|
+
value: "ssr-isr",
|
|
64
|
+
hint: "Dynamic content with cached pages",
|
|
65
|
+
},
|
|
78
66
|
],
|
|
79
67
|
});
|
|
80
68
|
if (isCancel(template)) {
|
package/dist/generator.js
CHANGED
|
@@ -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
|
import fs from "fs";
|
|
19
2
|
import path from "path";
|
|
20
3
|
export function copyTemplateFiles(src, dest) {
|
|
@@ -45,27 +28,27 @@ export function createProjectFiles(dir, options) {
|
|
|
45
28
|
}
|
|
46
29
|
// Merge with user project name
|
|
47
30
|
const packageJson = {
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
version: "0.1.0",
|
|
31
|
+
name: "jen-app",
|
|
32
|
+
version: "1.0.0",
|
|
51
33
|
type: "module",
|
|
52
34
|
scripts: {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
build: "jen build",
|
|
56
|
-
start: "jen start",
|
|
57
|
-
...(options.typescript && { typecheck: "tsc --noEmit" }),
|
|
35
|
+
dev: "node server.js dev",
|
|
36
|
+
build: "node build.js",
|
|
58
37
|
},
|
|
59
38
|
dependencies: {
|
|
60
|
-
...templatePackageJson.dependencies,
|
|
61
39
|
"@jenjs/master": "^1.2.5",
|
|
40
|
+
"@vue/compiler-sfc": "^3.5.28",
|
|
41
|
+
esbuild: "^0.25.0",
|
|
42
|
+
glob: "^13.0.5",
|
|
43
|
+
preact: "^10.25.4",
|
|
44
|
+
"preact-render-to-string": "^6.5.13",
|
|
45
|
+
sass: "^1.97.3",
|
|
46
|
+
sirv: "^3.0.1",
|
|
47
|
+
svelte: "^5.51.3",
|
|
62
48
|
},
|
|
63
49
|
devDependencies: {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
"@types/node": "^22.10.0",
|
|
67
|
-
typescript: "^5.7.2",
|
|
68
|
-
}),
|
|
50
|
+
"@types/node": "^22.10.0",
|
|
51
|
+
typescript: "^5.7.2",
|
|
69
52
|
},
|
|
70
53
|
};
|
|
71
54
|
fs.writeFileSync(path.join(dir, "package.json"), JSON.stringify(packageJson, null, 2));
|
package/dist/index.js
CHANGED
|
@@ -1 +1,6 @@
|
|
|
1
|
-
#!/usr/bin/env
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { createJenApp } from "./create.js";
|
|
3
|
+
createJenApp().catch((error) => {
|
|
4
|
+
console.error("\n❌ Error:", error.message);
|
|
5
|
+
process.exit(1);
|
|
6
|
+
});
|
package/package.json
CHANGED
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Jen.js Starter Kit: SSR + ISR
|
|
2
|
+
|
|
3
|
+
```sh
|
|
4
|
+
npm create jen-app@latest
|
|
5
|
+
```
|
|
6
|
+
|
|
7
|
+
> ⚡ **Building something cool?** This is an SSR (Server-Side Rendering) + ISR (Incremental Static Regeneration) Jen.js starter template with dynamic rendering and intelligent caching.
|
|
8
|
+
|
|
9
|
+
## 🚀 Project Structure
|
|
10
|
+
|
|
11
|
+
Inside your Jen.js project, you'll see the following folders and files:
|
|
12
|
+
|
|
13
|
+
```text
|
|
14
|
+
/
|
|
15
|
+
├── site/
|
|
16
|
+
│ ├── assets/
|
|
17
|
+
│ │ └── favicon.svg
|
|
18
|
+
│ ├── components/
|
|
19
|
+
│ │ └── Header.tsx
|
|
20
|
+
│ ├── layouts/
|
|
21
|
+
│ │ └── BaseLayout.tsx
|
|
22
|
+
│ ├── pages/
|
|
23
|
+
│ │ └── (index).tsx
|
|
24
|
+
│ ├── styles/
|
|
25
|
+
│ │ └── global.scss
|
|
26
|
+
│ └── jen.config.ts
|
|
27
|
+
├── dist/
|
|
28
|
+
└── package.json
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### Key Folders
|
|
32
|
+
|
|
33
|
+
- **`site/pages/`** → Your routes (file-based routing)
|
|
34
|
+
- **`site/components/`** → Reusable UI components
|
|
35
|
+
- **`site/layouts/`** → Layout wrappers
|
|
36
|
+
- **`site/assets/`** → Public static files
|
|
37
|
+
- **`site/styles/`** → Global styles
|
|
38
|
+
|
|
39
|
+
## 🧞 Commands
|
|
40
|
+
|
|
41
|
+
All commands are run from the root of the project, from a terminal:
|
|
42
|
+
|
|
43
|
+
| Command | Action |
|
|
44
|
+
| :-------------- | :---------------------------------------- |
|
|
45
|
+
| `npm install` | Installs dependencies |
|
|
46
|
+
| `npm run dev` | Starts the dev server at `localhost:3001` |
|
|
47
|
+
| `npm run build` | Builds your SSR+ISR app into `./dist/` |
|
|
48
|
+
|
|
49
|
+
## 🎯 SSR + ISR Mode
|
|
50
|
+
|
|
51
|
+
This template uses **Server-Side Rendering (SSR)** with **Incremental Static Regeneration (ISR)**:
|
|
52
|
+
|
|
53
|
+
- **SSR**: Pages are rendered on-demand on the server when requested
|
|
54
|
+
- **ISR**: Rendered pages are cached and revalidated every `defaultRevalidateSeconds` (default: 3600 seconds / 1 hour)
|
|
55
|
+
|
|
56
|
+
Configure revalidation in `jen.config.ts`:
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
rendering: {
|
|
60
|
+
defaultMode: "ssr",
|
|
61
|
+
defaultRevalidateSeconds: 3600, // Revalidate every hour
|
|
62
|
+
},
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
## 📦 Deployment
|
|
66
|
+
|
|
67
|
+
SSR+ISR apps require a Node.js runtime:
|
|
68
|
+
|
|
69
|
+
- **Vercel** - Excellent SSR support
|
|
70
|
+
- **Netlify** - With serverless functions
|
|
71
|
+
- **Railway** - Node.js hosting
|
|
72
|
+
- **Heroku** - Classic Node.js deployment
|
|
73
|
+
- **AWS Lambda** - Via serverless frameworks
|
|
74
|
+
|
|
75
|
+
## 👀 Want to learn more?
|
|
76
|
+
|
|
77
|
+
Check the Jen.js documentation (coming soon) or explore the source code to see how routing, SSR, and caching work.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { dirname, join } from "node:path";
|
|
2
|
+
import { fileURLToPath, pathToFileURL } from "node:url";
|
|
3
|
+
import { readdir, stat, readFile, writeFile } from "node:fs/promises";
|
|
4
|
+
import esbuild from "esbuild";
|
|
5
|
+
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const currentDir = dirname(__filename);
|
|
8
|
+
const rootDir = join(currentDir, ".");
|
|
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
|
+
|
|
34
|
+
// Embedded Minifier Logic
|
|
35
|
+
const Minifier = {
|
|
36
|
+
html(input) {
|
|
37
|
+
return input
|
|
38
|
+
.replace(/<!--[\s\S]*?-->/g, "")
|
|
39
|
+
.replace(/>\s+</g, "><")
|
|
40
|
+
.replace(/\s+/g, " ")
|
|
41
|
+
.replace(/\s*([{};:,=])\s*/g, "$1")
|
|
42
|
+
.trim();
|
|
43
|
+
},
|
|
44
|
+
css(input) {
|
|
45
|
+
return input
|
|
46
|
+
.replace(/\/\*[\s\S]*?\*\//g, "")
|
|
47
|
+
.replace(/\/\/.*/g, "")
|
|
48
|
+
.replace(/\s*([{}:;,])\s*/g, "$1")
|
|
49
|
+
.replace(/\s+/g, " ")
|
|
50
|
+
.replace(/;\s*}/g, "}")
|
|
51
|
+
.trim();
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
async function main() {
|
|
56
|
+
const args = process.argv.slice(2);
|
|
57
|
+
if (args.includes("analyze")) {
|
|
58
|
+
await analyze();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
console.log("[BUILD] Starting SSR+ISR build...");
|
|
63
|
+
|
|
64
|
+
const configPath = join(currentDir, "jen.config.ts");
|
|
65
|
+
const outdir = join(currentDir, ".esbuild");
|
|
66
|
+
|
|
67
|
+
await esbuild.build({
|
|
68
|
+
entryPoints: [configPath],
|
|
69
|
+
outdir,
|
|
70
|
+
format: "esm",
|
|
71
|
+
platform: "node",
|
|
72
|
+
target: "es2022",
|
|
73
|
+
bundle: true,
|
|
74
|
+
minify: true,
|
|
75
|
+
sourcemap: true,
|
|
76
|
+
loader: { ".ts": "ts" },
|
|
77
|
+
logLevel: "silent",
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const configFile = join(outdir, "jen.config.js");
|
|
81
|
+
const config = (await import(pathToFileURL(configFile).href)).default;
|
|
82
|
+
|
|
83
|
+
const buildPath = pathToFileURL(
|
|
84
|
+
join(rootDir, "lib/build/production-build.js"),
|
|
85
|
+
).href;
|
|
86
|
+
const { buildProduction } = await import(buildPath);
|
|
87
|
+
|
|
88
|
+
await buildProduction({ config });
|
|
89
|
+
|
|
90
|
+
console.log("[BUILD] Minifying output...");
|
|
91
|
+
|
|
92
|
+
async function minifyDir(dir) {
|
|
93
|
+
try {
|
|
94
|
+
const files = await readdir(dir);
|
|
95
|
+
for (const file of files) {
|
|
96
|
+
const path = join(dir, file);
|
|
97
|
+
const s = await stat(path);
|
|
98
|
+
if (s.isDirectory()) {
|
|
99
|
+
await minifyDir(path);
|
|
100
|
+
} else if (file.endsWith(".html")) {
|
|
101
|
+
const content = await readFile(path, "utf-8");
|
|
102
|
+
await writeFile(path, Minifier.html(content));
|
|
103
|
+
} else if (file.endsWith(".css")) {
|
|
104
|
+
const content = await readFile(path, "utf-8");
|
|
105
|
+
await writeFile(path, Minifier.css(content));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
} catch (e) {
|
|
109
|
+
if (e.code !== "ENOENT") console.warn("Minification warning:", e.message);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
await minifyDir(join(currentDir, config.distDir || "dist"));
|
|
114
|
+
|
|
115
|
+
console.log("✅ Site built successfully with SSR+ISR!");
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
main().catch(console.error);
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
const config: FrameworkConfig = {
|
|
2
|
+
siteDir: "site",
|
|
3
|
+
distDir: "dist",
|
|
4
|
+
routes: {
|
|
5
|
+
fileExtensions: [".tsx", ".jsx", ".ts", ".js"],
|
|
6
|
+
routeFilePattern: /^\(([^)]+)\)\.(tsx|jsx|ts|js)$/,
|
|
7
|
+
enableIndexFallback: true,
|
|
8
|
+
},
|
|
9
|
+
rendering: {
|
|
10
|
+
defaultMode: "ssr",
|
|
11
|
+
defaultRevalidateSeconds: 3600,
|
|
12
|
+
},
|
|
13
|
+
inject: {
|
|
14
|
+
head: [],
|
|
15
|
+
bodyEnd: [],
|
|
16
|
+
},
|
|
17
|
+
css: {
|
|
18
|
+
globalScss: "site/styles/global.scss",
|
|
19
|
+
},
|
|
20
|
+
assets: {
|
|
21
|
+
publicDir: "site/assets",
|
|
22
|
+
cacheControl: "public, max-age=3600",
|
|
23
|
+
},
|
|
24
|
+
server: {
|
|
25
|
+
port: 3001,
|
|
26
|
+
hostname: "localhost",
|
|
27
|
+
},
|
|
28
|
+
dev: {
|
|
29
|
+
liveReload: true,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export default config;
|
|
34
|
+
|
|
35
|
+
export type RenderMode = "ssg" | "ssr" | "isr";
|
|
36
|
+
|
|
37
|
+
export interface FrameworkConfig {
|
|
38
|
+
/** Root directory where pages/components live */
|
|
39
|
+
siteDir: string;
|
|
40
|
+
|
|
41
|
+
/** Output directory for build artifacts */
|
|
42
|
+
distDir: string;
|
|
43
|
+
|
|
44
|
+
routes: {
|
|
45
|
+
/** Allowed extensions for route files */
|
|
46
|
+
fileExtensions: string[];
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Pattern for matching route files.
|
|
50
|
+
* Example: (hello).tsx -> "hello"
|
|
51
|
+
*/
|
|
52
|
+
routeFilePattern: RegExp;
|
|
53
|
+
|
|
54
|
+
/** If true, /about maps to /about/index */
|
|
55
|
+
enableIndexFallback: boolean;
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
rendering: {
|
|
59
|
+
/** Default rendering strategy: ssg, ssr, or isr */
|
|
60
|
+
defaultMode: RenderMode;
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Default revalidation time in seconds (ISR-like behavior).
|
|
64
|
+
* 0 = never revalidate (pure SSR).
|
|
65
|
+
* >0 = revalidate cache after N seconds.
|
|
66
|
+
*/
|
|
67
|
+
defaultRevalidateSeconds: number;
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
inject: {
|
|
71
|
+
/**
|
|
72
|
+
* HTML strings to inject into <head>.
|
|
73
|
+
* Example: `<meta charset="utf-8">`
|
|
74
|
+
*/
|
|
75
|
+
head: string[];
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* HTML strings injected before </body>.
|
|
79
|
+
* Example: `<script src="/app.js"></script>`
|
|
80
|
+
*/
|
|
81
|
+
bodyEnd: string[];
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
css: {
|
|
85
|
+
/** Path to global SCSS file loaded into every page */
|
|
86
|
+
globalScss?: string;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
assets: {
|
|
90
|
+
/** Directory for static public assets */
|
|
91
|
+
publicDir: string;
|
|
92
|
+
|
|
93
|
+
/** Cache-Control header applied to assets */
|
|
94
|
+
cacheControl?: string;
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
server: {
|
|
98
|
+
/** Dev/SSR server port */
|
|
99
|
+
port: number;
|
|
100
|
+
|
|
101
|
+
/** Dev/SSR server hostname */
|
|
102
|
+
hostname: string;
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
dev: {
|
|
106
|
+
/** Enables live reload / HMR behavior */
|
|
107
|
+
liveReload: boolean;
|
|
108
|
+
};
|
|
109
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// Type declarations for local lib/ folder (bundled Jen.js framework)
|
|
2
|
+
declare module "lib" {
|
|
3
|
+
export * from "./lib/index.js";
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
declare module "lib/core" {
|
|
7
|
+
export * from "./lib/core/config.js";
|
|
8
|
+
export * from "./lib/core/routes/scan.js";
|
|
9
|
+
export * from "./lib/core/routes/match.js";
|
|
10
|
+
export * from "./lib/core/middleware-hooks.js";
|
|
11
|
+
export * from "./lib/core/http.js";
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
declare module "lib/runtime" {
|
|
15
|
+
export * from "./lib/runtime/render.js";
|
|
16
|
+
export * from "./lib/runtime/islands.js";
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
declare module "lib/server" {
|
|
20
|
+
export * from "./lib/server/app.js";
|
|
21
|
+
export * from "./lib/server/ssr.js";
|
|
22
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate secure cookie header value
|
|
3
|
+
*/
|
|
4
|
+
export function createSecureCookie(name, value, options = {}) {
|
|
5
|
+
const defaults = {
|
|
6
|
+
httpOnly: true, // Prevent XSS token theft
|
|
7
|
+
secure: process.env.NODE_ENV === "production", // HTTPS only in production
|
|
8
|
+
sameSite: "Strict", // CSRF protection
|
|
9
|
+
maxAge: 24 * 60 * 60, // 24 hours
|
|
10
|
+
path: "/",
|
|
11
|
+
};
|
|
12
|
+
const opts = { ...defaults, ...options };
|
|
13
|
+
let cookieStr = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;
|
|
14
|
+
if (opts.maxAge !== undefined) {
|
|
15
|
+
cookieStr += `; Max-Age=${opts.maxAge}`;
|
|
16
|
+
}
|
|
17
|
+
if (opts.path) {
|
|
18
|
+
cookieStr += `; Path=${opts.path}`;
|
|
19
|
+
}
|
|
20
|
+
if (opts.domain) {
|
|
21
|
+
cookieStr += `; Domain=${opts.domain}`;
|
|
22
|
+
}
|
|
23
|
+
if (opts.secure) {
|
|
24
|
+
cookieStr += "; Secure";
|
|
25
|
+
}
|
|
26
|
+
if (opts.httpOnly) {
|
|
27
|
+
cookieStr += "; HttpOnly";
|
|
28
|
+
}
|
|
29
|
+
if (opts.sameSite) {
|
|
30
|
+
cookieStr += `; SameSite=${opts.sameSite}`;
|
|
31
|
+
}
|
|
32
|
+
return cookieStr;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Parse cookies from request header
|
|
36
|
+
*/
|
|
37
|
+
export function parseCookies(cookieHeader) {
|
|
38
|
+
const cookies = {};
|
|
39
|
+
if (!cookieHeader || !cookieHeader.trim()) return cookies;
|
|
40
|
+
cookieHeader.split(";").forEach((cookie) => {
|
|
41
|
+
const trimmed = cookie.trim();
|
|
42
|
+
if (!trimmed) return;
|
|
43
|
+
const eqIndex = trimmed.indexOf("=");
|
|
44
|
+
if (eqIndex === -1) return;
|
|
45
|
+
const name = trimmed.substring(0, eqIndex).trim();
|
|
46
|
+
const value = trimmed.substring(eqIndex + 1).trim();
|
|
47
|
+
if (name && value) {
|
|
48
|
+
try {
|
|
49
|
+
cookies[decodeURIComponent(name)] = decodeURIComponent(value);
|
|
50
|
+
} catch (err) {
|
|
51
|
+
// Skip cookies with invalid URI encoding
|
|
52
|
+
console.warn(
|
|
53
|
+
`Failed to decode cookie ${name}:`,
|
|
54
|
+
err instanceof Error ? err.message : String(err),
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return cookies;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Validate session cookie - check all security properties
|
|
63
|
+
*/
|
|
64
|
+
export function validateSessionCookie(header, expectedName = "sessionId") {
|
|
65
|
+
if (!header) return false;
|
|
66
|
+
const parts = header.split(";").map((p) => p.trim());
|
|
67
|
+
const [cookiePair, ...flags] = parts;
|
|
68
|
+
if (!cookiePair || !cookiePair.includes("=")) return false;
|
|
69
|
+
const [name] = cookiePair.split("=");
|
|
70
|
+
if (decodeURIComponent(name) !== expectedName) return false;
|
|
71
|
+
// Check required security flags
|
|
72
|
+
const hasHttpOnly = flags.some((f) => f.toLowerCase() === "httponly");
|
|
73
|
+
const hasSameSite = flags.some((f) => f.toLowerCase().startsWith("samesite"));
|
|
74
|
+
const isSecure =
|
|
75
|
+
process.env.NODE_ENV === "production"
|
|
76
|
+
? flags.some((f) => f.toLowerCase() === "secure")
|
|
77
|
+
: true;
|
|
78
|
+
return hasHttpOnly && hasSameSite && isSecure;
|
|
79
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JWT token utilities for creating and validating JSON Web Tokens.
|
|
3
|
+
* This module provides stub implementations that require an external JWT library.
|
|
4
|
+
* Users must install a JWT library (e.g., jsonwebtoken) and implement these functions
|
|
5
|
+
* using that library's APIs to enable authentication features.
|
|
6
|
+
*
|
|
7
|
+
* The module validates that JWT_SECRET is configured in the environment,
|
|
8
|
+
* ensuring token signing and verification can proceed securely.
|
|
9
|
+
*/
|
|
10
|
+
// JWT signing and verification require an external library not included by default.
|
|
11
|
+
// Users should install jsonwebtoken: npm install jsonwebtoken
|
|
12
|
+
const SECRET = process.env.JWT_SECRET;
|
|
13
|
+
// Validate that JWT_SECRET is set. This environment variable is required for all token operations.
|
|
14
|
+
// Without a secret, tokens cannot be securely signed or verified.
|
|
15
|
+
if (!SECRET) {
|
|
16
|
+
throw new Error(
|
|
17
|
+
"CRITICAL: JWT_SECRET environment variable is required. Set JWT_SECRET in your .env file or environment.",
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Creates a signed JWT token containing the provided payload.
|
|
22
|
+
* This function is a stub that requires implementing with an external JWT library.
|
|
23
|
+
*
|
|
24
|
+
* @param payload The data to encode in the token.
|
|
25
|
+
* @param expiresIn Token expiration time (default "1h"). Format: "1h", "7d", "30s", etc.
|
|
26
|
+
* @returns The signed JWT token as a string.
|
|
27
|
+
* @throws Error indicating that a JWT library must be installed.
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* const token = signToken({ userId: 123, role: 'admin' }, '24h');
|
|
31
|
+
* // Implementation using jsonwebtoken:
|
|
32
|
+
* // jwt.sign(payload, SECRET, { expiresIn });
|
|
33
|
+
*/
|
|
34
|
+
export function signToken(payload, expiresIn = "1h") {
|
|
35
|
+
throw new Error(
|
|
36
|
+
"JWT implementation requires external library. Install: npm install jsonwebtoken",
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Verifies and decodes a JWT token, returning the payload if valid.
|
|
41
|
+
* This function is a stub that requires implementing with an external JWT library.
|
|
42
|
+
*
|
|
43
|
+
* @param token The JWT token string to verify.
|
|
44
|
+
* @returns The decoded payload from the token.
|
|
45
|
+
* @throws Error indicating that a JWT library must be installed.
|
|
46
|
+
* @throws Error if the token is invalid, expired, or fails verification.
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* const payload = verifyToken(token);
|
|
50
|
+
* // Implementation using jsonwebtoken:
|
|
51
|
+
* // jwt.verify(token, SECRET);
|
|
52
|
+
*/
|
|
53
|
+
export function verifyToken(token) {
|
|
54
|
+
throw new Error(
|
|
55
|
+
"JWT implementation requires external library. Install: npm install jsonwebtoken",
|
|
56
|
+
);
|
|
57
|
+
}
|