@c15t/backend 0.0.1-rc.10
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 +11 -0
- package/.turbo/turbo-check-types.log +5 -0
- package/.turbo/turbo-fmt.log +7 -0
- package/.turbo/turbo-lint.log +6 -0
- package/.turbo/turbo-test.log +26 -0
- package/README-next.md +223 -0
- package/README.md +164 -0
- package/dist/api/call.d.ts +176 -0
- package/dist/api/call.d.ts.map +1 -0
- package/dist/api/index.d.ts +935 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/middlewares/index.d.ts +39 -0
- package/dist/api/middlewares/index.d.ts.map +1 -0
- package/dist/api/middlewares/origin-check.d.ts +82 -0
- package/dist/api/middlewares/origin-check.d.ts.map +1 -0
- package/dist/api/middlewares/validate-context.d.ts +38 -0
- package/dist/api/middlewares/validate-context.d.ts.map +1 -0
- package/dist/api/routes/__tests__/consent.test.d.ts +2 -0
- package/dist/api/routes/__tests__/consent.test.d.ts.map +1 -0
- package/dist/api/routes/__tests__/status.test.d.ts +2 -0
- package/dist/api/routes/__tests__/status.test.d.ts.map +1 -0
- package/dist/api/routes/error.d.ts +57 -0
- package/dist/api/routes/error.d.ts.map +1 -0
- package/dist/api/routes/generate-consent-receipt.d.ts +130 -0
- package/dist/api/routes/generate-consent-receipt.d.ts.map +1 -0
- package/dist/api/routes/get-consent-history.d.ts +133 -0
- package/dist/api/routes/get-consent-history.d.ts.map +1 -0
- package/dist/api/routes/get-consent-policy.d.ts +164 -0
- package/dist/api/routes/get-consent-policy.d.ts.map +1 -0
- package/dist/api/routes/get-consent.d.ts +148 -0
- package/dist/api/routes/get-consent.d.ts.map +1 -0
- package/dist/api/routes/index.d.ts +339 -0
- package/dist/api/routes/index.d.ts.map +1 -0
- package/dist/api/routes/ok.d.ts +87 -0
- package/dist/api/routes/ok.d.ts.map +1 -0
- package/dist/api/routes/set-consent.d.ts +245 -0
- package/dist/api/routes/set-consent.d.ts.map +1 -0
- package/dist/api/routes/show-consent-banner.d.ts +127 -0
- package/dist/api/routes/show-consent-banner.d.ts.map +1 -0
- package/dist/api/routes/status.d.ts +61 -0
- package/dist/api/routes/status.d.ts.map +1 -0
- package/dist/api/routes/verify-consent.d.ts +179 -0
- package/dist/api/routes/verify-consent.d.ts.map +1 -0
- package/dist/api/routes/withdraw-consent.d.ts +194 -0
- package/dist/api/routes/withdraw-consent.d.ts.map +1 -0
- package/dist/api/to-endpoints.d.ts +35 -0
- package/dist/api/to-endpoints.d.ts.map +1 -0
- package/dist/client/index.cjs +139 -0
- package/dist/client/index.d.ts +203 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +106 -0
- package/dist/client/types.d.ts +431 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/core.d.ts +124 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.test.d.ts +2 -0
- package/dist/core.test.d.ts.map +1 -0
- package/dist/db/adapters/drizzle-adapter/drizzle-adapter.d.ts +122 -0
- package/dist/db/adapters/drizzle-adapter/drizzle-adapter.d.ts.map +1 -0
- package/dist/db/adapters/drizzle-adapter/index.d.ts +2 -0
- package/dist/db/adapters/drizzle-adapter/index.d.ts.map +1 -0
- package/dist/db/adapters/drizzle.cjs +1531 -0
- package/dist/db/adapters/drizzle.js +1489 -0
- package/dist/db/adapters/kysely-adapter/dialect.d.ts +72 -0
- package/dist/db/adapters/kysely-adapter/dialect.d.ts.map +1 -0
- package/dist/db/adapters/kysely-adapter/index.d.ts +4 -0
- package/dist/db/adapters/kysely-adapter/index.d.ts.map +1 -0
- package/dist/db/adapters/kysely-adapter/kysely-adapter.d.ts +98 -0
- package/dist/db/adapters/kysely-adapter/kysely-adapter.d.ts.map +1 -0
- package/dist/db/adapters/kysely-adapter/types.d.ts +281 -0
- package/dist/db/adapters/kysely-adapter/types.d.ts.map +1 -0
- package/dist/db/adapters/kysely.cjs +1551 -0
- package/dist/db/adapters/kysely.js +1508 -0
- package/dist/db/adapters/memory-adapter/index.d.ts +2 -0
- package/dist/db/adapters/memory-adapter/index.d.ts.map +1 -0
- package/dist/db/adapters/memory-adapter/memory-adapter.d.ts +56 -0
- package/dist/db/adapters/memory-adapter/memory-adapter.d.ts.map +1 -0
- package/dist/db/adapters/memory.cjs +1391 -0
- package/dist/db/adapters/memory.js +1349 -0
- package/dist/db/adapters/prisma-adapter/index.d.ts +2 -0
- package/dist/db/adapters/prisma-adapter/index.d.ts.map +1 -0
- package/dist/db/adapters/prisma-adapter/prisma-adapter.d.ts +143 -0
- package/dist/db/adapters/prisma-adapter/prisma-adapter.d.ts.map +1 -0
- package/dist/db/adapters/prisma.cjs +1503 -0
- package/dist/db/adapters/prisma.js +1461 -0
- package/dist/db/adapters/types.d.ts +154 -0
- package/dist/db/adapters/types.d.ts.map +1 -0
- package/dist/db/adapters/utils.d.ts +36 -0
- package/dist/db/adapters/utils.d.ts.map +1 -0
- package/dist/db/core/fields/field-factory.d.ts +383 -0
- package/dist/db/core/fields/field-factory.d.ts.map +1 -0
- package/dist/db/core/fields/field-inference.d.ts +218 -0
- package/dist/db/core/fields/field-inference.d.ts.map +1 -0
- package/dist/db/core/fields/field-options-integration.d.ts +90 -0
- package/dist/db/core/fields/field-options-integration.d.ts.map +1 -0
- package/dist/db/core/fields/field-types.d.ts +182 -0
- package/dist/db/core/fields/field-types.d.ts.map +1 -0
- package/dist/db/core/fields/id-generator.d.ts +19 -0
- package/dist/db/core/fields/id-generator.d.ts.map +1 -0
- package/dist/db/core/fields/index.d.ts +8 -0
- package/dist/db/core/fields/index.d.ts.map +1 -0
- package/dist/db/core/fields/superjson-utils.d.ts +34 -0
- package/dist/db/core/fields/superjson-utils.d.ts.map +1 -0
- package/dist/db/core/fields/zod-fields.d.ts +1011 -0
- package/dist/db/core/fields/zod-fields.d.ts.map +1 -0
- package/dist/db/core/get-schema.d.ts +36 -0
- package/dist/db/core/get-schema.d.ts.map +1 -0
- package/dist/db/core/types.d.ts +41 -0
- package/dist/db/core/types.d.ts.map +1 -0
- package/dist/db/create-registry.d.ts +760 -0
- package/dist/db/create-registry.d.ts.map +1 -0
- package/dist/db/hooks/create-hooks.d.ts +32 -0
- package/dist/db/hooks/create-hooks.d.ts.map +1 -0
- package/dist/db/hooks/index.d.ts +40 -0
- package/dist/db/hooks/index.d.ts.map +1 -0
- package/dist/db/hooks/types.d.ts +133 -0
- package/dist/db/hooks/types.d.ts.map +1 -0
- package/dist/db/hooks/update-hooks.d.ts +33 -0
- package/dist/db/hooks/update-hooks.d.ts.map +1 -0
- package/dist/db/hooks/update-many-hooks.d.ts +55 -0
- package/dist/db/hooks/update-many-hooks.d.ts.map +1 -0
- package/dist/db/hooks/utils.d.ts +62 -0
- package/dist/db/hooks/utils.d.ts.map +1 -0
- package/dist/db/hooks/with-hooks-factory.d.ts +33 -0
- package/dist/db/hooks/with-hooks-factory.d.ts.map +1 -0
- package/dist/db/index.cjs +2458 -0
- package/dist/db/index.d.ts +11 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +2404 -0
- package/dist/db/migration/get-migration.d.ts +32 -0
- package/dist/db/migration/get-migration.d.ts.map +1 -0
- package/dist/db/migration/get-schema/get-schema.d.ts +27 -0
- package/dist/db/migration/get-schema/get-schema.d.ts.map +1 -0
- package/dist/db/migration/get-schema/index.d.ts +21 -0
- package/dist/db/migration/get-schema/index.d.ts.map +1 -0
- package/dist/db/migration/get-schema/process-fields.d.ts +16 -0
- package/dist/db/migration/get-schema/process-fields.d.ts.map +1 -0
- package/dist/db/migration/get-schema/process-tables.d.ts +13 -0
- package/dist/db/migration/get-schema/process-tables.d.ts.map +1 -0
- package/dist/db/migration/get-schema/types.d.ts +17 -0
- package/dist/db/migration/get-schema/types.d.ts.map +1 -0
- package/dist/db/migration/index.cjs +1613 -0
- package/dist/db/migration/index.d.ts +14 -0
- package/dist/db/migration/index.d.ts.map +1 -0
- package/dist/db/migration/index.js +1571 -0
- package/dist/db/migration/migration-builders.d.ts +28 -0
- package/dist/db/migration/migration-builders.d.ts.map +1 -0
- package/dist/db/migration/migration-execution.d.ts +12 -0
- package/dist/db/migration/migration-execution.d.ts.map +1 -0
- package/dist/db/migration/schema-comparison.d.ts +54 -0
- package/dist/db/migration/schema-comparison.d.ts.map +1 -0
- package/dist/db/migration/type-mapping.d.ts +86 -0
- package/dist/db/migration/type-mapping.d.ts.map +1 -0
- package/dist/db/migration/types.d.ts +37 -0
- package/dist/db/migration/types.d.ts.map +1 -0
- package/dist/db/schema/audit-log/index.d.ts +4 -0
- package/dist/db/schema/audit-log/index.d.ts.map +1 -0
- package/dist/db/schema/audit-log/registry.d.ts +128 -0
- package/dist/db/schema/audit-log/registry.d.ts.map +1 -0
- package/dist/db/schema/audit-log/schema.d.ts +67 -0
- package/dist/db/schema/audit-log/schema.d.ts.map +1 -0
- package/dist/db/schema/audit-log/table.d.ts +175 -0
- package/dist/db/schema/audit-log/table.d.ts.map +1 -0
- package/dist/db/schema/audit-log/types.d.ts +29 -0
- package/dist/db/schema/audit-log/types.d.ts.map +1 -0
- package/dist/db/schema/consent/index.d.ts +4 -0
- package/dist/db/schema/consent/index.d.ts.map +1 -0
- package/dist/db/schema/consent/registry.d.ts +318 -0
- package/dist/db/schema/consent/registry.d.ts.map +1 -0
- package/dist/db/schema/consent/schema.d.ts +135 -0
- package/dist/db/schema/consent/schema.d.ts.map +1 -0
- package/dist/db/schema/consent/table.d.ts +245 -0
- package/dist/db/schema/consent/table.d.ts.map +1 -0
- package/dist/db/schema/consent/types.d.ts +37 -0
- package/dist/db/schema/consent/types.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/index.d.ts +4 -0
- package/dist/db/schema/consent-geo-location/index.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/registry.d.ts +96 -0
- package/dist/db/schema/consent-geo-location/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/schema.d.ts +71 -0
- package/dist/db/schema/consent-geo-location/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/table.d.ts +167 -0
- package/dist/db/schema/consent-geo-location/table.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/types.d.ts +21 -0
- package/dist/db/schema/consent-geo-location/types.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/index.d.ts +4 -0
- package/dist/db/schema/consent-policy/index.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/registry.d.ts +186 -0
- package/dist/db/schema/consent-policy/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/schema.d.ts +68 -0
- package/dist/db/schema/consent-policy/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/table.d.ts +147 -0
- package/dist/db/schema/consent-policy/table.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/types.d.ts +28 -0
- package/dist/db/schema/consent-policy/types.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/index.d.ts +4 -0
- package/dist/db/schema/consent-purpose/index.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/registry.d.ts +136 -0
- package/dist/db/schema/consent-purpose/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/schema.d.ts +79 -0
- package/dist/db/schema/consent-purpose/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/table.d.ts +161 -0
- package/dist/db/schema/consent-purpose/table.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/types.d.ts +16 -0
- package/dist/db/schema/consent-purpose/types.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/index.d.ts +4 -0
- package/dist/db/schema/consent-purpose-junction/index.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/registry.d.ts +109 -0
- package/dist/db/schema/consent-purpose-junction/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/schema.d.ts +57 -0
- package/dist/db/schema/consent-purpose-junction/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/table.d.ts +138 -0
- package/dist/db/schema/consent-purpose-junction/table.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/types.d.ts +14 -0
- package/dist/db/schema/consent-purpose-junction/types.d.ts.map +1 -0
- package/dist/db/schema/consent-record/index.d.ts +4 -0
- package/dist/db/schema/consent-record/index.d.ts.map +1 -0
- package/dist/db/schema/consent-record/registry.d.ts +119 -0
- package/dist/db/schema/consent-record/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-record/schema.d.ts +57 -0
- package/dist/db/schema/consent-record/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-record/table.d.ts +123 -0
- package/dist/db/schema/consent-record/table.d.ts.map +1 -0
- package/dist/db/schema/consent-record/types.d.ts +21 -0
- package/dist/db/schema/consent-record/types.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/index.d.ts +4 -0
- package/dist/db/schema/consent-withdrawal/index.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/registry.d.ts +134 -0
- package/dist/db/schema/consent-withdrawal/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/schema.d.ts +67 -0
- package/dist/db/schema/consent-withdrawal/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/table.d.ts +170 -0
- package/dist/db/schema/consent-withdrawal/table.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/types.d.ts +28 -0
- package/dist/db/schema/consent-withdrawal/types.d.ts.map +1 -0
- package/dist/db/schema/definition.d.ts +1100 -0
- package/dist/db/schema/definition.d.ts.map +1 -0
- package/dist/db/schema/domain/index.d.ts +4 -0
- package/dist/db/schema/domain/index.d.ts.map +1 -0
- package/dist/db/schema/domain/registry.d.ts +169 -0
- package/dist/db/schema/domain/registry.d.ts.map +1 -0
- package/dist/db/schema/domain/schema.d.ts +60 -0
- package/dist/db/schema/domain/schema.d.ts.map +1 -0
- package/dist/db/schema/domain/table.d.ts +140 -0
- package/dist/db/schema/domain/table.d.ts.map +1 -0
- package/dist/db/schema/domain/types.d.ts +27 -0
- package/dist/db/schema/domain/types.d.ts.map +1 -0
- package/dist/db/schema/geo-location/index.d.ts +4 -0
- package/dist/db/schema/geo-location/index.d.ts.map +1 -0
- package/dist/db/schema/geo-location/registry.d.ts +114 -0
- package/dist/db/schema/geo-location/registry.d.ts.map +1 -0
- package/dist/db/schema/geo-location/schema.d.ts +58 -0
- package/dist/db/schema/geo-location/schema.d.ts.map +1 -0
- package/dist/db/schema/geo-location/table.d.ts +132 -0
- package/dist/db/schema/geo-location/table.d.ts.map +1 -0
- package/dist/db/schema/geo-location/types.d.ts +17 -0
- package/dist/db/schema/geo-location/types.d.ts.map +1 -0
- package/dist/db/schema/index.d.ts +85 -0
- package/dist/db/schema/index.d.ts.map +1 -0
- package/dist/db/schema/parser.d.ts +183 -0
- package/dist/db/schema/parser.d.ts.map +1 -0
- package/dist/db/schema/schemas.d.ts +383 -0
- package/dist/db/schema/schemas.d.ts.map +1 -0
- package/dist/db/schema/subject/index.d.ts +4 -0
- package/dist/db/schema/subject/index.d.ts.map +1 -0
- package/dist/db/schema/subject/registry.d.ts +141 -0
- package/dist/db/schema/subject/registry.d.ts.map +1 -0
- package/dist/db/schema/subject/schema.d.ts +56 -0
- package/dist/db/schema/subject/schema.d.ts.map +1 -0
- package/dist/db/schema/subject/table.d.ts +136 -0
- package/dist/db/schema/subject/table.d.ts.map +1 -0
- package/dist/db/schema/subject/types.d.ts +22 -0
- package/dist/db/schema/subject/types.d.ts.map +1 -0
- package/dist/db/schema/types.d.ts +136 -0
- package/dist/db/schema/types.d.ts.map +1 -0
- package/dist/db/utils/adapter-factory.d.ts +21 -0
- package/dist/db/utils/adapter-factory.d.ts.map +1 -0
- package/dist/db/utils/index.d.ts +10 -0
- package/dist/db/utils/index.d.ts.map +1 -0
- package/dist/db/utils.d.ts +4 -0
- package/dist/db/utils.d.ts.map +1 -0
- package/dist/error/codes.cjs +68 -0
- package/dist/error/codes.d.ts +175 -0
- package/dist/error/codes.d.ts.map +1 -0
- package/dist/error/codes.js +35 -0
- package/dist/error/error.d.ts +79 -0
- package/dist/error/error.d.ts.map +1 -0
- package/dist/error/index.cjs +172 -0
- package/dist/error/index.d.ts +9 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +129 -0
- package/dist/error/logging.d.ts +25 -0
- package/dist/error/logging.d.ts.map +1 -0
- package/dist/error/pipeline.d.ts +19 -0
- package/dist/error/pipeline.d.ts.map +1 -0
- package/dist/error/recovery.d.ts +22 -0
- package/dist/error/recovery.d.ts.map +1 -0
- package/dist/error/results.d.ts +56 -0
- package/dist/error/results.d.ts.map +1 -0
- package/dist/index.cjs +4777 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4708 -0
- package/dist/init.d.ts +52 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.test.d.ts +2 -0
- package/dist/init.test.d.ts.map +1 -0
- package/dist/integrations/index.cjs +281 -0
- package/dist/integrations/index.d.ts +7 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +248 -0
- package/dist/integrations/next.cjs +131 -0
- package/dist/integrations/next.d.ts +29 -0
- package/dist/integrations/next.d.ts.map +1 -0
- package/dist/integrations/next.js +99 -0
- package/dist/integrations/react.cjs +182 -0
- package/dist/integrations/react.d.ts +257 -0
- package/dist/integrations/react.d.ts.map +1 -0
- package/dist/integrations/react.js +150 -0
- package/dist/plugins/geo/index.d.ts +2 -0
- package/dist/plugins/geo/index.d.ts.map +1 -0
- package/dist/test/utils.d.ts +65 -0
- package/dist/test/utils.d.ts.map +1 -0
- package/dist/types/api.d.ts +89 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/context.d.ts +205 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/helper.d.ts +78 -0
- package/dist/types/helper.d.ts.map +1 -0
- package/dist/types/index.cjs +19 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +0 -0
- package/dist/types/options.d.ts +172 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/plugins.d.ts +442 -0
- package/dist/types/plugins.d.ts.map +1 -0
- package/dist/utils/env.d.ts +77 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/hide-metadata.d.ts +22 -0
- package/dist/utils/hide-metadata.d.ts.map +1 -0
- package/dist/utils/index.cjs +268 -0
- package/dist/utils/index.d.ts +18 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +210 -0
- package/dist/utils/ip.d.ts +10 -0
- package/dist/utils/ip.d.ts.map +1 -0
- package/dist/utils/json.d.ts +14 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +108 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/url.d.ts +87 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/wildcard.d.ts +46 -0
- package/dist/utils/wildcard.d.ts.map +1 -0
- package/knip.json +37 -0
- package/package.json +146 -0
- package/rslib.config.ts +104 -0
- package/src/api/call.ts +177 -0
- package/src/api/index.ts +303 -0
- package/src/api/middlewares/index.ts +38 -0
- package/src/api/middlewares/origin-check.ts +260 -0
- package/src/api/middlewares/validate-context.ts +175 -0
- package/src/api/routes/__tests__/consent.test.ts +270 -0
- package/src/api/routes/__tests__/status.test.ts +36 -0
- package/src/api/routes/error.ts +130 -0
- package/src/api/routes/generate-consent-receipt.ts +244 -0
- package/src/api/routes/get-consent-history.ts +128 -0
- package/src/api/routes/get-consent-policy.ts +327 -0
- package/src/api/routes/get-consent.ts +230 -0
- package/src/api/routes/index.ts +12 -0
- package/src/api/routes/ok.ts +45 -0
- package/src/api/routes/set-consent.ts +328 -0
- package/src/api/routes/show-consent-banner.ts +149 -0
- package/src/api/routes/status.ts +62 -0
- package/src/api/routes/verify-consent.ts +272 -0
- package/src/api/routes/withdraw-consent.ts +293 -0
- package/src/api/to-endpoints.ts +371 -0
- package/src/client/index.ts +471 -0
- package/src/client/types.ts +458 -0
- package/src/core.test.ts +303 -0
- package/src/core.ts +267 -0
- package/src/db/adapters/drizzle-adapter/drizzle-adapter.ts +711 -0
- package/src/db/adapters/drizzle-adapter/index.ts +1 -0
- package/src/db/adapters/kysely-adapter/dialect.ts +192 -0
- package/src/db/adapters/kysely-adapter/index.ts +3 -0
- package/src/db/adapters/kysely-adapter/kysely-adapter.ts +1168 -0
- package/src/db/adapters/kysely-adapter/types.ts +307 -0
- package/src/db/adapters/memory-adapter/index.ts +1 -0
- package/src/db/adapters/memory-adapter/memory-adapter.ts +648 -0
- package/src/db/adapters/prisma-adapter/index.ts +1 -0
- package/src/db/adapters/prisma-adapter/prisma-adapter.ts +586 -0
- package/src/db/adapters/types.ts +203 -0
- package/src/db/adapters/utils.ts +51 -0
- package/src/db/core/fields/field-factory.ts +804 -0
- package/src/db/core/fields/field-inference.ts +298 -0
- package/src/db/core/fields/field-options-integration.ts +135 -0
- package/src/db/core/fields/field-types.ts +233 -0
- package/src/db/core/fields/id-generator.ts +57 -0
- package/src/db/core/fields/index.ts +56 -0
- package/src/db/core/fields/superjson-utils.ts +155 -0
- package/src/db/core/fields/zod-fields.ts +269 -0
- package/src/db/core/get-schema.ts +102 -0
- package/src/db/core/types.ts +52 -0
- package/src/db/create-registry.ts +31 -0
- package/src/db/hooks/create-hooks.ts +88 -0
- package/src/db/hooks/index.ts +39 -0
- package/src/db/hooks/types.ts +164 -0
- package/src/db/hooks/update-hooks.ts +91 -0
- package/src/db/hooks/update-many-hooks.ts +176 -0
- package/src/db/hooks/utils.ts +151 -0
- package/src/db/hooks/with-hooks-factory.ts +68 -0
- package/src/db/index.ts +32 -0
- package/src/db/migration/get-migration.ts +89 -0
- package/src/db/migration/get-schema/get-schema.ts +44 -0
- package/src/db/migration/get-schema/index.ts +20 -0
- package/src/db/migration/get-schema/process-fields.ts +66 -0
- package/src/db/migration/get-schema/process-tables.ts +68 -0
- package/src/db/migration/get-schema/types.ts +18 -0
- package/src/db/migration/index.ts +18 -0
- package/src/db/migration/migration-builders.ts +170 -0
- package/src/db/migration/migration-execution.ts +79 -0
- package/src/db/migration/schema-comparison.ts +216 -0
- package/src/db/migration/type-mapping.ts +255 -0
- package/src/db/migration/types.ts +46 -0
- package/src/db/schema/audit-log/index.ts +3 -0
- package/src/db/schema/audit-log/registry.ts +228 -0
- package/src/db/schema/audit-log/schema.ts +46 -0
- package/src/db/schema/audit-log/table.ts +185 -0
- package/src/db/schema/audit-log/types.ts +29 -0
- package/src/db/schema/consent/index.ts +3 -0
- package/src/db/schema/consent/registry.ts +381 -0
- package/src/db/schema/consent/schema.ts +65 -0
- package/src/db/schema/consent/table.ts +220 -0
- package/src/db/schema/consent/types.ts +39 -0
- package/src/db/schema/consent-geo-location/index.ts +3 -0
- package/src/db/schema/consent-geo-location/registry.ts +124 -0
- package/src/db/schema/consent-geo-location/schema.ts +51 -0
- package/src/db/schema/consent-geo-location/table.ts +169 -0
- package/src/db/schema/consent-geo-location/types.ts +21 -0
- package/src/db/schema/consent-policy/index.ts +3 -0
- package/src/db/schema/consent-policy/registry.ts +313 -0
- package/src/db/schema/consent-policy/schema.ts +47 -0
- package/src/db/schema/consent-policy/table.ts +141 -0
- package/src/db/schema/consent-policy/types.ts +28 -0
- package/src/db/schema/consent-purpose/index.ts +3 -0
- package/src/db/schema/consent-purpose/registry.ts +188 -0
- package/src/db/schema/consent-purpose/schema.ts +58 -0
- package/src/db/schema/consent-purpose/table.ts +154 -0
- package/src/db/schema/consent-purpose/types.ts +16 -0
- package/src/db/schema/consent-purpose-junction/index.ts +3 -0
- package/src/db/schema/consent-purpose-junction/registry.ts +189 -0
- package/src/db/schema/consent-purpose-junction/schema.ts +49 -0
- package/src/db/schema/consent-purpose-junction/table.ts +142 -0
- package/src/db/schema/consent-purpose-junction/types.ts +14 -0
- package/src/db/schema/consent-record/index.ts +3 -0
- package/src/db/schema/consent-record/registry.ts +209 -0
- package/src/db/schema/consent-record/schema.ts +42 -0
- package/src/db/schema/consent-record/table.ts +124 -0
- package/src/db/schema/consent-record/types.ts +21 -0
- package/src/db/schema/consent-withdrawal/index.ts +3 -0
- package/src/db/schema/consent-withdrawal/registry.ts +219 -0
- package/src/db/schema/consent-withdrawal/schema.ts +48 -0
- package/src/db/schema/consent-withdrawal/table.ts +181 -0
- package/src/db/schema/consent-withdrawal/types.ts +29 -0
- package/src/db/schema/definition.ts +196 -0
- package/src/db/schema/domain/index.ts +3 -0
- package/src/db/schema/domain/registry.ts +272 -0
- package/src/db/schema/domain/schema.ts +43 -0
- package/src/db/schema/domain/table.ts +137 -0
- package/src/db/schema/domain/types.ts +27 -0
- package/src/db/schema/geo-location/index.ts +3 -0
- package/src/db/schema/geo-location/registry.ts +159 -0
- package/src/db/schema/geo-location/schema.ts +45 -0
- package/src/db/schema/geo-location/table.ts +148 -0
- package/src/db/schema/geo-location/types.ts +18 -0
- package/src/db/schema/index.ts +96 -0
- package/src/db/schema/parser.ts +417 -0
- package/src/db/schema/schemas.ts +35 -0
- package/src/db/schema/subject/index.ts +3 -0
- package/src/db/schema/subject/registry.ts +371 -0
- package/src/db/schema/subject/schema.ts +41 -0
- package/src/db/schema/subject/table.ts +139 -0
- package/src/db/schema/subject/types.ts +22 -0
- package/src/db/schema/types.ts +154 -0
- package/src/db/utils/adapter-factory.ts +64 -0
- package/src/db/utils/index.ts +10 -0
- package/src/db/utils.ts +42 -0
- package/src/docs/ADVANCED_JSON_HANDLING.md +99 -0
- package/src/docs/neverthrow.md +171 -0
- package/src/error/codes.ts +201 -0
- package/src/error/error.ts +145 -0
- package/src/error/index.ts +23 -0
- package/src/error/logging.ts +52 -0
- package/src/error/pipeline.ts +57 -0
- package/src/error/recovery.ts +45 -0
- package/src/error/results.ts +100 -0
- package/src/index.ts +79 -0
- package/src/init.test.ts +235 -0
- package/src/init.ts +261 -0
- package/src/integrations/index.ts +10 -0
- package/src/integrations/next.ts +136 -0
- package/src/integrations/react.ts +567 -0
- package/src/plugins/geo/index.ts +563 -0
- package/src/test/utils.ts +244 -0
- package/src/types/api.ts +101 -0
- package/src/types/context.ts +235 -0
- package/src/types/helper.ts +87 -0
- package/src/types/index.ts +5 -0
- package/src/types/options.ts +189 -0
- package/src/types/plugins.ts +538 -0
- package/src/utils/env.ts +103 -0
- package/src/utils/hide-metadata.ts +21 -0
- package/src/utils/index.ts +17 -0
- package/src/utils/ip.ts +45 -0
- package/src/utils/json.ts +19 -0
- package/src/utils/logger.ts +252 -0
- package/src/utils/url.ts +194 -0
- package/src/utils/wildcard.ts +253 -0
- package/tsconfig.json +12 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom ID generation system for C15T entities
|
|
3
|
+
*
|
|
4
|
+
* Provides prefixed, time-ordered, unique identifiers for all system entities.
|
|
5
|
+
* Each entity type has a specific prefix to make IDs self-descriptive about
|
|
6
|
+
* their origin and purpose.
|
|
7
|
+
*/
|
|
8
|
+
import baseX from 'base-x';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Base-58 encoder for generating short, URL-friendly identifiers
|
|
12
|
+
* Uses a character set that avoids visually ambiguous characters.
|
|
13
|
+
*/
|
|
14
|
+
const b58 = baseX('123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Generates a unique ID with the specified prefix
|
|
18
|
+
*
|
|
19
|
+
* Creates time-ordered, prefixed, base58-encoded identifiers that:
|
|
20
|
+
* - Start with the provided prefix for clear identification
|
|
21
|
+
* - Embed a timestamp for chronological ordering
|
|
22
|
+
* - Include random data for uniqueness
|
|
23
|
+
*
|
|
24
|
+
* @param prefix - The prefix to use for the ID
|
|
25
|
+
* @returns A unique, prefixed identifier
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const subjectId = generateId("sub"); // "sub_3hK4G..."
|
|
30
|
+
* const consentId = generateId("cns"); // "cns_5RtX9..."
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
export function generateId(prefix: string): string {
|
|
34
|
+
const buf = crypto.getRandomValues(new Uint8Array(20));
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Epoch starts more recently to extend timestamp lifetime.
|
|
38
|
+
* From 2023-11-14T22:13:20.000Z (1700000000000) to ~2159.
|
|
39
|
+
*/
|
|
40
|
+
const EPOCH_TIMESTAMP = 1_700_000_000_000;
|
|
41
|
+
|
|
42
|
+
const t = Date.now() - EPOCH_TIMESTAMP;
|
|
43
|
+
|
|
44
|
+
// Use 8 bytes for the timestamp (0..7) and shift accordingly:
|
|
45
|
+
const high = Math.floor(t / 0x100000000);
|
|
46
|
+
const low = t >>> 0;
|
|
47
|
+
buf[0] = (high >>> 24) & 255;
|
|
48
|
+
buf[1] = (high >>> 16) & 255;
|
|
49
|
+
buf[2] = (high >>> 8) & 255;
|
|
50
|
+
buf[3] = high & 255;
|
|
51
|
+
buf[4] = (low >>> 24) & 255;
|
|
52
|
+
buf[5] = (low >>> 16) & 255;
|
|
53
|
+
buf[6] = (low >>> 8) & 255;
|
|
54
|
+
buf[7] = low & 255;
|
|
55
|
+
|
|
56
|
+
return `${prefix}_${b58.encode(buf)}`;
|
|
57
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
// Export core types
|
|
2
|
+
export type {
|
|
3
|
+
FieldType,
|
|
4
|
+
Field,
|
|
5
|
+
FieldConfig,
|
|
6
|
+
Primitive,
|
|
7
|
+
JsonValue,
|
|
8
|
+
} from './field-types';
|
|
9
|
+
|
|
10
|
+
// Export field options
|
|
11
|
+
export type {
|
|
12
|
+
NumberFieldOptions,
|
|
13
|
+
StringFieldOptions,
|
|
14
|
+
JsonFieldOptions,
|
|
15
|
+
TimezoneFieldOptions,
|
|
16
|
+
DateFieldOptions,
|
|
17
|
+
} from './field-factory';
|
|
18
|
+
|
|
19
|
+
// Export factory functions
|
|
20
|
+
export {
|
|
21
|
+
createField,
|
|
22
|
+
stringField,
|
|
23
|
+
numberField,
|
|
24
|
+
booleanField,
|
|
25
|
+
dateField,
|
|
26
|
+
jsonField,
|
|
27
|
+
stringArrayField,
|
|
28
|
+
numberArrayField,
|
|
29
|
+
timezoneField,
|
|
30
|
+
COMMON_TIMEZONES,
|
|
31
|
+
} from './field-factory';
|
|
32
|
+
|
|
33
|
+
// Export Zod utilities
|
|
34
|
+
export {
|
|
35
|
+
validateField,
|
|
36
|
+
createFieldValueSchema,
|
|
37
|
+
} from './zod-fields';
|
|
38
|
+
|
|
39
|
+
// Export field inference utilities
|
|
40
|
+
export type {
|
|
41
|
+
InferFieldOutput,
|
|
42
|
+
InferFieldInput,
|
|
43
|
+
InferFieldsOutput,
|
|
44
|
+
InferFieldsInput,
|
|
45
|
+
TransformOutputFn,
|
|
46
|
+
} from './field-inference';
|
|
47
|
+
|
|
48
|
+
// Export SuperJSON utilities
|
|
49
|
+
export {
|
|
50
|
+
getDatabaseType,
|
|
51
|
+
transformForDb,
|
|
52
|
+
parseFromDb,
|
|
53
|
+
} from './superjson-utils';
|
|
54
|
+
|
|
55
|
+
// Export ID generator
|
|
56
|
+
export { generateId } from './id-generator';
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import superjson from 'superjson';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Database type enumeration
|
|
5
|
+
* Used to identify the current database type for data handling decisions
|
|
6
|
+
*/
|
|
7
|
+
export type DatabaseType = 'sqlite' | 'postgresql' | 'mysql' | 'unknown';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Get the current database type from a provider string
|
|
11
|
+
*
|
|
12
|
+
* @param provider - The database provider string
|
|
13
|
+
* @returns The normalized database type
|
|
14
|
+
*/
|
|
15
|
+
export function normalizeDatabaseType(provider?: string): DatabaseType {
|
|
16
|
+
if (!provider) {
|
|
17
|
+
return 'unknown';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Normalize provider names
|
|
21
|
+
switch (provider.toLowerCase()) {
|
|
22
|
+
case 'pg':
|
|
23
|
+
case 'postgres':
|
|
24
|
+
case 'postgresql':
|
|
25
|
+
return 'postgresql';
|
|
26
|
+
case 'mysql':
|
|
27
|
+
case 'mariadb':
|
|
28
|
+
return 'mysql';
|
|
29
|
+
case 'sqlite':
|
|
30
|
+
case 'sqlite3':
|
|
31
|
+
return 'sqlite';
|
|
32
|
+
default:
|
|
33
|
+
return 'unknown';
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Global database type setting that can be configured at startup
|
|
38
|
+
const currentDatabaseType: DatabaseType = 'unknown';
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Get the current database type
|
|
42
|
+
*
|
|
43
|
+
* @returns The current database type
|
|
44
|
+
*/
|
|
45
|
+
export function getDatabaseType(): DatabaseType {
|
|
46
|
+
return currentDatabaseType;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Apply database-specific transformations for JSON data
|
|
51
|
+
*
|
|
52
|
+
* @param value - The value to transform
|
|
53
|
+
* @param dbType - The database type (defaults to current global setting)
|
|
54
|
+
* @returns Transformed value appropriate for the database
|
|
55
|
+
*/
|
|
56
|
+
export function transformForDb<T>(
|
|
57
|
+
value: T,
|
|
58
|
+
dbType: DatabaseType = currentDatabaseType
|
|
59
|
+
): T | string {
|
|
60
|
+
// For SQLite, always use SuperJSON
|
|
61
|
+
if (dbType === 'sqlite') {
|
|
62
|
+
return superjson.stringify(value);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
// For MySQL, use SuperJSON for complex types
|
|
66
|
+
if (dbType === 'mysql') {
|
|
67
|
+
// Check if value contains complex types
|
|
68
|
+
const containsComplexTypes = containsComplexJsTypes(value);
|
|
69
|
+
|
|
70
|
+
if (containsComplexTypes) {
|
|
71
|
+
return superjson.stringify(value);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// For PostgreSQL, use native JSON
|
|
76
|
+
return value;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Parse a value from the database using the global database type.
|
|
81
|
+
*
|
|
82
|
+
* @param value - The value from the database
|
|
83
|
+
* @returns Parsed value
|
|
84
|
+
*/
|
|
85
|
+
export function parseFromDb(value: unknown) {
|
|
86
|
+
// If the value is a string and might be SuperJSON format
|
|
87
|
+
if (typeof value === 'string' && isSuperJsonString(value)) {
|
|
88
|
+
try {
|
|
89
|
+
return superjson.parse(value);
|
|
90
|
+
} catch {
|
|
91
|
+
// If parsing fails, return the original value
|
|
92
|
+
return value;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Check if a string looks like it might be in SuperJSON format
|
|
101
|
+
*
|
|
102
|
+
* @param str - The string to check
|
|
103
|
+
* @returns Whether the string appears to be SuperJSON
|
|
104
|
+
*/
|
|
105
|
+
function isSuperJsonString(str: string): boolean {
|
|
106
|
+
try {
|
|
107
|
+
const parsed = JSON.parse(str);
|
|
108
|
+
// SuperJSON format has 'json' and 'meta' properties
|
|
109
|
+
return (
|
|
110
|
+
typeof parsed === 'object' &&
|
|
111
|
+
parsed !== null &&
|
|
112
|
+
'json' in parsed &&
|
|
113
|
+
'meta' in parsed
|
|
114
|
+
);
|
|
115
|
+
} catch {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Check if a value contains complex JavaScript types
|
|
122
|
+
* that might not be properly handled by standard JSON
|
|
123
|
+
*
|
|
124
|
+
* @param value - The value to check
|
|
125
|
+
* @returns Whether the value contains complex types
|
|
126
|
+
*/
|
|
127
|
+
function containsComplexJsTypes(value: unknown): boolean {
|
|
128
|
+
if (value === null || value === undefined) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// Check for Date, Map, Set, BigInt, or other non-standard JSON types
|
|
133
|
+
if (
|
|
134
|
+
value instanceof Date ||
|
|
135
|
+
value instanceof Map ||
|
|
136
|
+
value instanceof Set ||
|
|
137
|
+
typeof value === 'bigint' ||
|
|
138
|
+
ArrayBuffer.isView(value)
|
|
139
|
+
) {
|
|
140
|
+
return true;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Recursively check objects and arrays
|
|
144
|
+
if (Array.isArray(value)) {
|
|
145
|
+
return value.some((item) => containsComplexJsTypes(item));
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (typeof value === 'object') {
|
|
149
|
+
return Object.values(value as Record<string, unknown>).some((item) =>
|
|
150
|
+
containsComplexJsTypes(item)
|
|
151
|
+
);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return false;
|
|
155
|
+
}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type {
|
|
3
|
+
Field,
|
|
4
|
+
FieldType,
|
|
5
|
+
InferValueType,
|
|
6
|
+
JsonValue,
|
|
7
|
+
} from './field-types';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Base Zod schema for field configuration options
|
|
11
|
+
*/
|
|
12
|
+
const fieldConfigSchema = z.object({
|
|
13
|
+
required: z.boolean().default(true),
|
|
14
|
+
returned: z.boolean().default(true),
|
|
15
|
+
input: z.boolean().default(true),
|
|
16
|
+
defaultValue: z.union([z.any(), z.function().returns(z.any())]).optional(),
|
|
17
|
+
transform: z
|
|
18
|
+
.object({
|
|
19
|
+
input: z
|
|
20
|
+
.function()
|
|
21
|
+
.args(z.any())
|
|
22
|
+
.returns(z.union([z.any(), z.promise(z.any())]))
|
|
23
|
+
.optional(),
|
|
24
|
+
output: z
|
|
25
|
+
.function()
|
|
26
|
+
.args(z.any())
|
|
27
|
+
.returns(z.union([z.any(), z.promise(z.any())]))
|
|
28
|
+
.optional(),
|
|
29
|
+
})
|
|
30
|
+
.optional(),
|
|
31
|
+
validator: z
|
|
32
|
+
.function()
|
|
33
|
+
.args(z.any())
|
|
34
|
+
.returns(z.union([z.string(), z.null()]))
|
|
35
|
+
.optional(),
|
|
36
|
+
unique: z.boolean().optional(),
|
|
37
|
+
indexed: z.boolean().optional(),
|
|
38
|
+
sortable: z.boolean().default(true),
|
|
39
|
+
fieldName: z.string().optional(),
|
|
40
|
+
bigint: z.boolean().default(false),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Zod schema for string field configuration
|
|
45
|
+
*/
|
|
46
|
+
export const stringFieldSchema = fieldConfigSchema.extend({
|
|
47
|
+
type: z.literal('string'),
|
|
48
|
+
minLength: z.number().optional(),
|
|
49
|
+
maxLength: z.number().optional(),
|
|
50
|
+
pattern: z.string().optional(),
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Zod schema for number field configuration
|
|
55
|
+
*/
|
|
56
|
+
export const numberFieldSchema = fieldConfigSchema.extend({
|
|
57
|
+
type: z.literal('number'),
|
|
58
|
+
min: z.number().optional(),
|
|
59
|
+
max: z.number().optional(),
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Zod schema for boolean field configuration
|
|
64
|
+
*/
|
|
65
|
+
export const booleanFieldSchema = fieldConfigSchema.extend({
|
|
66
|
+
type: z.literal('boolean'),
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Zod schema for date field configuration
|
|
71
|
+
*/
|
|
72
|
+
export const dateFieldSchema = fieldConfigSchema.extend({
|
|
73
|
+
type: z.literal('date'),
|
|
74
|
+
minDate: z.date().optional(),
|
|
75
|
+
maxDate: z.date().optional(),
|
|
76
|
+
dateOnly: z.boolean().default(false),
|
|
77
|
+
format: z.record(z.unknown()).optional(),
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Zod schema for timezone field configuration
|
|
82
|
+
*/
|
|
83
|
+
export const timezoneFieldSchema = fieldConfigSchema.extend({
|
|
84
|
+
type: z.literal('timezone'),
|
|
85
|
+
validateTimezone: z.boolean().default(true),
|
|
86
|
+
suggestedValues: z.array(z.string()).optional(),
|
|
87
|
+
restrictToSuggestedValues: z.boolean().default(false),
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Zod schema for JSON field configuration
|
|
92
|
+
*/
|
|
93
|
+
export const jsonFieldSchema = fieldConfigSchema.extend({
|
|
94
|
+
type: z.literal('json'),
|
|
95
|
+
validateJson: z.boolean().default(true),
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Zod schema for string array field configuration
|
|
100
|
+
*/
|
|
101
|
+
export const stringArrayFieldSchema = fieldConfigSchema.extend({
|
|
102
|
+
type: z.literal('string[]'),
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Zod schema for number array field configuration
|
|
107
|
+
*/
|
|
108
|
+
export const numberArrayFieldSchema = fieldConfigSchema.extend({
|
|
109
|
+
type: z.literal('number[]'),
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Union type of all field schemas
|
|
114
|
+
*/
|
|
115
|
+
export const fieldSchema = z.discriminatedUnion('type', [
|
|
116
|
+
stringFieldSchema,
|
|
117
|
+
numberFieldSchema,
|
|
118
|
+
booleanFieldSchema,
|
|
119
|
+
dateFieldSchema,
|
|
120
|
+
timezoneFieldSchema,
|
|
121
|
+
jsonFieldSchema,
|
|
122
|
+
stringArrayFieldSchema,
|
|
123
|
+
numberArrayFieldSchema,
|
|
124
|
+
]);
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Type for a validated field configuration
|
|
128
|
+
*/
|
|
129
|
+
export type ValidatedField<TFieldType extends FieldType> = z.infer<
|
|
130
|
+
typeof fieldSchema
|
|
131
|
+
> & {
|
|
132
|
+
type: TFieldType;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Creates a Zod schema for a field's value based on its type
|
|
137
|
+
*/
|
|
138
|
+
export function createFieldValueSchema<TFieldType extends FieldType>(
|
|
139
|
+
field: ValidatedField<TFieldType>
|
|
140
|
+
): z.ZodType<InferValueType<TFieldType>> {
|
|
141
|
+
type ValueType = InferValueType<TFieldType>;
|
|
142
|
+
|
|
143
|
+
const baseSchema = (() => {
|
|
144
|
+
switch (field.type) {
|
|
145
|
+
case 'string': {
|
|
146
|
+
let schema = z.string();
|
|
147
|
+
if ('minLength' in field && field.minLength !== undefined) {
|
|
148
|
+
schema = schema.min(field.minLength);
|
|
149
|
+
}
|
|
150
|
+
if ('maxLength' in field && field.maxLength !== undefined) {
|
|
151
|
+
schema = schema.max(field.maxLength);
|
|
152
|
+
}
|
|
153
|
+
if ('pattern' in field && field.pattern) {
|
|
154
|
+
schema = schema.regex(new RegExp(field.pattern));
|
|
155
|
+
}
|
|
156
|
+
return schema;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
case 'number': {
|
|
160
|
+
let schema = z.number();
|
|
161
|
+
if ('min' in field && field.min !== undefined) {
|
|
162
|
+
schema = schema.min(field.min);
|
|
163
|
+
}
|
|
164
|
+
if ('max' in field && field.max !== undefined) {
|
|
165
|
+
schema = schema.max(field.max);
|
|
166
|
+
}
|
|
167
|
+
return schema;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
case 'boolean':
|
|
171
|
+
return z.boolean();
|
|
172
|
+
|
|
173
|
+
case 'date': {
|
|
174
|
+
let schema = z.date();
|
|
175
|
+
if ('minDate' in field && field.minDate) {
|
|
176
|
+
schema = schema.min(field.minDate);
|
|
177
|
+
}
|
|
178
|
+
if ('maxDate' in field && field.maxDate) {
|
|
179
|
+
schema = schema.max(field.maxDate);
|
|
180
|
+
}
|
|
181
|
+
return schema;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
case 'timezone': {
|
|
185
|
+
let schema: z.ZodType<string> = z.string();
|
|
186
|
+
if ('validateTimezone' in field && field.validateTimezone) {
|
|
187
|
+
schema = schema.superRefine((val, ctx) => {
|
|
188
|
+
try {
|
|
189
|
+
Intl.DateTimeFormat(undefined, { timeZone: val });
|
|
190
|
+
} catch {
|
|
191
|
+
ctx.addIssue({
|
|
192
|
+
code: z.ZodIssueCode.custom,
|
|
193
|
+
message: 'Invalid timezone',
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
if (
|
|
199
|
+
'restrictToSuggestedValues' in field &&
|
|
200
|
+
field.restrictToSuggestedValues &&
|
|
201
|
+
'suggestedValues' in field &&
|
|
202
|
+
field.suggestedValues
|
|
203
|
+
) {
|
|
204
|
+
const suggestedValues = field.suggestedValues;
|
|
205
|
+
schema = schema.superRefine((val, ctx) => {
|
|
206
|
+
if (!suggestedValues.includes(val)) {
|
|
207
|
+
ctx.addIssue({
|
|
208
|
+
code: z.ZodIssueCode.custom,
|
|
209
|
+
message: 'Timezone not in allowed values',
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
return schema;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
case 'json': {
|
|
218
|
+
let schema: z.ZodType<JsonValue> = z.any();
|
|
219
|
+
if ('validateJson' in field && field.validateJson) {
|
|
220
|
+
schema = schema.superRefine((val, ctx) => {
|
|
221
|
+
try {
|
|
222
|
+
JSON.stringify(val);
|
|
223
|
+
} catch {
|
|
224
|
+
ctx.addIssue({
|
|
225
|
+
code: z.ZodIssueCode.custom,
|
|
226
|
+
message: 'Invalid JSON',
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
return schema;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
case 'string[]':
|
|
235
|
+
return z.array(z.string());
|
|
236
|
+
|
|
237
|
+
case 'number[]':
|
|
238
|
+
return z.array(z.number());
|
|
239
|
+
|
|
240
|
+
default:
|
|
241
|
+
throw new Error(`Unsupported field type: ${field.type}`);
|
|
242
|
+
}
|
|
243
|
+
})() as z.ZodType<ValueType>;
|
|
244
|
+
|
|
245
|
+
// Apply custom validation if provided
|
|
246
|
+
if (field.validator) {
|
|
247
|
+
const validator = field.validator;
|
|
248
|
+
return baseSchema.superRefine((val, ctx) => {
|
|
249
|
+
const result = validator(val);
|
|
250
|
+
if (result !== null) {
|
|
251
|
+
ctx.addIssue({
|
|
252
|
+
code: z.ZodIssueCode.custom,
|
|
253
|
+
message: result,
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
}) as z.ZodType<ValueType>;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
return baseSchema;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* Validates a field configuration against its schema
|
|
264
|
+
*/
|
|
265
|
+
export function validateField<TFieldType extends FieldType>(
|
|
266
|
+
field: Field<TFieldType>
|
|
267
|
+
): ValidatedField<TFieldType> {
|
|
268
|
+
return fieldSchema.parse(field) as ValidatedField<TFieldType>;
|
|
269
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { Field } from '~/db/core/fields';
|
|
2
|
+
import type { EntityName } from '~/db/core/types';
|
|
3
|
+
import type { C15TOptions } from '~/types';
|
|
4
|
+
import { getConsentTables } from '../index';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A schema entry representing a processed entity definition.
|
|
8
|
+
* Contains fields and creation/sorting order information.
|
|
9
|
+
*
|
|
10
|
+
* @internal
|
|
11
|
+
* @interface SchemaEntry
|
|
12
|
+
* @property {Record<string, Field>} fields - Map of field names to their definitions
|
|
13
|
+
* @property {number} order - Order priority for entity creation (lower numbers first)
|
|
14
|
+
*/
|
|
15
|
+
interface SchemaEntry {
|
|
16
|
+
fields: Record<string, Field>;
|
|
17
|
+
order: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Processes entity definitions from configuration into a standardized schema format.
|
|
22
|
+
*
|
|
23
|
+
* This function takes raw configuration and builds a complete schema with properly
|
|
24
|
+
* structured field definitions, handling field name mapping, references between
|
|
25
|
+
* entities, and merging duplicate entity definitions.
|
|
26
|
+
*
|
|
27
|
+
* @param {C15TOptions} config - The application configuration
|
|
28
|
+
* @returns {Record<string, SchemaEntry>} A map of entity names to their schema entries
|
|
29
|
+
*
|
|
30
|
+
* @example
|
|
31
|
+
* ```typescript
|
|
32
|
+
* const schema = getSchema(config);
|
|
33
|
+
*
|
|
34
|
+
* // Access subject entity definition
|
|
35
|
+
* const subjectFields = schema.subject.fields;
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export function getSchema(config: C15TOptions) {
|
|
39
|
+
const entities = getConsentTables(config);
|
|
40
|
+
const schema: Record<string, SchemaEntry> = {};
|
|
41
|
+
|
|
42
|
+
for (const [key, entity] of Object.entries(entities)) {
|
|
43
|
+
if (!entity) {
|
|
44
|
+
continue; // Skip if entity is undefined
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const fields = entity.fields || {}; // Default to empty object if fields is undefined
|
|
48
|
+
const processedFields: Record<string, Field> = {};
|
|
49
|
+
|
|
50
|
+
// Process each field
|
|
51
|
+
for (const [fieldKey, field] of Object.entries(fields)) {
|
|
52
|
+
if (!field) {
|
|
53
|
+
continue; // Skip if field is undefined
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const fieldName = field.fieldName || fieldKey;
|
|
57
|
+
// Cast field to Field to ensure it has the right type
|
|
58
|
+
const typedField = field as Field;
|
|
59
|
+
processedFields[fieldName] = typedField;
|
|
60
|
+
|
|
61
|
+
// Handle references - first check if the field has a references property
|
|
62
|
+
if (typedField && 'references' in typedField && typedField.references) {
|
|
63
|
+
const entityName = typedField.references.model as EntityName;
|
|
64
|
+
const referencedEntity = entities[entityName];
|
|
65
|
+
if (referencedEntity) {
|
|
66
|
+
// Create a new object for references to avoid modifying the original
|
|
67
|
+
processedFields[fieldName] = {
|
|
68
|
+
...typedField,
|
|
69
|
+
references: {
|
|
70
|
+
model: referencedEntity.entityName,
|
|
71
|
+
entity: referencedEntity.entityName,
|
|
72
|
+
field: typedField.references.field,
|
|
73
|
+
onDelete: typedField.references.onDelete,
|
|
74
|
+
},
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Update or create schema entry
|
|
81
|
+
const entityName = entity.entityName || key;
|
|
82
|
+
if (entityName in schema) {
|
|
83
|
+
const existingEntry = schema[entityName];
|
|
84
|
+
|
|
85
|
+
schema[entityName] = {
|
|
86
|
+
...existingEntry,
|
|
87
|
+
order: existingEntry?.order ?? Number.POSITIVE_INFINITY,
|
|
88
|
+
fields: {
|
|
89
|
+
...existingEntry?.fields,
|
|
90
|
+
...processedFields,
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
} else {
|
|
94
|
+
schema[entityName] = {
|
|
95
|
+
fields: processedFields,
|
|
96
|
+
order: entity.order ?? Number.POSITIVE_INFINITY,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return schema;
|
|
102
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { C15TDBSchema } from '../schema/definition';
|
|
2
|
+
import type { Field } from './fields';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Plugin-provided schema type with proper typing.
|
|
6
|
+
* Defines the structure of schemas that plugins can provide to extend the system.
|
|
7
|
+
*
|
|
8
|
+
* @template TEntityKey - The entity key in the schema
|
|
9
|
+
*/
|
|
10
|
+
export type PluginSchema = Record<
|
|
11
|
+
string,
|
|
12
|
+
{
|
|
13
|
+
fields: Record<string, Field>;
|
|
14
|
+
entityName?: string;
|
|
15
|
+
}
|
|
16
|
+
>;
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Maps entity keys to their corresponding data structures.
|
|
20
|
+
* Provides type access to all entities defined in the database schema.
|
|
21
|
+
*
|
|
22
|
+
* @template TKey - Entity key in the database schema
|
|
23
|
+
*/
|
|
24
|
+
export type EntityTypeMap = {
|
|
25
|
+
[TKey in keyof C15TDBSchema]: C15TDBSchema[TKey];
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* All valid entity names in the database schema.
|
|
30
|
+
* This type represents the keys of all entities that can be used in queries.
|
|
31
|
+
*/
|
|
32
|
+
export type EntityName = keyof C15TDBSchema;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Input type for entity operations, allowing partial fields and additional properties.
|
|
36
|
+
* Used when creating or updating entity records.
|
|
37
|
+
*
|
|
38
|
+
* @template TEntity - The entity type being operated on
|
|
39
|
+
*/
|
|
40
|
+
export type EntityInput<TEntity extends EntityName> = Partial<
|
|
41
|
+
EntityTypeMap[TEntity]
|
|
42
|
+
> &
|
|
43
|
+
Record<string, unknown>;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Output type for entity operations returned from the database.
|
|
47
|
+
* Represents the full structure of an entity as returned from queries.
|
|
48
|
+
*
|
|
49
|
+
* @template TEntity - The entity type being returned
|
|
50
|
+
*/
|
|
51
|
+
export type EntityOutput<TEntity extends EntityName> = EntityTypeMap[TEntity] &
|
|
52
|
+
Record<string, unknown>;
|