@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
package/src/init.test.ts
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import type { DatabaseConfiguration } from './db/adapters/kysely-adapter';
|
|
3
|
+
import { memoryAdapter } from './db/adapters/memory-adapter';
|
|
4
|
+
import { init } from './init';
|
|
5
|
+
import type { C15TPlugin } from './types';
|
|
6
|
+
|
|
7
|
+
describe('init', () => {
|
|
8
|
+
beforeEach(() => {
|
|
9
|
+
vi.unstubAllEnvs();
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it('should initialize with basic config', async () => {
|
|
13
|
+
const result = await init({
|
|
14
|
+
baseURL: 'http://localhost:3000',
|
|
15
|
+
database: memoryAdapter({}),
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
expect(result.isOk()).toBe(true);
|
|
19
|
+
if (result.isOk()) {
|
|
20
|
+
const ctx = result.value;
|
|
21
|
+
expect(ctx.options.baseURL).toBe('http://localhost:3000');
|
|
22
|
+
expect(ctx.options.basePath).toBe('/api/c15t');
|
|
23
|
+
expect(ctx.appName).toBe('c15t Consent Manager');
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
it('should infer base URL from environment', async () => {
|
|
28
|
+
vi.stubEnv('C15T_URL', 'http://localhost:5147');
|
|
29
|
+
|
|
30
|
+
const result = await init({
|
|
31
|
+
database: memoryAdapter({}),
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
expect(result.isOk()).toBe(true);
|
|
35
|
+
if (result.isOk()) {
|
|
36
|
+
const ctx = result.value;
|
|
37
|
+
expect(ctx.options.baseURL).toBe('http://localhost:5147');
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
vi.unstubAllEnvs();
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it('should respect custom base path', async () => {
|
|
44
|
+
const result = await init({
|
|
45
|
+
baseURL: 'http://localhost:3000',
|
|
46
|
+
basePath: '/custom-path',
|
|
47
|
+
database: memoryAdapter({}),
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
expect(result.isOk()).toBe(true);
|
|
51
|
+
if (result.isOk()) {
|
|
52
|
+
const ctx = result.value;
|
|
53
|
+
expect(ctx.options.basePath).toBe('/custom-path');
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('should initialize plugins', async () => {
|
|
58
|
+
const newBaseURL = 'http://test.test';
|
|
59
|
+
const result = await init({
|
|
60
|
+
baseURL: 'http://localhost:3000',
|
|
61
|
+
database: memoryAdapter({}),
|
|
62
|
+
plugins: [
|
|
63
|
+
{
|
|
64
|
+
id: 'test-plugin',
|
|
65
|
+
name: 'Test Plugin',
|
|
66
|
+
type: 'test',
|
|
67
|
+
init: () => ({
|
|
68
|
+
context: {
|
|
69
|
+
baseURL: newBaseURL,
|
|
70
|
+
},
|
|
71
|
+
}),
|
|
72
|
+
} as C15TPlugin,
|
|
73
|
+
],
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
expect(result.isOk()).toBe(true);
|
|
77
|
+
if (result.isOk()) {
|
|
78
|
+
const ctx = result.value;
|
|
79
|
+
expect(ctx.baseURL).toBe(newBaseURL);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it('should allow plugins to modify options', async () => {
|
|
84
|
+
const result = await init({
|
|
85
|
+
baseURL: 'http://localhost:3000',
|
|
86
|
+
database: memoryAdapter({}),
|
|
87
|
+
plugins: [
|
|
88
|
+
{
|
|
89
|
+
id: 'test-plugin',
|
|
90
|
+
name: 'Test Plugin',
|
|
91
|
+
type: 'test',
|
|
92
|
+
init: () => ({
|
|
93
|
+
options: {
|
|
94
|
+
baseURL: 'http://test.test',
|
|
95
|
+
},
|
|
96
|
+
}),
|
|
97
|
+
} as C15TPlugin,
|
|
98
|
+
],
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
expect(result.isOk()).toBe(true);
|
|
102
|
+
if (result.isOk()) {
|
|
103
|
+
const ctx = result.value;
|
|
104
|
+
expect(ctx.options.baseURL).toBe('http://test.test');
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
it('should handle plugin initialization errors', async () => {
|
|
109
|
+
const result = await init({
|
|
110
|
+
baseURL: 'http://localhost:3000',
|
|
111
|
+
database: memoryAdapter({}),
|
|
112
|
+
plugins: [
|
|
113
|
+
{
|
|
114
|
+
id: 'error-plugin',
|
|
115
|
+
name: 'Error Plugin',
|
|
116
|
+
type: 'test',
|
|
117
|
+
init: () => {
|
|
118
|
+
throw new Error('Plugin initialization failed');
|
|
119
|
+
},
|
|
120
|
+
} as C15TPlugin,
|
|
121
|
+
],
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
expect(result.isErr()).toBe(true);
|
|
125
|
+
if (result.isErr()) {
|
|
126
|
+
expect(result.error.message).toContain('Plugin initialization failed');
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('should handle storage adapter errors', async () => {
|
|
131
|
+
const result = await init({
|
|
132
|
+
baseURL: 'http://localhost:3000',
|
|
133
|
+
database: null as unknown as DatabaseConfiguration,
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
expect(result.isErr()).toBe(false);
|
|
137
|
+
if (result.isErr()) {
|
|
138
|
+
expect(result.error.message).toContain(
|
|
139
|
+
'Failed to initialize consent system'
|
|
140
|
+
);
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('should handle secret from environment', async () => {
|
|
145
|
+
vi.stubEnv('C15T_SECRET', 'test-secret');
|
|
146
|
+
|
|
147
|
+
const result = await init({
|
|
148
|
+
baseURL: 'http://localhost:3000',
|
|
149
|
+
database: memoryAdapter({}),
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
expect(result.isOk()).toBe(true);
|
|
153
|
+
if (result.isOk()) {
|
|
154
|
+
const ctx = result.value;
|
|
155
|
+
expect(ctx.secret).toBe('test-secret');
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
vi.unstubAllEnvs();
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
it('should handle multiple plugins in sequence', async () => {
|
|
162
|
+
const result = await init({
|
|
163
|
+
baseURL: 'http://localhost:3000',
|
|
164
|
+
database: memoryAdapter({}),
|
|
165
|
+
plugins: [
|
|
166
|
+
{
|
|
167
|
+
id: 'plugin-1',
|
|
168
|
+
name: 'Plugin 1',
|
|
169
|
+
type: 'test',
|
|
170
|
+
init: () => ({
|
|
171
|
+
options: {
|
|
172
|
+
baseURL: 'http://plugin1.test',
|
|
173
|
+
},
|
|
174
|
+
}),
|
|
175
|
+
} as C15TPlugin,
|
|
176
|
+
{
|
|
177
|
+
id: 'plugin-2',
|
|
178
|
+
name: 'Plugin 2',
|
|
179
|
+
type: 'test',
|
|
180
|
+
init: () => ({
|
|
181
|
+
options: {
|
|
182
|
+
baseURL: 'http://plugin2.test',
|
|
183
|
+
},
|
|
184
|
+
}),
|
|
185
|
+
} as C15TPlugin,
|
|
186
|
+
],
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
expect(result.isOk()).toBe(true);
|
|
190
|
+
if (result.isOk()) {
|
|
191
|
+
const ctx = result.value;
|
|
192
|
+
expect(ctx.options.baseURL).toBe('http://plugin2.test');
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
|
|
196
|
+
it('should configure trusted origins', async () => {
|
|
197
|
+
const result = await init({
|
|
198
|
+
baseURL: 'http://localhost:3000',
|
|
199
|
+
database: memoryAdapter({}),
|
|
200
|
+
trustedOrigins: ['http://trusted.test'],
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
expect(result.isOk()).toBe(true);
|
|
204
|
+
if (result.isOk()) {
|
|
205
|
+
const ctx = result.value;
|
|
206
|
+
expect(ctx.trustedOrigins).toContain('http://localhost:3000');
|
|
207
|
+
expect(ctx.trustedOrigins).toContain('http://trusted.test');
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it('should handle plugin context modifications', async () => {
|
|
212
|
+
const result = await init({
|
|
213
|
+
baseURL: 'http://localhost:3000',
|
|
214
|
+
database: memoryAdapter({}),
|
|
215
|
+
plugins: [
|
|
216
|
+
{
|
|
217
|
+
id: 'context-plugin',
|
|
218
|
+
name: 'Context Plugin',
|
|
219
|
+
type: 'test',
|
|
220
|
+
init: () => ({
|
|
221
|
+
context: {
|
|
222
|
+
appName: 'Modified App Name',
|
|
223
|
+
},
|
|
224
|
+
}),
|
|
225
|
+
} as C15TPlugin,
|
|
226
|
+
],
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
expect(result.isOk()).toBe(true);
|
|
230
|
+
if (result.isOk()) {
|
|
231
|
+
const ctx = result.value;
|
|
232
|
+
expect(ctx.appName).toBe('Modified App Name');
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
});
|
package/src/init.ts
ADDED
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { defu } from 'defu';
|
|
2
|
+
import { getConsentTables } from './db';
|
|
3
|
+
import { generateId } from './db/core/fields/id-generator';
|
|
4
|
+
import type { EntityName } from './db/core/types';
|
|
5
|
+
import { createRegistry } from './db/create-registry';
|
|
6
|
+
import { getAdapter } from './db/utils';
|
|
7
|
+
import {
|
|
8
|
+
BASE_ERROR_CODES,
|
|
9
|
+
type C15TError,
|
|
10
|
+
failAsync,
|
|
11
|
+
fromPromise,
|
|
12
|
+
} from './error';
|
|
13
|
+
import { type C15TResult, fail, ok } from './error/results';
|
|
14
|
+
/**
|
|
15
|
+
* c15t Initialization Module
|
|
16
|
+
*
|
|
17
|
+
* This module handles the initialization of the c15t consent management system.
|
|
18
|
+
* It sets up the consent context, configures storage adapters, initializes plugins,
|
|
19
|
+
* and establishes security settings like secrets and trusted origins.
|
|
20
|
+
*
|
|
21
|
+
* The initialization process includes:
|
|
22
|
+
* - Setting up storage adapters for consent data
|
|
23
|
+
* - Configuring security credentials and trusted origins
|
|
24
|
+
* - Initializing core and custom plugins
|
|
25
|
+
* - Creating the consent context object that serves as the foundation for the system
|
|
26
|
+
*
|
|
27
|
+
* This is an internal module typically not used directly by consumers of the c15t library.
|
|
28
|
+
*/
|
|
29
|
+
import type {
|
|
30
|
+
C15TContext,
|
|
31
|
+
C15TOptions,
|
|
32
|
+
C15TPlugin,
|
|
33
|
+
RegistryContext,
|
|
34
|
+
} from './types';
|
|
35
|
+
import { createLogger, env, getBaseURL, isProduction } from './utils';
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Helper function to convert a Promise to a C15T-specific ResultAsync
|
|
39
|
+
*
|
|
40
|
+
* @param promise - The promise to convert to a ResultAsync
|
|
41
|
+
* @returns A ResultAsync that captures errors as C15TError objects
|
|
42
|
+
*/
|
|
43
|
+
const fromC15TPromise = <T>(promise: Promise<T>) => {
|
|
44
|
+
return fromPromise(
|
|
45
|
+
promise,
|
|
46
|
+
(error): C15TError => ({
|
|
47
|
+
message: error instanceof Error ? error.message : String(error),
|
|
48
|
+
code: BASE_ERROR_CODES.UNKNOWN_ERROR,
|
|
49
|
+
name: 'C15TError',
|
|
50
|
+
data: { error },
|
|
51
|
+
})
|
|
52
|
+
);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Default secret used when no secret is provided
|
|
57
|
+
* This should only be used in development environments
|
|
58
|
+
*/
|
|
59
|
+
const DEFAULT_SECRET = 'c15t-default-secret-please-change-in-production';
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Initializes the c15t consent management system using Result pattern
|
|
63
|
+
*
|
|
64
|
+
* This function creates and configures the consent context based on the provided options.
|
|
65
|
+
* It sets up storage adapters, initializes plugins, configures security settings,
|
|
66
|
+
* and establishes the foundation for the consent management system.
|
|
67
|
+
*
|
|
68
|
+
* This version uses the neverthrow Result pattern for error handling.
|
|
69
|
+
*
|
|
70
|
+
* @template P - The plugin types used in the configuration
|
|
71
|
+
* @param options - Configuration options for the c15t instance
|
|
72
|
+
* @returns A Promise resolving to a Result containing the initialized consent context
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* const contextResult = await init({
|
|
77
|
+
* secret: process.env.CONSENT_SECRET,
|
|
78
|
+
* storage: memoryAdapter(),
|
|
79
|
+
* plugins: [geoPlugin()]
|
|
80
|
+
* });
|
|
81
|
+
*
|
|
82
|
+
* // Handle success and error cases explicitly
|
|
83
|
+
* contextResult.match(
|
|
84
|
+
* (context) => {
|
|
85
|
+
* // Use the successfully initialized context
|
|
86
|
+
* },
|
|
87
|
+
* (error) => {
|
|
88
|
+
* // Handle the initialization error
|
|
89
|
+
* console.error('Failed to initialize:', error.message);
|
|
90
|
+
* }
|
|
91
|
+
* );
|
|
92
|
+
* ```
|
|
93
|
+
*/
|
|
94
|
+
export const init = async <P extends C15TPlugin[]>(
|
|
95
|
+
options: C15TOptions<P>
|
|
96
|
+
): Promise<C15TResult<C15TContext>> => {
|
|
97
|
+
try {
|
|
98
|
+
// Initialize core components
|
|
99
|
+
const adapterResult = await fromC15TPromise(getAdapter(options));
|
|
100
|
+
|
|
101
|
+
return adapterResult.andThen((adapter) => {
|
|
102
|
+
const logger = createLogger(options.logger);
|
|
103
|
+
const baseURL = getBaseURL(options.baseURL, options.basePath);
|
|
104
|
+
const secret =
|
|
105
|
+
options.secret ||
|
|
106
|
+
env.C15T_SECRET ||
|
|
107
|
+
env.CONSENT_SECRET ||
|
|
108
|
+
DEFAULT_SECRET;
|
|
109
|
+
|
|
110
|
+
// Secret warning
|
|
111
|
+
if (secret === DEFAULT_SECRET && isProduction) {
|
|
112
|
+
logger.error(
|
|
113
|
+
'Using default secret in production. Set C15T_SECRET or pass secret in config.'
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// Create normalized options
|
|
118
|
+
const finalOptions = {
|
|
119
|
+
...options,
|
|
120
|
+
secret,
|
|
121
|
+
baseURL: baseURL ? new URL(baseURL).origin : '',
|
|
122
|
+
basePath: options.basePath || '/api/c15t',
|
|
123
|
+
plugins: [...(options.plugins || []), ...getInternalPlugins(options)],
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
// Create ID generator
|
|
127
|
+
const generateIdFunc = ({
|
|
128
|
+
model,
|
|
129
|
+
size = 16,
|
|
130
|
+
}: { model: EntityName; size?: number }) => {
|
|
131
|
+
return (
|
|
132
|
+
finalOptions?.advanced?.generateId?.({ model, size }) ||
|
|
133
|
+
generateId(getConsentTables(finalOptions)[model].entityPrefix)
|
|
134
|
+
);
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// Create registry context - just what registries need
|
|
138
|
+
const registryContext: RegistryContext = {
|
|
139
|
+
adapter,
|
|
140
|
+
options: finalOptions,
|
|
141
|
+
logger,
|
|
142
|
+
hooks: options.databaseHooks || [],
|
|
143
|
+
generateId: generateIdFunc,
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// Create full application context
|
|
147
|
+
const ctx: C15TContext = {
|
|
148
|
+
appName: finalOptions.appName || 'c15t Consent Manager',
|
|
149
|
+
options: finalOptions,
|
|
150
|
+
trustedOrigins: getTrustedOrigins(finalOptions),
|
|
151
|
+
baseURL: baseURL || '',
|
|
152
|
+
secret,
|
|
153
|
+
logger,
|
|
154
|
+
generateId: generateIdFunc,
|
|
155
|
+
adapter,
|
|
156
|
+
registry: createRegistry(registryContext),
|
|
157
|
+
tables: getConsentTables(options),
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
// Initialize plugins and return
|
|
161
|
+
return runPluginInit(ctx);
|
|
162
|
+
});
|
|
163
|
+
} catch (error) {
|
|
164
|
+
return failAsync(
|
|
165
|
+
`Failed to initialize consent system: ${error instanceof Error ? error.message : String(error)}`,
|
|
166
|
+
{
|
|
167
|
+
code: BASE_ERROR_CODES.INITIALIZATION_FAILED,
|
|
168
|
+
data: { error },
|
|
169
|
+
}
|
|
170
|
+
);
|
|
171
|
+
}
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Initializes all registered plugins using the Result pattern
|
|
176
|
+
*
|
|
177
|
+
* This function runs the init method of each plugin in sequence,
|
|
178
|
+
* collecting any context or options modifications they provide.
|
|
179
|
+
*
|
|
180
|
+
* @param ctx - The current consent context
|
|
181
|
+
* @returns A Result with the updated context after plugin initialization
|
|
182
|
+
*/
|
|
183
|
+
function runPluginInit(ctx: C15TContext): C15TResult<C15TContext> {
|
|
184
|
+
try {
|
|
185
|
+
let options = ctx.options;
|
|
186
|
+
const plugins = options.plugins || [];
|
|
187
|
+
let context: C15TContext = ctx;
|
|
188
|
+
|
|
189
|
+
for (const plugin of plugins) {
|
|
190
|
+
if (plugin.init) {
|
|
191
|
+
const result = plugin.init(ctx);
|
|
192
|
+
if (typeof result === 'object') {
|
|
193
|
+
if (result.options) {
|
|
194
|
+
options = defu(result.options, options);
|
|
195
|
+
}
|
|
196
|
+
if (result.context) {
|
|
197
|
+
context = {
|
|
198
|
+
...context,
|
|
199
|
+
...(result.context as Partial<C15TContext>),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
context.options = options;
|
|
207
|
+
return ok(context);
|
|
208
|
+
} catch (error) {
|
|
209
|
+
return fail(
|
|
210
|
+
`Plugin initialization failed: ${error instanceof Error ? error.message : String(error)}`,
|
|
211
|
+
{
|
|
212
|
+
code: BASE_ERROR_CODES.PLUGIN_INITIALIZATION_FAILED,
|
|
213
|
+
data: { error },
|
|
214
|
+
}
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Retrieves internal plugins based on configuration options
|
|
221
|
+
*
|
|
222
|
+
* This function determines which internal plugins should be automatically
|
|
223
|
+
* included based on the provided options.
|
|
224
|
+
*
|
|
225
|
+
* @param options - The c15t configuration options
|
|
226
|
+
* @returns An array of internal plugins to include
|
|
227
|
+
*/
|
|
228
|
+
function getInternalPlugins(_options: C15TOptions): C15TPlugin[] {
|
|
229
|
+
const plugins: C15TPlugin[] = [];
|
|
230
|
+
|
|
231
|
+
return plugins;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* Builds a list of trusted origins for CORS
|
|
236
|
+
*
|
|
237
|
+
* This function determines which origins should be trusted for
|
|
238
|
+
* cross-origin requests based on configuration and environment.
|
|
239
|
+
*
|
|
240
|
+
* @param options - The c15t configuration options
|
|
241
|
+
* @returns An array of trusted origin URLs
|
|
242
|
+
*/
|
|
243
|
+
function getTrustedOrigins(options: C15TOptions): string[] {
|
|
244
|
+
const baseURL = getBaseURL(options.baseURL, options.basePath);
|
|
245
|
+
if (!baseURL) {
|
|
246
|
+
return [];
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
const trustedOrigins = [new URL(baseURL).origin];
|
|
250
|
+
|
|
251
|
+
if (options.trustedOrigins && Array.isArray(options.trustedOrigins)) {
|
|
252
|
+
trustedOrigins.push(...options.trustedOrigins);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
const envTrustedOrigins = env.C15T_TRUSTED_ORIGINS;
|
|
256
|
+
if (envTrustedOrigins) {
|
|
257
|
+
trustedOrigins.push(...envTrustedOrigins.split(','));
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return trustedOrigins;
|
|
261
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import type { C15TInstance } from '~/core';
|
|
2
|
+
import { BASE_ERROR_CODES } from '~/error/codes';
|
|
3
|
+
import type { C15TContext } from '~/types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Convert a c15t handler to a Next.js API route handler.
|
|
7
|
+
*
|
|
8
|
+
* This function adapts a c15t instance to work with Next.js App Router API routes,
|
|
9
|
+
* providing GET and POST handler functions. It handles the conversion between
|
|
10
|
+
* c15t's Result types and Next.js Response objects.
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* // app/api/c15t/route.ts
|
|
15
|
+
* import { toNextJsHandler } from '@c15t/integrations/next';
|
|
16
|
+
* import { c15t } from '@/lib/c15t';
|
|
17
|
+
*
|
|
18
|
+
* // Pass the entire c15t instance, not just the handler
|
|
19
|
+
* export const { GET, POST } = toNextJsHandler(c15t);
|
|
20
|
+
*
|
|
21
|
+
* // ❌ Don't do this:
|
|
22
|
+
* // export const { GET, POST } = toNextJsHandler(c15t.handler);
|
|
23
|
+
* ```
|
|
24
|
+
*
|
|
25
|
+
* @param instance - The complete c15t instance (not just the handler)
|
|
26
|
+
* @returns Next.js API route handler functions for GET and POST
|
|
27
|
+
*/
|
|
28
|
+
export function toNextJsHandler(instance: C15TInstance) {
|
|
29
|
+
const handler = async (initialRequest: Request) => {
|
|
30
|
+
try {
|
|
31
|
+
const request = initialRequest;
|
|
32
|
+
|
|
33
|
+
// For POST requests, validate JSON body
|
|
34
|
+
if (request.method === 'POST') {
|
|
35
|
+
try {
|
|
36
|
+
const clonedRequest = request.clone();
|
|
37
|
+
await clonedRequest.json();
|
|
38
|
+
} catch (error) {
|
|
39
|
+
return new Response(
|
|
40
|
+
JSON.stringify({
|
|
41
|
+
error: true,
|
|
42
|
+
code: BASE_ERROR_CODES.REQUEST_HANDLER_ERROR,
|
|
43
|
+
message: 'Invalid JSON in request body',
|
|
44
|
+
details: error instanceof Error ? error.message : 'Unknown error',
|
|
45
|
+
}),
|
|
46
|
+
{
|
|
47
|
+
status: 400,
|
|
48
|
+
headers: {
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
},
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Ensure the baseURL is set correctly for the c15t instance
|
|
57
|
+
if (instance.$context) {
|
|
58
|
+
const contextPromise = instance.$context;
|
|
59
|
+
try {
|
|
60
|
+
const contextResult = await contextPromise;
|
|
61
|
+
|
|
62
|
+
// Extract context safely using match pattern
|
|
63
|
+
contextResult.match(
|
|
64
|
+
(context: C15TContext) => {
|
|
65
|
+
// If baseURL is not set, initialize it from the request URL
|
|
66
|
+
if (!context.baseURL || context.baseURL.trim() === '') {
|
|
67
|
+
const url = new URL(request.url);
|
|
68
|
+
const basePath = context.options?.basePath || '/api/c15t';
|
|
69
|
+
const baseURL = `${url.origin}${basePath}`;
|
|
70
|
+
|
|
71
|
+
context.baseURL = baseURL;
|
|
72
|
+
if (context.options) {
|
|
73
|
+
context.options.baseURL = baseURL;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
() => {
|
|
78
|
+
// Handle context error silently - the handler will deal with it
|
|
79
|
+
}
|
|
80
|
+
);
|
|
81
|
+
} catch {
|
|
82
|
+
// Handle promise rejection silently - the handler will deal with it
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Handle the request and unwrap the Result
|
|
87
|
+
const result = await instance.handler(request);
|
|
88
|
+
return await result.match(
|
|
89
|
+
(response) => response,
|
|
90
|
+
(error) => {
|
|
91
|
+
// Convert c15t errors to Response objects
|
|
92
|
+
const status = error.status || 500;
|
|
93
|
+
const message =
|
|
94
|
+
error.message || BASE_ERROR_CODES.INTERNAL_SERVER_ERROR;
|
|
95
|
+
return new Response(
|
|
96
|
+
JSON.stringify({
|
|
97
|
+
error: true,
|
|
98
|
+
code: error.code || BASE_ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
99
|
+
message,
|
|
100
|
+
data: error.data,
|
|
101
|
+
}),
|
|
102
|
+
{
|
|
103
|
+
status,
|
|
104
|
+
headers: {
|
|
105
|
+
'Content-Type': 'application/json',
|
|
106
|
+
},
|
|
107
|
+
}
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
);
|
|
111
|
+
} catch (error) {
|
|
112
|
+
// Handle any unexpected errors
|
|
113
|
+
// biome-ignore lint/suspicious/noConsole: This is a logging error
|
|
114
|
+
console.error('Unexpected error in c15t handler:', error);
|
|
115
|
+
return new Response(
|
|
116
|
+
JSON.stringify({
|
|
117
|
+
error: true,
|
|
118
|
+
code: BASE_ERROR_CODES.INTERNAL_SERVER_ERROR,
|
|
119
|
+
message: 'An unexpected error occurred',
|
|
120
|
+
data: { error: String(error) },
|
|
121
|
+
}),
|
|
122
|
+
{
|
|
123
|
+
status: 500,
|
|
124
|
+
headers: {
|
|
125
|
+
'Content-Type': 'application/json',
|
|
126
|
+
},
|
|
127
|
+
}
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
return {
|
|
133
|
+
GET: handler,
|
|
134
|
+
POST: handler,
|
|
135
|
+
};
|
|
136
|
+
}
|