@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,563 @@
|
|
|
1
|
+
// /**
|
|
2
|
+
// * Geo Plugin for c15t
|
|
3
|
+
// *
|
|
4
|
+
// * This plugin provides geolocation detection and jurisdiction-based consent management.
|
|
5
|
+
// * It identifies subjects' locations based on their IP addresses and applies appropriate
|
|
6
|
+
// * jurisdiction-specific consent rules based on their geography.
|
|
7
|
+
// *
|
|
8
|
+
// * Features:
|
|
9
|
+
// * - IP-based location detection using various headers or geolocation services
|
|
10
|
+
// * - Jurisdiction mapping based on country/region
|
|
11
|
+
// * - Automatic application of required consent purposes based on jurisdiction
|
|
12
|
+
// * - Client and server APIs for accessing location information
|
|
13
|
+
// *
|
|
14
|
+
// * @example
|
|
15
|
+
// * ```typescript
|
|
16
|
+
// * import { geo, geoClient } from '@c15t/plugins/geo';
|
|
17
|
+
// *
|
|
18
|
+
// * // Server-side setup
|
|
19
|
+
// * const c15t = createc15t({
|
|
20
|
+
// * plugins: [
|
|
21
|
+
// * geo({
|
|
22
|
+
// * jurisdictions: [
|
|
23
|
+
// * {
|
|
24
|
+
// * code: 'GDPR',
|
|
25
|
+
// * countries: ['AT', 'BE', 'BG', 'HR', 'CY', 'CZ', 'DK', 'EE', 'FI', 'FR', 'DE', 'GR', 'HU', 'IE', 'IT', 'LV', 'LT', 'LU', 'MT', 'NL', 'PL', 'PT', 'RO', 'SK', 'SI', 'ES', 'SE'],
|
|
26
|
+
// * requiredPurposes: ['essential'],
|
|
27
|
+
// * defaultPurposes: []
|
|
28
|
+
// * },
|
|
29
|
+
// * {
|
|
30
|
+
// * code: 'CCPA',
|
|
31
|
+
// * countries: ['US'],
|
|
32
|
+
// * regions: { 'US': ['CA'] },
|
|
33
|
+
// * requiredPurposes: ['essential'],
|
|
34
|
+
// * defaultPurposes: ['analytics']
|
|
35
|
+
// * }
|
|
36
|
+
// * ]
|
|
37
|
+
// * })
|
|
38
|
+
// * ]
|
|
39
|
+
// * });
|
|
40
|
+
// *
|
|
41
|
+
// * // Client-side usage
|
|
42
|
+
// * const client = createc15tClient({
|
|
43
|
+
// * plugins: [geoClient()]
|
|
44
|
+
// * });
|
|
45
|
+
// *
|
|
46
|
+
// * // Get the subject's jurisdiction
|
|
47
|
+
// * const { jurisdiction, country } = await client.geo.getJurisdiction();
|
|
48
|
+
// * console.log(`Subject is in ${country} under ${jurisdiction} jurisdiction`);
|
|
49
|
+
// * ```
|
|
50
|
+
// */
|
|
51
|
+
|
|
52
|
+
// import type { c15tClient } from '~/client';
|
|
53
|
+
// import { createAuthEndpoint, createAuthMiddleware } from '../../api/call';
|
|
54
|
+
// import type {
|
|
55
|
+
// C15TPlugin,
|
|
56
|
+
// LoggerMetadata,
|
|
57
|
+
// C15TContext,
|
|
58
|
+
// EndpointContext,
|
|
59
|
+
// } from '~/types';
|
|
60
|
+
// import type { MiddlewareContext, MiddlewareOptions } from 'better-call';
|
|
61
|
+
|
|
62
|
+
// /**
|
|
63
|
+
// * Extension of the request context with geolocation information
|
|
64
|
+
// *
|
|
65
|
+
// * This interface adds geographic information to request contexts
|
|
66
|
+
// * when using the geo middleware.
|
|
67
|
+
// */
|
|
68
|
+
// interface GeoContext {
|
|
69
|
+
// /**
|
|
70
|
+
// * Geolocation information for the current request
|
|
71
|
+
// */
|
|
72
|
+
// geo?: {
|
|
73
|
+
// /**
|
|
74
|
+
// * IP address of the visitor, used for geolocation
|
|
75
|
+
// */
|
|
76
|
+
// ip: string;
|
|
77
|
+
|
|
78
|
+
// /**
|
|
79
|
+
// * ISO 3166-1 alpha-2 country code (e.g., 'US', 'GB', 'DE')
|
|
80
|
+
// */
|
|
81
|
+
// country?: string;
|
|
82
|
+
|
|
83
|
+
// /**
|
|
84
|
+
// * Region or state code within the country
|
|
85
|
+
// * For the US, this would be the two-letter state code (e.g., 'CA' for California)
|
|
86
|
+
// */
|
|
87
|
+
// region?: string;
|
|
88
|
+
|
|
89
|
+
// /**
|
|
90
|
+
// * Source of the geolocation data (e.g., 'cloudflare-headers', 'ipapi', 'ip-only')
|
|
91
|
+
// */
|
|
92
|
+
// source: string;
|
|
93
|
+
// };
|
|
94
|
+
// }
|
|
95
|
+
|
|
96
|
+
// /**
|
|
97
|
+
// * Configuration options for the geo plugin
|
|
98
|
+
// */
|
|
99
|
+
// interface GeoPluginOptions {
|
|
100
|
+
// /**
|
|
101
|
+
// * Enable geo-targeting functionality
|
|
102
|
+
// * When disabled, no geolocation detection will occur
|
|
103
|
+
// *
|
|
104
|
+
// * @default true
|
|
105
|
+
// */
|
|
106
|
+
// enabled?: boolean;
|
|
107
|
+
|
|
108
|
+
// /**
|
|
109
|
+
// * HTTP headers to check for the client's IP address, in order of preference
|
|
110
|
+
// * The first header that contains a value will be used
|
|
111
|
+
// *
|
|
112
|
+
// * @default ['cf-connecting-ip', 'x-forwarded-for', 'x-real-ip']
|
|
113
|
+
// */
|
|
114
|
+
// ipHeaders?: string[];
|
|
115
|
+
|
|
116
|
+
// /**
|
|
117
|
+
// * Jurisdiction rules for different geographic regions
|
|
118
|
+
// * Used to map countries and regions to specific consent requirements
|
|
119
|
+
// */
|
|
120
|
+
// jurisdictions?: Array<{
|
|
121
|
+
// /**
|
|
122
|
+
// * Unique identifier for the jurisdiction (e.g., 'GDPR', 'CCPA', 'LGPD')
|
|
123
|
+
// */
|
|
124
|
+
// code: string;
|
|
125
|
+
|
|
126
|
+
// /**
|
|
127
|
+
// * Array of ISO 3166-1 alpha-2 country codes this jurisdiction applies to
|
|
128
|
+
// * For example: ['US'] for United States or ['DE', 'FR', 'IT'] for multiple EU countries
|
|
129
|
+
// */
|
|
130
|
+
// countries: string[];
|
|
131
|
+
|
|
132
|
+
// /**
|
|
133
|
+
// * Specific regions within countries where this jurisdiction applies
|
|
134
|
+
// * Useful for state/province-specific regulations like CCPA in California
|
|
135
|
+
// *
|
|
136
|
+
// * @example
|
|
137
|
+
// * ```
|
|
138
|
+
// * regions: { 'US': ['CA', 'VA'] } // For California and Virginia
|
|
139
|
+
// * ```
|
|
140
|
+
// */
|
|
141
|
+
// regions?: Record<string, string[]>;
|
|
142
|
+
|
|
143
|
+
// /**
|
|
144
|
+
// * Consent purposes that must always be accepted in this jurisdiction
|
|
145
|
+
// * These will be automatically set to true regardless of subject choice
|
|
146
|
+
// */
|
|
147
|
+
// requiredPurposes?: string[];
|
|
148
|
+
|
|
149
|
+
// /**
|
|
150
|
+
// * Consent purposes that are enabled by default in this jurisdiction
|
|
151
|
+
// * Subjects can still opt out of these purposes
|
|
152
|
+
// */
|
|
153
|
+
// defaultPurposes?: string[];
|
|
154
|
+
// }>;
|
|
155
|
+
|
|
156
|
+
// /**
|
|
157
|
+
// * Configuration for IP geolocation service
|
|
158
|
+
// */
|
|
159
|
+
// geoService?: {
|
|
160
|
+
// /**
|
|
161
|
+
// * Type of geolocation service to use
|
|
162
|
+
// * - 'cloudflare': Use Cloudflare's country headers (automatically used if available)
|
|
163
|
+
// * - 'maxmind': Use MaxMind GeoIP database (requires separate setup)
|
|
164
|
+
// * - 'ipapi': Use ipapi.co service
|
|
165
|
+
// * - 'custom': Use a custom function to resolve locations
|
|
166
|
+
// */
|
|
167
|
+
// type: 'cloudflare' | 'maxmind' | 'ipapi' | 'custom';
|
|
168
|
+
|
|
169
|
+
// /**
|
|
170
|
+
// * Custom function for geolocation lookup when type is 'custom'
|
|
171
|
+
// *
|
|
172
|
+
// * @param ip - The IP address to look up
|
|
173
|
+
// * @returns Promise resolving to location data or null if not found
|
|
174
|
+
// */
|
|
175
|
+
// getLocation?: (ip: string) => Promise<{
|
|
176
|
+
// country?: string;
|
|
177
|
+
// region?: string;
|
|
178
|
+
// city?: string;
|
|
179
|
+
// } | null>;
|
|
180
|
+
|
|
181
|
+
// /**
|
|
182
|
+
// * API key for services that require authentication
|
|
183
|
+
// */
|
|
184
|
+
// apiKey?: string;
|
|
185
|
+
// };
|
|
186
|
+
// }
|
|
187
|
+
|
|
188
|
+
// /**
|
|
189
|
+
// * Creates a geo plugin instance for c15t
|
|
190
|
+
// *
|
|
191
|
+
// * This plugin adds geolocation capabilities to the consent management system,
|
|
192
|
+
// * allowing for jurisdiction-specific consent rules based on subject location.
|
|
193
|
+
// *
|
|
194
|
+
// * @param options - Configuration options for the geo plugin
|
|
195
|
+
// * @returns A configured geo plugin instance
|
|
196
|
+
// */
|
|
197
|
+
// export const geo = (options?: GeoPluginOptions): C15TPlugin => {
|
|
198
|
+
// const ipHeaders = options?.ipHeaders || [
|
|
199
|
+
// 'cf-connecting-ip',
|
|
200
|
+
// 'x-forwarded-for',
|
|
201
|
+
// 'x-real-ip',
|
|
202
|
+
// ];
|
|
203
|
+
|
|
204
|
+
// // Type for the extended context with geo information
|
|
205
|
+
// type GeoEndpointContext = EndpointContext & GeoContext;
|
|
206
|
+
|
|
207
|
+
// /**
|
|
208
|
+
// * Middleware that detects visitor location from IP address
|
|
209
|
+
// * Adds geo information to the request context
|
|
210
|
+
// */
|
|
211
|
+
// const geoMiddleware = createAuthMiddleware(
|
|
212
|
+
// async (ctx: MiddlewareContext<MiddlewareOptions>) => {
|
|
213
|
+
// // Skip if disabled
|
|
214
|
+
// if (options?.enabled === false) {
|
|
215
|
+
// return { geo: null };
|
|
216
|
+
// }
|
|
217
|
+
|
|
218
|
+
// // Get IP address safely
|
|
219
|
+
// let ip = 'unknown';
|
|
220
|
+
// for (const header of ipHeaders) {
|
|
221
|
+
// const headerValue = ctx.headers?.get?.(header);
|
|
222
|
+
// if (headerValue) {
|
|
223
|
+
// // Handle null or undefined headerValue
|
|
224
|
+
// ip = headerValue.split(',')[0]?.trim() || 'unknown';
|
|
225
|
+
// break;
|
|
226
|
+
// }
|
|
227
|
+
// }
|
|
228
|
+
|
|
229
|
+
// // Get country from Cloudflare headers if available
|
|
230
|
+
// const cfCountry = ctx.headers?.get?.('cf-ipcountry');
|
|
231
|
+
// const cfRegion = ctx.headers?.get?.('cf-region');
|
|
232
|
+
|
|
233
|
+
// if (cfCountry) {
|
|
234
|
+
// return {
|
|
235
|
+
// geo: {
|
|
236
|
+
// ip,
|
|
237
|
+
// country: cfCountry,
|
|
238
|
+
// region: cfRegion || undefined,
|
|
239
|
+
// source: 'cloudflare-headers',
|
|
240
|
+
// },
|
|
241
|
+
// };
|
|
242
|
+
// }
|
|
243
|
+
|
|
244
|
+
// // Otherwise use configured geo service
|
|
245
|
+
// if (options?.geoService) {
|
|
246
|
+
// try {
|
|
247
|
+
// let location = null;
|
|
248
|
+
|
|
249
|
+
// if (
|
|
250
|
+
// options.geoService.type === 'custom' &&
|
|
251
|
+
// options.geoService.getLocation
|
|
252
|
+
// ) {
|
|
253
|
+
// location = await options.geoService.getLocation(ip);
|
|
254
|
+
// } else if (options.geoService.type === 'ipapi') {
|
|
255
|
+
// // Simple IP API implementation
|
|
256
|
+
// const response = await fetch(`https://ipapi.co/${ip}/json/`);
|
|
257
|
+
// if (response.ok) {
|
|
258
|
+
// const data = await response.json();
|
|
259
|
+
// location = {
|
|
260
|
+
// country: data.country_code,
|
|
261
|
+
// region: data.region_code,
|
|
262
|
+
// city: data.city,
|
|
263
|
+
// };
|
|
264
|
+
// }
|
|
265
|
+
// }
|
|
266
|
+
// // Add other geo service implementations as needed
|
|
267
|
+
|
|
268
|
+
// if (location) {
|
|
269
|
+
// return {
|
|
270
|
+
// geo: {
|
|
271
|
+
// ip,
|
|
272
|
+
// ...location,
|
|
273
|
+
// source: options.geoService.type,
|
|
274
|
+
// },
|
|
275
|
+
// };
|
|
276
|
+
// }
|
|
277
|
+
// } catch (error) {
|
|
278
|
+
// ctx.context.logger?.error(
|
|
279
|
+
// 'Error getting geolocation',
|
|
280
|
+
// error as LoggerMetadata
|
|
281
|
+
// );
|
|
282
|
+
// }
|
|
283
|
+
// }
|
|
284
|
+
|
|
285
|
+
// // Fallback - no location data
|
|
286
|
+
// return {
|
|
287
|
+
// geo: {
|
|
288
|
+
// ip,
|
|
289
|
+
// source: 'ip-only',
|
|
290
|
+
// },
|
|
291
|
+
// };
|
|
292
|
+
// }
|
|
293
|
+
// );
|
|
294
|
+
|
|
295
|
+
// return {
|
|
296
|
+
// id: 'geo',
|
|
297
|
+
|
|
298
|
+
// /**
|
|
299
|
+
// * Initialize the geo plugin
|
|
300
|
+
// *
|
|
301
|
+
// * Sets up the plugin configuration and registers it with the c15t instance
|
|
302
|
+
// *
|
|
303
|
+
// * @param context - The c15t consent context
|
|
304
|
+
// * @returns Object containing modifications to options
|
|
305
|
+
// */
|
|
306
|
+
// init(context: C15TContext) {
|
|
307
|
+
// // Add the geo configuration to the global options
|
|
308
|
+
// context.options.geo = {
|
|
309
|
+
// ...context.options.geo,
|
|
310
|
+
// enabled: options?.enabled !== false,
|
|
311
|
+
// };
|
|
312
|
+
|
|
313
|
+
// // Return an object with options to satisfy the return type
|
|
314
|
+
// return {
|
|
315
|
+
// options: {
|
|
316
|
+
// geo: {
|
|
317
|
+
// enabled: options?.enabled !== false,
|
|
318
|
+
// },
|
|
319
|
+
// },
|
|
320
|
+
// };
|
|
321
|
+
// },
|
|
322
|
+
|
|
323
|
+
// endpoints: {
|
|
324
|
+
// /**
|
|
325
|
+
// * Endpoint that returns the detected jurisdiction for the current subject
|
|
326
|
+
// *
|
|
327
|
+
// * This endpoint uses geolocation to determine which jurisdiction's rules
|
|
328
|
+
// * should apply to the current subject, based on their country and region.
|
|
329
|
+
// *
|
|
330
|
+
// * @example
|
|
331
|
+
// * GET /geo/jurisdiction
|
|
332
|
+
// * Response:
|
|
333
|
+
// * {
|
|
334
|
+
// * "jurisdiction": "GDPR",
|
|
335
|
+
// * "country": "DE",
|
|
336
|
+
// * "region": null,
|
|
337
|
+
// * "requiredPurposes": ["essential"],
|
|
338
|
+
// * "defaultPurposes": []
|
|
339
|
+
// * }
|
|
340
|
+
// */
|
|
341
|
+
// getJurisdiction: createAuthEndpoint(
|
|
342
|
+
// '/jurisdiction',
|
|
343
|
+
// {
|
|
344
|
+
// method: 'GET',
|
|
345
|
+
// use: [geoMiddleware],
|
|
346
|
+
// },
|
|
347
|
+
// async (ctx) => {
|
|
348
|
+
// const geo = (ctx as unknown as GeoEndpointContext).geo;
|
|
349
|
+
|
|
350
|
+
// if (!geo || !geo.country) {
|
|
351
|
+
// return ctx.json({
|
|
352
|
+
// jurisdiction: 'UNKNOWN',
|
|
353
|
+
// country: geo?.country || 'UNKNOWN',
|
|
354
|
+
// region: geo?.region,
|
|
355
|
+
// requiredPurposes: [],
|
|
356
|
+
// defaultPurposes: [],
|
|
357
|
+
// });
|
|
358
|
+
// }
|
|
359
|
+
|
|
360
|
+
// // Find applicable jurisdiction
|
|
361
|
+
// let jurisdiction = 'UNKNOWN';
|
|
362
|
+
// let requiredPurposes: string[] = [];
|
|
363
|
+
// let defaultPurposes: string[] = [];
|
|
364
|
+
|
|
365
|
+
// if (options?.jurisdictions && options.jurisdictions.length > 0) {
|
|
366
|
+
// for (const j of options.jurisdictions) {
|
|
367
|
+
// // Check if country matches
|
|
368
|
+
// if (j.countries.includes(geo.country)) {
|
|
369
|
+
// // If regions are specified, check if region matches
|
|
370
|
+
// let regionMatch = true;
|
|
371
|
+
// if (j.regions && geo.region && j.regions[geo.country]) {
|
|
372
|
+
// // Make sure we safely check if regions[country] exists before using includes
|
|
373
|
+
// regionMatch =
|
|
374
|
+
// j.regions[geo.country]?.includes(geo.region) ?? false;
|
|
375
|
+
// }
|
|
376
|
+
|
|
377
|
+
// if (regionMatch) {
|
|
378
|
+
// jurisdiction = j.code;
|
|
379
|
+
// requiredPurposes = j.requiredPurposes || [];
|
|
380
|
+
// defaultPurposes = j.defaultPurposes || [];
|
|
381
|
+
// break;
|
|
382
|
+
// }
|
|
383
|
+
// }
|
|
384
|
+
// }
|
|
385
|
+
// }
|
|
386
|
+
|
|
387
|
+
// return ctx.json({
|
|
388
|
+
// jurisdiction,
|
|
389
|
+
// country: geo.country,
|
|
390
|
+
// region: geo.region,
|
|
391
|
+
// requiredPurposes,
|
|
392
|
+
// defaultPurposes,
|
|
393
|
+
// });
|
|
394
|
+
// }
|
|
395
|
+
// ),
|
|
396
|
+
|
|
397
|
+
// /**
|
|
398
|
+
// * Endpoint that returns geolocation information for the current subject
|
|
399
|
+
// *
|
|
400
|
+
// * This endpoint provides raw geolocation data, including IP address
|
|
401
|
+
// * and detected country/region.
|
|
402
|
+
// *
|
|
403
|
+
// * @example
|
|
404
|
+
// * GET /geo/location
|
|
405
|
+
// * Response:
|
|
406
|
+
// * {
|
|
407
|
+
// * "ip": "203.0.113.195",
|
|
408
|
+
// * "country": "US",
|
|
409
|
+
// * "region": "CA",
|
|
410
|
+
// * "source": "cloudflare-headers"
|
|
411
|
+
// * }
|
|
412
|
+
// */
|
|
413
|
+
// getGeoInfo: createAuthEndpoint(
|
|
414
|
+
// '/location',
|
|
415
|
+
// {
|
|
416
|
+
// method: 'GET',
|
|
417
|
+
// use: [geoMiddleware],
|
|
418
|
+
// },
|
|
419
|
+
// async (ctx) => {
|
|
420
|
+
// // Return the geo information that was added by the middleware
|
|
421
|
+
// const geo = (ctx as unknown as GeoEndpointContext).geo;
|
|
422
|
+
|
|
423
|
+
// return ctx.json({
|
|
424
|
+
// ip: geo?.ip,
|
|
425
|
+
// country: geo?.country,
|
|
426
|
+
// region: geo?.region,
|
|
427
|
+
// source: geo?.source,
|
|
428
|
+
// });
|
|
429
|
+
// }
|
|
430
|
+
// ),
|
|
431
|
+
// },
|
|
432
|
+
|
|
433
|
+
// hooks: {
|
|
434
|
+
// /**
|
|
435
|
+
// * Before-request hooks to apply jurisdiction rules
|
|
436
|
+
// *
|
|
437
|
+
// * These hooks are executed before processing consent-related requests
|
|
438
|
+
// * and automatically apply jurisdiction-specific rules.
|
|
439
|
+
// */
|
|
440
|
+
// before: [
|
|
441
|
+
// {
|
|
442
|
+
// /**
|
|
443
|
+
// * Hook matcher for consent update requests
|
|
444
|
+
// *
|
|
445
|
+
// * @param context - Request context
|
|
446
|
+
// * @returns Whether this hook should run for the given request
|
|
447
|
+
// */
|
|
448
|
+
// matcher(context) {
|
|
449
|
+
// return context.path === '/update-consent';
|
|
450
|
+
// },
|
|
451
|
+
|
|
452
|
+
// /**
|
|
453
|
+
// * Hook handler that applies jurisdiction-specific consent rules
|
|
454
|
+
// *
|
|
455
|
+
// * This enforces required consent purposes based on the subject's jurisdiction.
|
|
456
|
+
// * For example, in GDPR regions, essential cookies would be required.
|
|
457
|
+
// *
|
|
458
|
+
// * @param ctx - Request context
|
|
459
|
+
// */
|
|
460
|
+
// async handler(ctx) {
|
|
461
|
+
// // If geo plugin is enabled, apply jurisdiction-specific rules
|
|
462
|
+
// if (options?.enabled === false) {
|
|
463
|
+
// return;
|
|
464
|
+
// }
|
|
465
|
+
|
|
466
|
+
// // Get geo information from middleware
|
|
467
|
+
// await geoMiddleware(ctx);
|
|
468
|
+
|
|
469
|
+
// // Access the geo object directly from the context after middleware has run
|
|
470
|
+
// const geoInfo = (ctx as unknown as GeoEndpointContext).geo;
|
|
471
|
+
|
|
472
|
+
// if (!geoInfo?.country) {
|
|
473
|
+
// return;
|
|
474
|
+
// }
|
|
475
|
+
|
|
476
|
+
// // Find applicable jurisdiction
|
|
477
|
+
// if (options?.jurisdictions) {
|
|
478
|
+
// for (const j of options.jurisdictions) {
|
|
479
|
+
// const countryMatch = j.countries.includes(geoInfo.country);
|
|
480
|
+
// let regionMatch = true;
|
|
481
|
+
|
|
482
|
+
// // Check region if specified
|
|
483
|
+
// if (countryMatch && geoInfo.region && j.regions) {
|
|
484
|
+
// // Use optional chaining and nullish coalescing to safely check for region match
|
|
485
|
+
// regionMatch =
|
|
486
|
+
// j.regions[geoInfo.country]?.includes(geoInfo.region) ??
|
|
487
|
+
// false;
|
|
488
|
+
// }
|
|
489
|
+
|
|
490
|
+
// if (countryMatch && regionMatch) {
|
|
491
|
+
// // Apply jurisdiction-specific rules
|
|
492
|
+
// if (j.requiredPurposes && j.requiredPurposes.length > 0) {
|
|
493
|
+
// // Ensure required purposes have consent
|
|
494
|
+
// const body = ctx.body as Record<string, unknown>;
|
|
495
|
+
// if (body.preferences) {
|
|
496
|
+
// for (const purposeId of j.requiredPurposes) {
|
|
497
|
+
// (body.preferences as Record<string, boolean>)[
|
|
498
|
+
// purposeId
|
|
499
|
+
// ] = true;
|
|
500
|
+
// }
|
|
501
|
+
// }
|
|
502
|
+
// }
|
|
503
|
+
// break;
|
|
504
|
+
// }
|
|
505
|
+
// }
|
|
506
|
+
// }
|
|
507
|
+
// },
|
|
508
|
+
// },
|
|
509
|
+
// ],
|
|
510
|
+
// },
|
|
511
|
+
// };
|
|
512
|
+
// };
|
|
513
|
+
|
|
514
|
+
// /**
|
|
515
|
+
// * Creates a client-side geo plugin
|
|
516
|
+
// *
|
|
517
|
+
// * This plugin adds geolocation methods to the c15t client instance,
|
|
518
|
+
// * allowing client-side code to access subject location and jurisdiction information.
|
|
519
|
+
// *
|
|
520
|
+
// * @example
|
|
521
|
+
// * ```typescript
|
|
522
|
+
// * const client = createc15tClient({
|
|
523
|
+
// * plugins: [geoClient()]
|
|
524
|
+
// * });
|
|
525
|
+
// *
|
|
526
|
+
// * // Get jurisdiction information
|
|
527
|
+
// * const { jurisdiction, country, requiredPurposes } = await client.geo.getJurisdiction();
|
|
528
|
+
// *
|
|
529
|
+
// * // Get raw location data
|
|
530
|
+
// * const { ip, country, region } = await client.geo.getLocation();
|
|
531
|
+
// * ```
|
|
532
|
+
// *
|
|
533
|
+
// * @returns A client plugin with geo methods
|
|
534
|
+
// */
|
|
535
|
+
// export const geoClient = () => {
|
|
536
|
+
// return {
|
|
537
|
+
// id: 'geo',
|
|
538
|
+
// methods: {
|
|
539
|
+
// /**
|
|
540
|
+
// * Gets the detected jurisdiction for the current subject
|
|
541
|
+
// *
|
|
542
|
+
// * @returns Promise resolving to jurisdiction information
|
|
543
|
+
// */
|
|
544
|
+
// getJurisdiction: async function (this: c15tClient) {
|
|
545
|
+
// return this.$fetch('/geo/jurisdiction', {
|
|
546
|
+
// method: 'GET',
|
|
547
|
+
// });
|
|
548
|
+
// },
|
|
549
|
+
|
|
550
|
+
// /**
|
|
551
|
+
// * Gets geolocation information for the current subject
|
|
552
|
+
// *
|
|
553
|
+
// * @returns Promise resolving to location data
|
|
554
|
+
// */
|
|
555
|
+
// getLocation: async function (this: c15tClient) {
|
|
556
|
+
// return this.$fetch('/geo/location', {
|
|
557
|
+
// method: 'GET',
|
|
558
|
+
// });
|
|
559
|
+
// },
|
|
560
|
+
// },
|
|
561
|
+
// $InferServerPlugin: {} as ReturnType<typeof geo>,
|
|
562
|
+
// };
|
|
563
|
+
// };
|