@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,804 @@
|
|
|
1
|
+
import superjson from 'superjson';
|
|
2
|
+
import type { InferValueType } from './field-inference';
|
|
3
|
+
import type {
|
|
4
|
+
Field,
|
|
5
|
+
FieldConfig,
|
|
6
|
+
FieldType,
|
|
7
|
+
JsonValue,
|
|
8
|
+
Primitive,
|
|
9
|
+
} from './field-types';
|
|
10
|
+
import {
|
|
11
|
+
getDatabaseType,
|
|
12
|
+
parseFromDb,
|
|
13
|
+
transformForDb,
|
|
14
|
+
} from './superjson-utils';
|
|
15
|
+
import { validateField } from './zod-fields';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Defines transform functions for field input and output operations.
|
|
19
|
+
* Provides properly typed transform functions based on the field type.
|
|
20
|
+
*
|
|
21
|
+
* @template TFieldType - The field type that determines the transform function signatures
|
|
22
|
+
*
|
|
23
|
+
* @example
|
|
24
|
+
* ```typescript
|
|
25
|
+
* // Define transform functions for a string field
|
|
26
|
+
* const nameTransformers: FieldTransformers<'string'> = {
|
|
27
|
+
* input: (value) => value.trim(),
|
|
28
|
+
* output: (value) => value.toUpperCase()
|
|
29
|
+
* };
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export type FieldTransformers<TFieldType extends FieldType> = {
|
|
33
|
+
/**
|
|
34
|
+
* Transform function for field input.
|
|
35
|
+
* Applied when data is being saved to the database.
|
|
36
|
+
*/
|
|
37
|
+
input?: (value: InferValueType<TFieldType>) => Primitive | Promise<Primitive>;
|
|
38
|
+
/**
|
|
39
|
+
* Transform function for field output.
|
|
40
|
+
* Applied when data is being retrieved from the database.
|
|
41
|
+
*/
|
|
42
|
+
output?: (
|
|
43
|
+
value: InferValueType<TFieldType>
|
|
44
|
+
) => Primitive | Promise<Primitive>;
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Configuration options specific to number fields.
|
|
49
|
+
* Provides additional validation options for number fields.
|
|
50
|
+
*
|
|
51
|
+
* @example
|
|
52
|
+
* ```typescript
|
|
53
|
+
* // Define a number field with min/max constraints
|
|
54
|
+
* const ageField = numberField({
|
|
55
|
+
* required: true,
|
|
56
|
+
* min: 0,
|
|
57
|
+
* max: 120
|
|
58
|
+
* });
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export type NumberFieldOptions = {
|
|
62
|
+
/**
|
|
63
|
+
* Minimum allowed value for the number field.
|
|
64
|
+
*/
|
|
65
|
+
min?: number;
|
|
66
|
+
/**
|
|
67
|
+
* Maximum allowed value for the number field.
|
|
68
|
+
*/
|
|
69
|
+
max?: number;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Configuration options specific to string fields.
|
|
74
|
+
* Provides additional validation options for string fields.
|
|
75
|
+
*
|
|
76
|
+
* @example
|
|
77
|
+
* ```typescript
|
|
78
|
+
* // Define a string field with length constraints
|
|
79
|
+
* const usernameField = stringField({
|
|
80
|
+
* required: true,
|
|
81
|
+
* minLength: 3,
|
|
82
|
+
* maxLength: 20
|
|
83
|
+
* });
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export type StringFieldOptions = {
|
|
87
|
+
/**
|
|
88
|
+
* Minimum allowed length for the string field.
|
|
89
|
+
*/
|
|
90
|
+
minLength?: number;
|
|
91
|
+
/**
|
|
92
|
+
* Maximum allowed length for the string field.
|
|
93
|
+
*/
|
|
94
|
+
maxLength?: number;
|
|
95
|
+
/**
|
|
96
|
+
* Regular expression pattern that the string must match.
|
|
97
|
+
*/
|
|
98
|
+
pattern?: string;
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Configuration options specific to date fields.
|
|
103
|
+
* Provides additional validation and formatting options for date fields.
|
|
104
|
+
*
|
|
105
|
+
* @example
|
|
106
|
+
* ```typescript
|
|
107
|
+
* // Define a date field with min/max date constraints
|
|
108
|
+
* const birthdateField = dateField({
|
|
109
|
+
* required: true,
|
|
110
|
+
* minDate: new Date('1900-01-01'),
|
|
111
|
+
* maxDate: new Date() // Current date
|
|
112
|
+
* });
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
export type DateFieldOptions = {
|
|
116
|
+
/**
|
|
117
|
+
* Minimum allowed date value.
|
|
118
|
+
* Dates earlier than this will fail validation.
|
|
119
|
+
*/
|
|
120
|
+
minDate?: Date;
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Maximum allowed date value.
|
|
124
|
+
* Dates later than this will fail validation.
|
|
125
|
+
*/
|
|
126
|
+
maxDate?: Date;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* Whether to store just the date part without time information.
|
|
130
|
+
* When true, time components will be zeroed out.
|
|
131
|
+
* @default false
|
|
132
|
+
*/
|
|
133
|
+
dateOnly?: boolean;
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Format string for date output transformation.
|
|
137
|
+
* If provided, dates will be transformed to strings in this format.
|
|
138
|
+
* Only applies if no custom output transform is provided.
|
|
139
|
+
* Uses Intl.DateTimeFormat for consistent cross-platform formatting.
|
|
140
|
+
*/
|
|
141
|
+
format?: Intl.DateTimeFormatOptions;
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Configuration options specific to JSON fields.
|
|
146
|
+
* Provides additional validation and schema options for JSON data.
|
|
147
|
+
*
|
|
148
|
+
* @example
|
|
149
|
+
* ```typescript
|
|
150
|
+
* // Define a JSON field with schema validation
|
|
151
|
+
* const metadataField = jsonField({
|
|
152
|
+
* required: true,
|
|
153
|
+
* validator: (value) => {
|
|
154
|
+
* if (!value.hasOwnProperty('version')) return 'Missing version property';
|
|
155
|
+
* return null;
|
|
156
|
+
* }
|
|
157
|
+
* });
|
|
158
|
+
* ```
|
|
159
|
+
*/
|
|
160
|
+
export type JsonFieldOptions = {
|
|
161
|
+
/**
|
|
162
|
+
* Whether to validate that the value is a valid JSON object.
|
|
163
|
+
* When true, the field will ensure the value can be properly stringified/parsed.
|
|
164
|
+
* @default true
|
|
165
|
+
*/
|
|
166
|
+
validateJson?: boolean;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Common IANA timezone identifiers.
|
|
171
|
+
* A subset of commonly used timezones from the IANA timezone database.
|
|
172
|
+
* Used for validation and autocompletion in IDE.
|
|
173
|
+
*/
|
|
174
|
+
export const COMMON_TIMEZONES = {
|
|
175
|
+
UTC: 'UTC',
|
|
176
|
+
GMT: 'GMT',
|
|
177
|
+
// North America
|
|
178
|
+
EASTERN: 'America/New_York',
|
|
179
|
+
CENTRAL: 'America/Chicago',
|
|
180
|
+
MOUNTAIN: 'America/Denver',
|
|
181
|
+
PACIFIC: 'America/Los_Angeles',
|
|
182
|
+
// Europe
|
|
183
|
+
LONDON: 'Europe/London',
|
|
184
|
+
PARIS: 'Europe/Paris',
|
|
185
|
+
BERLIN: 'Europe/Berlin',
|
|
186
|
+
// Asia
|
|
187
|
+
TOKYO: 'Asia/Tokyo',
|
|
188
|
+
SHANGHAI: 'Asia/Shanghai',
|
|
189
|
+
SINGAPORE: 'Asia/Singapore',
|
|
190
|
+
// Australia
|
|
191
|
+
SYDNEY: 'Australia/Sydney',
|
|
192
|
+
// South America
|
|
193
|
+
SAO_PAULO: 'America/Sao_Paulo',
|
|
194
|
+
} as const;
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Configuration options specific to timezone fields.
|
|
198
|
+
* Provides additional validation options for timezone fields.
|
|
199
|
+
*
|
|
200
|
+
* @example
|
|
201
|
+
* ```typescript
|
|
202
|
+
* // Define a timezone field with validation
|
|
203
|
+
* const tzField = timezoneField({
|
|
204
|
+
* required: true,
|
|
205
|
+
* defaultValue: COMMON_TIMEZONES.UTC
|
|
206
|
+
* });
|
|
207
|
+
*
|
|
208
|
+
* // Define a timezone field with suggested values
|
|
209
|
+
* const subjectTimezone = timezoneField({
|
|
210
|
+
* required: true,
|
|
211
|
+
* suggestedValues: [
|
|
212
|
+
* COMMON_TIMEZONES.EASTERN,
|
|
213
|
+
* COMMON_TIMEZONES.CENTRAL,
|
|
214
|
+
* COMMON_TIMEZONES.PACIFIC
|
|
215
|
+
* ]
|
|
216
|
+
* });
|
|
217
|
+
* ```
|
|
218
|
+
*
|
|
219
|
+
* @remarks
|
|
220
|
+
* The timezone field stores timezone identifiers according to the IANA timezone database.
|
|
221
|
+
* It validates timezone strings to ensure they are valid IANA timezone identifiers.
|
|
222
|
+
*/
|
|
223
|
+
export type TimezoneFieldOptions = {
|
|
224
|
+
/**
|
|
225
|
+
* Whether to validate the timezone format against IANA timezone database.
|
|
226
|
+
* When true, ensures the value is a valid IANA timezone name.
|
|
227
|
+
* @default true
|
|
228
|
+
*/
|
|
229
|
+
validateTimezone?: boolean;
|
|
230
|
+
|
|
231
|
+
/**
|
|
232
|
+
* Suggested values for the timezone field.
|
|
233
|
+
* Can be used by client UIs to provide dropdown options.
|
|
234
|
+
*/
|
|
235
|
+
suggestedValues?: string[] | readonly string[];
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* Whether to restrict values to only the provided suggestedValues.
|
|
239
|
+
* If true, values not in suggestedValues will fail validation.
|
|
240
|
+
* @default false
|
|
241
|
+
*/
|
|
242
|
+
restrictToSuggestedValues?: boolean;
|
|
243
|
+
};
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Creates a field attribute with the specified configuration.
|
|
247
|
+
* This is the core function for defining schema fields with type safety.
|
|
248
|
+
*
|
|
249
|
+
* @template TFieldType - The field type to create
|
|
250
|
+
* @template TConfig - The configuration type for the field
|
|
251
|
+
*
|
|
252
|
+
* @param type - The field type to create
|
|
253
|
+
* @param config - Configuration options for the field
|
|
254
|
+
* @returns A fully configured field definition
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* ```typescript
|
|
258
|
+
* // Create a basic string field
|
|
259
|
+
* const nameField = createField('string', {
|
|
260
|
+
* required: true
|
|
261
|
+
* });
|
|
262
|
+
*
|
|
263
|
+
* // Create a number field with transforms
|
|
264
|
+
* const ageField = createField('number', {
|
|
265
|
+
* required: false,
|
|
266
|
+
* transform: {
|
|
267
|
+
* input: (value) => Math.floor(value)
|
|
268
|
+
* }
|
|
269
|
+
* });
|
|
270
|
+
* ```
|
|
271
|
+
*/
|
|
272
|
+
export function createField<TFieldType extends FieldType>(
|
|
273
|
+
type: TFieldType,
|
|
274
|
+
config?: Omit<FieldConfig<TFieldType>, 'type'>
|
|
275
|
+
): Field<TFieldType> {
|
|
276
|
+
const fieldConfig: FieldConfig<TFieldType> = {
|
|
277
|
+
type,
|
|
278
|
+
required: true,
|
|
279
|
+
returned: true,
|
|
280
|
+
input: true,
|
|
281
|
+
sortable: true,
|
|
282
|
+
bigint: false,
|
|
283
|
+
...config,
|
|
284
|
+
};
|
|
285
|
+
|
|
286
|
+
return validateField(fieldConfig);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Creates a string field with the specified configuration.
|
|
291
|
+
*/
|
|
292
|
+
export function stringField<
|
|
293
|
+
TConfig extends Omit<FieldConfig<'string'>, 'type' | 'transform'> & {
|
|
294
|
+
transform?: {
|
|
295
|
+
input?: (value: string) => Primitive | Promise<Primitive>;
|
|
296
|
+
output?: (value: unknown) => string | Promise<string>;
|
|
297
|
+
};
|
|
298
|
+
} & StringFieldOptions,
|
|
299
|
+
>(config: TConfig = {} as TConfig): Field<'string'> {
|
|
300
|
+
return createField('string', config);
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
/**
|
|
304
|
+
* Creates a number field with the specified configuration.
|
|
305
|
+
*/
|
|
306
|
+
export function numberField<
|
|
307
|
+
TConfig extends Omit<FieldConfig<'number'>, 'type' | 'transform'> & {
|
|
308
|
+
transform?: {
|
|
309
|
+
input?: (value: number) => Primitive | Promise<Primitive>;
|
|
310
|
+
output?: (value: unknown) => number | Promise<number>;
|
|
311
|
+
};
|
|
312
|
+
} & NumberFieldOptions,
|
|
313
|
+
>(config: TConfig = {} as TConfig): Field<'number'> {
|
|
314
|
+
return createField('number', config);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Creates a boolean field with the specified configuration.
|
|
319
|
+
*/
|
|
320
|
+
export function booleanField<
|
|
321
|
+
TConfig extends Omit<FieldConfig<'boolean'>, 'type' | 'transform'> & {
|
|
322
|
+
transform?: {
|
|
323
|
+
input?: (value: boolean) => Primitive | Promise<Primitive>;
|
|
324
|
+
output?: (value: unknown) => boolean | Promise<boolean>;
|
|
325
|
+
};
|
|
326
|
+
},
|
|
327
|
+
>(config: TConfig = {} as TConfig): Field<'boolean'> {
|
|
328
|
+
return createField('boolean', config);
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Creates a date field with the specified configuration.
|
|
333
|
+
*/
|
|
334
|
+
export function dateField<
|
|
335
|
+
TConfig extends Omit<
|
|
336
|
+
FieldConfig<'date'>,
|
|
337
|
+
'type' | 'transform' | 'minDate' | 'maxDate' | 'dateOnly' | 'format'
|
|
338
|
+
> & {
|
|
339
|
+
transform?: {
|
|
340
|
+
input?: (value: Date) => Primitive | Promise<Primitive>;
|
|
341
|
+
output?: (value: unknown) => Date | Promise<Date>;
|
|
342
|
+
};
|
|
343
|
+
} & DateFieldOptions,
|
|
344
|
+
>(config: TConfig = {} as TConfig): Field<'date'> {
|
|
345
|
+
const {
|
|
346
|
+
transform = {},
|
|
347
|
+
minDate,
|
|
348
|
+
maxDate,
|
|
349
|
+
dateOnly = false,
|
|
350
|
+
format,
|
|
351
|
+
validator,
|
|
352
|
+
...restConfig
|
|
353
|
+
} = config;
|
|
354
|
+
|
|
355
|
+
// Store the original transform functions
|
|
356
|
+
const originalInputTransform = transform.input;
|
|
357
|
+
const originalOutputTransform = transform.output;
|
|
358
|
+
|
|
359
|
+
// Get the current database type
|
|
360
|
+
const dbType = getDatabaseType();
|
|
361
|
+
|
|
362
|
+
// Create database-aware transform functions for SQLite and MySQL
|
|
363
|
+
const inputTransform = async (value: Date) => {
|
|
364
|
+
// First apply the subject's transform if provided
|
|
365
|
+
let transformedValue = value;
|
|
366
|
+
if (originalInputTransform) {
|
|
367
|
+
transformedValue = (await originalInputTransform(value)) as Date;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// Strip time components if dateOnly is true
|
|
371
|
+
if (dateOnly && transformedValue instanceof Date) {
|
|
372
|
+
const dateOnlyValue = new Date(transformedValue);
|
|
373
|
+
dateOnlyValue.setHours(0, 0, 0, 0);
|
|
374
|
+
transformedValue = dateOnlyValue;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
// Apply special handling for SQLite (and optionally MySQL) to preserve timezone info
|
|
378
|
+
if (dbType === 'sqlite') {
|
|
379
|
+
return superjson.stringify({ date: transformedValue });
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
return transformedValue;
|
|
383
|
+
};
|
|
384
|
+
|
|
385
|
+
const outputTransform = async (value: unknown): Promise<Date> => {
|
|
386
|
+
let parsedValue = value;
|
|
387
|
+
|
|
388
|
+
// Handle SQLite date format (SuperJSON string)
|
|
389
|
+
if (
|
|
390
|
+
dbType === 'sqlite' &&
|
|
391
|
+
typeof value === 'string' &&
|
|
392
|
+
value.includes('"date"')
|
|
393
|
+
) {
|
|
394
|
+
try {
|
|
395
|
+
const parsed = superjson.parse(value);
|
|
396
|
+
parsedValue = (parsed as { date: Date }).date;
|
|
397
|
+
} catch {
|
|
398
|
+
// If parsing fails, keep the original value
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Apply the subject's transform if provided
|
|
403
|
+
if (originalOutputTransform && parsedValue instanceof Date) {
|
|
404
|
+
return await originalOutputTransform(parsedValue);
|
|
405
|
+
}
|
|
406
|
+
// Apply formatting if no custom transform was provided and format is specified
|
|
407
|
+
if (!originalOutputTransform && format && parsedValue instanceof Date) {
|
|
408
|
+
return new Date(
|
|
409
|
+
new Intl.DateTimeFormat(undefined, format).format(parsedValue)
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
return parsedValue as Date;
|
|
414
|
+
};
|
|
415
|
+
|
|
416
|
+
// Create a validator for min/max date constraints
|
|
417
|
+
let dateValidator = validator;
|
|
418
|
+
if ((minDate || maxDate) && !dateValidator) {
|
|
419
|
+
dateValidator = (value: Date) => {
|
|
420
|
+
if (!(value instanceof Date)) {
|
|
421
|
+
return 'Value must be a Date object';
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
if (minDate && value < minDate) {
|
|
425
|
+
return `Date must not be earlier than ${minDate.toISOString()}`;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
if (maxDate && value > maxDate) {
|
|
429
|
+
return `Date must not be later than ${maxDate.toISOString()}`;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
return null;
|
|
433
|
+
};
|
|
434
|
+
}
|
|
435
|
+
// If there's already a validator and min/max constraints, chain them
|
|
436
|
+
else if (
|
|
437
|
+
(minDate || maxDate) &&
|
|
438
|
+
dateValidator &&
|
|
439
|
+
typeof dateValidator === 'function'
|
|
440
|
+
) {
|
|
441
|
+
const originalValidator = dateValidator;
|
|
442
|
+
dateValidator = (value: Date) => {
|
|
443
|
+
if (!(value instanceof Date)) {
|
|
444
|
+
return 'Value must be a Date object';
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// Check min/max constraints
|
|
448
|
+
if (minDate && value < minDate) {
|
|
449
|
+
return `Date must not be earlier than ${minDate.toISOString()}`;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
if (maxDate && value > maxDate) {
|
|
453
|
+
return `Date must not be later than ${maxDate.toISOString()}`;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
// Run the original validator
|
|
457
|
+
return originalValidator(value);
|
|
458
|
+
};
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
return createField('date', {
|
|
462
|
+
...restConfig,
|
|
463
|
+
transform: {
|
|
464
|
+
input: inputTransform,
|
|
465
|
+
output: outputTransform,
|
|
466
|
+
},
|
|
467
|
+
validator: dateValidator,
|
|
468
|
+
});
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
/**
|
|
472
|
+
* Creates a timezone field with the specified configuration.
|
|
473
|
+
* Convenience wrapper around createField with timezone type.
|
|
474
|
+
*
|
|
475
|
+
* @template TConfig - The configuration type for the field
|
|
476
|
+
*
|
|
477
|
+
* @param config - Configuration options for the field
|
|
478
|
+
* @returns A fully configured timezone field definition
|
|
479
|
+
*
|
|
480
|
+
* @example
|
|
481
|
+
* ```typescript
|
|
482
|
+
* // Create a required timezone field with a default value
|
|
483
|
+
* const timezoneField = {
|
|
484
|
+
* timezone: timezoneField({
|
|
485
|
+
* required: true,
|
|
486
|
+
* defaultValue: COMMON_TIMEZONES.UTC
|
|
487
|
+
* })
|
|
488
|
+
* };
|
|
489
|
+
*
|
|
490
|
+
* // Create a timezone field with restricted values
|
|
491
|
+
* const regionTimezone = timezoneField({
|
|
492
|
+
* required: true,
|
|
493
|
+
* suggestedValues: [
|
|
494
|
+
* COMMON_TIMEZONES.EASTERN,
|
|
495
|
+
* COMMON_TIMEZONES.CENTRAL,
|
|
496
|
+
* COMMON_TIMEZONES.MOUNTAIN,
|
|
497
|
+
* COMMON_TIMEZONES.PACIFIC
|
|
498
|
+
* ],
|
|
499
|
+
* restrictToSuggestedValues: true
|
|
500
|
+
* });
|
|
501
|
+
* ```
|
|
502
|
+
*
|
|
503
|
+
* @remarks
|
|
504
|
+
* The timezone field stores timezone identifiers according to the IANA timezone database.
|
|
505
|
+
* It validates timezone strings to ensure they are valid IANA timezone identifiers.
|
|
506
|
+
*/
|
|
507
|
+
export function timezoneField<
|
|
508
|
+
TConfig extends Omit<FieldConfig<'timezone'>, 'type' | 'transform'> & {
|
|
509
|
+
transform?: {
|
|
510
|
+
input?: (value: string) => string | Promise<string>;
|
|
511
|
+
output?: (value: unknown) => string | Promise<string>;
|
|
512
|
+
};
|
|
513
|
+
} & TimezoneFieldOptions,
|
|
514
|
+
>(config: TConfig = {} as TConfig): Field<'timezone'> {
|
|
515
|
+
const {
|
|
516
|
+
validateTimezone = true,
|
|
517
|
+
suggestedValues,
|
|
518
|
+
restrictToSuggestedValues = false,
|
|
519
|
+
transform = {},
|
|
520
|
+
...restConfig
|
|
521
|
+
} = config;
|
|
522
|
+
|
|
523
|
+
// Store the original transform functions
|
|
524
|
+
const originalInputTransform = transform.input;
|
|
525
|
+
const originalOutputTransform = transform.output;
|
|
526
|
+
|
|
527
|
+
// Create a validator for timezone format if validation is enabled
|
|
528
|
+
const validateIANATimezone = (timezone: string): string | null => {
|
|
529
|
+
// If we're restricting to suggested values, check that first
|
|
530
|
+
if (restrictToSuggestedValues && suggestedValues) {
|
|
531
|
+
if (!suggestedValues.includes(timezone)) {
|
|
532
|
+
return `Timezone must be one of the suggested values: ${suggestedValues.join(', ')}`;
|
|
533
|
+
}
|
|
534
|
+
// If it's in the suggested values, we can skip the Intl validation
|
|
535
|
+
return null;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
try {
|
|
539
|
+
// Use Intl.DateTimeFormat to validate the timezone
|
|
540
|
+
Intl.DateTimeFormat(undefined, { timeZone: timezone });
|
|
541
|
+
return null;
|
|
542
|
+
} catch {
|
|
543
|
+
return 'Invalid timezone identifier. Must be a valid IANA timezone.';
|
|
544
|
+
}
|
|
545
|
+
};
|
|
546
|
+
|
|
547
|
+
// Custom input transform that applies validation if enabled
|
|
548
|
+
const inputTransform = async (value: string): Promise<string> => {
|
|
549
|
+
// First apply the subject's transform if provided
|
|
550
|
+
let transformedValue = value;
|
|
551
|
+
if (originalInputTransform) {
|
|
552
|
+
transformedValue = await originalInputTransform(value);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
return transformedValue;
|
|
556
|
+
};
|
|
557
|
+
|
|
558
|
+
// Output transform
|
|
559
|
+
const outputTransform = async (value: unknown): Promise<string> => {
|
|
560
|
+
let parsedValue = value;
|
|
561
|
+
|
|
562
|
+
// Then apply the subject's transform if provided
|
|
563
|
+
if (originalOutputTransform && typeof parsedValue === 'string') {
|
|
564
|
+
parsedValue = await originalOutputTransform(parsedValue);
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
return parsedValue as string;
|
|
568
|
+
};
|
|
569
|
+
|
|
570
|
+
// Create the validator function
|
|
571
|
+
const validator = validateTimezone
|
|
572
|
+
? (value: string) => {
|
|
573
|
+
if (value === null || value === undefined) {
|
|
574
|
+
return null;
|
|
575
|
+
}
|
|
576
|
+
return validateIANATimezone(value);
|
|
577
|
+
}
|
|
578
|
+
: config.validator;
|
|
579
|
+
|
|
580
|
+
return createField('timezone', {
|
|
581
|
+
...restConfig,
|
|
582
|
+
transform: {
|
|
583
|
+
input: inputTransform,
|
|
584
|
+
output: outputTransform,
|
|
585
|
+
},
|
|
586
|
+
validator,
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
|
|
590
|
+
/**
|
|
591
|
+
* Creates a string array field with the specified configuration.
|
|
592
|
+
*/
|
|
593
|
+
export function stringArrayField<
|
|
594
|
+
TConfig extends Omit<FieldConfig<'string[]'>, 'type' | 'transform'> & {
|
|
595
|
+
transform?: {
|
|
596
|
+
input?: (value: string[]) => Primitive | Promise<Primitive>;
|
|
597
|
+
output?: (value: unknown) => string[] | Promise<string[]>;
|
|
598
|
+
};
|
|
599
|
+
},
|
|
600
|
+
>(config: TConfig = {} as TConfig): Field<'string[]'> {
|
|
601
|
+
return createField('string[]', config);
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
/**
|
|
605
|
+
* Creates a number array field with the specified configuration.
|
|
606
|
+
*/
|
|
607
|
+
export function numberArrayField<
|
|
608
|
+
TConfig extends Omit<FieldConfig<'number[]'>, 'type' | 'transform'> & {
|
|
609
|
+
transform?: {
|
|
610
|
+
input?: (value: number[]) => Primitive | Promise<Primitive>;
|
|
611
|
+
output?: (value: unknown) => number[] | Promise<number[]>;
|
|
612
|
+
};
|
|
613
|
+
},
|
|
614
|
+
>(config: TConfig = {} as TConfig): Field<'number[]'> {
|
|
615
|
+
return createField('number[]', config);
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
/**
|
|
619
|
+
* Creates a JSON field with the specified configuration.
|
|
620
|
+
*/
|
|
621
|
+
export function jsonField<
|
|
622
|
+
TConfig extends Omit<FieldConfig<'json'>, 'type' | 'transform'> & {
|
|
623
|
+
transform?: {
|
|
624
|
+
input?: (value: JsonValue) => Primitive | Promise<Primitive>;
|
|
625
|
+
output?: (value: unknown) => JsonValue | Promise<JsonValue>;
|
|
626
|
+
};
|
|
627
|
+
} & JsonFieldOptions,
|
|
628
|
+
>(config: TConfig = {} as TConfig): Field<'json'> {
|
|
629
|
+
const { validateJson = true, transform = {}, ...restConfig } = config;
|
|
630
|
+
|
|
631
|
+
// Store the original transform functions
|
|
632
|
+
const originalInputTransform = transform.input;
|
|
633
|
+
const originalOutputTransform = transform.output;
|
|
634
|
+
|
|
635
|
+
// Create database-aware transform functions
|
|
636
|
+
const inputTransform = async (value: JsonValue): Promise<Primitive> => {
|
|
637
|
+
// First apply the subject's transform if provided
|
|
638
|
+
let transformedValue = value;
|
|
639
|
+
if (originalInputTransform) {
|
|
640
|
+
const result = await originalInputTransform(value);
|
|
641
|
+
if (result === undefined || result === null) {
|
|
642
|
+
throw new Error('Transform returned invalid value');
|
|
643
|
+
}
|
|
644
|
+
transformedValue = result instanceof Date ? result.toISOString() : result;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
// Then apply database-specific serialization
|
|
648
|
+
if (
|
|
649
|
+
typeof transformedValue !== 'string' &&
|
|
650
|
+
typeof transformedValue !== 'number' &&
|
|
651
|
+
typeof transformedValue !== 'boolean'
|
|
652
|
+
) {
|
|
653
|
+
throw new Error('Invalid primitive value');
|
|
654
|
+
}
|
|
655
|
+
const isPrimitive = (value: unknown): value is Primitive =>
|
|
656
|
+
typeof value === 'string' ||
|
|
657
|
+
typeof value === 'number' ||
|
|
658
|
+
typeof value === 'boolean';
|
|
659
|
+
|
|
660
|
+
if (!isPrimitive(transformedValue)) {
|
|
661
|
+
throw new Error('Invalid primitive value');
|
|
662
|
+
}
|
|
663
|
+
return transformForDb(transformedValue);
|
|
664
|
+
};
|
|
665
|
+
|
|
666
|
+
const outputTransform = async (value: unknown): Promise<JsonValue> => {
|
|
667
|
+
// First parse from database format
|
|
668
|
+
let parsedValue = parseFromDb(value);
|
|
669
|
+
|
|
670
|
+
// Then apply the subject's transform if provided
|
|
671
|
+
if (
|
|
672
|
+
originalOutputTransform &&
|
|
673
|
+
typeof parsedValue === 'object' &&
|
|
674
|
+
parsedValue !== null
|
|
675
|
+
) {
|
|
676
|
+
parsedValue = await originalOutputTransform(parsedValue);
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
return parsedValue as JsonValue;
|
|
680
|
+
};
|
|
681
|
+
|
|
682
|
+
let jsonValidator = config.validator;
|
|
683
|
+
|
|
684
|
+
// If validateJson is true and no validator is specified, add JSON validation
|
|
685
|
+
if (validateJson && !jsonValidator) {
|
|
686
|
+
jsonValidator = (value: JsonValue) => {
|
|
687
|
+
try {
|
|
688
|
+
superjson.stringify(value);
|
|
689
|
+
return null;
|
|
690
|
+
} catch (error) {
|
|
691
|
+
return `Invalid JSON structure: ${(error as Error).message}`;
|
|
692
|
+
}
|
|
693
|
+
};
|
|
694
|
+
}
|
|
695
|
+
// If validateJson is true and there's an existing validator, chain them
|
|
696
|
+
else if (validateJson && jsonValidator) {
|
|
697
|
+
const originalValidator = jsonValidator;
|
|
698
|
+
jsonValidator = (value: JsonValue) => {
|
|
699
|
+
try {
|
|
700
|
+
superjson.stringify(value);
|
|
701
|
+
if (typeof originalValidator === 'function') {
|
|
702
|
+
return originalValidator(value);
|
|
703
|
+
}
|
|
704
|
+
return null;
|
|
705
|
+
} catch (error) {
|
|
706
|
+
return `Invalid JSON structure: ${(error as Error).message}`;
|
|
707
|
+
}
|
|
708
|
+
};
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
return createField('json', {
|
|
712
|
+
...restConfig,
|
|
713
|
+
validator: jsonValidator,
|
|
714
|
+
transform: {
|
|
715
|
+
input: inputTransform,
|
|
716
|
+
output: outputTransform,
|
|
717
|
+
},
|
|
718
|
+
});
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
/**
|
|
722
|
+
* Utility functions for working with dates and timezones.
|
|
723
|
+
* Provides helper methods for common date and timezone operations.
|
|
724
|
+
*/
|
|
725
|
+
export const DateTimeUtils = {
|
|
726
|
+
/**
|
|
727
|
+
* Creates a Date object in a specific timezone.
|
|
728
|
+
*
|
|
729
|
+
* @param dateInput - Date object or ISO string to convert
|
|
730
|
+
* @param timezone - Target timezone (IANA timezone identifier)
|
|
731
|
+
* @returns Date object adjusted for the specified timezone
|
|
732
|
+
*/
|
|
733
|
+
createDateInTimezone: (dateInput: Date | string, timezone: string): Date => {
|
|
734
|
+
const date =
|
|
735
|
+
typeof dateInput === 'string' ? new Date(dateInput) : new Date(dateInput);
|
|
736
|
+
|
|
737
|
+
// Get the target timezone's current offset from UTC
|
|
738
|
+
const formatter = new Intl.DateTimeFormat('en-US', {
|
|
739
|
+
timeZone: timezone,
|
|
740
|
+
timeZoneName: 'short',
|
|
741
|
+
});
|
|
742
|
+
|
|
743
|
+
// Format the date in the target timezone to get correct representation
|
|
744
|
+
const formattedDate = formatter.format(date);
|
|
745
|
+
return new Date(formattedDate);
|
|
746
|
+
},
|
|
747
|
+
|
|
748
|
+
/**
|
|
749
|
+
* Formats a date according to the specified timezone.
|
|
750
|
+
*
|
|
751
|
+
* @param date - The date to format
|
|
752
|
+
* @param timezone - Target timezone (IANA timezone identifier)
|
|
753
|
+
* @param options - Formatting options for Intl.DateTimeFormat
|
|
754
|
+
* @returns Formatted date string in the specified timezone
|
|
755
|
+
*/
|
|
756
|
+
formatInTimezone: (
|
|
757
|
+
date: Date,
|
|
758
|
+
timezone: string,
|
|
759
|
+
options: Intl.DateTimeFormatOptions = {
|
|
760
|
+
year: 'numeric',
|
|
761
|
+
month: 'numeric',
|
|
762
|
+
day: 'numeric',
|
|
763
|
+
hour: 'numeric',
|
|
764
|
+
minute: 'numeric',
|
|
765
|
+
second: 'numeric',
|
|
766
|
+
timeZoneName: 'short',
|
|
767
|
+
}
|
|
768
|
+
): string => {
|
|
769
|
+
return new Intl.DateTimeFormat('en-US', {
|
|
770
|
+
...options,
|
|
771
|
+
timeZone: timezone,
|
|
772
|
+
}).format(date);
|
|
773
|
+
},
|
|
774
|
+
|
|
775
|
+
/**
|
|
776
|
+
* Gets the current date in a specific timezone.
|
|
777
|
+
*
|
|
778
|
+
* @param timezone - Target timezone (IANA timezone identifier)
|
|
779
|
+
* @returns Current date adjusted for the specified timezone
|
|
780
|
+
*/
|
|
781
|
+
getNowInTimezone: (timezone: string): Date => {
|
|
782
|
+
return DateTimeUtils.createDateInTimezone(new Date(), timezone);
|
|
783
|
+
},
|
|
784
|
+
|
|
785
|
+
/**
|
|
786
|
+
* Calculates the offset in minutes between the local timezone and the specified timezone.
|
|
787
|
+
*
|
|
788
|
+
* @param timezone - Target timezone (IANA timezone identifier)
|
|
789
|
+
* @param date - Optional date to calculate the offset for (defaults to current date)
|
|
790
|
+
* @returns Offset in minutes between local and specified timezone
|
|
791
|
+
*/
|
|
792
|
+
getTimezoneOffset: (timezone: string, date: Date = new Date()): number => {
|
|
793
|
+
// Calculate the client's timezone offset in minutes
|
|
794
|
+
const localOffset = date.getTimezoneOffset();
|
|
795
|
+
|
|
796
|
+
// Get the target timezone offset
|
|
797
|
+
const targetDate = new Date(
|
|
798
|
+
date.toLocaleString('en-US', { timeZone: timezone })
|
|
799
|
+
);
|
|
800
|
+
const targetOffset = (date.getTime() - targetDate.getTime()) / 60000;
|
|
801
|
+
|
|
802
|
+
return localOffset - targetOffset;
|
|
803
|
+
},
|
|
804
|
+
};
|