@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
|
@@ -139,7 +139,7 @@ external_zod_namespaceObject.z.discriminatedUnion('type', [
|
|
|
139
139
|
numberArrayFieldSchema
|
|
140
140
|
]);
|
|
141
141
|
require("neverthrow");
|
|
142
|
-
const
|
|
142
|
+
const server_namespaceObject = require("@orpc/server");
|
|
143
143
|
const error_codes_ERROR_CODES = Object.freeze({
|
|
144
144
|
NOT_FOUND: 'Resource not found',
|
|
145
145
|
BAD_REQUEST: 'Bad request',
|
|
@@ -172,10 +172,10 @@ const ERROR_CATEGORIES = Object.freeze({
|
|
|
172
172
|
});
|
|
173
173
|
const api_namespaceObject = require("@opentelemetry/api");
|
|
174
174
|
api_namespaceObject.trace.getTracer('@doubletie/results');
|
|
175
|
-
class error_class_DoubleTieError extends
|
|
176
|
-
code;
|
|
175
|
+
class error_class_DoubleTieError extends server_namespaceObject.ORPCError {
|
|
177
176
|
category;
|
|
178
177
|
meta;
|
|
178
|
+
statusCode;
|
|
179
179
|
constructor(message, options = {
|
|
180
180
|
code: error_codes_ERROR_CODES.UNKNOWN_ERROR,
|
|
181
181
|
status: 500,
|
|
@@ -183,22 +183,18 @@ class error_class_DoubleTieError extends external_h3_namespaceObject.H3Error {
|
|
|
183
183
|
cause: void 0,
|
|
184
184
|
meta: {}
|
|
185
185
|
}){
|
|
186
|
-
super(
|
|
187
|
-
|
|
186
|
+
super(options.code ?? error_codes_ERROR_CODES.UNKNOWN_ERROR, {
|
|
187
|
+
message,
|
|
188
|
+
cause: options.cause,
|
|
189
|
+
data: options.meta ?? {}
|
|
188
190
|
});
|
|
189
|
-
this.name =
|
|
190
|
-
this.code = options.code ?? error_codes_ERROR_CODES.UNKNOWN_ERROR;
|
|
191
|
-
this.statusCode = options.status ?? 500;
|
|
191
|
+
this.name = 'DoubleTieError';
|
|
192
192
|
this.category = options.category ?? ERROR_CATEGORIES.UNEXPECTED;
|
|
193
193
|
this.meta = options.meta ?? {};
|
|
194
|
-
this.
|
|
195
|
-
code: this.code,
|
|
196
|
-
category: this.category,
|
|
197
|
-
meta: this.meta
|
|
198
|
-
};
|
|
194
|
+
this.statusCode = options.status ?? 500;
|
|
199
195
|
tracing_withSpan('create_doubletie_error', async (span)=>{
|
|
200
196
|
span.setAttributes({
|
|
201
|
-
'error.name': this.name,
|
|
197
|
+
'error.name': this.constructor.name,
|
|
202
198
|
'error.message': message,
|
|
203
199
|
'error.code': this.code,
|
|
204
200
|
'error.status': this.statusCode,
|
|
@@ -218,11 +214,11 @@ class error_class_DoubleTieError extends external_h3_namespaceObject.H3Error {
|
|
|
218
214
|
const validationErrorMessage = this.meta?.validationErrors ? String(this.meta.validationErrors) : void 0;
|
|
219
215
|
const stackTrace = this.stack ? this.stack.split('\n').map((line)=>line.trim()).filter((line)=>line && !line.includes('Error: ')) : [];
|
|
220
216
|
return {
|
|
221
|
-
|
|
217
|
+
code: this.code,
|
|
222
218
|
message: validationErrorMessage || this.message,
|
|
223
|
-
|
|
219
|
+
status: this.statusCode,
|
|
220
|
+
defined: true,
|
|
224
221
|
data: {
|
|
225
|
-
code: this.code,
|
|
226
222
|
category: this.category,
|
|
227
223
|
meta: this.meta,
|
|
228
224
|
...'production' === process.env.NODE_ENV ? {} : {
|
|
@@ -273,7 +269,9 @@ class error_class_DoubleTieError extends external_h3_namespaceObject.H3Error {
|
|
|
273
269
|
const ErrorSubclass = class extends error_class_DoubleTieError {
|
|
274
270
|
constructor(message, options){
|
|
275
271
|
super(message, options);
|
|
276
|
-
this
|
|
272
|
+
Object.defineProperty(this, 'name', {
|
|
273
|
+
value: name
|
|
274
|
+
});
|
|
277
275
|
}
|
|
278
276
|
};
|
|
279
277
|
Object.defineProperty(ErrorSubclass, 'name', {
|
|
@@ -290,137 +288,7 @@ class error_class_DoubleTieError extends external_h3_namespaceObject.H3Error {
|
|
|
290
288
|
return formattedMessage;
|
|
291
289
|
}
|
|
292
290
|
}
|
|
293
|
-
const
|
|
294
|
-
reset: '\x1b[0m',
|
|
295
|
-
bright: '\x1b[1m',
|
|
296
|
-
dim: '\x1b[2m',
|
|
297
|
-
underscore: '\x1b[4m',
|
|
298
|
-
blink: '\x1b[5m',
|
|
299
|
-
reverse: '\x1b[7m',
|
|
300
|
-
hidden: '\x1b[8m',
|
|
301
|
-
fg: {
|
|
302
|
-
black: '\x1b[30m',
|
|
303
|
-
red: '\x1b[31m',
|
|
304
|
-
green: '\x1b[32m',
|
|
305
|
-
yellow: '\x1b[33m',
|
|
306
|
-
blue: '\x1b[34m',
|
|
307
|
-
magenta: '\x1b[35m',
|
|
308
|
-
cyan: '\x1b[36m',
|
|
309
|
-
white: '\x1b[37m'
|
|
310
|
-
},
|
|
311
|
-
bg: {
|
|
312
|
-
black: '\x1b[40m',
|
|
313
|
-
red: '\x1b[41m',
|
|
314
|
-
green: '\x1b[42m',
|
|
315
|
-
yellow: '\x1b[43m',
|
|
316
|
-
blue: '\x1b[44m',
|
|
317
|
-
magenta: '\x1b[45m',
|
|
318
|
-
cyan: '\x1b[46m',
|
|
319
|
-
white: '\x1b[47m'
|
|
320
|
-
}
|
|
321
|
-
};
|
|
322
|
-
const levelColors = {
|
|
323
|
-
info: colors.fg.blue,
|
|
324
|
-
success: colors.fg.green,
|
|
325
|
-
warn: colors.fg.yellow,
|
|
326
|
-
error: colors.fg.red,
|
|
327
|
-
debug: colors.fg.magenta
|
|
328
|
-
};
|
|
329
|
-
const formatMessage = (level, message, appName = 'c15t')=>{
|
|
330
|
-
const timestamp = new Date().toISOString();
|
|
331
|
-
return `${colors.dim}${timestamp}${colors.reset} ${levelColors[level]}${level.toUpperCase()}${colors.reset} ${colors.bright}[${appName}]:${colors.reset} ${message}`;
|
|
332
|
-
};
|
|
333
|
-
const levels = [
|
|
334
|
-
'error',
|
|
335
|
-
'warn',
|
|
336
|
-
'info',
|
|
337
|
-
'success',
|
|
338
|
-
'debug'
|
|
339
|
-
];
|
|
340
|
-
function shouldPublishLog(currentLogLevel, logLevel) {
|
|
341
|
-
const currentLevelIndex = levels.indexOf(currentLogLevel);
|
|
342
|
-
const messageLevelIndex = levels.indexOf(logLevel);
|
|
343
|
-
if ('debug' === currentLogLevel) return 'debug' === logLevel;
|
|
344
|
-
return messageLevelIndex <= currentLevelIndex;
|
|
345
|
-
}
|
|
346
|
-
const LOGGER_TRACER_NAME = '@doubletie/logger';
|
|
347
|
-
const LOG_LEVEL_TO_SPAN_STATUS = {
|
|
348
|
-
error: api_namespaceObject.SpanStatusCode.ERROR,
|
|
349
|
-
warn: api_namespaceObject.SpanStatusCode.OK,
|
|
350
|
-
info: api_namespaceObject.SpanStatusCode.OK,
|
|
351
|
-
success: api_namespaceObject.SpanStatusCode.OK,
|
|
352
|
-
debug: api_namespaceObject.SpanStatusCode.OK
|
|
353
|
-
};
|
|
354
|
-
const telemetry_getTracer = (options)=>{
|
|
355
|
-
if (options?.telemetry?.tracer) return options.telemetry.tracer;
|
|
356
|
-
return api_namespaceObject.trace.getTracer(LOGGER_TRACER_NAME);
|
|
357
|
-
};
|
|
358
|
-
const createLogSpan = (level, message, args = [], options)=>{
|
|
359
|
-
if (options?.telemetry?.disabled) return null;
|
|
360
|
-
const tracer = telemetry_getTracer(options);
|
|
361
|
-
const span = tracer.startSpan('log_entry', {
|
|
362
|
-
attributes: {
|
|
363
|
-
'log.level': level,
|
|
364
|
-
'log.message': message,
|
|
365
|
-
'log.has_args': args.length > 0,
|
|
366
|
-
...options?.telemetry?.defaultAttributes || {}
|
|
367
|
-
}
|
|
368
|
-
});
|
|
369
|
-
if (args.length > 0 && 'object' == typeof args[0] && null !== args[0]) {
|
|
370
|
-
const data = args[0];
|
|
371
|
-
for (const [key, value] of Object.entries(data))if (null != value) span.setAttribute(`log.data.${key}`, String(value));
|
|
372
|
-
}
|
|
373
|
-
span.setStatus({
|
|
374
|
-
code: LOG_LEVEL_TO_SPAN_STATUS[level],
|
|
375
|
-
message: 'error' === level || 'warn' === level ? message : void 0
|
|
376
|
-
});
|
|
377
|
-
return span;
|
|
378
|
-
};
|
|
379
|
-
const withLogSpan = async (level, message, args, operation, options)=>{
|
|
380
|
-
const span = createLogSpan(level, message, args, options);
|
|
381
|
-
if (!span) return operation();
|
|
382
|
-
try {
|
|
383
|
-
const result = await operation();
|
|
384
|
-
return result;
|
|
385
|
-
} catch (error) {
|
|
386
|
-
span.setStatus({
|
|
387
|
-
code: api_namespaceObject.SpanStatusCode.ERROR,
|
|
388
|
-
message: error instanceof Error ? error.message : String(error)
|
|
389
|
-
});
|
|
390
|
-
throw error;
|
|
391
|
-
} finally{
|
|
392
|
-
span.end();
|
|
393
|
-
}
|
|
394
|
-
};
|
|
395
|
-
const logger_factory_createLogger = (options)=>{
|
|
396
|
-
if (options && 'object' == typeof options && levels.every((level)=>'function' == typeof options[level])) return options;
|
|
397
|
-
const loggerOptions = options;
|
|
398
|
-
const enabled = loggerOptions?.disabled !== true;
|
|
399
|
-
const logLevel = loggerOptions?.level ?? 'error';
|
|
400
|
-
const appName = loggerOptions?.appName ?? 'c15t';
|
|
401
|
-
const logFunc = async (level, message, args = [])=>{
|
|
402
|
-
if (!enabled || !shouldPublishLog(logLevel, level)) return;
|
|
403
|
-
await withLogSpan(level, message, args, async ()=>{
|
|
404
|
-
const formattedMessage = formatMessage(level, message, appName);
|
|
405
|
-
if (!loggerOptions || 'function' != typeof loggerOptions.log) {
|
|
406
|
-
if ('error' === level) console.error(formattedMessage, ...args);
|
|
407
|
-
else if ('warn' === level) console.warn(formattedMessage, ...args);
|
|
408
|
-
else if ('info' === level) console.log(formattedMessage, ...args);
|
|
409
|
-
else if ('debug' === level) console.debug(formattedMessage, ...args);
|
|
410
|
-
else if ('success' === level) console.log(formattedMessage, ...args);
|
|
411
|
-
return;
|
|
412
|
-
}
|
|
413
|
-
loggerOptions.log('success' === level ? 'info' : level, message, ...args);
|
|
414
|
-
});
|
|
415
|
-
};
|
|
416
|
-
return Object.fromEntries(levels.map((level)=>[
|
|
417
|
-
level,
|
|
418
|
-
(...[message, ...args])=>logFunc(level, message, args).catch((error)=>{
|
|
419
|
-
console.error('Logger error:', error);
|
|
420
|
-
})
|
|
421
|
-
]));
|
|
422
|
-
};
|
|
423
|
-
logger_factory_createLogger();
|
|
291
|
+
const logger_namespaceObject = require("@doubletie/logger");
|
|
424
292
|
const schema_auditLogSchema = external_zod_namespaceObject.z.object({
|
|
425
293
|
id: external_zod_namespaceObject.z.string(),
|
|
426
294
|
entityType: external_zod_namespaceObject.z.string(),
|
|
@@ -1073,6 +941,15 @@ const dialect_createKyselyAdapter = async (config)=>{
|
|
|
1073
941
|
};
|
|
1074
942
|
};
|
|
1075
943
|
require("drizzle-orm");
|
|
944
|
+
let globalLogger;
|
|
945
|
+
function logger_getLogger(options) {
|
|
946
|
+
if (!globalLogger) globalLogger = (0, logger_namespaceObject.createLogger)({
|
|
947
|
+
level: 'info',
|
|
948
|
+
appName: 'c15t',
|
|
949
|
+
...options
|
|
950
|
+
});
|
|
951
|
+
return globalLogger;
|
|
952
|
+
}
|
|
1076
953
|
const postgresMap = {
|
|
1077
954
|
string: [
|
|
1078
955
|
'character varying',
|
|
@@ -1273,7 +1150,7 @@ function buildColumnAddMigrations(db, toBeAdded, dbType) {
|
|
|
1273
1150
|
return migrations;
|
|
1274
1151
|
}
|
|
1275
1152
|
function buildTableCreateMigrations(db, toBeCreated, dbType) {
|
|
1276
|
-
const logger =
|
|
1153
|
+
const logger = logger_getLogger();
|
|
1277
1154
|
const migrations = [];
|
|
1278
1155
|
for (const table of toBeCreated){
|
|
1279
1156
|
const fieldNames = Object.keys(table.fields);
|
|
@@ -1298,7 +1175,7 @@ function buildTableCreateMigrations(db, toBeCreated, dbType) {
|
|
|
1298
1175
|
return migrations;
|
|
1299
1176
|
}
|
|
1300
1177
|
function createMigrationExecutors(migrations) {
|
|
1301
|
-
const logger =
|
|
1178
|
+
const logger = logger_getLogger();
|
|
1302
1179
|
async function runMigrations() {
|
|
1303
1180
|
for (const migration of migrations)try {
|
|
1304
1181
|
await migration.execute();
|
|
@@ -1387,7 +1264,7 @@ function get_schema_getSchema(config) {
|
|
|
1387
1264
|
}
|
|
1388
1265
|
function analyzeSchemaChanges(config, tableMetadata, dbType) {
|
|
1389
1266
|
const betterAuthSchema = get_schema_getSchema(config);
|
|
1390
|
-
const logger =
|
|
1267
|
+
const logger = logger_getLogger(config.logger);
|
|
1391
1268
|
const toBeCreated = [];
|
|
1392
1269
|
const toBeAdded = [];
|
|
1393
1270
|
for (const [key, value] of Object.entries(betterAuthSchema)){
|
|
@@ -1439,7 +1316,7 @@ function handleExistingTable(tableName, value, table, toBeAdded, dbType, logger)
|
|
|
1439
1316
|
});
|
|
1440
1317
|
}
|
|
1441
1318
|
async function getMigrations(config) {
|
|
1442
|
-
const logger =
|
|
1319
|
+
const logger = logger_getLogger(config.logger);
|
|
1443
1320
|
let { kysely: db, databaseType: dbType } = await dialect_createKyselyAdapter(config);
|
|
1444
1321
|
if (!dbType) {
|
|
1445
1322
|
logger.warn('Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this.');
|
|
@@ -2,8 +2,9 @@ import "superjson";
|
|
|
2
2
|
import * as __WEBPACK_EXTERNAL_MODULE_base_x_aeb88370__ from "base-x";
|
|
3
3
|
import * as __WEBPACK_EXTERNAL_MODULE_zod__ from "zod";
|
|
4
4
|
import "neverthrow";
|
|
5
|
-
import * as
|
|
5
|
+
import * as __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__ from "@orpc/server";
|
|
6
6
|
import * as __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__ from "@opentelemetry/api";
|
|
7
|
+
import * as __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__ from "@doubletie/logger";
|
|
7
8
|
import "node:crypto";
|
|
8
9
|
import * as __WEBPACK_EXTERNAL_MODULE_kysely__ from "kysely";
|
|
9
10
|
import "drizzle-orm";
|
|
@@ -130,10 +131,10 @@ const ERROR_CATEGORIES = Object.freeze({
|
|
|
130
131
|
UNEXPECTED: 'unexpected'
|
|
131
132
|
});
|
|
132
133
|
__WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__.trace.getTracer('@doubletie/results');
|
|
133
|
-
class error_class_DoubleTieError extends
|
|
134
|
-
code;
|
|
134
|
+
class error_class_DoubleTieError extends __WEBPACK_EXTERNAL_MODULE__orpc_server_0dae8408__.ORPCError {
|
|
135
135
|
category;
|
|
136
136
|
meta;
|
|
137
|
+
statusCode;
|
|
137
138
|
constructor(message, options = {
|
|
138
139
|
code: error_codes_ERROR_CODES.UNKNOWN_ERROR,
|
|
139
140
|
status: 500,
|
|
@@ -141,22 +142,18 @@ class error_class_DoubleTieError extends __WEBPACK_EXTERNAL_MODULE_h3__.H3Error
|
|
|
141
142
|
cause: void 0,
|
|
142
143
|
meta: {}
|
|
143
144
|
}){
|
|
144
|
-
super(
|
|
145
|
-
|
|
145
|
+
super(options.code ?? error_codes_ERROR_CODES.UNKNOWN_ERROR, {
|
|
146
|
+
message,
|
|
147
|
+
cause: options.cause,
|
|
148
|
+
data: options.meta ?? {}
|
|
146
149
|
});
|
|
147
|
-
this.name =
|
|
148
|
-
this.code = options.code ?? error_codes_ERROR_CODES.UNKNOWN_ERROR;
|
|
149
|
-
this.statusCode = options.status ?? 500;
|
|
150
|
+
this.name = 'DoubleTieError';
|
|
150
151
|
this.category = options.category ?? ERROR_CATEGORIES.UNEXPECTED;
|
|
151
152
|
this.meta = options.meta ?? {};
|
|
152
|
-
this.
|
|
153
|
-
code: this.code,
|
|
154
|
-
category: this.category,
|
|
155
|
-
meta: this.meta
|
|
156
|
-
};
|
|
153
|
+
this.statusCode = options.status ?? 500;
|
|
157
154
|
tracing_withSpan('create_doubletie_error', async (span)=>{
|
|
158
155
|
span.setAttributes({
|
|
159
|
-
'error.name': this.name,
|
|
156
|
+
'error.name': this.constructor.name,
|
|
160
157
|
'error.message': message,
|
|
161
158
|
'error.code': this.code,
|
|
162
159
|
'error.status': this.statusCode,
|
|
@@ -176,11 +173,11 @@ class error_class_DoubleTieError extends __WEBPACK_EXTERNAL_MODULE_h3__.H3Error
|
|
|
176
173
|
const validationErrorMessage = this.meta?.validationErrors ? String(this.meta.validationErrors) : void 0;
|
|
177
174
|
const stackTrace = this.stack ? this.stack.split('\n').map((line)=>line.trim()).filter((line)=>line && !line.includes('Error: ')) : [];
|
|
178
175
|
return {
|
|
179
|
-
|
|
176
|
+
code: this.code,
|
|
180
177
|
message: validationErrorMessage || this.message,
|
|
181
|
-
|
|
178
|
+
status: this.statusCode,
|
|
179
|
+
defined: true,
|
|
182
180
|
data: {
|
|
183
|
-
code: this.code,
|
|
184
181
|
category: this.category,
|
|
185
182
|
meta: this.meta,
|
|
186
183
|
...'production' === process.env.NODE_ENV ? {} : {
|
|
@@ -231,7 +228,9 @@ class error_class_DoubleTieError extends __WEBPACK_EXTERNAL_MODULE_h3__.H3Error
|
|
|
231
228
|
const ErrorSubclass = class extends error_class_DoubleTieError {
|
|
232
229
|
constructor(message, options){
|
|
233
230
|
super(message, options);
|
|
234
|
-
this
|
|
231
|
+
Object.defineProperty(this, 'name', {
|
|
232
|
+
value: name
|
|
233
|
+
});
|
|
235
234
|
}
|
|
236
235
|
};
|
|
237
236
|
Object.defineProperty(ErrorSubclass, 'name', {
|
|
@@ -248,137 +247,6 @@ class error_class_DoubleTieError extends __WEBPACK_EXTERNAL_MODULE_h3__.H3Error
|
|
|
248
247
|
return formattedMessage;
|
|
249
248
|
}
|
|
250
249
|
}
|
|
251
|
-
const levels = [
|
|
252
|
-
'error',
|
|
253
|
-
'warn',
|
|
254
|
-
'info',
|
|
255
|
-
'success',
|
|
256
|
-
'debug'
|
|
257
|
-
];
|
|
258
|
-
function shouldPublishLog(currentLogLevel, logLevel) {
|
|
259
|
-
const currentLevelIndex = levels.indexOf(currentLogLevel);
|
|
260
|
-
const messageLevelIndex = levels.indexOf(logLevel);
|
|
261
|
-
if ('debug' === currentLogLevel) return 'debug' === logLevel;
|
|
262
|
-
return messageLevelIndex <= currentLevelIndex;
|
|
263
|
-
}
|
|
264
|
-
const colors = {
|
|
265
|
-
reset: '\x1b[0m',
|
|
266
|
-
bright: '\x1b[1m',
|
|
267
|
-
dim: '\x1b[2m',
|
|
268
|
-
underscore: '\x1b[4m',
|
|
269
|
-
blink: '\x1b[5m',
|
|
270
|
-
reverse: '\x1b[7m',
|
|
271
|
-
hidden: '\x1b[8m',
|
|
272
|
-
fg: {
|
|
273
|
-
black: '\x1b[30m',
|
|
274
|
-
red: '\x1b[31m',
|
|
275
|
-
green: '\x1b[32m',
|
|
276
|
-
yellow: '\x1b[33m',
|
|
277
|
-
blue: '\x1b[34m',
|
|
278
|
-
magenta: '\x1b[35m',
|
|
279
|
-
cyan: '\x1b[36m',
|
|
280
|
-
white: '\x1b[37m'
|
|
281
|
-
},
|
|
282
|
-
bg: {
|
|
283
|
-
black: '\x1b[40m',
|
|
284
|
-
red: '\x1b[41m',
|
|
285
|
-
green: '\x1b[42m',
|
|
286
|
-
yellow: '\x1b[43m',
|
|
287
|
-
blue: '\x1b[44m',
|
|
288
|
-
magenta: '\x1b[45m',
|
|
289
|
-
cyan: '\x1b[46m',
|
|
290
|
-
white: '\x1b[47m'
|
|
291
|
-
}
|
|
292
|
-
};
|
|
293
|
-
const levelColors = {
|
|
294
|
-
info: colors.fg.blue,
|
|
295
|
-
success: colors.fg.green,
|
|
296
|
-
warn: colors.fg.yellow,
|
|
297
|
-
error: colors.fg.red,
|
|
298
|
-
debug: colors.fg.magenta
|
|
299
|
-
};
|
|
300
|
-
const formatMessage = (level, message, appName = 'c15t')=>{
|
|
301
|
-
const timestamp = new Date().toISOString();
|
|
302
|
-
return `${colors.dim}${timestamp}${colors.reset} ${levelColors[level]}${level.toUpperCase()}${colors.reset} ${colors.bright}[${appName}]:${colors.reset} ${message}`;
|
|
303
|
-
};
|
|
304
|
-
const LOGGER_TRACER_NAME = '@doubletie/logger';
|
|
305
|
-
const LOG_LEVEL_TO_SPAN_STATUS = {
|
|
306
|
-
error: __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__.SpanStatusCode.ERROR,
|
|
307
|
-
warn: __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__.SpanStatusCode.OK,
|
|
308
|
-
info: __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__.SpanStatusCode.OK,
|
|
309
|
-
success: __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__.SpanStatusCode.OK,
|
|
310
|
-
debug: __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__.SpanStatusCode.OK
|
|
311
|
-
};
|
|
312
|
-
const telemetry_getTracer = (options)=>{
|
|
313
|
-
if (options?.telemetry?.tracer) return options.telemetry.tracer;
|
|
314
|
-
return __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__.trace.getTracer(LOGGER_TRACER_NAME);
|
|
315
|
-
};
|
|
316
|
-
const createLogSpan = (level, message, args = [], options)=>{
|
|
317
|
-
if (options?.telemetry?.disabled) return null;
|
|
318
|
-
const tracer = telemetry_getTracer(options);
|
|
319
|
-
const span = tracer.startSpan('log_entry', {
|
|
320
|
-
attributes: {
|
|
321
|
-
'log.level': level,
|
|
322
|
-
'log.message': message,
|
|
323
|
-
'log.has_args': args.length > 0,
|
|
324
|
-
...options?.telemetry?.defaultAttributes || {}
|
|
325
|
-
}
|
|
326
|
-
});
|
|
327
|
-
if (args.length > 0 && 'object' == typeof args[0] && null !== args[0]) {
|
|
328
|
-
const data = args[0];
|
|
329
|
-
for (const [key, value] of Object.entries(data))if (null != value) span.setAttribute(`log.data.${key}`, String(value));
|
|
330
|
-
}
|
|
331
|
-
span.setStatus({
|
|
332
|
-
code: LOG_LEVEL_TO_SPAN_STATUS[level],
|
|
333
|
-
message: 'error' === level || 'warn' === level ? message : void 0
|
|
334
|
-
});
|
|
335
|
-
return span;
|
|
336
|
-
};
|
|
337
|
-
const withLogSpan = async (level, message, args, operation, options)=>{
|
|
338
|
-
const span = createLogSpan(level, message, args, options);
|
|
339
|
-
if (!span) return operation();
|
|
340
|
-
try {
|
|
341
|
-
const result = await operation();
|
|
342
|
-
return result;
|
|
343
|
-
} catch (error) {
|
|
344
|
-
span.setStatus({
|
|
345
|
-
code: __WEBPACK_EXTERNAL_MODULE__opentelemetry_api_87359e78__.SpanStatusCode.ERROR,
|
|
346
|
-
message: error instanceof Error ? error.message : String(error)
|
|
347
|
-
});
|
|
348
|
-
throw error;
|
|
349
|
-
} finally{
|
|
350
|
-
span.end();
|
|
351
|
-
}
|
|
352
|
-
};
|
|
353
|
-
const logger_factory_createLogger = (options)=>{
|
|
354
|
-
if (options && 'object' == typeof options && levels.every((level)=>'function' == typeof options[level])) return options;
|
|
355
|
-
const loggerOptions = options;
|
|
356
|
-
const enabled = loggerOptions?.disabled !== true;
|
|
357
|
-
const logLevel = loggerOptions?.level ?? 'error';
|
|
358
|
-
const appName = loggerOptions?.appName ?? 'c15t';
|
|
359
|
-
const logFunc = async (level, message, args = [])=>{
|
|
360
|
-
if (!enabled || !shouldPublishLog(logLevel, level)) return;
|
|
361
|
-
await withLogSpan(level, message, args, async ()=>{
|
|
362
|
-
const formattedMessage = formatMessage(level, message, appName);
|
|
363
|
-
if (!loggerOptions || 'function' != typeof loggerOptions.log) {
|
|
364
|
-
if ('error' === level) console.error(formattedMessage, ...args);
|
|
365
|
-
else if ('warn' === level) console.warn(formattedMessage, ...args);
|
|
366
|
-
else if ('info' === level) console.log(formattedMessage, ...args);
|
|
367
|
-
else if ('debug' === level) console.debug(formattedMessage, ...args);
|
|
368
|
-
else if ('success' === level) console.log(formattedMessage, ...args);
|
|
369
|
-
return;
|
|
370
|
-
}
|
|
371
|
-
loggerOptions.log('success' === level ? 'info' : level, message, ...args);
|
|
372
|
-
});
|
|
373
|
-
};
|
|
374
|
-
return Object.fromEntries(levels.map((level)=>[
|
|
375
|
-
level,
|
|
376
|
-
(...[message, ...args])=>logFunc(level, message, args).catch((error)=>{
|
|
377
|
-
console.error('Logger error:', error);
|
|
378
|
-
})
|
|
379
|
-
]));
|
|
380
|
-
};
|
|
381
|
-
logger_factory_createLogger();
|
|
382
250
|
const schema_auditLogSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
|
|
383
251
|
id: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
384
252
|
entityType: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
|
|
@@ -1028,6 +896,15 @@ const dialect_createKyselyAdapter = async (config)=>{
|
|
|
1028
896
|
databaseType
|
|
1029
897
|
};
|
|
1030
898
|
};
|
|
899
|
+
let globalLogger;
|
|
900
|
+
function logger_getLogger(options) {
|
|
901
|
+
if (!globalLogger) globalLogger = (0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)({
|
|
902
|
+
level: 'info',
|
|
903
|
+
appName: 'c15t',
|
|
904
|
+
...options
|
|
905
|
+
});
|
|
906
|
+
return globalLogger;
|
|
907
|
+
}
|
|
1031
908
|
const postgresMap = {
|
|
1032
909
|
string: [
|
|
1033
910
|
'character varying',
|
|
@@ -1228,7 +1105,7 @@ function buildColumnAddMigrations(db, toBeAdded, dbType) {
|
|
|
1228
1105
|
return migrations;
|
|
1229
1106
|
}
|
|
1230
1107
|
function buildTableCreateMigrations(db, toBeCreated, dbType) {
|
|
1231
|
-
const logger =
|
|
1108
|
+
const logger = logger_getLogger();
|
|
1232
1109
|
const migrations = [];
|
|
1233
1110
|
for (const table of toBeCreated){
|
|
1234
1111
|
const fieldNames = Object.keys(table.fields);
|
|
@@ -1253,7 +1130,7 @@ function buildTableCreateMigrations(db, toBeCreated, dbType) {
|
|
|
1253
1130
|
return migrations;
|
|
1254
1131
|
}
|
|
1255
1132
|
function createMigrationExecutors(migrations) {
|
|
1256
|
-
const logger =
|
|
1133
|
+
const logger = logger_getLogger();
|
|
1257
1134
|
async function runMigrations() {
|
|
1258
1135
|
for (const migration of migrations)try {
|
|
1259
1136
|
await migration.execute();
|
|
@@ -1342,7 +1219,7 @@ function get_schema_getSchema(config) {
|
|
|
1342
1219
|
}
|
|
1343
1220
|
function analyzeSchemaChanges(config, tableMetadata, dbType) {
|
|
1344
1221
|
const betterAuthSchema = get_schema_getSchema(config);
|
|
1345
|
-
const logger =
|
|
1222
|
+
const logger = logger_getLogger(config.logger);
|
|
1346
1223
|
const toBeCreated = [];
|
|
1347
1224
|
const toBeAdded = [];
|
|
1348
1225
|
for (const [key, value] of Object.entries(betterAuthSchema)){
|
|
@@ -1394,7 +1271,7 @@ function handleExistingTable(tableName, value, table, toBeAdded, dbType, logger)
|
|
|
1394
1271
|
});
|
|
1395
1272
|
}
|
|
1396
1273
|
async function getMigrations(config) {
|
|
1397
|
-
const logger =
|
|
1274
|
+
const logger = logger_getLogger(config.logger);
|
|
1398
1275
|
let { kysely: db, databaseType: dbType } = await dialect_createKyselyAdapter(config);
|
|
1399
1276
|
if (!dbType) {
|
|
1400
1277
|
logger.warn('Could not determine database type, defaulting to sqlite. Please provide a type in the database options to avoid this.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-comparison.d.ts","sourceRoot":"","sources":["../../../src/pkgs/migrations/schema-comparison.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema-comparison.d.ts","sourceRoot":"","sources":["../../../src/pkgs/migrations/schema-comparison.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAE5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kDAAkD,CAAC;AAE3F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAI3C,OAAO,KAAK,EACX,YAAY,EAEZ,aAAa,EACb,MAAM,SAAS,CAAC;AAEjB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,oBAAoB,CACnC,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,aAAa,EAAE,EAC9B,MAAM,EAAE,kBAAkB,GACxB;IAAE,WAAW,EAAE,aAAa,EAAE,CAAC;IAAC,SAAS,EAAE,YAAY,EAAE,CAAA;CAAE,CAwB7D"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import type { DoubleTieErrorOptions
|
|
1
|
+
import { ORPCError } from '@orpc/server';
|
|
2
|
+
import type { DoubleTieErrorOptions } from '../types';
|
|
3
3
|
/**
|
|
4
|
-
* Custom error class for DoubleTie errors that extends
|
|
4
|
+
* Custom error class for DoubleTie errors that extends ORPCError.
|
|
5
5
|
*
|
|
6
|
-
* This class directly extends
|
|
6
|
+
* This class directly extends ORPCError to provide seamless integration with oRPC
|
|
7
7
|
* while adding application-specific error properties and context.
|
|
8
8
|
*
|
|
9
9
|
* @remarks
|
|
@@ -29,17 +29,7 @@ import type { DoubleTieErrorOptions, ErrorMessageType } from '../types';
|
|
|
29
29
|
* }
|
|
30
30
|
* ```
|
|
31
31
|
*/
|
|
32
|
-
export declare class DoubleTieError extends
|
|
33
|
-
code: ErrorMessageType;
|
|
34
|
-
category?: string;
|
|
35
|
-
meta?: Record<string, unknown>;
|
|
36
|
-
originalMessage?: string;
|
|
37
|
-
}> {
|
|
38
|
-
/**
|
|
39
|
-
* Error code as defined in ERROR_CODES or custom error codes.
|
|
40
|
-
* Used to uniquely identify the error type.
|
|
41
|
-
*/
|
|
42
|
-
readonly code: ErrorMessageType;
|
|
32
|
+
export declare class DoubleTieError extends ORPCError<string, Record<string, unknown>> {
|
|
43
33
|
/**
|
|
44
34
|
* Error category that groups related errors.
|
|
45
35
|
* Defaults to 'unexpected' if not specified.
|
|
@@ -52,6 +42,10 @@ export declare class DoubleTieError extends H3Error<{
|
|
|
52
42
|
* Can contain any contextual information that might help debugging.
|
|
53
43
|
*/
|
|
54
44
|
readonly meta: Record<string, unknown>;
|
|
45
|
+
/**
|
|
46
|
+
* HTTP status code for the error
|
|
47
|
+
*/
|
|
48
|
+
readonly statusCode: number;
|
|
55
49
|
/**
|
|
56
50
|
* Creates a new DoubleTieError instance.
|
|
57
51
|
*
|
|
@@ -82,14 +76,22 @@ export declare class DoubleTieError extends H3Error<{
|
|
|
82
76
|
*/
|
|
83
77
|
static isDoubleTieError(error: unknown): error is DoubleTieError;
|
|
84
78
|
/**
|
|
85
|
-
* Convert the error to a JSON-serializable object.
|
|
79
|
+
* Convert the error to a JSON-serializable object matching oRPC's error format.
|
|
80
|
+
* Override of the parent ORPCError toJSON method.
|
|
86
81
|
*/
|
|
87
|
-
toJSON():
|
|
82
|
+
toJSON(): {
|
|
88
83
|
code: string;
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
84
|
+
message: string;
|
|
85
|
+
status: number;
|
|
86
|
+
defined: boolean;
|
|
87
|
+
data: {
|
|
88
|
+
cause?: {} | undefined;
|
|
89
|
+
originalMessage?: string | undefined;
|
|
90
|
+
stack?: string[] | undefined;
|
|
91
|
+
category: string;
|
|
92
|
+
meta: Record<string, unknown>;
|
|
93
|
+
};
|
|
94
|
+
};
|
|
93
95
|
/**
|
|
94
96
|
* Creates a DoubleTieError from an HTTP response object.
|
|
95
97
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-class.d.ts","sourceRoot":"","sources":["../../../../src/pkgs/results/core/error-class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"error-class.d.ts","sourceRoot":"","sources":["../../../../src/pkgs/results/core/error-class.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,qBAAqB,EAAoB,MAAM,UAAU,CAAC;AAIxE;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,qBAAa,cAAe,SAAQ,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7E;;;;;OAKG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B;;;OAGG;IACH,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEvC;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAE5B;;;;;;;;;;;;;;;;;;;;OAoBG;gBAEF,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,qBAMR;IA4CF;;;;;OAKG;IACH,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc;IAIhE;;;OAGG;IACH,MAAM;;;;;;;;;;;;;IAmDN;;;;;;OAMG;IACH,MAAM,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,cAAc;IA+BvE;;;;;;OAMG;IACH,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,cAAc;IAUjE;;;;;;OAMG;IACH,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,cAAc;IAY1D;;;;;;OAMG;IACH,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM;CAuB3D"}
|