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,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JDB (Jen Database) - A lightweight embedded JSON database for Jen.js applications.
|
|
3
|
+
*
|
|
4
|
+
* JDB provides MongoDB-like CRUD operations with file-based or in-memory storage.
|
|
5
|
+
* Perfect for small to medium applications that need data persistence without external dependencies.
|
|
6
|
+
*
|
|
7
|
+
* Features:
|
|
8
|
+
* - MongoDB-like query syntax with filter operators ($eq, $gt, $in, $regex, etc.)
|
|
9
|
+
* - Atomic update operations ($set, $inc, $push, etc.)
|
|
10
|
+
* - Pagination, sorting, and filtering
|
|
11
|
+
* - Lazy loading and deferred writes for performance
|
|
12
|
+
* - In-memory mode for testing
|
|
13
|
+
* - Simple JSON file format for easy inspection and migration
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* import { JDBEngine, type ICollection, type Document } from '@src/jdb';
|
|
17
|
+
*
|
|
18
|
+
* interface User extends Document {
|
|
19
|
+
* name: string;
|
|
20
|
+
* email: string;
|
|
21
|
+
* age: number;
|
|
22
|
+
* }
|
|
23
|
+
*
|
|
24
|
+
* const db = new JDBEngine({ root: './data' });
|
|
25
|
+
* await db.connect();
|
|
26
|
+
*
|
|
27
|
+
* const users = db.collection<User>('users');
|
|
28
|
+
* const user = await users.insert({ name: 'John', email: 'john@example.com', age: 30 });
|
|
29
|
+
* const found = await users.findOne({ email: 'john@example.com' });
|
|
30
|
+
* await users.update({ _id: user._id }, { $set: { age: 31 } });
|
|
31
|
+
* await users.delete({ _id: user._id });
|
|
32
|
+
*/
|
|
33
|
+
export * from "./types";
|
|
34
|
+
export { JDBEngine } from "./engine";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import fs from "fs/promises";
|
|
2
|
+
import crypto from "crypto";
|
|
3
|
+
/**
|
|
4
|
+
* Ensure a directory exists, creating it recursively if necessary.
|
|
5
|
+
* Idempotent: does not throw if the directory already exists.
|
|
6
|
+
*
|
|
7
|
+
* @param dir Directory path to ensure exists.
|
|
8
|
+
* @throws Error if directory creation fails.
|
|
9
|
+
*/
|
|
10
|
+
export async function ensureDir(dir) {
|
|
11
|
+
try {
|
|
12
|
+
await fs.access(dir);
|
|
13
|
+
} catch {
|
|
14
|
+
await fs.mkdir(dir, { recursive: true });
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Read and parse a JSON file from disk.
|
|
19
|
+
* Returns null if the file does not exist (ENOENT).
|
|
20
|
+
* Other errors (invalid JSON, permission denied, etc.) are re-thrown.
|
|
21
|
+
*
|
|
22
|
+
* @template T The expected JSON structure type.
|
|
23
|
+
* @param file Path to the JSON file to read.
|
|
24
|
+
* @returns Parsed JSON data, or null if file does not exist.
|
|
25
|
+
* @throws Error if the file exists but cannot be read or parsed.
|
|
26
|
+
*/
|
|
27
|
+
export async function readJSON(file) {
|
|
28
|
+
try {
|
|
29
|
+
const data = await fs.readFile(file, "utf-8");
|
|
30
|
+
return JSON.parse(data);
|
|
31
|
+
} catch (e) {
|
|
32
|
+
if (e.code === "ENOENT") return null;
|
|
33
|
+
throw e;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Write data as JSON to a file atomically using a temporary file.
|
|
38
|
+
* Atomic writes prevent corruption if the process crashes during writing.
|
|
39
|
+
* The temporary file is renamed to the target file only after writing completes successfully.
|
|
40
|
+
*
|
|
41
|
+
* @param file Path to the target file (will be created or overwritten).
|
|
42
|
+
* @param data Object to serialize as JSON with pretty-printing (2-space indent).
|
|
43
|
+
* @throws Error if writing or renaming fails.
|
|
44
|
+
*/
|
|
45
|
+
export async function writeJSON(file, data) {
|
|
46
|
+
const tempFile = `${file}.tmp`;
|
|
47
|
+
await fs.writeFile(tempFile, JSON.stringify(data, null, 2));
|
|
48
|
+
await fs.rename(tempFile, file);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Generate a unique identifier for a new document.
|
|
52
|
+
* Uses cryptographically secure UUID v4 generation.
|
|
53
|
+
*
|
|
54
|
+
* @returns A UUID string suitable for use as a document _id.
|
|
55
|
+
*/
|
|
56
|
+
export function generateId() {
|
|
57
|
+
return crypto.randomUUID();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Test whether a document matches a filter query.
|
|
61
|
+
* Supports MongoDB-like query syntax including operators ($eq, $ne, $gt, etc.) and logical operators ($or, $and).
|
|
62
|
+
* Processes each field condition and returns false if any condition fails (AND semantics).
|
|
63
|
+
* Logical operators $or and $and are processed separately with their respective semantics.
|
|
64
|
+
*
|
|
65
|
+
* @param doc The document to test.
|
|
66
|
+
* @param filter The filter query to apply.
|
|
67
|
+
* @returns True if the document matches all filter conditions, false otherwise.
|
|
68
|
+
*
|
|
69
|
+
* @example
|
|
70
|
+
* matchFilter({ name: 'John', age: 30 }, { name: 'John' }) // true
|
|
71
|
+
* matchFilter({ age: 25 }, { age: { $gte: 18 } }) // true
|
|
72
|
+
* matchFilter({ name: 'Jane' }, { $or: [{ name: 'John' }, { name: 'Jane' }] }) // true
|
|
73
|
+
*/
|
|
74
|
+
export function matchFilter(doc, filter) {
|
|
75
|
+
for (const key in filter) {
|
|
76
|
+
if (key === "$or") {
|
|
77
|
+
// OR: at least one filter must match
|
|
78
|
+
if (!filter.$or.some((f) => matchFilter(doc, f))) return false;
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
if (key === "$and") {
|
|
82
|
+
// AND: all filters must match
|
|
83
|
+
if (!filter.$and.every((f) => matchFilter(doc, f))) return false;
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
const val = doc[key];
|
|
87
|
+
const cond = filter[key];
|
|
88
|
+
// If condition is an object (not array), it contains operators
|
|
89
|
+
if (typeof cond === "object" && cond !== null && !Array.isArray(cond)) {
|
|
90
|
+
for (const op in cond) {
|
|
91
|
+
const target = cond[op];
|
|
92
|
+
switch (op) {
|
|
93
|
+
case "$eq":
|
|
94
|
+
if (val !== target) return false;
|
|
95
|
+
break;
|
|
96
|
+
case "$ne":
|
|
97
|
+
if (val === target) return false;
|
|
98
|
+
break;
|
|
99
|
+
case "$gt":
|
|
100
|
+
if (!(val > target)) return false;
|
|
101
|
+
break;
|
|
102
|
+
case "$gte":
|
|
103
|
+
if (!(val >= target)) return false;
|
|
104
|
+
break;
|
|
105
|
+
case "$lt":
|
|
106
|
+
if (!(val < target)) return false;
|
|
107
|
+
break;
|
|
108
|
+
case "$lte":
|
|
109
|
+
if (!(val <= target)) return false;
|
|
110
|
+
break;
|
|
111
|
+
case "$in":
|
|
112
|
+
if (!target.includes(val)) return false;
|
|
113
|
+
break;
|
|
114
|
+
case "$nin":
|
|
115
|
+
if (target.includes(val)) return false;
|
|
116
|
+
break;
|
|
117
|
+
case "$regex":
|
|
118
|
+
if (!new RegExp(target).test(val)) return false;
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
// Simple equality check
|
|
124
|
+
if (val !== cond) return false;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Apply update operators to a document, modifying it in place.
|
|
131
|
+
* Automatically updates the _updated timestamp to the current time.
|
|
132
|
+
* Supports $set, $unset, $inc, $push, and $pull operators.
|
|
133
|
+
*
|
|
134
|
+
* @param doc The document to update (modified in place).
|
|
135
|
+
* @param update Update specification with operators.
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* const doc = { name: 'John', age: 30, tags: ['js'] };
|
|
139
|
+
* applyUpdate(doc, { $set: { name: 'Jane' }, $inc: { age: 1 }, $push: { tags: 'ts' } });
|
|
140
|
+
* // doc is now { name: 'Jane', age: 31, tags: ['js', 'ts'], _updated: <current-timestamp> }
|
|
141
|
+
*/
|
|
142
|
+
export function applyUpdate(doc, update) {
|
|
143
|
+
const now = Date.now();
|
|
144
|
+
doc._updated = now;
|
|
145
|
+
for (const op in update) {
|
|
146
|
+
const fields = update[op];
|
|
147
|
+
for (const key in fields) {
|
|
148
|
+
const val = fields[key];
|
|
149
|
+
switch (op) {
|
|
150
|
+
case "$set":
|
|
151
|
+
// Set field to the specified value
|
|
152
|
+
doc[key] = val;
|
|
153
|
+
break;
|
|
154
|
+
case "$unset":
|
|
155
|
+
// Remove the field from the document
|
|
156
|
+
delete doc[key];
|
|
157
|
+
break;
|
|
158
|
+
case "$inc":
|
|
159
|
+
// Increment numeric field by the specified amount
|
|
160
|
+
doc[key] = (doc[key] || 0) + val;
|
|
161
|
+
break;
|
|
162
|
+
case "$push":
|
|
163
|
+
// Append to array (create array if doesn't exist)
|
|
164
|
+
if (!Array.isArray(doc[key])) doc[key] = [];
|
|
165
|
+
doc[key].push(val);
|
|
166
|
+
break;
|
|
167
|
+
case "$pull":
|
|
168
|
+
// Remove all occurrences of value from array
|
|
169
|
+
if (Array.isArray(doc[key])) {
|
|
170
|
+
doc[key] = doc[key].filter((item) => item !== val);
|
|
171
|
+
}
|
|
172
|
+
break;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
@@ -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
|
/**
|
|
19
2
|
* Request body parsing middleware.
|
|
20
3
|
* Reads and parses the request body based on Content-Type header.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export function cors(options = {}) {
|
|
2
|
+
const defaults = {
|
|
3
|
+
origin: ["http://localhost:3000", "http://localhost:5173"],
|
|
4
|
+
methods: ["GET", "HEAD", "PUT", "PATCH", "POST", "DELETE"],
|
|
5
|
+
allowedHeaders: ["Content-Type", "Authorization"],
|
|
6
|
+
credentials: false, // Changed: credentials should be false with CORS by default for security
|
|
7
|
+
maxAge: 86400,
|
|
8
|
+
};
|
|
9
|
+
const opts = { ...defaults, ...options };
|
|
10
|
+
return async (ctx, next) => {
|
|
11
|
+
const origin = ctx.req.headers.origin;
|
|
12
|
+
// Validate origin against whitelist
|
|
13
|
+
let allowOrigin = false;
|
|
14
|
+
if (Array.isArray(opts.origin)) {
|
|
15
|
+
allowOrigin = origin && opts.origin.includes(origin);
|
|
16
|
+
} else if (typeof opts.origin === "function") {
|
|
17
|
+
allowOrigin = origin && opts.origin(origin);
|
|
18
|
+
} else if (opts.origin === "*") {
|
|
19
|
+
// DANGEROUS: only use with credentials: false
|
|
20
|
+
if (opts.credentials) {
|
|
21
|
+
console.warn(
|
|
22
|
+
"SECURITY WARNING: CORS origin '*' with credentials=true is insecure. Origin set to empty.",
|
|
23
|
+
);
|
|
24
|
+
allowOrigin = false;
|
|
25
|
+
} else {
|
|
26
|
+
allowOrigin = true;
|
|
27
|
+
}
|
|
28
|
+
} else if (opts.origin === origin) {
|
|
29
|
+
allowOrigin = true;
|
|
30
|
+
}
|
|
31
|
+
if (allowOrigin && origin) {
|
|
32
|
+
ctx.response.header("Access-Control-Allow-Origin", origin);
|
|
33
|
+
}
|
|
34
|
+
if (opts.credentials) {
|
|
35
|
+
ctx.response.header("Access-Control-Allow-Credentials", "true");
|
|
36
|
+
}
|
|
37
|
+
if (ctx.req.method === "OPTIONS") {
|
|
38
|
+
ctx.response.header(
|
|
39
|
+
"Access-Control-Allow-Methods",
|
|
40
|
+
opts.methods?.join(","),
|
|
41
|
+
);
|
|
42
|
+
ctx.response.header(
|
|
43
|
+
"Access-Control-Allow-Headers",
|
|
44
|
+
opts.allowedHeaders?.join(","),
|
|
45
|
+
);
|
|
46
|
+
if (opts.maxAge) {
|
|
47
|
+
ctx.response.header("Access-Control-Max-Age", opts.maxAge);
|
|
48
|
+
}
|
|
49
|
+
ctx.response.status(204).send();
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
await next();
|
|
53
|
+
};
|
|
54
|
+
}
|
|
@@ -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 { log } from "../../shared/log.js";
|
|
19
2
|
/**
|
|
20
3
|
* Middleware that logs HTTP requests and responses with timing information.
|
|
@@ -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
|
/**
|
|
19
2
|
* Rate limiting middleware that protects against brute force and DDoS attacks.
|
|
20
3
|
* Tracks request count per client IP within a time window and rejects excess requests.
|
|
@@ -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 { randomUUID } from "node:crypto";
|
|
19
2
|
/**
|
|
20
3
|
* Request ID middleware that assigns unique identifiers to incoming requests.
|
|
@@ -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
|
/**
|
|
19
2
|
* Security headers middleware that sets HTTP response headers for defense against common attacks.
|
|
20
3
|
* Implements a comprehensive security policy including:
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { ResponseBuilder } from "./response.js";
|
|
2
|
+
/**
|
|
3
|
+
* Request context object passed through the middleware chain.
|
|
4
|
+
* Wraps Node.js req/res objects and provides helper methods and parsed request data.
|
|
5
|
+
* Each middleware receives this context and can read/modify its properties.
|
|
6
|
+
*
|
|
7
|
+
* The context enables:
|
|
8
|
+
* - Access to parsed URL, query params, route params, cookies, headers
|
|
9
|
+
* - Convenient response building methods (json(), headers())
|
|
10
|
+
* - State storage for passing data between middlewares
|
|
11
|
+
* - Request body parsing and caching
|
|
12
|
+
*/
|
|
13
|
+
export class Context {
|
|
14
|
+
/**
|
|
15
|
+
* Raw Node.js IncomingMessage request object.
|
|
16
|
+
* Contains method, url, headers, socket, etc.
|
|
17
|
+
*/
|
|
18
|
+
req;
|
|
19
|
+
/**
|
|
20
|
+
* Raw Node.js ServerResponse response object.
|
|
21
|
+
* Used to send response data back to the client.
|
|
22
|
+
*/
|
|
23
|
+
res;
|
|
24
|
+
/**
|
|
25
|
+
* Parsed URL object with scheme, host, pathname, search, searchParams, etc.
|
|
26
|
+
* Automatically constructed from req.url and req.headers.host.
|
|
27
|
+
*
|
|
28
|
+
* @example ctx.url.pathname for "/posts/42", ctx.url.searchParams for query parsing
|
|
29
|
+
*/
|
|
30
|
+
url;
|
|
31
|
+
/**
|
|
32
|
+
* Shared state object for middleware to store data.
|
|
33
|
+
* Useful for passing values between middlewares in the chain without response headers.
|
|
34
|
+
*
|
|
35
|
+
* @example ctx.state.userId = 42; // Set in auth middleware, read in handler
|
|
36
|
+
*/
|
|
37
|
+
state;
|
|
38
|
+
/**
|
|
39
|
+
* ResponseBuilder instance for fluent response building.
|
|
40
|
+
* Use ctx.response.status().json() or ctx.response.header() to build responses.
|
|
41
|
+
* Alternatively, use ctx.json() shortcut for quick JSON responses.
|
|
42
|
+
*/
|
|
43
|
+
response;
|
|
44
|
+
/**
|
|
45
|
+
* Parsed request body cache.
|
|
46
|
+
* Set by body parser middleware if request has a body.
|
|
47
|
+
* Can be null if no body parser ran or if the request has no body.
|
|
48
|
+
*/
|
|
49
|
+
body;
|
|
50
|
+
/**
|
|
51
|
+
* Query string parameters as an object.
|
|
52
|
+
* Automatically parsed from ctx.url.searchParams on construction.
|
|
53
|
+
* Keys and values are always strings.
|
|
54
|
+
*
|
|
55
|
+
* @example For URL "/posts?sort=date&limit=10", yields { sort: "date", limit: "10" }
|
|
56
|
+
*/
|
|
57
|
+
query;
|
|
58
|
+
/**
|
|
59
|
+
* Route parameters extracted from the URL path.
|
|
60
|
+
* Set by route matching middleware based on dynamic route patterns.
|
|
61
|
+
* Empty object initially; populated when a route matches.
|
|
62
|
+
*
|
|
63
|
+
* @example For route "/posts/:id" matching "/posts/42", yields { id: "42" }
|
|
64
|
+
*/
|
|
65
|
+
params;
|
|
66
|
+
/**
|
|
67
|
+
* Initializes a request context from Node.js request and response objects.
|
|
68
|
+
* Parses the URL, extracts query parameters, and initializes helpers.
|
|
69
|
+
*
|
|
70
|
+
* @param req Node.js IncomingMessage
|
|
71
|
+
* @param res Node.js ServerResponse
|
|
72
|
+
*/
|
|
73
|
+
constructor(req, res) {
|
|
74
|
+
this.req = req;
|
|
75
|
+
this.res = res;
|
|
76
|
+
this.url = new URL(
|
|
77
|
+
req.url ?? "/",
|
|
78
|
+
`http://${req.headers.host || "localhost"}`,
|
|
79
|
+
);
|
|
80
|
+
this.state = {};
|
|
81
|
+
this.response = new ResponseBuilder(res);
|
|
82
|
+
this.body = null;
|
|
83
|
+
this.query = Object.fromEntries(this.url.searchParams);
|
|
84
|
+
this.params = {};
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Getter that parses and caches cookies from the request.
|
|
88
|
+
* Parses the Cookie header into an object of name-value pairs.
|
|
89
|
+
* Values are automatically decoded using decodeURIComponent.
|
|
90
|
+
* Memoization is implicit; called fresh each time.
|
|
91
|
+
*
|
|
92
|
+
* @returns Object with cookie names as keys and values as cookie values
|
|
93
|
+
*
|
|
94
|
+
* @example
|
|
95
|
+
* const sessionId = ctx.cookies.sessionId; // Get a cookie value
|
|
96
|
+
* // For header "sessionId=abc123; theme=dark" yields { sessionId: "abc123", theme: "dark" }
|
|
97
|
+
*/
|
|
98
|
+
get cookies() {
|
|
99
|
+
const header = this.req.headers.cookie;
|
|
100
|
+
if (!header) return {};
|
|
101
|
+
return Object.fromEntries(
|
|
102
|
+
header.split(";").map((c) => {
|
|
103
|
+
const [key, ...v] = c.trim().split("=");
|
|
104
|
+
return [key, decodeURIComponent(v.join("="))];
|
|
105
|
+
}),
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Convenience method to send a JSON response.
|
|
110
|
+
* Combines ctx.response.status().json().send() into a single call.
|
|
111
|
+
*
|
|
112
|
+
* @param data Object to serialize as JSON and send
|
|
113
|
+
* @param status HTTP status code; defaults to 200 (OK)
|
|
114
|
+
*
|
|
115
|
+
* @returns Result of response.send() (undefined if response is sent)
|
|
116
|
+
*
|
|
117
|
+
* @example
|
|
118
|
+
* ctx.json({ success: true }, 201);
|
|
119
|
+
* ctx.json({ error: "Not found" }, 404);
|
|
120
|
+
*/
|
|
121
|
+
json(data, status = 200) {
|
|
122
|
+
return this.response.status(status).json(data).send();
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -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
|
/**
|
|
19
2
|
* Metadata storage for decorator information.
|
|
20
3
|
* Provides a fallback when Reflect.metadata is not available.
|
|
@@ -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 { HttpError } from "./http-error.js";
|
|
19
2
|
export async function errorHandler(ctx, next) {
|
|
20
3
|
try {
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Pipeline } from "./pipeline.js";
|
|
2
|
+
import { MiddlewareRegistry } from "./registry.js";
|
|
3
|
+
import { Context } from "./context.js";
|
|
4
|
+
/**
|
|
5
|
+
* Core HTTP request handler that manages middleware execution and request context.
|
|
6
|
+
*
|
|
7
|
+
* The Kernel implements a middleware pipeline pattern:
|
|
8
|
+
* 1. Receives Node.js req and res objects
|
|
9
|
+
* 2. Wraps them in a Context object with helper methods and properties
|
|
10
|
+
* 3. Composes registered middlewares into a callable pipeline
|
|
11
|
+
* 4. Executes the pipeline with the context for request processing
|
|
12
|
+
*
|
|
13
|
+
* Middlewares can:
|
|
14
|
+
* - Access/modify request and response via ctx.req, ctx.res, ctx.response
|
|
15
|
+
* - Read/set cookies, headers, query params, route params
|
|
16
|
+
* - Store and retrieve shared state in ctx.state
|
|
17
|
+
* - Call ctx.response.json() or other response builders
|
|
18
|
+
* - Control flow via next() to continue to next middleware
|
|
19
|
+
*/
|
|
20
|
+
export class Kernel {
|
|
21
|
+
/**
|
|
22
|
+
* Array of global middleware functions that run for every request.
|
|
23
|
+
* Middlewares are stored in order of registration (use() calls).
|
|
24
|
+
* Executed sequentially in Pipeline.compose().
|
|
25
|
+
*/
|
|
26
|
+
globalMiddleware = [];
|
|
27
|
+
constructor() {}
|
|
28
|
+
/**
|
|
29
|
+
* Registers a middleware function to run for all requests.
|
|
30
|
+
* Middleware can be a function, a class constructor, or an object with handle() method.
|
|
31
|
+
*
|
|
32
|
+
* @param mw Middleware function: (ctx, next) => Promise<void>
|
|
33
|
+
* Or class with: new MyMiddleware().handle(ctx, next)
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* kernel.use(async (ctx, next) => {
|
|
37
|
+
* console.log(`${ctx.req.method} ${ctx.url.pathname}`);
|
|
38
|
+
* await next();
|
|
39
|
+
* });
|
|
40
|
+
*/
|
|
41
|
+
use(mw) {
|
|
42
|
+
this.globalMiddleware.push(mw);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Processes an HTTP request through the global middleware pipeline.
|
|
46
|
+
* Creates a Context wrapping the request/response, composes middlewares, and executes them.
|
|
47
|
+
*
|
|
48
|
+
* @param req Node.js IncomingMessage (HTTP request object)
|
|
49
|
+
* @param res Node.js ServerResponse (HTTP response object)
|
|
50
|
+
*
|
|
51
|
+
* @returns Promise that resolves when middleware chain completes
|
|
52
|
+
*
|
|
53
|
+
* @example
|
|
54
|
+
* const server = createServer((req, res) => {
|
|
55
|
+
* kernel.handle(req, res);
|
|
56
|
+
* });
|
|
57
|
+
*/
|
|
58
|
+
async handle(req, res) {
|
|
59
|
+
const ctx = new Context(req, res);
|
|
60
|
+
const fn = Pipeline.compose(this.globalMiddleware);
|
|
61
|
+
await fn(ctx, async () => {});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Processes a request through global middleware plus a registered middleware group.
|
|
65
|
+
* Retrieves middleware from the registry by group name and composes them with global middleware.
|
|
66
|
+
* Useful for route-specific or feature-specific middleware chains.
|
|
67
|
+
*
|
|
68
|
+
* @param req Node.js IncomingMessage
|
|
69
|
+
* @param res Node.js ServerResponse
|
|
70
|
+
* @param groupName Name of the middleware group registered in MiddlewareRegistry
|
|
71
|
+
*
|
|
72
|
+
* @returns Promise that resolves when complete middleware chain executes
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* // Given a group named "apiMiddleware" with auth and logging
|
|
76
|
+
* await kernel.handleWithGroup(req, res, "apiMiddleware");
|
|
77
|
+
*/
|
|
78
|
+
async handleWithGroup(req, res, groupName) {
|
|
79
|
+
const ctx = new Context(req, res);
|
|
80
|
+
const registry = MiddlewareRegistry.get();
|
|
81
|
+
const groupMw = registry.getGroup(groupName);
|
|
82
|
+
const fn = Pipeline.compose([...this.globalMiddleware, ...groupMw]);
|
|
83
|
+
await fn(ctx, async () => {});
|
|
84
|
+
}
|
|
85
|
+
}
|