@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,567 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* React integration for c15t consent management system
|
|
3
|
+
*
|
|
4
|
+
* This module provides React hooks and state management for the c15t consent system.
|
|
5
|
+
* It implements a lightweight store and hooks for integrating consent management
|
|
6
|
+
* into React applications without requiring specific React dependencies.
|
|
7
|
+
*
|
|
8
|
+
* The implementation is designed to work in various React environments and can
|
|
9
|
+
* also function in non-React environments by providing a fallback pattern.
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```tsx
|
|
13
|
+
* // Initialize in your app
|
|
14
|
+
* import { createConsentClient } from '@c15t/integrations/react';
|
|
15
|
+
*
|
|
16
|
+
* const consentClient = createConsentClient({
|
|
17
|
+
* baseUrl: '/api/c15t',
|
|
18
|
+
* refreshInterval: 60000, // Check every minute
|
|
19
|
+
* });
|
|
20
|
+
*
|
|
21
|
+
* // Use in components
|
|
22
|
+
* function ConsentBanner() {
|
|
23
|
+
* const { isLoading, hasConsented, acceptAll, declineAll } = consentClient.useConsent();
|
|
24
|
+
*
|
|
25
|
+
* if (isLoading) return <div>Loading...</div>;
|
|
26
|
+
* if (hasConsented) return null;
|
|
27
|
+
*
|
|
28
|
+
* return (
|
|
29
|
+
* <div className="consent-banner">
|
|
30
|
+
* <h2>We use cookies</h2>
|
|
31
|
+
* <button onClick={acceptAll}>Accept All</button>
|
|
32
|
+
* <button onClick={declineAll}>Decline All</button>
|
|
33
|
+
* </div>
|
|
34
|
+
* );
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Type definition for a React-like hook function
|
|
41
|
+
*
|
|
42
|
+
* This type facilitates compatibility with React's hooks pattern
|
|
43
|
+
* without requiring a direct dependency on React.
|
|
44
|
+
*
|
|
45
|
+
* @template T The return type of the hook
|
|
46
|
+
*/
|
|
47
|
+
type ReactHook<T> = () => T;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* State for the consent management store
|
|
51
|
+
*
|
|
52
|
+
* Contains the current consent status, preferences, and loading state.
|
|
53
|
+
*/
|
|
54
|
+
interface ConsentState {
|
|
55
|
+
/**
|
|
56
|
+
* Whether consent data is currently being loaded
|
|
57
|
+
*/
|
|
58
|
+
isLoading: boolean;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Whether the subject has provided consent
|
|
62
|
+
* - `true`: Subject has provided at least one consent
|
|
63
|
+
* - `false`: Subject has explicitly declined all consent
|
|
64
|
+
* - `null`: Consent status hasn't been determined yet
|
|
65
|
+
*/
|
|
66
|
+
hasConsented: boolean | null;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Map of consent purposes to their consent status
|
|
70
|
+
* Key is the consentPurpose ID, value is a boolean indicating consent
|
|
71
|
+
*/
|
|
72
|
+
preferences: Record<string, boolean> | null;
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Error that occurred during consent operations
|
|
76
|
+
*/
|
|
77
|
+
error: Error | null;
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Timestamp of when consent was last updated
|
|
81
|
+
*/
|
|
82
|
+
lastUpdated: number | null;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Actions that can be performed on the consent store
|
|
87
|
+
*
|
|
88
|
+
* These actions allow modifying the consent state and interacting
|
|
89
|
+
* with the consent management backend.
|
|
90
|
+
*/
|
|
91
|
+
interface ConsentActions {
|
|
92
|
+
/**
|
|
93
|
+
* Set specific consent preferences
|
|
94
|
+
*
|
|
95
|
+
* @param preferences - Map of consentPurpose IDs to consent values
|
|
96
|
+
* @returns Promise that resolves when consent is updated
|
|
97
|
+
*/
|
|
98
|
+
setConsent: (preferences: Record<string, boolean>) => Promise<void>;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Accept all consent purposes
|
|
102
|
+
* Uses the default preferences defined in configuration
|
|
103
|
+
*
|
|
104
|
+
* @returns Promise that resolves when consent is updated
|
|
105
|
+
*/
|
|
106
|
+
acceptAll: () => Promise<void>;
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Decline all consent purposes
|
|
110
|
+
* Sets all purposes to `false`
|
|
111
|
+
*
|
|
112
|
+
* @returns Promise that resolves when consent is updated
|
|
113
|
+
*/
|
|
114
|
+
declineAll: () => Promise<void>;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Refresh the consent status from the server
|
|
118
|
+
*
|
|
119
|
+
* @returns Promise that resolves when consent status is refreshed
|
|
120
|
+
*/
|
|
121
|
+
refreshStatus: () => Promise<void>;
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Clear any error state in the store
|
|
125
|
+
*/
|
|
126
|
+
clearError: () => void;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Combined type for the consent store containing both state and actions
|
|
131
|
+
*/
|
|
132
|
+
type ConsentStore = ConsentState & ConsentActions;
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Configuration options for the c15t React client
|
|
136
|
+
*/
|
|
137
|
+
interface c15tClientConfig {
|
|
138
|
+
/**
|
|
139
|
+
* Base URL for API endpoints
|
|
140
|
+
* @default '/api/c15t'
|
|
141
|
+
*/
|
|
142
|
+
baseUrl?: string;
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Auto-refresh interval in milliseconds
|
|
146
|
+
* Set to 0 to disable auto-refresh
|
|
147
|
+
* @default 0 (disabled)
|
|
148
|
+
*/
|
|
149
|
+
refreshInterval?: number;
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Default preferences to use for acceptAll action
|
|
153
|
+
* These values determine what gets set when a subject accepts all consent
|
|
154
|
+
*
|
|
155
|
+
* @example
|
|
156
|
+
* ```ts
|
|
157
|
+
* {
|
|
158
|
+
* analytics: true,
|
|
159
|
+
* marketing: true,
|
|
160
|
+
* preferences: true
|
|
161
|
+
* }
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
defaultPreferences?: {
|
|
165
|
+
analytics?: boolean;
|
|
166
|
+
marketing?: boolean;
|
|
167
|
+
preferences?: boolean;
|
|
168
|
+
[key: string]: boolean | undefined;
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Interface for basic store operations
|
|
174
|
+
*
|
|
175
|
+
* Provides a minimal store API similar to common state management libraries
|
|
176
|
+
*
|
|
177
|
+
* @template T The type of state stored in the store
|
|
178
|
+
*/
|
|
179
|
+
interface StoreAPI<T> {
|
|
180
|
+
/**
|
|
181
|
+
* Get the current state
|
|
182
|
+
* @returns The current state
|
|
183
|
+
*/
|
|
184
|
+
getState: () => T;
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Update the state
|
|
188
|
+
* @param partial - Partial state or function that returns partial state
|
|
189
|
+
*/
|
|
190
|
+
setState: (partial: Partial<T> | ((state: T) => Partial<T>)) => void;
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* Subscribe to state changes
|
|
194
|
+
* @param listener - Function to call when state changes
|
|
195
|
+
* @returns Unsubscribe function
|
|
196
|
+
*/
|
|
197
|
+
subscribe: (listener: (state: T) => void) => () => void;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Result of the useConditionalContent hook
|
|
202
|
+
*/
|
|
203
|
+
interface ConditionalContentResult {
|
|
204
|
+
/**
|
|
205
|
+
* Whether consent data is currently loading
|
|
206
|
+
*/
|
|
207
|
+
isLoading: boolean;
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Whether the subject has given any consent
|
|
211
|
+
*/
|
|
212
|
+
hasConsented: boolean | null;
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Whether content can be shown based on required consent
|
|
216
|
+
*/
|
|
217
|
+
canShow: boolean;
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Current consent preferences
|
|
221
|
+
*/
|
|
222
|
+
preferences: Record<string, boolean> | null;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Result of the createConsentClient function
|
|
227
|
+
*/
|
|
228
|
+
interface ConsentClient {
|
|
229
|
+
/**
|
|
230
|
+
* Store for managing consent state
|
|
231
|
+
*/
|
|
232
|
+
store: StoreAPI<ConsentStore>;
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Hook for accessing consent state and actions
|
|
236
|
+
*/
|
|
237
|
+
useConsent: ReactHook<ConsentStore>;
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Hook for conditionally showing content based on consent
|
|
241
|
+
*/
|
|
242
|
+
useConditionalContent: (
|
|
243
|
+
requiredConsent: string | string[]
|
|
244
|
+
) => ConditionalContentResult;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Creates a c15t client for React applications
|
|
249
|
+
*
|
|
250
|
+
* This function creates a store and hooks for managing consent in React applications.
|
|
251
|
+
* It provides a lightweight implementation that works in various React environments
|
|
252
|
+
* and degrades gracefully in non-React environments.
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* ```tsx
|
|
256
|
+
* // Create a client
|
|
257
|
+
* const client = createConsentClient({
|
|
258
|
+
* baseUrl: '/api/c15t',
|
|
259
|
+
* refreshInterval: 60000,
|
|
260
|
+
* defaultPreferences: {
|
|
261
|
+
* analytics: true,
|
|
262
|
+
* marketing: false
|
|
263
|
+
* }
|
|
264
|
+
* });
|
|
265
|
+
*
|
|
266
|
+
* // Use in a component
|
|
267
|
+
* function ConsentStatus() {
|
|
268
|
+
* const { preferences, refreshStatus } = client.useConsent();
|
|
269
|
+
*
|
|
270
|
+
* return (
|
|
271
|
+
* <div>
|
|
272
|
+
* <h2>Your consent preferences:</h2>
|
|
273
|
+
* <pre>{JSON.stringify(preferences, null, 2)}</pre>
|
|
274
|
+
* <button onClick={refreshStatus}>Refresh</button>
|
|
275
|
+
* </div>
|
|
276
|
+
* );
|
|
277
|
+
* }
|
|
278
|
+
* ```
|
|
279
|
+
*
|
|
280
|
+
* @param config - Client configuration options
|
|
281
|
+
* @returns A client object with store and hooks
|
|
282
|
+
*/
|
|
283
|
+
export function createConsentClient(
|
|
284
|
+
config: c15tClientConfig = {}
|
|
285
|
+
): ConsentClient {
|
|
286
|
+
const {
|
|
287
|
+
baseUrl = '/api/c15t',
|
|
288
|
+
refreshInterval = 0,
|
|
289
|
+
defaultPreferences = {
|
|
290
|
+
analytics: true,
|
|
291
|
+
marketing: true,
|
|
292
|
+
preferences: true,
|
|
293
|
+
},
|
|
294
|
+
} = config;
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Create a basic store implementation
|
|
298
|
+
*
|
|
299
|
+
* This is a lightweight implementation of a store pattern similar to
|
|
300
|
+
* what libraries like Zustand provide, but without dependencies.
|
|
301
|
+
*
|
|
302
|
+
* @template T The type of state to store
|
|
303
|
+
* @param createState - Function that defines the initial state and actions
|
|
304
|
+
* @returns A store API with getState, setState, and subscribe methods
|
|
305
|
+
*/
|
|
306
|
+
function createStore<TState extends object>(
|
|
307
|
+
createState: (
|
|
308
|
+
set: (
|
|
309
|
+
partial: Partial<TState> | ((state: TState) => Partial<TState>)
|
|
310
|
+
) => void,
|
|
311
|
+
get: () => TState
|
|
312
|
+
) => TState
|
|
313
|
+
): StoreAPI<TState> {
|
|
314
|
+
let state: TState;
|
|
315
|
+
const listeners = new Set<(state: TState) => void>();
|
|
316
|
+
|
|
317
|
+
const setState = (
|
|
318
|
+
partial: Partial<TState> | ((state: TState) => Partial<TState>)
|
|
319
|
+
) => {
|
|
320
|
+
const nextState =
|
|
321
|
+
typeof partial === 'function'
|
|
322
|
+
? { ...state, ...partial(state) }
|
|
323
|
+
: { ...state, ...partial };
|
|
324
|
+
|
|
325
|
+
state = nextState;
|
|
326
|
+
// Replace forEach with for...of to fix linter error
|
|
327
|
+
for (const listener of listeners) {
|
|
328
|
+
listener(state);
|
|
329
|
+
}
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
const getState = () => state;
|
|
333
|
+
|
|
334
|
+
const subscribe = (listener: (state: TState) => void) => {
|
|
335
|
+
listeners.add(listener);
|
|
336
|
+
return () => listeners.delete(listener);
|
|
337
|
+
};
|
|
338
|
+
|
|
339
|
+
state = createState(setState, getState);
|
|
340
|
+
|
|
341
|
+
return { getState, setState, subscribe };
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
// Create a store for consent state
|
|
345
|
+
const consentStore = createStore<ConsentStore>((set, get) => ({
|
|
346
|
+
// Initial state
|
|
347
|
+
isLoading: true,
|
|
348
|
+
hasConsented: null,
|
|
349
|
+
preferences: null,
|
|
350
|
+
error: null,
|
|
351
|
+
lastUpdated: null,
|
|
352
|
+
|
|
353
|
+
// Actions
|
|
354
|
+
/**
|
|
355
|
+
* Update consent preferences for specific purposes
|
|
356
|
+
*
|
|
357
|
+
* @param preferences - Map of consentPurpose IDs to consent values
|
|
358
|
+
* @returns Promise that resolves when consent is updated
|
|
359
|
+
*/
|
|
360
|
+
setConsent: async (preferences: Record<string, boolean>) => {
|
|
361
|
+
try {
|
|
362
|
+
set({ isLoading: true, error: null });
|
|
363
|
+
|
|
364
|
+
const response = await fetch(`${baseUrl}/set`, {
|
|
365
|
+
method: 'POST',
|
|
366
|
+
headers: {
|
|
367
|
+
'Content-Type': 'application/json',
|
|
368
|
+
},
|
|
369
|
+
body: JSON.stringify({ preferences }),
|
|
370
|
+
credentials: 'same-origin',
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
if (!response.ok) {
|
|
374
|
+
throw new Error(`Failed to set consent: ${response.statusText}`);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
const result = await response.json();
|
|
378
|
+
|
|
379
|
+
set({
|
|
380
|
+
isLoading: false,
|
|
381
|
+
hasConsented: true,
|
|
382
|
+
preferences: result.preferences || preferences,
|
|
383
|
+
lastUpdated: Date.now(),
|
|
384
|
+
});
|
|
385
|
+
|
|
386
|
+
return result;
|
|
387
|
+
} catch (error) {
|
|
388
|
+
set({
|
|
389
|
+
isLoading: false,
|
|
390
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
391
|
+
});
|
|
392
|
+
throw error;
|
|
393
|
+
}
|
|
394
|
+
},
|
|
395
|
+
|
|
396
|
+
/**
|
|
397
|
+
* Accept all consent purposes using the default preferences
|
|
398
|
+
*
|
|
399
|
+
* @returns Promise that resolves when consent is updated
|
|
400
|
+
*/
|
|
401
|
+
acceptAll: async () => {
|
|
402
|
+
// Filter out any undefined values from defaultPreferences
|
|
403
|
+
const cleanPreferences = Object.entries(defaultPreferences)
|
|
404
|
+
.filter(([_, value]) => value !== undefined)
|
|
405
|
+
.reduce(
|
|
406
|
+
(acc, [key, value]) => {
|
|
407
|
+
acc[key] = value as boolean;
|
|
408
|
+
return acc;
|
|
409
|
+
},
|
|
410
|
+
{} as Record<string, boolean>
|
|
411
|
+
);
|
|
412
|
+
|
|
413
|
+
return await get().setConsent(cleanPreferences);
|
|
414
|
+
},
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Decline all consent purposes
|
|
418
|
+
*
|
|
419
|
+
* @returns Promise that resolves when consent is updated
|
|
420
|
+
*/
|
|
421
|
+
declineAll: async () => {
|
|
422
|
+
const minimalConsent = Object.keys(defaultPreferences).reduce(
|
|
423
|
+
(acc, key) => {
|
|
424
|
+
acc[key] = false;
|
|
425
|
+
return acc;
|
|
426
|
+
},
|
|
427
|
+
{} as Record<string, boolean>
|
|
428
|
+
);
|
|
429
|
+
|
|
430
|
+
return await get().setConsent(minimalConsent);
|
|
431
|
+
},
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Refresh consent status from the server
|
|
435
|
+
*
|
|
436
|
+
* @returns Promise that resolves when consent status is refreshed
|
|
437
|
+
*/
|
|
438
|
+
refreshStatus: async () => {
|
|
439
|
+
try {
|
|
440
|
+
set({ isLoading: true, error: null });
|
|
441
|
+
|
|
442
|
+
const response = await fetch(`${baseUrl}/status`, {
|
|
443
|
+
credentials: 'same-origin',
|
|
444
|
+
});
|
|
445
|
+
|
|
446
|
+
if (!response.ok) {
|
|
447
|
+
throw new Error(
|
|
448
|
+
`Failed to get consent status: ${response.statusText}`
|
|
449
|
+
);
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
const { consented, preferences } = await response.json();
|
|
453
|
+
|
|
454
|
+
set({
|
|
455
|
+
isLoading: false,
|
|
456
|
+
hasConsented: consented,
|
|
457
|
+
preferences: preferences,
|
|
458
|
+
lastUpdated: Date.now(),
|
|
459
|
+
});
|
|
460
|
+
} catch (error) {
|
|
461
|
+
set({
|
|
462
|
+
isLoading: false,
|
|
463
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
},
|
|
467
|
+
|
|
468
|
+
/**
|
|
469
|
+
* Clear any error state
|
|
470
|
+
*/
|
|
471
|
+
clearError: () => {
|
|
472
|
+
set({ error: null });
|
|
473
|
+
},
|
|
474
|
+
}));
|
|
475
|
+
|
|
476
|
+
/**
|
|
477
|
+
* Hook for accessing consent state and actions
|
|
478
|
+
*
|
|
479
|
+
* This hook provides access to the current consent state and
|
|
480
|
+
* actions to update consent preferences. It initiates loading
|
|
481
|
+
* of consent status and sets up auto-refresh if configured.
|
|
482
|
+
*
|
|
483
|
+
* @returns Current consent state and actions
|
|
484
|
+
*/
|
|
485
|
+
const useConsent: ReactHook<ConsentStore> = () => {
|
|
486
|
+
const storeState = consentStore.getState();
|
|
487
|
+
|
|
488
|
+
// If in a non-React environment or SSR, just return the current state
|
|
489
|
+
if (typeof window === 'undefined') {
|
|
490
|
+
return storeState;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
// For browser environments without full React
|
|
494
|
+
// We return a simple object with the current state
|
|
495
|
+
setTimeout(() => {
|
|
496
|
+
// Initialize by refreshing status after initial render
|
|
497
|
+
if (storeState.hasConsented === null && !storeState.isLoading) {
|
|
498
|
+
storeState.refreshStatus();
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
// Set up refresh interval if configured
|
|
502
|
+
if (refreshInterval > 0) {
|
|
503
|
+
const intervalId = setInterval(() => {
|
|
504
|
+
storeState.refreshStatus();
|
|
505
|
+
}, refreshInterval);
|
|
506
|
+
|
|
507
|
+
// Cleanup on window unload
|
|
508
|
+
window.addEventListener('unload', () => clearInterval(intervalId));
|
|
509
|
+
}
|
|
510
|
+
}, 0);
|
|
511
|
+
|
|
512
|
+
return storeState;
|
|
513
|
+
};
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* Hook to conditionally render content based on consent
|
|
517
|
+
*
|
|
518
|
+
* This hook checks if the subject has consented to specific purposes
|
|
519
|
+
* and returns a boolean indicating whether the content can be shown.
|
|
520
|
+
*
|
|
521
|
+
* @example
|
|
522
|
+
* ```tsx
|
|
523
|
+
* function AnalyticsComponent() {
|
|
524
|
+
* const { canShow, isLoading } = client.useConditionalContent('analytics');
|
|
525
|
+
*
|
|
526
|
+
* if (isLoading) return <div>Loading...</div>;
|
|
527
|
+
* if (!canShow) return null;
|
|
528
|
+
*
|
|
529
|
+
* return <div>Analytics content is shown because you consented!</div>;
|
|
530
|
+
* }
|
|
531
|
+
* ```
|
|
532
|
+
*
|
|
533
|
+
* @param requiredConsent - Required consent consentPurpose(s) to show content
|
|
534
|
+
* @returns Object with loading state, consent status, and whether content can be shown
|
|
535
|
+
*/
|
|
536
|
+
const useConditionalContent = (
|
|
537
|
+
requiredConsent: string | string[]
|
|
538
|
+
): ConditionalContentResult => {
|
|
539
|
+
const store = useConsent();
|
|
540
|
+
|
|
541
|
+
const canShow = () => {
|
|
542
|
+
if (store.isLoading || !store.hasConsented || !store.preferences) {
|
|
543
|
+
return false;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
if (Array.isArray(requiredConsent)) {
|
|
547
|
+
return requiredConsent.every((key) => store.preferences?.[key]);
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
return !!store.preferences[requiredConsent];
|
|
551
|
+
};
|
|
552
|
+
|
|
553
|
+
return {
|
|
554
|
+
isLoading: store.isLoading,
|
|
555
|
+
hasConsented: store.hasConsented,
|
|
556
|
+
canShow: canShow(),
|
|
557
|
+
preferences: store.preferences,
|
|
558
|
+
};
|
|
559
|
+
};
|
|
560
|
+
|
|
561
|
+
// Return the client with store and hooks
|
|
562
|
+
return {
|
|
563
|
+
store: consentStore,
|
|
564
|
+
useConsent,
|
|
565
|
+
useConditionalContent,
|
|
566
|
+
};
|
|
567
|
+
}
|