@c15t/backend 1.0.5 → 1.2.0-canary.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/.turbo/turbo-build.log +33 -39
- package/.turbo/turbo-fmt.log +3 -3
- package/.turbo/turbo-test.log +531 -0
- package/coverage/coverage-final.json +84 -0
- package/coverage/coverage-summary.json +85 -0
- package/coverage/html/backend/index.html +116 -0
- package/coverage/html/backend/rslib.config.ts.html +415 -0
- package/coverage/html/backend/src/contracts/consent/index.html +161 -0
- package/coverage/html/backend/src/contracts/consent/index.ts.html +112 -0
- package/coverage/html/backend/src/contracts/consent/post.contract.ts.html +559 -0
- package/coverage/html/backend/src/contracts/consent/show-banner.contract.ts.html +220 -0
- package/coverage/html/backend/src/contracts/consent/verify.contract.ts.html +463 -0
- package/coverage/html/backend/src/contracts/index.html +116 -0
- package/coverage/html/backend/src/contracts/index.ts.html +139 -0
- package/coverage/html/backend/src/contracts/meta/index.html +131 -0
- package/coverage/html/backend/src/contracts/meta/index.ts.html +100 -0
- package/coverage/html/backend/src/contracts/meta/status.contract.ts.html +196 -0
- package/coverage/html/backend/src/contracts/shared/index.html +116 -0
- package/coverage/html/backend/src/contracts/shared/jurisdiction.schema.ts.html +175 -0
- package/coverage/html/backend/src/core.ts.html +1624 -0
- package/coverage/html/backend/src/handlers/consent/index.html +161 -0
- package/coverage/html/backend/src/handlers/consent/index.ts.html +112 -0
- package/coverage/html/backend/src/handlers/consent/post.handler.ts.html +889 -0
- package/coverage/html/backend/src/handlers/consent/show-banner.handler.ts.html +535 -0
- package/coverage/html/backend/src/handlers/consent/verify.handler.ts.html +1000 -0
- package/coverage/html/backend/src/handlers/meta/index.html +131 -0
- package/coverage/html/backend/src/handlers/meta/index.ts.html +100 -0
- package/coverage/html/backend/src/handlers/meta/status.handler.ts.html +226 -0
- package/coverage/html/backend/src/index.html +161 -0
- package/coverage/html/backend/src/init.ts.html +1018 -0
- package/coverage/html/backend/src/pkgs/api-router/hooks/index.html +116 -0
- package/coverage/html/backend/src/pkgs/api-router/hooks/processor.ts.html +544 -0
- package/coverage/html/backend/src/pkgs/api-router/index.html +116 -0
- package/coverage/html/backend/src/pkgs/api-router/telemetry.ts.html +334 -0
- package/coverage/html/backend/src/pkgs/api-router/utils/cors.ts.html +304 -0
- package/coverage/html/backend/src/pkgs/api-router/utils/index.html +131 -0
- package/coverage/html/backend/src/pkgs/api-router/utils/ip.ts.html +361 -0
- package/coverage/html/backend/src/pkgs/data-model/fields/field-factory.ts.html +709 -0
- package/coverage/html/backend/src/pkgs/data-model/fields/id-generator.ts.html +256 -0
- package/coverage/html/backend/src/pkgs/data-model/fields/index.html +161 -0
- package/coverage/html/backend/src/pkgs/data-model/fields/superjson-utils.ts.html +136 -0
- package/coverage/html/backend/src/pkgs/data-model/fields/zod-fields.ts.html +496 -0
- package/coverage/html/backend/src/pkgs/data-model/hooks/create-hooks.ts.html +349 -0
- package/coverage/html/backend/src/pkgs/data-model/hooks/index.html +176 -0
- package/coverage/html/backend/src/pkgs/data-model/hooks/update-hooks.ts.html +358 -0
- package/coverage/html/backend/src/pkgs/data-model/hooks/update-many-hooks.ts.html +613 -0
- package/coverage/html/backend/src/pkgs/data-model/hooks/utils.ts.html +538 -0
- package/coverage/html/backend/src/pkgs/data-model/hooks/with-hooks-factory.ts.html +289 -0
- package/coverage/html/backend/src/pkgs/db-adapters/adapter-factory.ts.html +289 -0
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts.html +2203 -0
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/index.html +116 -0
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/index.html +116 -0
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/dialect.ts.html +670 -0
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/index.html +131 -0
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.ts.html +3634 -0
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/index.html +116 -0
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts.html +1417 -0
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/index.html +116 -0
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.ts.html +2071 -0
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/index.html +116 -0
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.ts.html +1834 -0
- package/coverage/html/backend/src/pkgs/db-adapters/adapters/test.ts.html +316 -0
- package/coverage/html/backend/src/pkgs/db-adapters/index.html +131 -0
- package/coverage/html/backend/src/pkgs/db-adapters/utils.ts.html +238 -0
- package/coverage/html/backend/src/pkgs/migrations/get-migration.ts.html +343 -0
- package/coverage/html/backend/src/pkgs/migrations/get-schema/get-schema.ts.html +217 -0
- package/coverage/html/backend/src/pkgs/migrations/get-schema/index.html +146 -0
- package/coverage/html/backend/src/pkgs/migrations/get-schema/process-fields.ts.html +280 -0
- package/coverage/html/backend/src/pkgs/migrations/get-schema/process-tables.ts.html +289 -0
- package/coverage/html/backend/src/pkgs/migrations/index.html +176 -0
- package/coverage/html/backend/src/pkgs/migrations/migration-builders.ts.html +595 -0
- package/coverage/html/backend/src/pkgs/migrations/migration-execution.ts.html +301 -0
- package/coverage/html/backend/src/pkgs/migrations/schema-comparison.ts.html +694 -0
- package/coverage/html/backend/src/pkgs/migrations/type-mapping.ts.html +817 -0
- package/coverage/html/backend/src/pkgs/results/core/error-class.ts.html +976 -0
- package/coverage/html/backend/src/pkgs/results/core/error-codes.ts.html +703 -0
- package/coverage/html/backend/src/pkgs/results/core/index.html +146 -0
- package/coverage/html/backend/src/pkgs/results/core/tracing.ts.html +280 -0
- package/coverage/html/backend/src/pkgs/results/create-telemetry-options.ts.html +271 -0
- package/coverage/html/backend/src/pkgs/results/index.html +131 -0
- package/coverage/html/backend/src/pkgs/results/orpc-error-handler.ts.html +496 -0
- package/coverage/html/backend/src/pkgs/results/results/index.html +131 -0
- package/coverage/html/backend/src/pkgs/results/results/recovery-utils.ts.html +628 -0
- package/coverage/html/backend/src/pkgs/results/results/result-helpers.ts.html +1234 -0
- package/coverage/html/backend/src/pkgs/utils/env.ts.html +337 -0
- package/coverage/html/backend/src/pkgs/utils/index.html +146 -0
- package/coverage/html/backend/src/pkgs/utils/logger.ts.html +199 -0
- package/coverage/html/backend/src/pkgs/utils/url.ts.html +400 -0
- package/coverage/html/backend/src/router.ts.html +109 -0
- package/coverage/html/backend/src/schema/audit-log/index.html +146 -0
- package/coverage/html/backend/src/schema/audit-log/registry.ts.html +436 -0
- package/coverage/html/backend/src/schema/audit-log/schema.ts.html +223 -0
- package/coverage/html/backend/src/schema/audit-log/table.ts.html +640 -0
- package/coverage/html/backend/src/schema/consent/index.html +146 -0
- package/coverage/html/backend/src/schema/consent/registry.ts.html +616 -0
- package/coverage/html/backend/src/schema/consent/schema.ts.html +238 -0
- package/coverage/html/backend/src/schema/consent/table.ts.html +748 -0
- package/coverage/html/backend/src/schema/consent-policy/index.html +146 -0
- package/coverage/html/backend/src/schema/consent-policy/registry.ts.html +1063 -0
- package/coverage/html/backend/src/schema/consent-policy/schema.ts.html +265 -0
- package/coverage/html/backend/src/schema/consent-policy/table.ts.html +535 -0
- package/coverage/html/backend/src/schema/consent-purpose/index.html +146 -0
- package/coverage/html/backend/src/schema/consent-purpose/registry.ts.html +589 -0
- package/coverage/html/backend/src/schema/consent-purpose/schema.ts.html +259 -0
- package/coverage/html/backend/src/schema/consent-purpose/table.ts.html +547 -0
- package/coverage/html/backend/src/schema/consent-record/index.html +131 -0
- package/coverage/html/backend/src/schema/consent-record/schema.ts.html +211 -0
- package/coverage/html/backend/src/schema/consent-record/table.ts.html +457 -0
- package/coverage/html/backend/src/schema/create-registry.ts.html +148 -0
- package/coverage/html/backend/src/schema/definition.ts.html +685 -0
- package/coverage/html/backend/src/schema/domain/index.html +146 -0
- package/coverage/html/backend/src/schema/domain/registry.ts.html +973 -0
- package/coverage/html/backend/src/schema/domain/schema.ts.html +214 -0
- package/coverage/html/backend/src/schema/domain/table.ts.html +496 -0
- package/coverage/html/backend/src/schema/index.html +146 -0
- package/coverage/html/backend/src/schema/schemas.ts.html +166 -0
- package/coverage/html/backend/src/schema/subject/index.html +146 -0
- package/coverage/html/backend/src/schema/subject/registry.ts.html +973 -0
- package/coverage/html/backend/src/schema/subject/schema.ts.html +208 -0
- package/coverage/html/backend/src/schema/subject/table.ts.html +499 -0
- package/coverage/html/backend/src/server.ts.html +475 -0
- package/coverage/html/backend/src/testing/contract-testing.ts.html +1348 -0
- package/coverage/html/backend/src/testing/index.html +116 -0
- package/coverage/html/base.css +224 -0
- package/coverage/html/block-navigation.js +87 -0
- package/coverage/html/favicon.png +0 -0
- package/coverage/html/index.html +626 -0
- package/coverage/html/prettify.css +1 -0
- package/coverage/html/prettify.js +2 -0
- package/coverage/html/sort-arrow-sprite.png +0 -0
- package/coverage/html/sorter.js +196 -0
- package/dist/contracts/consent/index.d.ts +401 -0
- package/dist/contracts/consent/index.d.ts.map +1 -0
- package/dist/contracts/consent/index.test.d.ts +2 -0
- package/dist/contracts/consent/index.test.d.ts.map +1 -0
- package/dist/contracts/consent/post.contract.d.ts +212 -0
- package/dist/contracts/consent/post.contract.d.ts.map +1 -0
- package/dist/contracts/consent/post.contract.test.d.ts +2 -0
- package/dist/contracts/consent/post.contract.test.d.ts.map +1 -0
- package/dist/contracts/consent/show-banner.contract.d.ts +45 -0
- package/dist/contracts/consent/show-banner.contract.d.ts.map +1 -0
- package/dist/contracts/consent/show-banner.contract.test.d.ts +2 -0
- package/dist/contracts/consent/show-banner.contract.test.d.ts.map +1 -0
- package/dist/contracts/consent/verify.contract.d.ts +147 -0
- package/dist/contracts/consent/verify.contract.d.ts.map +1 -0
- package/dist/contracts/consent/verify.contract.test.d.ts +2 -0
- package/dist/contracts/consent/verify.contract.test.d.ts.map +1 -0
- package/dist/contracts/index.d.ts +963 -0
- package/dist/contracts/index.d.ts.map +1 -0
- package/dist/contracts/meta/index.d.ts +78 -0
- package/dist/contracts/meta/index.d.ts.map +1 -0
- package/dist/contracts/meta/index.test.d.ts +2 -0
- package/dist/contracts/meta/index.test.d.ts.map +1 -0
- package/dist/contracts/meta/status.contract.d.ts +77 -0
- package/dist/contracts/meta/status.contract.d.ts.map +1 -0
- package/dist/contracts/meta/status.contract.test.d.ts +2 -0
- package/dist/contracts/meta/status.contract.test.d.ts.map +1 -0
- package/dist/contracts/shared/jurisdiction.schema.d.ts +24 -0
- package/dist/contracts/shared/jurisdiction.schema.d.ts.map +1 -0
- package/dist/core.cjs +3584 -0
- package/dist/core.d.ts +533 -76
- package/dist/core.d.ts.map +1 -1
- package/dist/{index.js → core.js} +1163 -1286
- package/dist/handlers/consent/index.d.ts +401 -0
- package/dist/handlers/consent/index.d.ts.map +1 -0
- package/dist/handlers/consent/post.handler.d.ts +234 -0
- package/dist/handlers/consent/post.handler.d.ts.map +1 -0
- package/dist/handlers/consent/show-banner.handler.d.ts +57 -0
- package/dist/handlers/consent/show-banner.handler.d.ts.map +1 -0
- package/dist/handlers/consent/show-banner.handler.test.d.ts +2 -0
- package/dist/handlers/consent/show-banner.handler.test.d.ts.map +1 -0
- package/dist/handlers/consent/verify.handler.d.ts +169 -0
- package/dist/handlers/consent/verify.handler.d.ts.map +1 -0
- package/dist/handlers/meta/index.d.ts +78 -0
- package/dist/handlers/meta/index.d.ts.map +1 -0
- package/dist/handlers/meta/status.handler.d.ts +76 -0
- package/dist/handlers/meta/status.handler.d.ts.map +1 -0
- package/dist/init.d.ts.map +1 -1
- package/dist/pkgs/api-router/hooks/processor.d.ts.map +1 -1
- package/dist/pkgs/api-router/types/router-props.d.ts +1 -1
- package/dist/pkgs/api-router/types/router-props.d.ts.map +1 -1
- package/dist/pkgs/api-router/utils/cors.d.ts +1 -1
- package/dist/pkgs/api-router/utils/cors.d.ts.map +1 -1
- package/dist/pkgs/data-model/fields/field-types.d.ts +1 -1
- package/dist/pkgs/data-model/fields/zod-fields.d.ts +32 -32
- package/dist/pkgs/data-model/index.cjs +1433 -1799
- package/dist/pkgs/data-model/index.js +20 -385
- package/dist/pkgs/data-model/schema/index.cjs +1402 -1768
- package/dist/pkgs/data-model/schema/index.js +20 -385
- package/dist/pkgs/db-adapters/adapter-factory.d.ts +2 -2
- package/dist/pkgs/db-adapters/adapter-factory.d.ts.map +1 -1
- package/dist/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.d.ts +4 -4
- package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.cjs +19 -151
- package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.js +19 -151
- package/dist/pkgs/db-adapters/adapters/kysely-adapter/dialect.d.ts +1 -1
- package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.cjs +17 -149
- package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.js +17 -149
- package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts +2 -2
- package/dist/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.d.ts.map +1 -1
- package/dist/pkgs/db-adapters/adapters/memory-adapter/index.cjs +17 -149
- package/dist/pkgs/db-adapters/adapters/memory-adapter/index.js +17 -149
- package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.cjs +19 -151
- package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.js +19 -151
- package/dist/pkgs/db-adapters/index.cjs +31 -153
- package/dist/pkgs/db-adapters/index.js +31 -153
- package/dist/pkgs/migrations/get-schema/get-schema.d.ts +2 -2
- package/dist/pkgs/migrations/get-schema/index.d.ts +1 -1
- package/dist/pkgs/migrations/index.cjs +30 -153
- package/dist/pkgs/migrations/index.js +30 -153
- package/dist/pkgs/migrations/schema-comparison.d.ts.map +1 -1
- package/dist/pkgs/results/core/error-class.d.ts +23 -21
- package/dist/pkgs/results/core/error-class.d.ts.map +1 -1
- package/dist/pkgs/results/index.cjs +17 -150
- package/dist/pkgs/results/index.d.ts +0 -3
- package/dist/pkgs/results/index.d.ts.map +1 -1
- package/dist/pkgs/results/index.js +17 -138
- package/dist/pkgs/results/orpc-error-handler.d.ts +65 -0
- package/dist/pkgs/results/orpc-error-handler.d.ts.map +1 -0
- package/dist/pkgs/results/types.d.ts +7 -7
- package/dist/pkgs/results/types.d.ts.map +1 -1
- package/dist/pkgs/types/context.d.ts +15 -4
- package/dist/pkgs/types/context.d.ts.map +1 -1
- package/dist/pkgs/types/endpoints.d.ts +3 -4
- package/dist/pkgs/types/endpoints.d.ts.map +1 -1
- package/dist/pkgs/types/options.d.ts +2 -3
- package/dist/pkgs/types/options.d.ts.map +1 -1
- package/dist/pkgs/types/plugins.d.ts +2 -3
- package/dist/pkgs/types/plugins.d.ts.map +1 -1
- package/dist/pkgs/utils/index.d.ts +1 -0
- package/dist/pkgs/utils/index.d.ts.map +1 -1
- package/dist/pkgs/utils/logger.d.ts +16 -0
- package/dist/pkgs/utils/logger.d.ts.map +1 -0
- package/dist/router.cjs +1213 -0
- package/dist/router.d.ts +480 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +1169 -0
- package/dist/schema/audit-log/table.d.ts +1 -1
- package/dist/schema/consent/table.d.ts +1 -1
- package/dist/schema/consent-policy/registry.d.ts +12 -12
- package/dist/schema/consent-policy/schema.d.ts +6 -6
- package/dist/schema/consent-policy/table.d.ts +7 -7
- package/dist/schema/consent-purpose/registry.d.ts +6 -6
- package/dist/schema/consent-purpose/schema.d.ts +6 -6
- package/dist/schema/consent-purpose/table.d.ts +7 -7
- package/dist/schema/consent-record/table.d.ts +1 -1
- package/dist/schema/create-registry.d.ts +32 -32
- package/dist/schema/definition.d.ts +19 -19
- package/dist/schema/domain/registry.d.ts +10 -10
- package/dist/schema/domain/schema.d.ts +5 -5
- package/dist/schema/domain/table.d.ts +6 -6
- package/dist/schema/index.cjs +1409 -1775
- package/dist/schema/index.js +20 -385
- package/dist/schema/schemas.d.ts +19 -19
- package/dist/schema/subject/registry.d.ts +4 -4
- package/dist/schema/subject/schema.d.ts +2 -2
- package/dist/schema/subject/table.d.ts +3 -3
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/testing/contract-testing.d.ts +37 -0
- package/dist/testing/contract-testing.d.ts.map +1 -0
- package/dist/types/context.d.ts +1 -1
- package/dist/types/index.d.ts +2 -2
- package/dist/types/options.d.ts +33 -2
- package/dist/types/options.d.ts.map +1 -1
- package/dist/types/plugins.d.ts +3 -4
- package/dist/types/plugins.d.ts.map +1 -1
- package/package.json +22 -30
- package/rslib.config.ts +2 -5
- package/src/contracts/consent/index.test.ts +5 -0
- package/src/contracts/consent/index.ts +9 -0
- package/src/contracts/consent/post.contract.test.ts +526 -0
- package/src/contracts/consent/post.contract.ts +160 -0
- package/src/contracts/consent/show-banner.contract.test.ts +214 -0
- package/src/contracts/consent/show-banner.contract.ts +45 -0
- package/src/contracts/consent/verify.contract.test.ts +185 -0
- package/src/contracts/consent/verify.contract.ts +126 -0
- package/src/contracts/index.ts +18 -0
- package/src/contracts/meta/index.test.ts +5 -0
- package/src/contracts/meta/index.ts +5 -0
- package/src/contracts/meta/status.contract.test.ts +338 -0
- package/src/contracts/meta/status.contract.ts +37 -0
- package/src/contracts/shared/jurisdiction.schema.ts +30 -0
- package/src/core.ts +451 -159
- package/src/handlers/consent/index.ts +9 -0
- package/src/handlers/consent/post.handler.ts +273 -0
- package/src/handlers/consent/show-banner.handler.test.ts +148 -0
- package/src/handlers/consent/show-banner.handler.ts +150 -0
- package/src/handlers/consent/verify.handler.ts +305 -0
- package/src/handlers/meta/index.ts +5 -0
- package/src/handlers/meta/status.handler.ts +47 -0
- package/src/init.ts +8 -5
- package/src/pkgs/api-router/hooks/__tests__/processor.test.ts +6 -0
- package/src/pkgs/api-router/hooks/processor.ts +2 -0
- package/src/pkgs/api-router/types/router-props.ts +1 -1
- package/src/pkgs/api-router/utils/cors.ts +1 -1
- package/src/pkgs/data-model/fields/field-types.ts +1 -1
- package/src/pkgs/data-model/fields/id-generator.ts +1 -1
- package/src/pkgs/db-adapters/README.md +3 -3
- package/src/pkgs/db-adapters/adapter-factory.ts +8 -4
- package/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts +13 -13
- package/src/pkgs/db-adapters/adapters/kysely-adapter/dialect.ts +1 -1
- package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/postgres.test.ts +1 -1
- package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/sqlite.test.ts +1 -1
- package/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts +2 -2
- package/src/pkgs/migrations/get-migration.ts +3 -3
- package/src/pkgs/migrations/get-schema/get-schema.ts +2 -2
- package/src/pkgs/migrations/get-schema/index.ts +1 -1
- package/src/pkgs/migrations/migration-builders.ts +2 -2
- package/src/pkgs/migrations/migration-execution.ts +2 -2
- package/src/pkgs/migrations/schema-comparison.ts +5 -4
- package/src/pkgs/results/__tests__/error-class.test.ts +8 -7
- package/src/pkgs/results/core/error-class.ts +31 -43
- package/src/pkgs/results/index.ts +0 -10
- package/src/pkgs/results/orpc-error-handler.ts +137 -0
- package/src/pkgs/results/types.ts +8 -7
- package/src/pkgs/types/context.ts +18 -4
- package/src/pkgs/types/endpoints.ts +3 -5
- package/src/pkgs/types/options.ts +2 -3
- package/src/pkgs/types/plugins.ts +2 -3
- package/src/pkgs/utils/index.ts +1 -0
- package/src/pkgs/utils/logger.ts +38 -0
- package/src/router.ts +8 -0
- package/src/schema/audit-log/table.ts +1 -1
- package/src/schema/consent/table.ts +1 -1
- package/src/schema/consent-policy/table.ts +1 -1
- package/src/schema/consent-purpose/table.ts +1 -1
- package/src/schema/consent-record/table.ts +1 -1
- package/src/schema/definition.ts +2 -2
- package/src/schema/domain/table.ts +1 -1
- package/src/schema/subject/table.ts +1 -1
- package/src/server.ts +130 -0
- package/src/testing/contract-testing.ts +437 -0
- package/src/types/context.ts +1 -1
- package/src/types/index.ts +2 -2
- package/src/types/options.ts +38 -2
- package/src/types/plugins.ts +3 -4
- package/dist/index.cjs +0 -3701
- package/dist/index.d.ts +0 -11
- package/dist/index.d.ts.map +0 -1
- package/dist/init.test.d.ts +0 -2
- package/dist/init.test.d.ts.map +0 -1
- package/dist/integrations/cloudflare.cjs +0 -312
- package/dist/integrations/cloudflare.d.ts +0 -32
- package/dist/integrations/cloudflare.d.ts.map +0 -1
- package/dist/integrations/cloudflare.js +0 -278
- package/dist/integrations/next.cjs +0 -276
- package/dist/integrations/next.d.ts +0 -68
- package/dist/integrations/next.d.ts.map +0 -1
- package/dist/integrations/next.js +0 -239
- package/dist/integrations/node.cjs +0 -257
- package/dist/integrations/node.d.ts +0 -29
- package/dist/integrations/node.d.ts.map +0 -1
- package/dist/integrations/node.js +0 -223
- package/dist/pkgs/api-router/index.d.ts +0 -9
- package/dist/pkgs/api-router/index.d.ts.map +0 -1
- package/dist/pkgs/api-router/utils/define-route.d.ts +0 -87
- package/dist/pkgs/api-router/utils/define-route.d.ts.map +0 -1
- package/dist/pkgs/logger/__tests__/console-formatter.test.d.ts +0 -2
- package/dist/pkgs/logger/__tests__/console-formatter.test.d.ts.map +0 -1
- package/dist/pkgs/logger/__tests__/integration.test.d.ts +0 -2
- package/dist/pkgs/logger/__tests__/integration.test.d.ts.map +0 -1
- package/dist/pkgs/logger/__tests__/log-levels.test.d.ts +0 -2
- package/dist/pkgs/logger/__tests__/log-levels.test.d.ts.map +0 -1
- package/dist/pkgs/logger/__tests__/logger-factory.test.d.ts +0 -2
- package/dist/pkgs/logger/__tests__/logger-factory.test.d.ts.map +0 -1
- package/dist/pkgs/logger/__tests__/result-logging.test.d.ts +0 -2
- package/dist/pkgs/logger/__tests__/result-logging.test.d.ts.map +0 -1
- package/dist/pkgs/logger/__tests__/types.test.d.ts +0 -2
- package/dist/pkgs/logger/__tests__/types.test.d.ts.map +0 -1
- package/dist/pkgs/logger/console-formatter.d.ts +0 -56
- package/dist/pkgs/logger/console-formatter.d.ts.map +0 -1
- package/dist/pkgs/logger/index.cjs +0 -240
- package/dist/pkgs/logger/index.d.ts +0 -35
- package/dist/pkgs/logger/index.d.ts.map +0 -1
- package/dist/pkgs/logger/index.js +0 -185
- package/dist/pkgs/logger/log-levels.d.ts +0 -29
- package/dist/pkgs/logger/log-levels.d.ts.map +0 -1
- package/dist/pkgs/logger/logger-factory.d.ts +0 -42
- package/dist/pkgs/logger/logger-factory.d.ts.map +0 -1
- package/dist/pkgs/logger/result-logging.d.ts +0 -71
- package/dist/pkgs/logger/result-logging.d.ts.map +0 -1
- package/dist/pkgs/logger/telemetry.d.ts +0 -14
- package/dist/pkgs/logger/telemetry.d.ts.map +0 -1
- package/dist/pkgs/logger/types.d.ts +0 -121
- package/dist/pkgs/logger/types.d.ts.map +0 -1
- package/dist/pkgs/results/__tests__/retrieval-pipeline.test.d.ts +0 -2
- package/dist/pkgs/results/__tests__/retrieval-pipeline.test.d.ts.map +0 -1
- package/dist/pkgs/results/__tests__/validation-pipeline.test.d.ts +0 -2
- package/dist/pkgs/results/__tests__/validation-pipeline.test.d.ts.map +0 -1
- package/dist/pkgs/results/h3-integration.d.ts +0 -52
- package/dist/pkgs/results/h3-integration.d.ts.map +0 -1
- package/dist/pkgs/results/pipeline/retrieval-pipeline.d.ts +0 -101
- package/dist/pkgs/results/pipeline/retrieval-pipeline.d.ts.map +0 -1
- package/dist/pkgs/results/pipeline/validation-pipeline.d.ts +0 -89
- package/dist/pkgs/results/pipeline/validation-pipeline.d.ts.map +0 -1
- package/dist/response-types.d.ts +0 -19
- package/dist/response-types.d.ts.map +0 -1
- package/dist/routes/__test__/index.test.d.ts +0 -17
- package/dist/routes/__test__/index.test.d.ts.map +0 -1
- package/dist/routes/__test__/set-consent.test.d.ts +0 -2
- package/dist/routes/__test__/set-consent.test.d.ts.map +0 -1
- package/dist/routes/__test__/show-consent-banner.test.d.ts +0 -2
- package/dist/routes/__test__/show-consent-banner.test.d.ts.map +0 -1
- package/dist/routes/__test__/status.test.d.ts +0 -2
- package/dist/routes/__test__/status.test.d.ts.map +0 -1
- package/dist/routes/__test__/verify-consent.test.d.ts +0 -2
- package/dist/routes/__test__/verify-consent.test.d.ts.map +0 -1
- package/dist/routes/index.d.ts +0 -3
- package/dist/routes/index.d.ts.map +0 -1
- package/dist/routes/set-consent.d.ts +0 -89
- package/dist/routes/set-consent.d.ts.map +0 -1
- package/dist/routes/show-consent-banner.d.ts +0 -15
- package/dist/routes/show-consent-banner.d.ts.map +0 -1
- package/dist/routes/status.d.ts +0 -44
- package/dist/routes/status.d.ts.map +0 -1
- package/dist/routes/types.d.ts +0 -7
- package/dist/routes/types.d.ts.map +0 -1
- package/dist/routes/verify-consent.d.ts +0 -38
- package/dist/routes/verify-consent.d.ts.map +0 -1
- package/src/docs/ADVANCED_JSON_HANDLING.md +0 -99
- package/src/docs/neverthrow.md +0 -171
- package/src/index.ts +0 -34
- package/src/init.test.ts +0 -219
- package/src/integrations/cloudflare.ts +0 -269
- package/src/integrations/next.ts +0 -204
- package/src/integrations/node.ts +0 -141
- package/src/pkgs/api-router/index.ts +0 -148
- package/src/pkgs/api-router/types/h3.d.ts +0 -42
- package/src/pkgs/api-router/utils/define-route.ts +0 -410
- package/src/pkgs/logger/README.md +0 -213
- package/src/pkgs/logger/__tests__/console-formatter.test.ts +0 -67
- package/src/pkgs/logger/__tests__/integration.test.ts +0 -184
- package/src/pkgs/logger/__tests__/log-levels.test.ts +0 -77
- package/src/pkgs/logger/__tests__/logger-factory.test.ts +0 -156
- package/src/pkgs/logger/__tests__/result-logging.test.ts +0 -209
- package/src/pkgs/logger/__tests__/types.test.ts +0 -94
- package/src/pkgs/logger/console-formatter.ts +0 -75
- package/src/pkgs/logger/doc.md +0 -569
- package/src/pkgs/logger/index.ts +0 -59
- package/src/pkgs/logger/log-levels.ts +0 -46
- package/src/pkgs/logger/logger-factory.ts +0 -121
- package/src/pkgs/logger/result-logging.ts +0 -134
- package/src/pkgs/logger/telemetry.ts +0 -96
- package/src/pkgs/logger/types.ts +0 -138
- package/src/pkgs/results/__tests__/retrieval-pipeline.test.ts +0 -157
- package/src/pkgs/results/__tests__/validation-pipeline.test.ts +0 -151
- package/src/pkgs/results/h3-integration.ts +0 -142
- package/src/pkgs/results/pipeline/retrieval-pipeline.ts +0 -188
- package/src/pkgs/results/pipeline/validation-pipeline.ts +0 -164
- package/src/plugins/.keep +0 -0
- package/src/response-types.ts +0 -29
- package/src/routes/__test__/index.test.ts +0 -112
- package/src/routes/__test__/set-consent.test.ts +0 -242
- package/src/routes/__test__/show-consent-banner.test.ts +0 -98
- package/src/routes/__test__/status.test.ts +0 -64
- package/src/routes/__test__/verify-consent.test.ts +0 -266
- package/src/routes/index.ts +0 -12
- package/src/routes/set-consent.ts +0 -249
- package/src/routes/show-consent-banner.ts +0 -131
- package/src/routes/status.ts +0 -61
- package/src/routes/types.ts +0 -7
- package/src/routes/verify-consent.ts +0 -206
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
createApp,
|
|
3
|
-
createRouter,
|
|
4
|
-
eventHandler,
|
|
5
|
-
handleCors,
|
|
6
|
-
sendStream,
|
|
7
|
-
toWebHandler,
|
|
8
|
-
} from 'h3';
|
|
9
|
-
import { routes } from '~/routes';
|
|
10
|
-
import { withRequestSpan } from './telemetry';
|
|
11
|
-
import type { RouterProps } from './types/router-props';
|
|
12
|
-
import { isOriginTrusted } from './utils/cors';
|
|
13
|
-
|
|
14
|
-
import type { Readable } from 'node:stream';
|
|
15
|
-
import { getIp } from './utils/ip';
|
|
16
|
-
|
|
17
|
-
import { createH3ErrorHandler, withH3ErrorHandling } from '../results';
|
|
18
|
-
export { defineRoute } from './utils/define-route';
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Creates an API handler with proper context and CORS handling
|
|
22
|
-
*/
|
|
23
|
-
export function createApiHandler({ options, context }: RouterProps) {
|
|
24
|
-
// Use the logger from context instead of creating a new one
|
|
25
|
-
const { logger } = context;
|
|
26
|
-
logger.info('Creating API Handler');
|
|
27
|
-
|
|
28
|
-
// Create an app instance
|
|
29
|
-
const app = createApp({
|
|
30
|
-
onRequest(event) {
|
|
31
|
-
// Set up event context with required properties
|
|
32
|
-
event.context.ipAddress = getIp(event.headers, options);
|
|
33
|
-
event.context.userAgent = event.node.req.headers['user-agent'] || null;
|
|
34
|
-
event.context.registry = context.registry;
|
|
35
|
-
event.context.adapter = context.adapter;
|
|
36
|
-
event.context.trustedOrigins = context.trustedOrigins;
|
|
37
|
-
event.context.logger = logger; // Make the logger available in the event context
|
|
38
|
-
logger.debug(`Request received: ${event.method} ${event.path}`);
|
|
39
|
-
},
|
|
40
|
-
onError(error, event) {
|
|
41
|
-
// Use our custom error handler if available
|
|
42
|
-
if (
|
|
43
|
-
event.context._onError &&
|
|
44
|
-
typeof event.context._onError === 'function'
|
|
45
|
-
) {
|
|
46
|
-
return event.context._onError(error);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
// Default error handling as fallback
|
|
50
|
-
logger.error(`Unhandled API error in ${event.method} ${event.path}`, {
|
|
51
|
-
error: error instanceof Error ? error.message : String(error),
|
|
52
|
-
errorType:
|
|
53
|
-
error instanceof Error ? error.constructor.name : typeof error,
|
|
54
|
-
});
|
|
55
|
-
},
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
// Add error handler middleware first
|
|
59
|
-
app.use(createH3ErrorHandler());
|
|
60
|
-
logger.debug('Added error handler middleware');
|
|
61
|
-
|
|
62
|
-
// Create CORS handler using h3's built-in handleCors
|
|
63
|
-
app.use(
|
|
64
|
-
eventHandler((event) => {
|
|
65
|
-
if (
|
|
66
|
-
handleCors(event, {
|
|
67
|
-
origin: (originStr: string) => {
|
|
68
|
-
return isOriginTrusted(
|
|
69
|
-
originStr,
|
|
70
|
-
event.context.trustedOrigins,
|
|
71
|
-
logger
|
|
72
|
-
);
|
|
73
|
-
},
|
|
74
|
-
methods: ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'],
|
|
75
|
-
allowHeaders: ['Content-Type', 'Authorization'],
|
|
76
|
-
credentials: true,
|
|
77
|
-
maxAge: '600',
|
|
78
|
-
})
|
|
79
|
-
) {
|
|
80
|
-
logger.debug('CORS preflight response sent');
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
})
|
|
84
|
-
);
|
|
85
|
-
|
|
86
|
-
// Create a new router and register it with the app
|
|
87
|
-
const router = createRouter();
|
|
88
|
-
app.use(router);
|
|
89
|
-
logger.debug('Router initialized and registered with app');
|
|
90
|
-
|
|
91
|
-
// Initialize routes with tracing
|
|
92
|
-
for (const route of routes) {
|
|
93
|
-
logger.debug(`Registering route: ${route.method} ${route.path}`);
|
|
94
|
-
router[route.method](
|
|
95
|
-
route.path,
|
|
96
|
-
// Wrap with our error handling middleware
|
|
97
|
-
withH3ErrorHandling(
|
|
98
|
-
eventHandler(async (event) => {
|
|
99
|
-
logger.debug(`Handling request: ${route.method} ${route.path}`);
|
|
100
|
-
try {
|
|
101
|
-
// Execute the handler with tracing
|
|
102
|
-
logger.debug(`Executing handler for ${route.path}`);
|
|
103
|
-
const result = await withRequestSpan(
|
|
104
|
-
event.method.toUpperCase(),
|
|
105
|
-
route.path,
|
|
106
|
-
() => route.handler(event),
|
|
107
|
-
options
|
|
108
|
-
);
|
|
109
|
-
|
|
110
|
-
logger.debug(`Handler completed for ${route.path}`);
|
|
111
|
-
|
|
112
|
-
// Set proper content type header based on response type
|
|
113
|
-
if (
|
|
114
|
-
typeof result === 'object' &&
|
|
115
|
-
result !== null &&
|
|
116
|
-
'pipe' in result &&
|
|
117
|
-
typeof result.pipe === 'function'
|
|
118
|
-
) {
|
|
119
|
-
// For streams, use appropriate stream handling
|
|
120
|
-
logger.debug(`Sending stream response for ${route.path}`);
|
|
121
|
-
return sendStream(event, result as Readable);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// For all other responses, use JSON
|
|
125
|
-
event.node.res.setHeader('Content-Type', 'application/json');
|
|
126
|
-
|
|
127
|
-
// Let H3 handle the serialization natively
|
|
128
|
-
// The defineRoute handler already ensures proper object wrapping
|
|
129
|
-
return result;
|
|
130
|
-
} catch (error) {
|
|
131
|
-
logger.error(`Error in route handler for ${route.path}`, {
|
|
132
|
-
error: error instanceof Error ? error.message : String(error),
|
|
133
|
-
errorType:
|
|
134
|
-
error instanceof Error ? error.constructor.name : typeof error,
|
|
135
|
-
});
|
|
136
|
-
throw error; // Let error handler middleware handle it
|
|
137
|
-
}
|
|
138
|
-
})
|
|
139
|
-
)
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
// Convert to web handler
|
|
144
|
-
const handler = toWebHandler(app);
|
|
145
|
-
logger.info('API handler created successfully');
|
|
146
|
-
|
|
147
|
-
return { handler };
|
|
148
|
-
}
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Type declarations for H3 framework extensions
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import type { Adapter } from '~/pkgs/db-adapters/types';
|
|
6
|
-
import type { Logger } from '~/pkgs/logger';
|
|
7
|
-
import type { createRegistry } from '~/schema/create-registry';
|
|
8
|
-
|
|
9
|
-
declare module 'h3' {
|
|
10
|
-
interface H3EventContext {
|
|
11
|
-
/**
|
|
12
|
-
* The IP address of the client making the request
|
|
13
|
-
* Can be null if IP tracking is disabled or IP cannot be determined
|
|
14
|
-
*/
|
|
15
|
-
ipAddress: string | null;
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* The user agent string from the client's browser
|
|
19
|
-
*/
|
|
20
|
-
userAgent: string | null;
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* The registry of database operations
|
|
24
|
-
*/
|
|
25
|
-
registry: ReturnType<typeof createRegistry>;
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* The database adapter
|
|
29
|
-
*/
|
|
30
|
-
adapter: Adapter;
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* The trusted origins for CORS
|
|
34
|
-
*/
|
|
35
|
-
trustedOrigins: string[];
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* The logger
|
|
39
|
-
*/
|
|
40
|
-
logger: Logger;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
@@ -1,410 +0,0 @@
|
|
|
1
|
-
import type { H3Event, H3EventContext, RouterMethod } from 'h3';
|
|
2
|
-
import {
|
|
3
|
-
defineEventHandler,
|
|
4
|
-
getQuery as h3GetQuery,
|
|
5
|
-
getRouterParams as h3GetRouterParams,
|
|
6
|
-
readBody,
|
|
7
|
-
readFormData,
|
|
8
|
-
} from 'h3';
|
|
9
|
-
import type { ZodType, z } from 'zod';
|
|
10
|
-
import { createLogger } from '~/pkgs/logger';
|
|
11
|
-
import {
|
|
12
|
-
DoubleTieError,
|
|
13
|
-
ERROR_CODES,
|
|
14
|
-
validationPipeline,
|
|
15
|
-
} from '~/pkgs/results';
|
|
16
|
-
import type { Route } from '~/routes/types';
|
|
17
|
-
import type {
|
|
18
|
-
Endpoint,
|
|
19
|
-
EndpointHandler,
|
|
20
|
-
EndpointOptions,
|
|
21
|
-
} from '../../types/endpoints';
|
|
22
|
-
|
|
23
|
-
// Define more precise types for validation data
|
|
24
|
-
type ValidatedData<
|
|
25
|
-
TBody extends ZodType | undefined,
|
|
26
|
-
TQuery extends ZodType | undefined,
|
|
27
|
-
TParams extends ZodType | undefined,
|
|
28
|
-
> = {
|
|
29
|
-
body: TBody extends ZodType ? z.infer<TBody> : undefined;
|
|
30
|
-
query: TQuery extends ZodType ? z.infer<TQuery> : undefined;
|
|
31
|
-
params: TParams extends ZodType ? z.infer<TParams> : undefined;
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
type ValidatedContext<
|
|
35
|
-
TBody extends ZodType | undefined,
|
|
36
|
-
TQuery extends ZodType | undefined,
|
|
37
|
-
TParams extends ZodType | undefined,
|
|
38
|
-
> = H3EventContext & {
|
|
39
|
-
validated: ValidatedData<TBody, TQuery, TParams>;
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
type ValidatedEvent<
|
|
43
|
-
TBody extends ZodType | undefined,
|
|
44
|
-
TQuery extends ZodType | undefined,
|
|
45
|
-
TParams extends ZodType | undefined,
|
|
46
|
-
> = Omit<H3Event, 'context'> & {
|
|
47
|
-
context: ValidatedContext<TBody, TQuery, TParams>;
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Defines a type-safe API route with validation and proper error handling
|
|
52
|
-
*
|
|
53
|
-
* This utility function creates a complete API route definition with:
|
|
54
|
-
* - Path and method definition
|
|
55
|
-
* - Request validation (body, query params, path params)
|
|
56
|
-
* - Consistent error handling
|
|
57
|
-
* - Type-safe response handling
|
|
58
|
-
*
|
|
59
|
-
* @param config - Configuration for the route including path, method, validations and handler
|
|
60
|
-
* @returns A Route object that can be used in the router
|
|
61
|
-
*
|
|
62
|
-
* @example
|
|
63
|
-
* ```ts
|
|
64
|
-
* // Define a route with validation and type-safe response
|
|
65
|
-
* export const createUser = defineRoute<UserResponse, UserSchema>({
|
|
66
|
-
* path: '/users',
|
|
67
|
-
* method: 'post',
|
|
68
|
-
* validations: {
|
|
69
|
-
* body: UserSchema,
|
|
70
|
-
* },
|
|
71
|
-
* handler: async (event) => {
|
|
72
|
-
* const { body } = event.context.validated;
|
|
73
|
-
* // Implementation...
|
|
74
|
-
* return { id: newUser.id, name: body.name, email: body.email };
|
|
75
|
-
* }
|
|
76
|
-
* });
|
|
77
|
-
* ```
|
|
78
|
-
*/
|
|
79
|
-
export function defineRoute<
|
|
80
|
-
TResponse,
|
|
81
|
-
TBodySchema extends ZodType = never,
|
|
82
|
-
TQuerySchema extends ZodType = never,
|
|
83
|
-
TParamsSchema extends ZodType = never,
|
|
84
|
-
>(config: {
|
|
85
|
-
path: string;
|
|
86
|
-
method: RouterMethod;
|
|
87
|
-
validations?: {
|
|
88
|
-
body?: TBodySchema;
|
|
89
|
-
query?: TQuerySchema;
|
|
90
|
-
params?: TParamsSchema;
|
|
91
|
-
};
|
|
92
|
-
handler: (
|
|
93
|
-
event: ValidatedEvent<
|
|
94
|
-
TBodySchema extends never ? undefined : TBodySchema,
|
|
95
|
-
TQuerySchema extends never ? undefined : TQuerySchema,
|
|
96
|
-
TParamsSchema extends never ? undefined : TParamsSchema
|
|
97
|
-
>
|
|
98
|
-
) => Promise<TResponse>;
|
|
99
|
-
}): Route & { responseType: TResponse };
|
|
100
|
-
|
|
101
|
-
/**
|
|
102
|
-
* Creates a simple endpoint with optional middleware
|
|
103
|
-
*
|
|
104
|
-
* @param path - The path for this endpoint
|
|
105
|
-
* @param handler - Handler function for the endpoint
|
|
106
|
-
* @param options - Optional configuration options
|
|
107
|
-
* @returns An Endpoint object
|
|
108
|
-
*/
|
|
109
|
-
export function defineRoute(
|
|
110
|
-
path: string,
|
|
111
|
-
handler: EndpointHandler,
|
|
112
|
-
options?: EndpointOptions
|
|
113
|
-
): Endpoint;
|
|
114
|
-
|
|
115
|
-
// Implementation
|
|
116
|
-
export function defineRoute<
|
|
117
|
-
TResponse = unknown,
|
|
118
|
-
TBodySchema extends ZodType = never,
|
|
119
|
-
TQuerySchema extends ZodType = never,
|
|
120
|
-
TParamsSchema extends ZodType = never,
|
|
121
|
-
>(
|
|
122
|
-
pathOrConfig:
|
|
123
|
-
| string
|
|
124
|
-
| {
|
|
125
|
-
path: string;
|
|
126
|
-
method: RouterMethod;
|
|
127
|
-
validations?: {
|
|
128
|
-
body?: TBodySchema;
|
|
129
|
-
query?: TQuerySchema;
|
|
130
|
-
params?: TParamsSchema;
|
|
131
|
-
};
|
|
132
|
-
handler: (
|
|
133
|
-
event: ValidatedEvent<
|
|
134
|
-
TBodySchema extends never ? undefined : TBodySchema,
|
|
135
|
-
TQuerySchema extends never ? undefined : TQuerySchema,
|
|
136
|
-
TParamsSchema extends never ? undefined : TParamsSchema
|
|
137
|
-
>
|
|
138
|
-
) => Promise<TResponse>;
|
|
139
|
-
},
|
|
140
|
-
handlerOrUndefined?: EndpointHandler,
|
|
141
|
-
options?: EndpointOptions
|
|
142
|
-
): (Route & { responseType: TResponse }) | Endpoint {
|
|
143
|
-
// Simple endpoint case
|
|
144
|
-
if (typeof pathOrConfig === 'string' && handlerOrUndefined) {
|
|
145
|
-
// Create an endpoint directly with H3 patterns - log will happen in the handler
|
|
146
|
-
return {
|
|
147
|
-
path: pathOrConfig,
|
|
148
|
-
handler: handlerOrUndefined,
|
|
149
|
-
options,
|
|
150
|
-
};
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
// Full route definition case
|
|
154
|
-
const config = pathOrConfig as {
|
|
155
|
-
path: string;
|
|
156
|
-
method: RouterMethod;
|
|
157
|
-
validations?: {
|
|
158
|
-
body?: TBodySchema;
|
|
159
|
-
query?: TQuerySchema;
|
|
160
|
-
params?: TParamsSchema;
|
|
161
|
-
};
|
|
162
|
-
handler: (
|
|
163
|
-
event: ValidatedEvent<
|
|
164
|
-
TBodySchema extends never ? undefined : TBodySchema,
|
|
165
|
-
TQuerySchema extends never ? undefined : TQuerySchema,
|
|
166
|
-
TParamsSchema extends never ? undefined : TParamsSchema
|
|
167
|
-
>
|
|
168
|
-
) => Promise<TResponse>;
|
|
169
|
-
};
|
|
170
|
-
|
|
171
|
-
// We'll log the route definition when the handler is first used
|
|
172
|
-
const handler = defineEventHandler(async (event) => {
|
|
173
|
-
// Get the logger from the event context or create one if needed
|
|
174
|
-
const logger = event.context.logger || createLogger();
|
|
175
|
-
logger.debug(`Handling request for ${config.method} ${config.path}`);
|
|
176
|
-
|
|
177
|
-
// Ensure the logger is always in the context for handlers to use
|
|
178
|
-
if (!event.context.logger) {
|
|
179
|
-
event.context.logger = logger;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
const validated = {
|
|
183
|
-
body: undefined,
|
|
184
|
-
query: undefined,
|
|
185
|
-
params: undefined,
|
|
186
|
-
} as ValidatedData<
|
|
187
|
-
TBodySchema extends never ? undefined : TBodySchema,
|
|
188
|
-
TQuerySchema extends never ? undefined : TQuerySchema,
|
|
189
|
-
TParamsSchema extends never ? undefined : TParamsSchema
|
|
190
|
-
>;
|
|
191
|
-
|
|
192
|
-
try {
|
|
193
|
-
// Validate body if schema provided
|
|
194
|
-
if (config.validations?.body) {
|
|
195
|
-
const contentType = event.headers.get('content-type');
|
|
196
|
-
const body = contentType?.includes('multipart/form-data')
|
|
197
|
-
? Object.fromEntries(await readFormData(event))
|
|
198
|
-
: await readBody(event);
|
|
199
|
-
|
|
200
|
-
logger.debug('Validating request body', { body });
|
|
201
|
-
const validateBody = validationPipeline(
|
|
202
|
-
config.validations.body,
|
|
203
|
-
(data) => data
|
|
204
|
-
);
|
|
205
|
-
const result = await validateBody(body);
|
|
206
|
-
result.match(
|
|
207
|
-
(data) => {
|
|
208
|
-
validated.body = data;
|
|
209
|
-
},
|
|
210
|
-
(error) => {
|
|
211
|
-
logger.error('Validation error (body)', { error });
|
|
212
|
-
throw new DoubleTieError('Body validation failed', {
|
|
213
|
-
code: ERROR_CODES.BAD_REQUEST,
|
|
214
|
-
status: 422,
|
|
215
|
-
cause: error instanceof Error ? error : undefined,
|
|
216
|
-
meta: {
|
|
217
|
-
validationErrors: error,
|
|
218
|
-
requestPath: config.path,
|
|
219
|
-
requestMethod: config.method,
|
|
220
|
-
},
|
|
221
|
-
});
|
|
222
|
-
}
|
|
223
|
-
);
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
// Validate query if schema provided
|
|
227
|
-
if (config.validations?.query) {
|
|
228
|
-
const query = getQuery(event);
|
|
229
|
-
logger.debug('Validating query parameters', { query });
|
|
230
|
-
const validateQuery = validationPipeline(
|
|
231
|
-
config.validations.query,
|
|
232
|
-
(data) => data
|
|
233
|
-
);
|
|
234
|
-
const result = await validateQuery(query);
|
|
235
|
-
result.match(
|
|
236
|
-
(data) => {
|
|
237
|
-
validated.query = data;
|
|
238
|
-
},
|
|
239
|
-
(error) => {
|
|
240
|
-
logger.error('Query validation failed', { error });
|
|
241
|
-
throw new DoubleTieError('Query validation failed', {
|
|
242
|
-
code: ERROR_CODES.BAD_REQUEST,
|
|
243
|
-
status: 422,
|
|
244
|
-
cause: error instanceof Error ? error : undefined,
|
|
245
|
-
meta: {
|
|
246
|
-
validationErrors: error,
|
|
247
|
-
requestPath: config.path,
|
|
248
|
-
requestMethod: config.method,
|
|
249
|
-
},
|
|
250
|
-
});
|
|
251
|
-
}
|
|
252
|
-
);
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// Validate params if schema provided
|
|
256
|
-
if (config.validations?.params) {
|
|
257
|
-
const params = getRouterParams(event);
|
|
258
|
-
logger.debug('Validating route parameters', { params });
|
|
259
|
-
const validateParams = validationPipeline(
|
|
260
|
-
config.validations.params,
|
|
261
|
-
(data) => data
|
|
262
|
-
);
|
|
263
|
-
const result = await validateParams(params);
|
|
264
|
-
result.match(
|
|
265
|
-
(data) => {
|
|
266
|
-
validated.params = data;
|
|
267
|
-
},
|
|
268
|
-
(error) => {
|
|
269
|
-
logger.error('Path parameters validation failed', { error });
|
|
270
|
-
throw new DoubleTieError('Path parameters validation failed', {
|
|
271
|
-
code: ERROR_CODES.BAD_REQUEST,
|
|
272
|
-
status: 422,
|
|
273
|
-
cause: error instanceof Error ? error : undefined,
|
|
274
|
-
meta: {
|
|
275
|
-
validationErrors: error,
|
|
276
|
-
requestPath: config.path,
|
|
277
|
-
requestMethod: config.method,
|
|
278
|
-
},
|
|
279
|
-
});
|
|
280
|
-
}
|
|
281
|
-
);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
// Create event with validated context
|
|
285
|
-
const eventWithContext = event as ValidatedEvent<
|
|
286
|
-
TBodySchema extends never ? undefined : TBodySchema,
|
|
287
|
-
TQuerySchema extends never ? undefined : TQuerySchema,
|
|
288
|
-
TParamsSchema extends never ? undefined : TParamsSchema
|
|
289
|
-
>;
|
|
290
|
-
|
|
291
|
-
eventWithContext.context = {
|
|
292
|
-
...event.context,
|
|
293
|
-
validated,
|
|
294
|
-
};
|
|
295
|
-
|
|
296
|
-
// Call the handler and get its response
|
|
297
|
-
logger.debug(`Executing handler for ${config.method} ${config.path}`);
|
|
298
|
-
const response = await config.handler(eventWithContext);
|
|
299
|
-
logger.debug(
|
|
300
|
-
`Handler execution complete for ${config.method} ${config.path}, response type: ${typeof response}`
|
|
301
|
-
);
|
|
302
|
-
|
|
303
|
-
// Handle different response types
|
|
304
|
-
if (response === undefined || response === null) {
|
|
305
|
-
logger.warn(
|
|
306
|
-
`Handler for ${config.method} ${config.path} returned ${response === null ? 'null' : 'undefined'}`
|
|
307
|
-
);
|
|
308
|
-
return {}; // Return empty object instead of null/undefined
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
// For primitive values (which H3 might handle incorrectly)
|
|
312
|
-
if (
|
|
313
|
-
typeof response === 'boolean' ||
|
|
314
|
-
typeof response === 'number' ||
|
|
315
|
-
typeof response === 'string'
|
|
316
|
-
) {
|
|
317
|
-
logger.warn(
|
|
318
|
-
`Handler for ${config.method} ${config.path} returned primitive ${typeof response}, wrapping in object`
|
|
319
|
-
);
|
|
320
|
-
return { value: response }; // Wrap primitives in an object
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
// Return objects as-is (H3 will handle serialization)
|
|
324
|
-
return response;
|
|
325
|
-
} catch (error) {
|
|
326
|
-
// If it's already a DoubleTieError, rethrow it
|
|
327
|
-
if (error instanceof DoubleTieError) {
|
|
328
|
-
throw error;
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
// Otherwise, wrap it in a DoubleTieError
|
|
332
|
-
logger.error('Validation failed', { error });
|
|
333
|
-
|
|
334
|
-
// Extract validation details for better error messages
|
|
335
|
-
let validationErrors: unknown = 'Unknown validation error';
|
|
336
|
-
let statusCode = 422; // Default to validation error status
|
|
337
|
-
|
|
338
|
-
if (error instanceof Error) {
|
|
339
|
-
validationErrors = error.message;
|
|
340
|
-
|
|
341
|
-
// Handle Zod validation errors more comprehensively
|
|
342
|
-
if (
|
|
343
|
-
error.name === 'ZodError' &&
|
|
344
|
-
'format' in error &&
|
|
345
|
-
typeof error.format === 'function'
|
|
346
|
-
) {
|
|
347
|
-
try {
|
|
348
|
-
validationErrors = error.format();
|
|
349
|
-
statusCode = 422; // Zod errors are definitely validation errors
|
|
350
|
-
} catch {
|
|
351
|
-
// If formatting fails, fall back to the error message
|
|
352
|
-
validationErrors = `Validation error: ${error.message}`;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
// Log the validation error details
|
|
358
|
-
logger.error('Validation failed', {
|
|
359
|
-
error,
|
|
360
|
-
validationErrors,
|
|
361
|
-
});
|
|
362
|
-
|
|
363
|
-
throw new DoubleTieError('Validation failed', {
|
|
364
|
-
code: ERROR_CODES.BAD_REQUEST,
|
|
365
|
-
status: statusCode,
|
|
366
|
-
cause: error instanceof Error ? error : undefined,
|
|
367
|
-
meta: {
|
|
368
|
-
validationErrors,
|
|
369
|
-
requestPath: config.path,
|
|
370
|
-
requestMethod: config.method,
|
|
371
|
-
},
|
|
372
|
-
});
|
|
373
|
-
}
|
|
374
|
-
});
|
|
375
|
-
|
|
376
|
-
// Return the route definition
|
|
377
|
-
return {
|
|
378
|
-
path: config.path,
|
|
379
|
-
method: config.method,
|
|
380
|
-
handler,
|
|
381
|
-
responseType: {} as TResponse, // This is just for type information, not used at runtime
|
|
382
|
-
};
|
|
383
|
-
}
|
|
384
|
-
|
|
385
|
-
/**
|
|
386
|
-
* Extracts the response type from a route definition
|
|
387
|
-
*
|
|
388
|
-
* This utility type allows extracting the response type from a route defined
|
|
389
|
-
* with defineRoute for use in client-side code.
|
|
390
|
-
*
|
|
391
|
-
* @example
|
|
392
|
-
* ```ts
|
|
393
|
-
* // Server-side route definition
|
|
394
|
-
* export const getUser = defineRoute<UserResponse>({...});
|
|
395
|
-
*
|
|
396
|
-
* // Client-side type usage
|
|
397
|
-
* type UserResponse = RouteResponseType<typeof getUser>;
|
|
398
|
-
* ```
|
|
399
|
-
*/
|
|
400
|
-
export type RouteResponseType<T extends Route & { responseType: unknown }> =
|
|
401
|
-
T extends Route & { responseType: infer R } ? R : never;
|
|
402
|
-
|
|
403
|
-
// Helper functions for getting parameters in a type-safe way
|
|
404
|
-
function getQuery(event: H3Event): Record<string, unknown> {
|
|
405
|
-
return h3GetQuery(event);
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
function getRouterParams(event: H3Event): Record<string, unknown> {
|
|
409
|
-
return h3GetRouterParams(event) || {};
|
|
410
|
-
}
|