webapp-factory 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +145 -0
- package/dist/access-control/adapters/in-memory-relations.d.ts +7 -0
- package/dist/access-control/adapters/in-memory-relations.d.ts.map +1 -0
- package/dist/access-control/adapters/in-memory-relations.js +6 -0
- package/dist/access-control/adapters/in-memory-relations.js.map +1 -0
- package/dist/access-control/core/enforcement.d.ts +13 -0
- package/dist/access-control/core/enforcement.d.ts.map +1 -0
- package/dist/access-control/core/enforcement.js +38 -0
- package/dist/access-control/core/enforcement.js.map +1 -0
- package/dist/access-control/core/errors.d.ts +30 -0
- package/dist/access-control/core/errors.d.ts.map +1 -0
- package/dist/access-control/core/errors.js +46 -0
- package/dist/access-control/core/errors.js.map +1 -0
- package/dist/access-control/core/pdp.d.ts +14 -0
- package/dist/access-control/core/pdp.d.ts.map +1 -0
- package/dist/access-control/core/pdp.js +79 -0
- package/dist/access-control/core/pdp.js.map +1 -0
- package/dist/access-control/core/ports.d.ts +68 -0
- package/dist/access-control/core/ports.d.ts.map +1 -0
- package/dist/access-control/core/ports.js +6 -0
- package/dist/access-control/core/ports.js.map +1 -0
- package/dist/access-control/core/rbac.d.ts +10 -0
- package/dist/access-control/core/rbac.d.ts.map +1 -0
- package/dist/access-control/core/rbac.js +78 -0
- package/dist/access-control/core/rbac.js.map +1 -0
- package/dist/access-control/core/rebac.d.ts +15 -0
- package/dist/access-control/core/rebac.d.ts.map +1 -0
- package/dist/access-control/core/rebac.js +48 -0
- package/dist/access-control/core/rebac.js.map +1 -0
- package/dist/access-control/index.d.ts +15 -0
- package/dist/access-control/index.d.ts.map +1 -0
- package/dist/access-control/index.js +20 -0
- package/dist/access-control/index.js.map +1 -0
- package/dist/access-control/nestjs/access-control.module.d.ts +34 -0
- package/dist/access-control/nestjs/access-control.module.d.ts.map +1 -0
- package/dist/access-control/nestjs/access-control.module.js +80 -0
- package/dist/access-control/nestjs/access-control.module.js.map +1 -0
- package/dist/audit/adapters/in-memory-store.d.ts +3 -0
- package/dist/audit/adapters/in-memory-store.d.ts.map +1 -0
- package/dist/audit/adapters/in-memory-store.js +66 -0
- package/dist/audit/adapters/in-memory-store.js.map +1 -0
- package/dist/audit/adapters/pg-store.d.ts +22 -0
- package/dist/audit/adapters/pg-store.d.ts.map +1 -0
- package/dist/audit/adapters/pg-store.js +119 -0
- package/dist/audit/adapters/pg-store.js.map +1 -0
- package/dist/audit/core/audit-log.d.ts +41 -0
- package/dist/audit/core/audit-log.d.ts.map +1 -0
- package/dist/audit/core/audit-log.js +78 -0
- package/dist/audit/core/audit-log.js.map +1 -0
- package/dist/audit/core/errors.d.ts +22 -0
- package/dist/audit/core/errors.d.ts.map +1 -0
- package/dist/audit/core/errors.js +35 -0
- package/dist/audit/core/errors.js.map +1 -0
- package/dist/audit/core/hash.d.ts +9 -0
- package/dist/audit/core/hash.d.ts.map +1 -0
- package/dist/audit/core/hash.js +45 -0
- package/dist/audit/core/hash.js.map +1 -0
- package/dist/audit/core/ports.d.ts +68 -0
- package/dist/audit/core/ports.d.ts.map +1 -0
- package/dist/audit/core/ports.js +6 -0
- package/dist/audit/core/ports.js.map +1 -0
- package/dist/audit/index.d.ts +13 -0
- package/dist/audit/index.d.ts.map +1 -0
- package/dist/audit/index.js +16 -0
- package/dist/audit/index.js.map +1 -0
- package/dist/auth/adapters/argon2id-hasher.d.ts +15 -0
- package/dist/auth/adapters/argon2id-hasher.d.ts.map +1 -0
- package/dist/auth/adapters/argon2id-hasher.js +61 -0
- package/dist/auth/adapters/argon2id-hasher.js.map +1 -0
- package/dist/auth/adapters/in-memory-stores.d.ts +14 -0
- package/dist/auth/adapters/in-memory-stores.d.ts.map +1 -0
- package/dist/auth/adapters/in-memory-stores.js +78 -0
- package/dist/auth/adapters/in-memory-stores.js.map +1 -0
- package/dist/auth/core/auth-service.d.ts +40 -0
- package/dist/auth/core/auth-service.d.ts.map +1 -0
- package/dist/auth/core/auth-service.js +106 -0
- package/dist/auth/core/auth-service.js.map +1 -0
- package/dist/auth/core/credentials.d.ts +15 -0
- package/dist/auth/core/credentials.d.ts.map +1 -0
- package/dist/auth/core/credentials.js +15 -0
- package/dist/auth/core/credentials.js.map +1 -0
- package/dist/auth/core/crypto-util.d.ts +7 -0
- package/dist/auth/core/crypto-util.d.ts.map +1 -0
- package/dist/auth/core/crypto-util.js +15 -0
- package/dist/auth/core/crypto-util.js.map +1 -0
- package/dist/auth/core/errors.d.ts +33 -0
- package/dist/auth/core/errors.d.ts.map +1 -0
- package/dist/auth/core/errors.js +48 -0
- package/dist/auth/core/errors.js.map +1 -0
- package/dist/auth/core/jwt.d.ts +5 -0
- package/dist/auth/core/jwt.d.ts.map +1 -0
- package/dist/auth/core/jwt.js +40 -0
- package/dist/auth/core/jwt.js.map +1 -0
- package/dist/auth/core/ports.d.ts +95 -0
- package/dist/auth/core/ports.d.ts.map +1 -0
- package/dist/auth/core/ports.js +7 -0
- package/dist/auth/core/ports.js.map +1 -0
- package/dist/auth/core/single-use.d.ts +10 -0
- package/dist/auth/core/single-use.d.ts.map +1 -0
- package/dist/auth/core/single-use.js +47 -0
- package/dist/auth/core/single-use.js.map +1 -0
- package/dist/auth/core/tokens.d.ts +14 -0
- package/dist/auth/core/tokens.d.ts.map +1 -0
- package/dist/auth/core/tokens.js +85 -0
- package/dist/auth/core/tokens.js.map +1 -0
- package/dist/auth/index.d.ts +18 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +22 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/nestjs/auth.module.d.ts +17 -0
- package/dist/auth/nestjs/auth.module.d.ts.map +1 -0
- package/dist/auth/nestjs/auth.module.js +18 -0
- package/dist/auth/nestjs/auth.module.js.map +1 -0
- package/dist/cache/adapters/in-memory-store.d.ts +6 -0
- package/dist/cache/adapters/in-memory-store.d.ts.map +1 -0
- package/dist/cache/adapters/in-memory-store.js +65 -0
- package/dist/cache/adapters/in-memory-store.js.map +1 -0
- package/dist/cache/adapters/redis-store.d.ts +32 -0
- package/dist/cache/adapters/redis-store.d.ts.map +1 -0
- package/dist/cache/adapters/redis-store.js +59 -0
- package/dist/cache/adapters/redis-store.js.map +1 -0
- package/dist/cache/core/cache.d.ts +31 -0
- package/dist/cache/core/cache.d.ts.map +1 -0
- package/dist/cache/core/cache.js +89 -0
- package/dist/cache/core/cache.js.map +1 -0
- package/dist/cache/core/errors.d.ts +17 -0
- package/dist/cache/core/errors.d.ts.map +1 -0
- package/dist/cache/core/errors.js +27 -0
- package/dist/cache/core/errors.js.map +1 -0
- package/dist/cache/core/lock.d.ts +21 -0
- package/dist/cache/core/lock.d.ts.map +1 -0
- package/dist/cache/core/lock.js +47 -0
- package/dist/cache/core/lock.js.map +1 -0
- package/dist/cache/core/ports.d.ts +33 -0
- package/dist/cache/core/ports.d.ts.map +1 -0
- package/dist/cache/core/ports.js +6 -0
- package/dist/cache/core/ports.js.map +1 -0
- package/dist/cache/core/pubsub.d.ts +14 -0
- package/dist/cache/core/pubsub.d.ts.map +1 -0
- package/dist/cache/core/pubsub.js +13 -0
- package/dist/cache/core/pubsub.js.map +1 -0
- package/dist/cache/core/serializer.d.ts +4 -0
- package/dist/cache/core/serializer.d.ts.map +1 -0
- package/dist/cache/core/serializer.js +6 -0
- package/dist/cache/core/serializer.js.map +1 -0
- package/dist/cache/index.d.ts +14 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +19 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/config/adapters/reporters.d.ts +17 -0
- package/dist/config/adapters/reporters.d.ts.map +1 -0
- package/dist/config/adapters/reporters.js +35 -0
- package/dist/config/adapters/reporters.js.map +1 -0
- package/dist/config/adapters/secret-resolvers.d.ts +21 -0
- package/dist/config/adapters/secret-resolvers.d.ts.map +1 -0
- package/dist/config/adapters/secret-resolvers.js +60 -0
- package/dist/config/adapters/secret-resolvers.js.map +1 -0
- package/dist/config/adapters/zod-schema.d.ts +20 -0
- package/dist/config/adapters/zod-schema.d.ts.map +1 -0
- package/dist/config/adapters/zod-schema.js +35 -0
- package/dist/config/adapters/zod-schema.js.map +1 -0
- package/dist/config/core/env-loader.d.ts +47 -0
- package/dist/config/core/env-loader.d.ts.map +1 -0
- package/dist/config/core/env-loader.js +155 -0
- package/dist/config/core/env-loader.js.map +1 -0
- package/dist/config/core/errors.d.ts +34 -0
- package/dist/config/core/errors.d.ts.map +1 -0
- package/dist/config/core/errors.js +49 -0
- package/dist/config/core/errors.js.map +1 -0
- package/dist/config/core/freeze.d.ts +7 -0
- package/dist/config/core/freeze.d.ts.map +1 -0
- package/dist/config/core/freeze.js +20 -0
- package/dist/config/core/freeze.js.map +1 -0
- package/dist/config/core/load-config.d.ts +43 -0
- package/dist/config/core/load-config.d.ts.map +1 -0
- package/dist/config/core/load-config.js +74 -0
- package/dist/config/core/load-config.js.map +1 -0
- package/dist/config/core/merge.d.ts +19 -0
- package/dist/config/core/merge.d.ts.map +1 -0
- package/dist/config/core/merge.js +31 -0
- package/dist/config/core/merge.js.map +1 -0
- package/dist/config/core/ports.d.ts +58 -0
- package/dist/config/core/ports.d.ts.map +1 -0
- package/dist/config/core/ports.js +2 -0
- package/dist/config/core/ports.js.map +1 -0
- package/dist/config/core/secret-resolver.d.ts +16 -0
- package/dist/config/core/secret-resolver.d.ts.map +1 -0
- package/dist/config/core/secret-resolver.js +73 -0
- package/dist/config/core/secret-resolver.js.map +1 -0
- package/dist/config/core/secret.d.ts +21 -0
- package/dist/config/core/secret.d.ts.map +1 -0
- package/dist/config/core/secret.js +40 -0
- package/dist/config/core/secret.js.map +1 -0
- package/dist/config/index.d.ts +16 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +23 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/nestjs/config-kit.module.d.ts +37 -0
- package/dist/config/nestjs/config-kit.module.d.ts.map +1 -0
- package/dist/config/nestjs/config-kit.module.js +24 -0
- package/dist/config/nestjs/config-kit.module.js.map +1 -0
- package/dist/http/adapters/zod-schema.d.ts +11 -0
- package/dist/http/adapters/zod-schema.d.ts.map +1 -0
- package/dist/http/adapters/zod-schema.js +74 -0
- package/dist/http/adapters/zod-schema.js.map +1 -0
- package/dist/http/core/context.d.ts +25 -0
- package/dist/http/core/context.d.ts.map +1 -0
- package/dist/http/core/context.js +60 -0
- package/dist/http/core/context.js.map +1 -0
- package/dist/http/core/errors.d.ts +41 -0
- package/dist/http/core/errors.d.ts.map +1 -0
- package/dist/http/core/errors.js +99 -0
- package/dist/http/core/errors.js.map +1 -0
- package/dist/http/core/kernel.d.ts +54 -0
- package/dist/http/core/kernel.d.ts.map +1 -0
- package/dist/http/core/kernel.js +122 -0
- package/dist/http/core/kernel.js.map +1 -0
- package/dist/http/core/openapi.d.ts +37 -0
- package/dist/http/core/openapi.d.ts.map +1 -0
- package/dist/http/core/openapi.js +99 -0
- package/dist/http/core/openapi.js.map +1 -0
- package/dist/http/core/pagination.d.ts +17 -0
- package/dist/http/core/pagination.d.ts.map +1 -0
- package/dist/http/core/pagination.js +108 -0
- package/dist/http/core/pagination.js.map +1 -0
- package/dist/http/core/ports.d.ts +106 -0
- package/dist/http/core/ports.d.ts.map +1 -0
- package/dist/http/core/ports.js +6 -0
- package/dist/http/core/ports.js.map +1 -0
- package/dist/http/core/redaction.d.ts +8 -0
- package/dist/http/core/redaction.d.ts.map +1 -0
- package/dist/http/core/redaction.js +45 -0
- package/dist/http/core/redaction.js.map +1 -0
- package/dist/http/core/router.d.ts +37 -0
- package/dist/http/core/router.d.ts.map +1 -0
- package/dist/http/core/router.js +120 -0
- package/dist/http/core/router.js.map +1 -0
- package/dist/http/core/security.d.ts +43 -0
- package/dist/http/core/security.d.ts.map +1 -0
- package/dist/http/core/security.js +66 -0
- package/dist/http/core/security.js.map +1 -0
- package/dist/http/core/validation.d.ts +9 -0
- package/dist/http/core/validation.d.ts.map +1 -0
- package/dist/http/core/validation.js +36 -0
- package/dist/http/core/validation.js.map +1 -0
- package/dist/http/index.d.ts +20 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +29 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/nestjs/http-kernel.module.d.ts +37 -0
- package/dist/http/nestjs/http-kernel.module.d.ts.map +1 -0
- package/dist/http/nestjs/http-kernel.module.js +77 -0
- package/dist/http/nestjs/http-kernel.module.js.map +1 -0
- package/dist/http/nodejs/http-adapter.d.ts +11 -0
- package/dist/http/nodejs/http-adapter.d.ts.map +1 -0
- package/dist/http/nodejs/http-adapter.js +60 -0
- package/dist/http/nodejs/http-adapter.js.map +1 -0
- package/dist/i18n/core/catalog.d.ts +23 -0
- package/dist/i18n/core/catalog.d.ts.map +1 -0
- package/dist/i18n/core/catalog.js +31 -0
- package/dist/i18n/core/catalog.js.map +1 -0
- package/dist/i18n/core/errors.d.ts +14 -0
- package/dist/i18n/core/errors.d.ts.map +1 -0
- package/dist/i18n/core/errors.js +22 -0
- package/dist/i18n/core/errors.js.map +1 -0
- package/dist/i18n/core/i18n.d.ts +20 -0
- package/dist/i18n/core/i18n.d.ts.map +1 -0
- package/dist/i18n/core/i18n.js +48 -0
- package/dist/i18n/core/i18n.js.map +1 -0
- package/dist/i18n/core/message.d.ts +8 -0
- package/dist/i18n/core/message.d.ts.map +1 -0
- package/dist/i18n/core/message.js +38 -0
- package/dist/i18n/core/message.js.map +1 -0
- package/dist/i18n/core/negotiate.d.ts +13 -0
- package/dist/i18n/core/negotiate.d.ts.map +1 -0
- package/dist/i18n/core/negotiate.js +46 -0
- package/dist/i18n/core/negotiate.js.map +1 -0
- package/dist/i18n/core/ports.d.ts +35 -0
- package/dist/i18n/core/ports.d.ts.map +1 -0
- package/dist/i18n/core/ports.js +6 -0
- package/dist/i18n/core/ports.js.map +1 -0
- package/dist/i18n/index.d.ts +14 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/index.js +18 -0
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/nestjs/i18n.module.d.ts +16 -0
- package/dist/i18n/nestjs/i18n.module.d.ts.map +1 -0
- package/dist/i18n/nestjs/i18n.module.js +17 -0
- package/dist/i18n/nestjs/i18n.module.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/adapters/in-memory-idempotency.d.ts +9 -0
- package/dist/jobs/adapters/in-memory-idempotency.d.ts.map +1 -0
- package/dist/jobs/adapters/in-memory-idempotency.js +34 -0
- package/dist/jobs/adapters/in-memory-idempotency.js.map +1 -0
- package/dist/jobs/adapters/in-memory-queue-store.d.ts +7 -0
- package/dist/jobs/adapters/in-memory-queue-store.d.ts.map +1 -0
- package/dist/jobs/adapters/in-memory-queue-store.js +70 -0
- package/dist/jobs/adapters/in-memory-queue-store.js.map +1 -0
- package/dist/jobs/adapters/redis-queue-store.d.ts +28 -0
- package/dist/jobs/adapters/redis-queue-store.d.ts.map +1 -0
- package/dist/jobs/adapters/redis-queue-store.js +86 -0
- package/dist/jobs/adapters/redis-queue-store.js.map +1 -0
- package/dist/jobs/core/backoff.d.ts +15 -0
- package/dist/jobs/core/backoff.d.ts.map +1 -0
- package/dist/jobs/core/backoff.js +20 -0
- package/dist/jobs/core/backoff.js.map +1 -0
- package/dist/jobs/core/cron.d.ts +13 -0
- package/dist/jobs/core/cron.d.ts.map +1 -0
- package/dist/jobs/core/cron.js +101 -0
- package/dist/jobs/core/cron.js.map +1 -0
- package/dist/jobs/core/errors.d.ts +18 -0
- package/dist/jobs/core/errors.d.ts.map +1 -0
- package/dist/jobs/core/errors.js +30 -0
- package/dist/jobs/core/errors.js.map +1 -0
- package/dist/jobs/core/ports.d.ts +80 -0
- package/dist/jobs/core/ports.d.ts.map +1 -0
- package/dist/jobs/core/ports.js +6 -0
- package/dist/jobs/core/ports.js.map +1 -0
- package/dist/jobs/core/queue.d.ts +16 -0
- package/dist/jobs/core/queue.d.ts.map +1 -0
- package/dist/jobs/core/queue.js +29 -0
- package/dist/jobs/core/queue.js.map +1 -0
- package/dist/jobs/core/registry.d.ts +4 -0
- package/dist/jobs/core/registry.d.ts.map +1 -0
- package/dist/jobs/core/registry.js +11 -0
- package/dist/jobs/core/registry.js.map +1 -0
- package/dist/jobs/core/scheduler.d.ts +30 -0
- package/dist/jobs/core/scheduler.d.ts.map +1 -0
- package/dist/jobs/core/scheduler.js +53 -0
- package/dist/jobs/core/scheduler.js.map +1 -0
- package/dist/jobs/core/serializer.d.ts +3 -0
- package/dist/jobs/core/serializer.d.ts.map +1 -0
- package/dist/jobs/core/serializer.js +5 -0
- package/dist/jobs/core/serializer.js.map +1 -0
- package/dist/jobs/core/worker.d.ts +28 -0
- package/dist/jobs/core/worker.d.ts.map +1 -0
- package/dist/jobs/core/worker.js +118 -0
- package/dist/jobs/core/worker.js.map +1 -0
- package/dist/jobs/index.d.ts +18 -0
- package/dist/jobs/index.d.ts.map +1 -0
- package/dist/jobs/index.js +23 -0
- package/dist/jobs/index.js.map +1 -0
- package/dist/mailer/adapters/dev-inbox.d.ts +17 -0
- package/dist/mailer/adapters/dev-inbox.d.ts.map +1 -0
- package/dist/mailer/adapters/dev-inbox.js +29 -0
- package/dist/mailer/adapters/dev-inbox.js.map +1 -0
- package/dist/mailer/adapters/i18n-renderer.d.ts +13 -0
- package/dist/mailer/adapters/i18n-renderer.d.ts.map +1 -0
- package/dist/mailer/adapters/i18n-renderer.js +27 -0
- package/dist/mailer/adapters/i18n-renderer.js.map +1 -0
- package/dist/mailer/adapters/in-memory-templates.d.ts +6 -0
- package/dist/mailer/adapters/in-memory-templates.d.ts.map +1 -0
- package/dist/mailer/adapters/in-memory-templates.js +6 -0
- package/dist/mailer/adapters/in-memory-templates.js.map +1 -0
- package/dist/mailer/adapters/transports.d.ts +19 -0
- package/dist/mailer/adapters/transports.d.ts.map +1 -0
- package/dist/mailer/adapters/transports.js +38 -0
- package/dist/mailer/adapters/transports.js.map +1 -0
- package/dist/mailer/core/errors.d.ts +23 -0
- package/dist/mailer/core/errors.d.ts.map +1 -0
- package/dist/mailer/core/errors.js +40 -0
- package/dist/mailer/core/errors.js.map +1 -0
- package/dist/mailer/core/failover.d.ts +3 -0
- package/dist/mailer/core/failover.d.ts.map +1 -0
- package/dist/mailer/core/failover.js +30 -0
- package/dist/mailer/core/failover.js.map +1 -0
- package/dist/mailer/core/mailer.d.ts +25 -0
- package/dist/mailer/core/mailer.d.ts.map +1 -0
- package/dist/mailer/core/mailer.js +61 -0
- package/dist/mailer/core/mailer.js.map +1 -0
- package/dist/mailer/core/ports.d.ts +54 -0
- package/dist/mailer/core/ports.d.ts.map +1 -0
- package/dist/mailer/core/ports.js +6 -0
- package/dist/mailer/core/ports.js.map +1 -0
- package/dist/mailer/core/render.d.ts +4 -0
- package/dist/mailer/core/render.d.ts.map +1 -0
- package/dist/mailer/core/render.js +29 -0
- package/dist/mailer/core/render.js.map +1 -0
- package/dist/mailer/index.d.ts +17 -0
- package/dist/mailer/index.d.ts.map +1 -0
- package/dist/mailer/index.js +21 -0
- package/dist/mailer/index.js.map +1 -0
- package/dist/mailer/nestjs/mailer.module.d.ts +17 -0
- package/dist/mailer/nestjs/mailer.module.d.ts.map +1 -0
- package/dist/mailer/nestjs/mailer.module.js +15 -0
- package/dist/mailer/nestjs/mailer.module.js.map +1 -0
- package/dist/observability/core/context.d.ts +9 -0
- package/dist/observability/core/context.d.ts.map +1 -0
- package/dist/observability/core/context.js +15 -0
- package/dist/observability/core/context.js.map +1 -0
- package/dist/observability/core/health.d.ts +40 -0
- package/dist/observability/core/health.d.ts.map +1 -0
- package/dist/observability/core/health.js +51 -0
- package/dist/observability/core/health.js.map +1 -0
- package/dist/observability/core/logger.d.ts +22 -0
- package/dist/observability/core/logger.d.ts.map +1 -0
- package/dist/observability/core/logger.js +45 -0
- package/dist/observability/core/logger.js.map +1 -0
- package/dist/observability/core/metrics.d.ts +63 -0
- package/dist/observability/core/metrics.d.ts.map +1 -0
- package/dist/observability/core/metrics.js +172 -0
- package/dist/observability/core/metrics.js.map +1 -0
- package/dist/observability/core/redaction.d.ts +10 -0
- package/dist/observability/core/redaction.d.ts.map +1 -0
- package/dist/observability/core/redaction.js +48 -0
- package/dist/observability/core/redaction.js.map +1 -0
- package/dist/observability/core/tracing.d.ts +52 -0
- package/dist/observability/core/tracing.d.ts.map +1 -0
- package/dist/observability/core/tracing.js +88 -0
- package/dist/observability/core/tracing.js.map +1 -0
- package/dist/observability/index.d.ts +14 -0
- package/dist/observability/index.d.ts.map +1 -0
- package/dist/observability/index.js +19 -0
- package/dist/observability/index.js.map +1 -0
- package/dist/observability/nestjs/observability.module.d.ts +35 -0
- package/dist/observability/nestjs/observability.module.d.ts.map +1 -0
- package/dist/observability/nestjs/observability.module.js +87 -0
- package/dist/observability/nestjs/observability.module.js.map +1 -0
- package/dist/persistence/adapters/in-memory-driver.d.ts +18 -0
- package/dist/persistence/adapters/in-memory-driver.d.ts.map +1 -0
- package/dist/persistence/adapters/in-memory-driver.js +229 -0
- package/dist/persistence/adapters/in-memory-driver.js.map +1 -0
- package/dist/persistence/adapters/pg-driver.d.ts +21 -0
- package/dist/persistence/adapters/pg-driver.d.ts.map +1 -0
- package/dist/persistence/adapters/pg-driver.js +42 -0
- package/dist/persistence/adapters/pg-driver.js.map +1 -0
- package/dist/persistence/adapters/testcontainer-harness.d.ts +37 -0
- package/dist/persistence/adapters/testcontainer-harness.d.ts.map +1 -0
- package/dist/persistence/adapters/testcontainer-harness.js +79 -0
- package/dist/persistence/adapters/testcontainer-harness.js.map +1 -0
- package/dist/persistence/core/errors.d.ts +36 -0
- package/dist/persistence/core/errors.d.ts.map +1 -0
- package/dist/persistence/core/errors.js +58 -0
- package/dist/persistence/core/errors.js.map +1 -0
- package/dist/persistence/core/migrations.d.ts +16 -0
- package/dist/persistence/core/migrations.d.ts.map +1 -0
- package/dist/persistence/core/migrations.js +95 -0
- package/dist/persistence/core/migrations.js.map +1 -0
- package/dist/persistence/core/pool.d.ts +4 -0
- package/dist/persistence/core/pool.d.ts.map +1 -0
- package/dist/persistence/core/pool.js +180 -0
- package/dist/persistence/core/pool.js.map +1 -0
- package/dist/persistence/core/ports.d.ts +91 -0
- package/dist/persistence/core/ports.d.ts.map +1 -0
- package/dist/persistence/core/ports.js +6 -0
- package/dist/persistence/core/ports.js.map +1 -0
- package/dist/persistence/core/repository.d.ts +18 -0
- package/dist/persistence/core/repository.d.ts.map +1 -0
- package/dist/persistence/core/repository.js +113 -0
- package/dist/persistence/core/repository.js.map +1 -0
- package/dist/persistence/core/sql.d.ts +13 -0
- package/dist/persistence/core/sql.d.ts.map +1 -0
- package/dist/persistence/core/sql.js +35 -0
- package/dist/persistence/core/sql.js.map +1 -0
- package/dist/persistence/index.d.ts +14 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +22 -0
- package/dist/persistence/index.js.map +1 -0
- package/dist/persistence/pg.d.ts +7 -0
- package/dist/persistence/pg.d.ts.map +1 -0
- package/dist/persistence/pg.js +7 -0
- package/dist/persistence/pg.js.map +1 -0
- package/dist/privacy/adapters/audit-sink.d.ts +19 -0
- package/dist/privacy/adapters/audit-sink.d.ts.map +1 -0
- package/dist/privacy/adapters/audit-sink.js +13 -0
- package/dist/privacy/adapters/audit-sink.js.map +1 -0
- package/dist/privacy/adapters/in-memory-consent-store.d.ts +7 -0
- package/dist/privacy/adapters/in-memory-consent-store.d.ts.map +1 -0
- package/dist/privacy/adapters/in-memory-consent-store.js +18 -0
- package/dist/privacy/adapters/in-memory-consent-store.js.map +1 -0
- package/dist/privacy/adapters/pg-consent-store.d.ts +26 -0
- package/dist/privacy/adapters/pg-consent-store.d.ts.map +1 -0
- package/dist/privacy/adapters/pg-consent-store.js +43 -0
- package/dist/privacy/adapters/pg-consent-store.js.map +1 -0
- package/dist/privacy/core/consent.d.ts +35 -0
- package/dist/privacy/core/consent.d.ts.map +1 -0
- package/dist/privacy/core/consent.js +49 -0
- package/dist/privacy/core/consent.js.map +1 -0
- package/dist/privacy/core/erasure.d.ts +22 -0
- package/dist/privacy/core/erasure.d.ts.map +1 -0
- package/dist/privacy/core/erasure.js +35 -0
- package/dist/privacy/core/erasure.js.map +1 -0
- package/dist/privacy/core/errors.d.ts +18 -0
- package/dist/privacy/core/errors.d.ts.map +1 -0
- package/dist/privacy/core/errors.js +30 -0
- package/dist/privacy/core/errors.js.map +1 -0
- package/dist/privacy/core/export.d.ts +20 -0
- package/dist/privacy/core/export.d.ts.map +1 -0
- package/dist/privacy/core/export.js +30 -0
- package/dist/privacy/core/export.js.map +1 -0
- package/dist/privacy/core/ports.d.ts +48 -0
- package/dist/privacy/core/ports.d.ts.map +1 -0
- package/dist/privacy/core/ports.js +6 -0
- package/dist/privacy/core/ports.js.map +1 -0
- package/dist/privacy/core/registry.d.ts +17 -0
- package/dist/privacy/core/registry.d.ts.map +1 -0
- package/dist/privacy/core/registry.js +31 -0
- package/dist/privacy/core/registry.js.map +1 -0
- package/dist/privacy/index.d.ts +16 -0
- package/dist/privacy/index.d.ts.map +1 -0
- package/dist/privacy/index.js +21 -0
- package/dist/privacy/index.js.map +1 -0
- package/dist/rate-limit/adapters/in-memory-store.d.ts +7 -0
- package/dist/rate-limit/adapters/in-memory-store.d.ts.map +1 -0
- package/dist/rate-limit/adapters/in-memory-store.js +50 -0
- package/dist/rate-limit/adapters/in-memory-store.js.map +1 -0
- package/dist/rate-limit/adapters/redis-store.d.ts +11 -0
- package/dist/rate-limit/adapters/redis-store.d.ts.map +1 -0
- package/dist/rate-limit/adapters/redis-store.js +93 -0
- package/dist/rate-limit/adapters/redis-store.js.map +1 -0
- package/dist/rate-limit/core/enforcer.d.ts +23 -0
- package/dist/rate-limit/core/enforcer.d.ts.map +1 -0
- package/dist/rate-limit/core/enforcer.js +27 -0
- package/dist/rate-limit/core/enforcer.js.map +1 -0
- package/dist/rate-limit/core/errors.d.ts +19 -0
- package/dist/rate-limit/core/errors.d.ts.map +1 -0
- package/dist/rate-limit/core/errors.js +32 -0
- package/dist/rate-limit/core/errors.js.map +1 -0
- package/dist/rate-limit/core/ports.d.ts +50 -0
- package/dist/rate-limit/core/ports.d.ts.map +1 -0
- package/dist/rate-limit/core/ports.js +6 -0
- package/dist/rate-limit/core/ports.js.map +1 -0
- package/dist/rate-limit/core/sliding-window.d.ts +9 -0
- package/dist/rate-limit/core/sliding-window.d.ts.map +1 -0
- package/dist/rate-limit/core/sliding-window.js +24 -0
- package/dist/rate-limit/core/sliding-window.js.map +1 -0
- package/dist/rate-limit/core/token-bucket.d.ts +9 -0
- package/dist/rate-limit/core/token-bucket.d.ts.map +1 -0
- package/dist/rate-limit/core/token-bucket.js +24 -0
- package/dist/rate-limit/core/token-bucket.js.map +1 -0
- package/dist/rate-limit/index.d.ts +15 -0
- package/dist/rate-limit/index.d.ts.map +1 -0
- package/dist/rate-limit/index.js +19 -0
- package/dist/rate-limit/index.js.map +1 -0
- package/dist/rate-limit/nestjs/rate-limit.module.d.ts +25 -0
- package/dist/rate-limit/nestjs/rate-limit.module.d.ts.map +1 -0
- package/dist/rate-limit/nestjs/rate-limit.module.js +63 -0
- package/dist/rate-limit/nestjs/rate-limit.module.js.map +1 -0
- package/dist/rate-limit/nodejs/middleware.d.ts +16 -0
- package/dist/rate-limit/nodejs/middleware.d.ts.map +1 -0
- package/dist/rate-limit/nodejs/middleware.js +26 -0
- package/dist/rate-limit/nodejs/middleware.js.map +1 -0
- package/dist/test-kit/adapters/infra-bootstrap.d.ts +40 -0
- package/dist/test-kit/adapters/infra-bootstrap.d.ts.map +1 -0
- package/dist/test-kit/adapters/infra-bootstrap.js +64 -0
- package/dist/test-kit/adapters/infra-bootstrap.js.map +1 -0
- package/dist/test-kit/core/contract.d.ts +49 -0
- package/dist/test-kit/core/contract.d.ts.map +1 -0
- package/dist/test-kit/core/contract.js +52 -0
- package/dist/test-kit/core/contract.js.map +1 -0
- package/dist/test-kit/core/errors.d.ts +12 -0
- package/dist/test-kit/core/errors.d.ts.map +1 -0
- package/dist/test-kit/core/errors.js +19 -0
- package/dist/test-kit/core/errors.js.map +1 -0
- package/dist/test-kit/core/factories.d.ts +24 -0
- package/dist/test-kit/core/factories.d.ts.map +1 -0
- package/dist/test-kit/core/factories.js +57 -0
- package/dist/test-kit/core/factories.js.map +1 -0
- package/dist/test-kit/core/http-client.d.ts +46 -0
- package/dist/test-kit/core/http-client.d.ts.map +1 -0
- package/dist/test-kit/core/http-client.js +63 -0
- package/dist/test-kit/core/http-client.js.map +1 -0
- package/dist/test-kit/index.d.ts +10 -0
- package/dist/test-kit/index.d.ts.map +1 -0
- package/dist/test-kit/index.js +14 -0
- package/dist/test-kit/index.js.map +1 -0
- package/dist/test-kit/infra.d.ts +6 -0
- package/dist/test-kit/infra.d.ts.map +1 -0
- package/dist/test-kit/infra.js +6 -0
- package/dist/test-kit/infra.js.map +1 -0
- package/package.json +170 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* US-0205 — Paginatie/filtering/sortering-conventies.
|
|
3
|
+
*
|
|
4
|
+
* Parset en valideert list-query-parameters tot genormaliseerde, getypte parameters en levert een
|
|
5
|
+
* consistente response-envelope met metadata. Toegestane sorteer-/filtervelden worden per route
|
|
6
|
+
* geïnjecteerd (whitelist); defaults en limieten zijn configureerbaar. De kern bevat geen
|
|
7
|
+
* domeinvelden.
|
|
8
|
+
*/
|
|
9
|
+
import { ValidationError } from './errors.js';
|
|
10
|
+
const DEFAULT_PAGE_SIZE = 20;
|
|
11
|
+
const DEFAULT_MAX_PAGE_SIZE = 100;
|
|
12
|
+
/**
|
|
13
|
+
* Parset `page`, `pageSize`, `sort` en filters uit de query. `sort` heeft de vorm
|
|
14
|
+
* `veld:asc,ander:desc` of `veld,-ander`. Ongeldige/niet-toegestane velden -> {@link ValidationError}.
|
|
15
|
+
*/
|
|
16
|
+
export function parseListQuery(query = {}, config = {}) {
|
|
17
|
+
const issues = [];
|
|
18
|
+
const defaultPageSize = config.defaultPageSize ?? DEFAULT_PAGE_SIZE;
|
|
19
|
+
const maxPageSize = config.maxPageSize ?? DEFAULT_MAX_PAGE_SIZE;
|
|
20
|
+
const page = parsePositiveInt(query['page'], 1, 'page', issues);
|
|
21
|
+
let pageSize = parsePositiveInt(query['pageSize'], defaultPageSize, 'pageSize', issues);
|
|
22
|
+
// AC2: begrens boven het maximum tot het maximum.
|
|
23
|
+
if (pageSize > maxPageSize)
|
|
24
|
+
pageSize = maxPageSize;
|
|
25
|
+
const sort = parseSort(query['sort'], config, issues);
|
|
26
|
+
const filters = parseFilters(query, config, issues);
|
|
27
|
+
if (issues.length > 0) {
|
|
28
|
+
throw new ValidationError(issues, 'Ongeldige list-parameters');
|
|
29
|
+
}
|
|
30
|
+
return {
|
|
31
|
+
page,
|
|
32
|
+
pageSize,
|
|
33
|
+
offset: (page - 1) * pageSize,
|
|
34
|
+
sort: sort.length > 0 ? sort : (config.defaultSort ?? []),
|
|
35
|
+
filters,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/** Bouwt een consistente response-envelope met paginatie-metadata. */
|
|
39
|
+
export function paginate(items, total, params) {
|
|
40
|
+
return {
|
|
41
|
+
data: items,
|
|
42
|
+
meta: {
|
|
43
|
+
page: params.page,
|
|
44
|
+
pageSize: params.pageSize,
|
|
45
|
+
total,
|
|
46
|
+
totalPages: params.pageSize > 0 ? Math.ceil(total / params.pageSize) : 0,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function parsePositiveInt(raw, fallback, field, issues) {
|
|
51
|
+
if (raw === undefined || raw === '')
|
|
52
|
+
return fallback;
|
|
53
|
+
const n = Number(raw);
|
|
54
|
+
if (!Number.isInteger(n) || n < 1) {
|
|
55
|
+
issues.push({ path: field, message: `moet een positief geheel getal zijn` });
|
|
56
|
+
return fallback;
|
|
57
|
+
}
|
|
58
|
+
return n;
|
|
59
|
+
}
|
|
60
|
+
function parseSort(raw, config, issues) {
|
|
61
|
+
if (raw === undefined || raw === '')
|
|
62
|
+
return [];
|
|
63
|
+
const allowed = config.allowedSortFields;
|
|
64
|
+
const tokens = String(raw)
|
|
65
|
+
.split(',')
|
|
66
|
+
.map((t) => t.trim())
|
|
67
|
+
.filter((t) => t.length > 0);
|
|
68
|
+
const result = [];
|
|
69
|
+
for (const token of tokens) {
|
|
70
|
+
let field = token;
|
|
71
|
+
let direction = 'asc';
|
|
72
|
+
if (token.includes(':')) {
|
|
73
|
+
const [f, d] = token.split(':');
|
|
74
|
+
field = (f ?? '').trim();
|
|
75
|
+
direction = (d ?? '').trim().toLowerCase() === 'desc' ? 'desc' : 'asc';
|
|
76
|
+
}
|
|
77
|
+
else if (token.startsWith('-')) {
|
|
78
|
+
field = token.slice(1);
|
|
79
|
+
direction = 'desc';
|
|
80
|
+
}
|
|
81
|
+
if (allowed && !allowed.includes(field)) {
|
|
82
|
+
issues.push({ path: 'sort', message: `sorteren op "${field}" is niet toegestaan` });
|
|
83
|
+
continue;
|
|
84
|
+
}
|
|
85
|
+
result.push({ field, direction });
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
const RESERVED = new Set(['page', 'pageSize', 'sort']);
|
|
90
|
+
function parseFilters(query, config, issues) {
|
|
91
|
+
const allowed = config.allowedFilterFields;
|
|
92
|
+
const filters = {};
|
|
93
|
+
for (const [key, value] of Object.entries(query)) {
|
|
94
|
+
if (RESERVED.has(key))
|
|
95
|
+
continue;
|
|
96
|
+
if (value === undefined)
|
|
97
|
+
continue;
|
|
98
|
+
if (allowed === undefined)
|
|
99
|
+
continue; // geen filtering geconfigureerd -> negeer overige params
|
|
100
|
+
if (!allowed.includes(key)) {
|
|
101
|
+
issues.push({ path: key, message: `filteren op "${key}" is niet toegestaan` });
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
filters[key] = String(value);
|
|
105
|
+
}
|
|
106
|
+
return filters;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=pagination.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../../src/http/core/pagination.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Poorten & types voor de http-kernel. Het consumerende project injecteert route-modules, schema's
|
|
3
|
+
* en (optioneel) configuratie; de kernel bevat zelf geen route of domeinkennis.
|
|
4
|
+
*/
|
|
5
|
+
export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE' | 'OPTIONS' | 'HEAD';
|
|
6
|
+
/** Framework-agnostisch request-object dat de kernel verwerkt. */
|
|
7
|
+
export interface KernelRequest {
|
|
8
|
+
method: string;
|
|
9
|
+
/** Pad zonder query-string, bv. `/users/42`. */
|
|
10
|
+
path: string;
|
|
11
|
+
headers: Record<string, string | string[] | undefined>;
|
|
12
|
+
/** Reeds geparste query-parameters. */
|
|
13
|
+
query?: Record<string, unknown>;
|
|
14
|
+
body?: unknown;
|
|
15
|
+
/** Door de router ingevulde path-parameters. */
|
|
16
|
+
params?: Record<string, string>;
|
|
17
|
+
}
|
|
18
|
+
/** Framework-agnostisch response-object dat de kernel oplevert. */
|
|
19
|
+
export interface KernelResponse {
|
|
20
|
+
status: number;
|
|
21
|
+
headers: Record<string, string>;
|
|
22
|
+
body: unknown;
|
|
23
|
+
}
|
|
24
|
+
export interface ValidationIssue {
|
|
25
|
+
path: string;
|
|
26
|
+
message: string;
|
|
27
|
+
}
|
|
28
|
+
export type ValidationOutcome<T> = {
|
|
29
|
+
success: true;
|
|
30
|
+
value: T;
|
|
31
|
+
} | {
|
|
32
|
+
success: false;
|
|
33
|
+
issues: ValidationIssue[];
|
|
34
|
+
};
|
|
35
|
+
/** Vervangbare validatie-engine. Zie de Zod-adapter voor een implementatie. */
|
|
36
|
+
export interface Schema<T = unknown> {
|
|
37
|
+
validate(input: unknown): ValidationOutcome<T>;
|
|
38
|
+
/** Optioneel: JSON-schema voor OpenAPI-generatie (US-0206). */
|
|
39
|
+
jsonSchema?(): JsonSchema;
|
|
40
|
+
}
|
|
41
|
+
/** Minimale JSON-schema-vorm (OpenAPI 3.1 componenten). */
|
|
42
|
+
export type JsonSchema = {
|
|
43
|
+
type?: string;
|
|
44
|
+
properties?: Record<string, JsonSchema>;
|
|
45
|
+
required?: string[];
|
|
46
|
+
items?: JsonSchema;
|
|
47
|
+
enum?: unknown[];
|
|
48
|
+
format?: string;
|
|
49
|
+
[key: string]: unknown;
|
|
50
|
+
};
|
|
51
|
+
export interface RequestContext {
|
|
52
|
+
requestId: string;
|
|
53
|
+
correlationId: string;
|
|
54
|
+
}
|
|
55
|
+
export interface RouteHandlerInput<B = unknown, Q = unknown, P = unknown> {
|
|
56
|
+
body: B;
|
|
57
|
+
query: Q;
|
|
58
|
+
params: P;
|
|
59
|
+
/** Genormaliseerde list-parameters, alleen voor list-routes (US-0205). */
|
|
60
|
+
list?: ListParams;
|
|
61
|
+
raw: KernelRequest;
|
|
62
|
+
context: RequestContext;
|
|
63
|
+
}
|
|
64
|
+
export type RouteHandler<B = unknown, Q = unknown, P = unknown> = (input: RouteHandlerInput<B, Q, P>) => unknown | Promise<unknown>;
|
|
65
|
+
export interface RouteSchemas {
|
|
66
|
+
body?: Schema;
|
|
67
|
+
query?: Schema;
|
|
68
|
+
params?: Schema;
|
|
69
|
+
/** Response-schema voor OpenAPI (validatie van output is optioneel). */
|
|
70
|
+
response?: Schema;
|
|
71
|
+
}
|
|
72
|
+
export interface RouteDefinition {
|
|
73
|
+
method: HttpMethod;
|
|
74
|
+
/** Pad relatief aan de module-basePath; mag `:param`-segmenten bevatten. */
|
|
75
|
+
path: string;
|
|
76
|
+
handler: RouteHandler;
|
|
77
|
+
schemas?: RouteSchemas;
|
|
78
|
+
summary?: string;
|
|
79
|
+
/** Markeer als list-endpoint met paginatie/sortering/filtering (US-0205). */
|
|
80
|
+
list?: ListConfig | boolean;
|
|
81
|
+
/** Success-statuscode (default 200, of 204 bij lege body). */
|
|
82
|
+
status?: number;
|
|
83
|
+
}
|
|
84
|
+
export interface RouteModule {
|
|
85
|
+
basePath?: string;
|
|
86
|
+
routes: RouteDefinition[];
|
|
87
|
+
}
|
|
88
|
+
export interface ListConfig {
|
|
89
|
+
defaultPageSize?: number;
|
|
90
|
+
maxPageSize?: number;
|
|
91
|
+
allowedSortFields?: string[];
|
|
92
|
+
allowedFilterFields?: string[];
|
|
93
|
+
defaultSort?: SortField[];
|
|
94
|
+
}
|
|
95
|
+
export interface SortField {
|
|
96
|
+
field: string;
|
|
97
|
+
direction: 'asc' | 'desc';
|
|
98
|
+
}
|
|
99
|
+
export interface ListParams {
|
|
100
|
+
page: number;
|
|
101
|
+
pageSize: number;
|
|
102
|
+
offset: number;
|
|
103
|
+
sort: SortField[];
|
|
104
|
+
filters: Record<string, string>;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=ports.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.d.ts","sourceRoot":"","sources":["../../../src/http/core/ports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ports.js","sourceRoot":"","sources":["../../../src/http/core/ports.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redactie van gevoelige velden in fout-payloads en logs (US-0204 AC3). Domein-loos: de set
|
|
3
|
+
* gevoelige key-namen is configureerbaar.
|
|
4
|
+
*/
|
|
5
|
+
export declare const DEFAULT_SENSITIVE_KEYS: string[];
|
|
6
|
+
/** Diep redigeren: waarden van keys die (case-insensitief) matchen worden vervangen door `***`. */
|
|
7
|
+
export declare function redactSensitive(value: unknown, sensitiveKeys?: string[]): unknown;
|
|
8
|
+
//# sourceMappingURL=redaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.d.ts","sourceRoot":"","sources":["../../../src/http/core/redaction.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,sBAAsB,UAkBlC,CAAC;AAIF,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,GAAE,MAAM,EAA2B,GAAG,OAAO,CAGzG"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Redactie van gevoelige velden in fout-payloads en logs (US-0204 AC3). Domein-loos: de set
|
|
3
|
+
* gevoelige key-namen is configureerbaar.
|
|
4
|
+
*/
|
|
5
|
+
export const DEFAULT_SENSITIVE_KEYS = [
|
|
6
|
+
'password',
|
|
7
|
+
'pass',
|
|
8
|
+
'secret',
|
|
9
|
+
'token',
|
|
10
|
+
'authorization',
|
|
11
|
+
'apikey',
|
|
12
|
+
'api_key',
|
|
13
|
+
'accesstoken',
|
|
14
|
+
'access_token',
|
|
15
|
+
'refreshtoken',
|
|
16
|
+
'refresh_token',
|
|
17
|
+
'cookie',
|
|
18
|
+
'setcookie',
|
|
19
|
+
'ssn',
|
|
20
|
+
'creditcard',
|
|
21
|
+
'card',
|
|
22
|
+
'pin',
|
|
23
|
+
];
|
|
24
|
+
const REDACTED = '***';
|
|
25
|
+
/** Diep redigeren: waarden van keys die (case-insensitief) matchen worden vervangen door `***`. */
|
|
26
|
+
export function redactSensitive(value, sensitiveKeys = DEFAULT_SENSITIVE_KEYS) {
|
|
27
|
+
const set = new Set(sensitiveKeys.map((k) => k.toLowerCase()));
|
|
28
|
+
return redact(value, set, new WeakSet());
|
|
29
|
+
}
|
|
30
|
+
function redact(value, keys, seen) {
|
|
31
|
+
if (value === null || typeof value !== 'object')
|
|
32
|
+
return value;
|
|
33
|
+
if (seen.has(value))
|
|
34
|
+
return '[Circular]';
|
|
35
|
+
seen.add(value);
|
|
36
|
+
if (Array.isArray(value)) {
|
|
37
|
+
return value.map((item) => redact(item, keys, seen));
|
|
38
|
+
}
|
|
39
|
+
const out = {};
|
|
40
|
+
for (const [key, val] of Object.entries(value)) {
|
|
41
|
+
out[key] = keys.has(key.toLowerCase()) ? REDACTED : redact(val, keys, seen);
|
|
42
|
+
}
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.js","sourceRoot":"","sources":["../../../src/http/core/redaction.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,UAAU;IACV,MAAM;IACN,QAAQ;IACR,OAAO;IACP,eAAe;IACf,QAAQ;IACR,SAAS;IACT,aAAa;IACb,cAAc;IACd,cAAc;IACd,eAAe;IACf,QAAQ;IACR,WAAW;IACX,KAAK;IACL,YAAY;IACZ,MAAM;IACN,KAAK;CACN,CAAC;AAEF,MAAM,QAAQ,GAAG,KAAK,CAAC;AAEvB,mGAAmG;AACnG,MAAM,UAAU,eAAe,CAAC,KAAc,EAAE,gBAA0B,sBAAsB;IAC9F,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC/D,OAAO,MAAM,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,MAAM,CAAC,KAAc,EAAE,IAAiB,EAAE,IAAqB;IACtE,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC9D,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC;IACzC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAEhB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,EAAE,CAAC;QAC1E,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* US-0201 — Route-modules valideren, mounten en matchen.
|
|
3
|
+
*
|
|
4
|
+
* Valideert geïnjecteerde route-modules tegen het port-contract (fail-fast bij een ongeldige module),
|
|
5
|
+
* compileert ze tot een route-tabel onder het geconfigureerde base-path en detecteert conflicterende
|
|
6
|
+
* registraties (zelfde methode + pad). Bevat geen domeinkennis.
|
|
7
|
+
*/
|
|
8
|
+
import type { HttpMethod, RouteDefinition, RouteModule } from './ports.js';
|
|
9
|
+
/** Fout bij het bootstrappen van de kernel (US-0201 AC3 / US-0206 AC3). Bevat geen interne payload. */
|
|
10
|
+
export declare class KernelBootstrapError extends Error {
|
|
11
|
+
constructor(message: string);
|
|
12
|
+
}
|
|
13
|
+
interface Segment {
|
|
14
|
+
value: string;
|
|
15
|
+
param: boolean;
|
|
16
|
+
}
|
|
17
|
+
export interface CompiledRoute {
|
|
18
|
+
method: HttpMethod;
|
|
19
|
+
/** Volledig pad inclusief base-path, bv. `/api/users/:id`. */
|
|
20
|
+
fullPath: string;
|
|
21
|
+
segments: Segment[];
|
|
22
|
+
definition: RouteDefinition;
|
|
23
|
+
}
|
|
24
|
+
/** Valideert één route-module tegen het port-contract. Gooit {@link KernelBootstrapError}. */
|
|
25
|
+
export declare function validateRouteModule(mod: unknown, index: number): asserts mod is RouteModule;
|
|
26
|
+
/** Compileert alle route-modules tot één route-tabel; detecteert conflicten (fail-fast). */
|
|
27
|
+
export declare function compileRoutes(modules: unknown[], basePath?: string): CompiledRoute[];
|
|
28
|
+
export interface RouteMatch {
|
|
29
|
+
route: CompiledRoute;
|
|
30
|
+
params: Record<string, string>;
|
|
31
|
+
}
|
|
32
|
+
/** Zoekt de eerste route die matcht op methode + pad en extraheert path-params. */
|
|
33
|
+
export declare function matchRoute(routes: CompiledRoute[], method: string, path: string): RouteMatch | null;
|
|
34
|
+
/** True als er wel een pad matcht maar geen enkele methode (405-hint). */
|
|
35
|
+
export declare function pathExistsWithOtherMethod(routes: CompiledRoute[], path: string): boolean;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/http/core/router.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE3E,uGAAuG;AACvG,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAK5B;AAYD,UAAU,OAAO;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,UAAU,CAAC;IACnB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,UAAU,EAAE,eAAe,CAAC;CAC7B;AAED,8FAA8F;AAC9F,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI,WAAW,CAyB3F;AAED,4FAA4F;AAC5F,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,QAAQ,SAAK,GAAG,aAAa,EAAE,CAuBhF;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,mFAAmF;AACnF,wBAAgB,UAAU,CACxB,MAAM,EAAE,aAAa,EAAE,EACvB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,GACX,UAAU,GAAG,IAAI,CASnB;AAED,0EAA0E;AAC1E,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGxF"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/** Fout bij het bootstrappen van de kernel (US-0201 AC3 / US-0206 AC3). Bevat geen interne payload. */
|
|
2
|
+
export class KernelBootstrapError extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = 'KernelBootstrapError';
|
|
6
|
+
Object.setPrototypeOf(this, KernelBootstrapError.prototype);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
const VALID_METHODS = new Set([
|
|
10
|
+
'GET',
|
|
11
|
+
'POST',
|
|
12
|
+
'PUT',
|
|
13
|
+
'PATCH',
|
|
14
|
+
'DELETE',
|
|
15
|
+
'OPTIONS',
|
|
16
|
+
'HEAD',
|
|
17
|
+
]);
|
|
18
|
+
/** Valideert één route-module tegen het port-contract. Gooit {@link KernelBootstrapError}. */
|
|
19
|
+
export function validateRouteModule(mod, index) {
|
|
20
|
+
const label = `route-module[${index}]`;
|
|
21
|
+
if (typeof mod !== 'object' || mod === null || Array.isArray(mod)) {
|
|
22
|
+
throw new KernelBootstrapError(`${label} is geen geldig object`);
|
|
23
|
+
}
|
|
24
|
+
const routes = mod.routes;
|
|
25
|
+
if (!Array.isArray(routes)) {
|
|
26
|
+
throw new KernelBootstrapError(`${label}.routes ontbreekt of is geen array`);
|
|
27
|
+
}
|
|
28
|
+
routes.forEach((route, i) => {
|
|
29
|
+
const rl = `${label}.routes[${i}]`;
|
|
30
|
+
if (typeof route !== 'object' || route === null) {
|
|
31
|
+
throw new KernelBootstrapError(`${rl} is geen geldig route-object`);
|
|
32
|
+
}
|
|
33
|
+
const r = route;
|
|
34
|
+
if (typeof r.method !== 'string' || !VALID_METHODS.has(r.method.toUpperCase())) {
|
|
35
|
+
throw new KernelBootstrapError(`${rl}.method "${String(r.method)}" is ongeldig`);
|
|
36
|
+
}
|
|
37
|
+
if (typeof r.path !== 'string' || !r.path.startsWith('/')) {
|
|
38
|
+
throw new KernelBootstrapError(`${rl}.path moet een string zijn die met "/" begint`);
|
|
39
|
+
}
|
|
40
|
+
if (typeof r.handler !== 'function') {
|
|
41
|
+
throw new KernelBootstrapError(`${rl}.handler ontbreekt of is geen functie`);
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
/** Compileert alle route-modules tot één route-tabel; detecteert conflicten (fail-fast). */
|
|
46
|
+
export function compileRoutes(modules, basePath = '') {
|
|
47
|
+
const routes = [];
|
|
48
|
+
const seen = new Map();
|
|
49
|
+
const normalizedBase = normalize(basePath);
|
|
50
|
+
modules.forEach((mod, index) => {
|
|
51
|
+
validateRouteModule(mod, index);
|
|
52
|
+
const moduleBase = normalize(mod.basePath ?? '');
|
|
53
|
+
for (const definition of mod.routes) {
|
|
54
|
+
const method = definition.method.toUpperCase();
|
|
55
|
+
const fullPath = joinPaths(normalizedBase, moduleBase, definition.path);
|
|
56
|
+
const key = `${method} ${fullPath}`;
|
|
57
|
+
if (seen.has(key)) {
|
|
58
|
+
throw new KernelBootstrapError(`conflicterende route-registratie: ${key} is meer dan één keer geregistreerd`);
|
|
59
|
+
}
|
|
60
|
+
seen.set(key, key);
|
|
61
|
+
routes.push({ method, fullPath, segments: toSegments(fullPath), definition });
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
return routes;
|
|
65
|
+
}
|
|
66
|
+
/** Zoekt de eerste route die matcht op methode + pad en extraheert path-params. */
|
|
67
|
+
export function matchRoute(routes, method, path) {
|
|
68
|
+
const upper = method.toUpperCase();
|
|
69
|
+
const target = toSegments(normalize(path));
|
|
70
|
+
for (const route of routes) {
|
|
71
|
+
if (route.method !== upper)
|
|
72
|
+
continue;
|
|
73
|
+
const params = matchSegments(route.segments, target);
|
|
74
|
+
if (params)
|
|
75
|
+
return { route, params };
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
/** True als er wel een pad matcht maar geen enkele methode (405-hint). */
|
|
80
|
+
export function pathExistsWithOtherMethod(routes, path) {
|
|
81
|
+
const target = toSegments(normalize(path));
|
|
82
|
+
return routes.some((route) => matchSegments(route.segments, target) !== null);
|
|
83
|
+
}
|
|
84
|
+
function matchSegments(routeSegs, target) {
|
|
85
|
+
if (routeSegs.length !== target.length)
|
|
86
|
+
return null;
|
|
87
|
+
const params = {};
|
|
88
|
+
for (let i = 0; i < routeSegs.length; i++) {
|
|
89
|
+
const seg = routeSegs[i];
|
|
90
|
+
const value = target[i].value;
|
|
91
|
+
if (seg.param) {
|
|
92
|
+
params[seg.value] = decodeURIComponent(value);
|
|
93
|
+
}
|
|
94
|
+
else if (seg.value !== value) {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return params;
|
|
99
|
+
}
|
|
100
|
+
function toSegments(path) {
|
|
101
|
+
return path
|
|
102
|
+
.split('/')
|
|
103
|
+
.filter((s) => s.length > 0)
|
|
104
|
+
.map((s) => (s.startsWith(':') ? { value: s.slice(1), param: true } : { value: s, param: false }));
|
|
105
|
+
}
|
|
106
|
+
function normalize(path) {
|
|
107
|
+
if (!path)
|
|
108
|
+
return '';
|
|
109
|
+
let p = path.trim();
|
|
110
|
+
if (!p.startsWith('/'))
|
|
111
|
+
p = `/${p}`;
|
|
112
|
+
if (p.length > 1 && p.endsWith('/'))
|
|
113
|
+
p = p.slice(0, -1);
|
|
114
|
+
return p === '/' ? '' : p;
|
|
115
|
+
}
|
|
116
|
+
function joinPaths(...parts) {
|
|
117
|
+
const joined = parts.map((p) => normalize(p)).join('');
|
|
118
|
+
return joined === '' ? '/' : joined;
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/http/core/router.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* US-0207 — CORS + security-headers.
|
|
3
|
+
*
|
|
4
|
+
* Past veilige security-header-defaults toe en handelt CORS af op basis van een geconfigureerde
|
|
5
|
+
* allowlist van origins/methodes/headers. Onbekende origins krijgen geen CORS-toegangs-headers. De
|
|
6
|
+
* laag is domein-loos; allowlist en overrides komen via config-injectie binnen.
|
|
7
|
+
*/
|
|
8
|
+
export interface SecurityHeadersConfig {
|
|
9
|
+
/** `Strict-Transport-Security`. Default veilige waarde; `false` schakelt uit. */
|
|
10
|
+
hsts?: string | false;
|
|
11
|
+
/** `Content-Security-Policy`. Default `default-src 'self'`; `false` schakelt uit. */
|
|
12
|
+
csp?: string | false;
|
|
13
|
+
/** `X-Frame-Options`. Default `DENY`. */
|
|
14
|
+
frameOptions?: string | false;
|
|
15
|
+
/** `Referrer-Policy`. Default `no-referrer`. */
|
|
16
|
+
referrerPolicy?: string | false;
|
|
17
|
+
/** Extra/overschrijvende headers. */
|
|
18
|
+
extra?: Record<string, string>;
|
|
19
|
+
}
|
|
20
|
+
/** Bouwt de security-headers met veilige defaults. */
|
|
21
|
+
export declare function securityHeaders(config?: SecurityHeadersConfig): Record<string, string>;
|
|
22
|
+
export interface CorsConfig {
|
|
23
|
+
/** Toegestane origins, of `'*'` voor alle. Leeg/afwezig = geen cross-origin-toegang. */
|
|
24
|
+
allowedOrigins?: string[] | '*';
|
|
25
|
+
allowedMethods?: string[];
|
|
26
|
+
allowedHeaders?: string[];
|
|
27
|
+
exposedHeaders?: string[];
|
|
28
|
+
allowCredentials?: boolean;
|
|
29
|
+
maxAge?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface CorsResult {
|
|
32
|
+
headers: Record<string, string>;
|
|
33
|
+
/** True als de origin op de allowlist staat (of `*`). */
|
|
34
|
+
allowed: boolean;
|
|
35
|
+
isPreflight: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Berekent de CORS-headers voor een request. Onbekende origins krijgen geen
|
|
39
|
+
* `Access-Control-Allow-Origin` (US-0207 AC3). Voor een preflight (OPTIONS met
|
|
40
|
+
* `Access-Control-Request-Method`) worden de toegestane methodes/headers teruggegeven.
|
|
41
|
+
*/
|
|
42
|
+
export declare function resolveCors(origin: string | undefined, method: string, config?: CorsConfig, hasPreflightHeader?: boolean): CorsResult;
|
|
43
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../src/http/core/security.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,WAAW,qBAAqB;IACpC,iFAAiF;IACjF,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACtB,qFAAqF;IACrF,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC9B,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAChC,qCAAqC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAKD,sDAAsD;AACtD,wBAAgB,eAAe,CAAC,MAAM,GAAE,qBAA0B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAW1F;AAED,MAAM,WAAW,UAAU;IACzB,wFAAwF;IACxF,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,yDAAyD;IACzD,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;CACtB;AAKD;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,MAAM,EAAE,MAAM,EACd,MAAM,GAAE,UAAe,EACvB,kBAAkB,UAAQ,GACzB,UAAU,CAwBZ"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* US-0207 — CORS + security-headers.
|
|
3
|
+
*
|
|
4
|
+
* Past veilige security-header-defaults toe en handelt CORS af op basis van een geconfigureerde
|
|
5
|
+
* allowlist van origins/methodes/headers. Onbekende origins krijgen geen CORS-toegangs-headers. De
|
|
6
|
+
* laag is domein-loos; allowlist en overrides komen via config-injectie binnen.
|
|
7
|
+
*/
|
|
8
|
+
const DEFAULT_HSTS = 'max-age=63072000; includeSubDomains';
|
|
9
|
+
const DEFAULT_CSP = "default-src 'self'";
|
|
10
|
+
/** Bouwt de security-headers met veilige defaults. */
|
|
11
|
+
export function securityHeaders(config = {}) {
|
|
12
|
+
const headers = {
|
|
13
|
+
'X-Content-Type-Options': 'nosniff',
|
|
14
|
+
};
|
|
15
|
+
if (config.frameOptions !== false)
|
|
16
|
+
headers['X-Frame-Options'] = config.frameOptions ?? 'DENY';
|
|
17
|
+
if (config.hsts !== false)
|
|
18
|
+
headers['Strict-Transport-Security'] = config.hsts ?? DEFAULT_HSTS;
|
|
19
|
+
if (config.csp !== false)
|
|
20
|
+
headers['Content-Security-Policy'] = config.csp ?? DEFAULT_CSP;
|
|
21
|
+
if (config.referrerPolicy !== false) {
|
|
22
|
+
headers['Referrer-Policy'] = config.referrerPolicy ?? 'no-referrer';
|
|
23
|
+
}
|
|
24
|
+
return { ...headers, ...(config.extra ?? {}) };
|
|
25
|
+
}
|
|
26
|
+
const DEFAULT_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE', 'OPTIONS'];
|
|
27
|
+
const DEFAULT_HEADERS = ['Content-Type', 'Authorization'];
|
|
28
|
+
/**
|
|
29
|
+
* Berekent de CORS-headers voor een request. Onbekende origins krijgen geen
|
|
30
|
+
* `Access-Control-Allow-Origin` (US-0207 AC3). Voor een preflight (OPTIONS met
|
|
31
|
+
* `Access-Control-Request-Method`) worden de toegestane methodes/headers teruggegeven.
|
|
32
|
+
*/
|
|
33
|
+
export function resolveCors(origin, method, config = {}, hasPreflightHeader = false) {
|
|
34
|
+
const isPreflight = method.toUpperCase() === 'OPTIONS' && hasPreflightHeader;
|
|
35
|
+
const allowed = isOriginAllowed(origin, config.allowedOrigins);
|
|
36
|
+
if (!allowed || origin === undefined) {
|
|
37
|
+
return { headers: {}, allowed: false, isPreflight };
|
|
38
|
+
}
|
|
39
|
+
const headers = {};
|
|
40
|
+
const originValue = config.allowedOrigins === '*' && !config.allowCredentials ? '*' : origin;
|
|
41
|
+
headers['Access-Control-Allow-Origin'] = originValue;
|
|
42
|
+
if (originValue !== '*')
|
|
43
|
+
headers['Vary'] = 'Origin';
|
|
44
|
+
if (config.allowCredentials)
|
|
45
|
+
headers['Access-Control-Allow-Credentials'] = 'true';
|
|
46
|
+
if (config.exposedHeaders?.length) {
|
|
47
|
+
headers['Access-Control-Expose-Headers'] = config.exposedHeaders.join(', ');
|
|
48
|
+
}
|
|
49
|
+
if (isPreflight) {
|
|
50
|
+
headers['Access-Control-Allow-Methods'] = (config.allowedMethods ?? DEFAULT_METHODS).join(', ');
|
|
51
|
+
headers['Access-Control-Allow-Headers'] = (config.allowedHeaders ?? DEFAULT_HEADERS).join(', ');
|
|
52
|
+
if (config.maxAge !== undefined)
|
|
53
|
+
headers['Access-Control-Max-Age'] = String(config.maxAge);
|
|
54
|
+
}
|
|
55
|
+
return { headers, allowed: true, isPreflight };
|
|
56
|
+
}
|
|
57
|
+
function isOriginAllowed(origin, allowlist) {
|
|
58
|
+
if (origin === undefined)
|
|
59
|
+
return false;
|
|
60
|
+
if (allowlist === '*')
|
|
61
|
+
return true;
|
|
62
|
+
if (!allowlist || allowlist.length === 0)
|
|
63
|
+
return false;
|
|
64
|
+
return allowlist.includes(origin);
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../../src/http/core/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { KernelRequest, RouteSchemas } from './ports.js';
|
|
2
|
+
export interface ValidatedRequest {
|
|
3
|
+
body: unknown;
|
|
4
|
+
query: unknown;
|
|
5
|
+
params: unknown;
|
|
6
|
+
}
|
|
7
|
+
/** Valideert de request-onderdelen; verzamelt álle overtredingen over body/query/params heen. */
|
|
8
|
+
export declare function validateRequest(req: KernelRequest, schemas?: RouteSchemas): ValidatedRequest;
|
|
9
|
+
//# sourceMappingURL=validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/http/core/validation.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAmB,MAAM,YAAY,CAAC;AAE/E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,iGAAiG;AACjG,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,gBAAgB,CAc5F"}
|