@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/core.test.ts
ADDED
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { c15tInstance } from './core';
|
|
3
|
+
import { memoryAdapter } from './db/adapters/memory-adapter';
|
|
4
|
+
import type { C15TPlugin } from './types';
|
|
5
|
+
|
|
6
|
+
describe('c15tInstance', () => {
|
|
7
|
+
beforeEach(() => {
|
|
8
|
+
vi.unstubAllEnvs();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
it('should create an instance with basic configuration', async () => {
|
|
12
|
+
const instance = c15tInstance({
|
|
13
|
+
baseURL: 'http://localhost:3000',
|
|
14
|
+
database: memoryAdapter({}),
|
|
15
|
+
secret: 'test-secret',
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
expect(instance.options.baseURL).toBe('http://localhost:3000');
|
|
19
|
+
const context = await instance.$context;
|
|
20
|
+
expect(context.isOk()).toBe(true);
|
|
21
|
+
if (context.isOk()) {
|
|
22
|
+
expect(context.value.appName).toBe('c15t Consent Manager');
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('should handle requests with proper routing', async () => {
|
|
27
|
+
const instance = c15tInstance({
|
|
28
|
+
baseURL: 'http://localhost:8080',
|
|
29
|
+
database: memoryAdapter({}),
|
|
30
|
+
// secret: 'test-secret',
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
const request = new Request('http://localhost:8080/api/c15t/status', {
|
|
34
|
+
method: 'GET',
|
|
35
|
+
headers: {
|
|
36
|
+
Accept: 'application/json',
|
|
37
|
+
Origin: 'http://localhost:8080',
|
|
38
|
+
},
|
|
39
|
+
});
|
|
40
|
+
const response = await instance.handler(request);
|
|
41
|
+
expect(response.isOk()).toBe(true);
|
|
42
|
+
if (response.isOk()) {
|
|
43
|
+
expect(response.value.status).toBe(200);
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('should return correct health response structure', async () => {
|
|
48
|
+
const instance = c15tInstance({
|
|
49
|
+
baseURL: 'http://localhost:8080',
|
|
50
|
+
database: memoryAdapter({}),
|
|
51
|
+
secret: 'test-secret',
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
const request = new Request('http://localhost:8080/api/c15t/status', {
|
|
55
|
+
method: 'GET',
|
|
56
|
+
headers: {
|
|
57
|
+
Accept: 'application/json',
|
|
58
|
+
Origin: 'http://localhost:8080',
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
const response = await instance.handler(request);
|
|
63
|
+
expect(response.isOk()).toBe(true);
|
|
64
|
+
if (response.isOk()) {
|
|
65
|
+
const responseData = await response.value.json();
|
|
66
|
+
|
|
67
|
+
expect(responseData).toHaveProperty('status', 'ok');
|
|
68
|
+
expect(responseData).toHaveProperty('version');
|
|
69
|
+
expect(responseData).toHaveProperty('timestamp');
|
|
70
|
+
expect(responseData).toHaveProperty('storage');
|
|
71
|
+
|
|
72
|
+
expect(responseData.storage).toHaveProperty('type', 'memory');
|
|
73
|
+
expect(responseData.storage).toHaveProperty('available', true);
|
|
74
|
+
|
|
75
|
+
expect(new Date(responseData.timestamp).toISOString()).toBe(
|
|
76
|
+
responseData.timestamp
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
// biome-ignore lint/performance/useTopLevelRegex: <explanation>
|
|
80
|
+
expect(responseData.version).toMatch(/^\d+\.\d+\.\d+$/);
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it('should handle requests with custom base path', async () => {
|
|
85
|
+
const instance = c15tInstance({
|
|
86
|
+
baseURL: 'http://localhost:3000',
|
|
87
|
+
basePath: '/custom-path',
|
|
88
|
+
database: memoryAdapter({}),
|
|
89
|
+
secret: 'test-secret',
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
const request = new Request('http://localhost:3000/custom-path/status');
|
|
93
|
+
const response = await instance.handler(request);
|
|
94
|
+
|
|
95
|
+
expect(response.isOk()).toBe(true);
|
|
96
|
+
if (response.isOk()) {
|
|
97
|
+
expect(response.value.status).toBe(200);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('should handle requests with plugins', async () => {
|
|
102
|
+
const testPlugin: C15TPlugin = {
|
|
103
|
+
id: 'test-plugin',
|
|
104
|
+
name: 'Test Plugin',
|
|
105
|
+
type: 'test',
|
|
106
|
+
init: () => ({
|
|
107
|
+
context: {
|
|
108
|
+
appName: 'Modified App Name',
|
|
109
|
+
},
|
|
110
|
+
}),
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
const instance = c15tInstance({
|
|
114
|
+
baseURL: 'http://localhost:3000',
|
|
115
|
+
database: memoryAdapter({}),
|
|
116
|
+
plugins: [testPlugin],
|
|
117
|
+
secret: 'test-secret',
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
const context = await instance.$context;
|
|
121
|
+
expect(context.isOk()).toBe(true);
|
|
122
|
+
if (context.isOk()) {
|
|
123
|
+
expect(context.value.appName).toBe('Modified App Name');
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
it('should handle API endpoint retrieval', async () => {
|
|
128
|
+
const instance = c15tInstance({
|
|
129
|
+
baseURL: 'http://localhost:3000',
|
|
130
|
+
database: memoryAdapter({}),
|
|
131
|
+
secret: 'test-secret',
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
const api = await instance.getApi();
|
|
135
|
+
expect(api.isOk()).toBe(true);
|
|
136
|
+
if (api.isOk()) {
|
|
137
|
+
expect(api.value).toBeDefined();
|
|
138
|
+
expect(typeof api.value).toBe('object');
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
it('should handle invalid requests gracefully', async () => {
|
|
143
|
+
const instance = c15tInstance({
|
|
144
|
+
baseURL: 'http://localhost:3000',
|
|
145
|
+
database: memoryAdapter({}),
|
|
146
|
+
secret: 'test-secret',
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
const request = new Request(
|
|
150
|
+
'http://localhost:3000/api/c15t/invalid-endpoint'
|
|
151
|
+
);
|
|
152
|
+
const response = await instance.handler(request);
|
|
153
|
+
|
|
154
|
+
expect(response.isOk()).toBe(true);
|
|
155
|
+
if (response.isOk()) {
|
|
156
|
+
expect(response.value.status).toBe(404);
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
it('should handle trusted origins configuration', async () => {
|
|
161
|
+
const instance = c15tInstance({
|
|
162
|
+
baseURL: 'http://localhost:3000',
|
|
163
|
+
database: memoryAdapter({}),
|
|
164
|
+
trustedOrigins: ['http://trusted.test'],
|
|
165
|
+
secret: 'test-secret',
|
|
166
|
+
});
|
|
167
|
+
|
|
168
|
+
const context = await instance.$context;
|
|
169
|
+
expect(context.isOk()).toBe(true);
|
|
170
|
+
if (context.isOk()) {
|
|
171
|
+
expect(context.value.trustedOrigins).toContain('http://localhost:3000');
|
|
172
|
+
expect(context.value.trustedOrigins).toContain('http://trusted.test');
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
it('should handle dynamic trusted origins', async () => {
|
|
177
|
+
const instance = c15tInstance({
|
|
178
|
+
baseURL: 'http://localhost:3000',
|
|
179
|
+
database: memoryAdapter({}),
|
|
180
|
+
trustedOrigins: (request) => [request.headers.get('origin') || ''],
|
|
181
|
+
secret: 'test-secret',
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
const request = new Request('http://localhost:3000/api/c15t/status', {
|
|
185
|
+
headers: { origin: 'http://dynamic.test' },
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
const response = await instance.handler(request);
|
|
189
|
+
expect(response.isOk()).toBe(true);
|
|
190
|
+
|
|
191
|
+
const context = await instance.$context;
|
|
192
|
+
expect(context.isOk()).toBe(true);
|
|
193
|
+
if (context.isOk()) {
|
|
194
|
+
expect(context.value.trustedOrigins).toContain('http://dynamic.test');
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
it('should handle plugin initialization errors gracefully', async () => {
|
|
199
|
+
const errorPlugin: C15TPlugin = {
|
|
200
|
+
id: 'error-plugin',
|
|
201
|
+
name: 'Error Plugin',
|
|
202
|
+
type: 'test',
|
|
203
|
+
init: () => {
|
|
204
|
+
throw new Error('Plugin initialization failed');
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
|
|
208
|
+
const instance = c15tInstance({
|
|
209
|
+
baseURL: 'http://localhost:3000',
|
|
210
|
+
database: memoryAdapter({}),
|
|
211
|
+
plugins: [errorPlugin],
|
|
212
|
+
secret: 'test-secret',
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
const context = await instance.$context;
|
|
216
|
+
expect(context.isErr()).toBe(true);
|
|
217
|
+
if (context.isErr()) {
|
|
218
|
+
expect(context.error.message).toContain('Plugin initialization failed');
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
it('should handle base URL with trailing slash', async () => {
|
|
223
|
+
const instance = c15tInstance({
|
|
224
|
+
baseURL: 'http://localhost:3000/',
|
|
225
|
+
database: memoryAdapter({}),
|
|
226
|
+
secret: 'test-secret',
|
|
227
|
+
});
|
|
228
|
+
|
|
229
|
+
const request = new Request('http://localhost:3000/api/c15t/status', {
|
|
230
|
+
method: 'GET',
|
|
231
|
+
headers: {
|
|
232
|
+
Accept: 'application/json',
|
|
233
|
+
Origin: 'http://localhost:3000',
|
|
234
|
+
},
|
|
235
|
+
});
|
|
236
|
+
const response = await instance.handler(request);
|
|
237
|
+
expect(response.isOk()).toBe(true);
|
|
238
|
+
if (response.isOk()) {
|
|
239
|
+
expect(response.value.status).toBe(200);
|
|
240
|
+
}
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
it('should handle plugin response modification', async () => {
|
|
244
|
+
const responsePlugin: C15TPlugin = {
|
|
245
|
+
id: 'response-plugin',
|
|
246
|
+
name: 'Response Plugin',
|
|
247
|
+
type: 'test',
|
|
248
|
+
onResponse: async (response, ctx) => {
|
|
249
|
+
const contentType = response.headers.get('content-type');
|
|
250
|
+
let data = {};
|
|
251
|
+
|
|
252
|
+
if (contentType?.includes('application/json')) {
|
|
253
|
+
try {
|
|
254
|
+
data = await response.clone().json();
|
|
255
|
+
} catch (error) {
|
|
256
|
+
// biome-ignore lint/suspicious/noConsoleLog: its okay as we are testing
|
|
257
|
+
// biome-ignore lint/suspicious/noConsole: its okay as we are testing
|
|
258
|
+
console.log('Failed to parse JSON response:', error);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return {
|
|
263
|
+
response: new Response(JSON.stringify({ ...data, modified: true }), {
|
|
264
|
+
status: response.status,
|
|
265
|
+
headers: new Headers({
|
|
266
|
+
'Content-Type': 'application/json',
|
|
267
|
+
...Object.fromEntries(response.headers.entries()),
|
|
268
|
+
}),
|
|
269
|
+
}),
|
|
270
|
+
context: ctx,
|
|
271
|
+
};
|
|
272
|
+
},
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
const instance = c15tInstance({
|
|
276
|
+
baseURL: 'http://localhost:3000',
|
|
277
|
+
database: memoryAdapter({}),
|
|
278
|
+
plugins: [responsePlugin],
|
|
279
|
+
secret: 'test-secret',
|
|
280
|
+
});
|
|
281
|
+
|
|
282
|
+
const request = new Request('http://localhost:3000/api/c15t/status', {
|
|
283
|
+
method: 'GET',
|
|
284
|
+
headers: {
|
|
285
|
+
Accept: 'application/json',
|
|
286
|
+
Origin: 'http://localhost:3000',
|
|
287
|
+
},
|
|
288
|
+
});
|
|
289
|
+
|
|
290
|
+
const response = await instance.handler(request);
|
|
291
|
+
|
|
292
|
+
expect(response.isOk()).toBe(true);
|
|
293
|
+
|
|
294
|
+
if (response.isOk()) {
|
|
295
|
+
const data = await response.value.json();
|
|
296
|
+
expect(data.modified).toBe(true);
|
|
297
|
+
} else {
|
|
298
|
+
// biome-ignore lint/suspicious/noConsole: its okay as we are testing
|
|
299
|
+
console.error('Response error:', response.error);
|
|
300
|
+
expect.fail(`Response was not OK: ${JSON.stringify(response.error)}`);
|
|
301
|
+
}
|
|
302
|
+
});
|
|
303
|
+
});
|
package/src/core.ts
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { router } from './api/index';
|
|
2
|
+
import { BASE_ERROR_CODES, failAsync, okAsync, safeResultAsync } from './error';
|
|
3
|
+
import type { C15TResult, C15TResultAsync } from './error/results';
|
|
4
|
+
import { init } from './init';
|
|
5
|
+
import type {
|
|
6
|
+
C15TContext,
|
|
7
|
+
C15TOptions,
|
|
8
|
+
C15TPlugin,
|
|
9
|
+
FilterActions,
|
|
10
|
+
} from './types';
|
|
11
|
+
import { getBaseURL } from './utils';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Interface representing a configured c15t consent management instance.
|
|
15
|
+
*
|
|
16
|
+
* @typeParam PluginTypes - Array of plugin types used in this instance
|
|
17
|
+
*
|
|
18
|
+
* @remarks
|
|
19
|
+
* The C15TInstance provides the main interface for interacting with the consent
|
|
20
|
+
* management system. It includes methods for handling requests, accessing API
|
|
21
|
+
* endpoints, and managing the system's configuration.
|
|
22
|
+
*
|
|
23
|
+
* All asynchronous operations return {@link C15TResultAsync} types for
|
|
24
|
+
* consistent error handling across the system.
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const instance: C15TInstance = c15tInstance({
|
|
29
|
+
* secret: 'your-secret',
|
|
30
|
+
* storage: memoryAdapter()
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* // Handle an incoming request
|
|
34
|
+
* const response = await instance.handler(request);
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export interface C15TInstance<PluginTypes extends C15TPlugin[] = C15TPlugin[]> {
|
|
38
|
+
/**
|
|
39
|
+
* Processes incoming HTTP requests and routes them to appropriate handlers.
|
|
40
|
+
*
|
|
41
|
+
* @param request - The incoming web request
|
|
42
|
+
* @returns A Promise resolving to a Result containing the HTTP response
|
|
43
|
+
*
|
|
44
|
+
* @throws Never - All errors are captured in the Result type
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* const result = await instance.handler(request);
|
|
49
|
+
* result.match(
|
|
50
|
+
* response => sendResponse(response),
|
|
51
|
+
* error => handleError(error)
|
|
52
|
+
* );
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
handler: (request: Request) => Promise<C15TResultAsync<Response>>;
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Retrieves available API endpoints and their configurations.
|
|
59
|
+
*
|
|
60
|
+
* @returns A Promise resolving to a Result containing the available API endpoints
|
|
61
|
+
*
|
|
62
|
+
* @throws Never - All errors are captured in the Result type
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const endpoints = await instance.getApi();
|
|
67
|
+
* endpoints.map(
|
|
68
|
+
* apis => console.log('Available endpoints:', apis),
|
|
69
|
+
* error => console.error('Failed to get endpoints:', error)
|
|
70
|
+
* );
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
getApi: () => Promise<
|
|
74
|
+
C15TResultAsync<FilterActions<ReturnType<typeof router>['endpoints']>>
|
|
75
|
+
>;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* The configuration options used for this instance.
|
|
79
|
+
*/
|
|
80
|
+
options: C15TOptions<PluginTypes>;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Access to the underlying context as a Result type.
|
|
84
|
+
*
|
|
85
|
+
* @remarks
|
|
86
|
+
* The context is wrapped in a Result type to ensure error handling
|
|
87
|
+
* consistency. Access should be handled using Result pattern methods.
|
|
88
|
+
*/
|
|
89
|
+
$context: Promise<C15TResult<C15TContext>>;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Creates a new c15t consent management instance.
|
|
94
|
+
*
|
|
95
|
+
* @typeParam PluginTypes - Array of plugin types to be used in this instance
|
|
96
|
+
* @typeParam ConfigOptions - Configuration options extending the base C15TOptions
|
|
97
|
+
*
|
|
98
|
+
* @param options - Configuration options for the consent management system
|
|
99
|
+
* @returns A configured C15TInstance ready for use
|
|
100
|
+
*
|
|
101
|
+
* @remarks
|
|
102
|
+
* This is the main factory function for creating c15t instances. It initializes
|
|
103
|
+
* the consent management system with the provided configuration and sets up all
|
|
104
|
+
* necessary components including:
|
|
105
|
+
*
|
|
106
|
+
* - Database adapters
|
|
107
|
+
* - Plugin system
|
|
108
|
+
* - Request handlers
|
|
109
|
+
* - API endpoints
|
|
110
|
+
* - CORS configuration
|
|
111
|
+
*
|
|
112
|
+
* All async operations use the Result pattern for error handling, ensuring
|
|
113
|
+
* that errors are handled consistently throughout the system.
|
|
114
|
+
*
|
|
115
|
+
* @example
|
|
116
|
+
* Basic initialization:
|
|
117
|
+
* ```typescript
|
|
118
|
+
* import { c15tInstance } from '@c15t/backend';
|
|
119
|
+
*
|
|
120
|
+
* const manager = c15tInstance({
|
|
121
|
+
* secret: process.env.SECRET_KEY,
|
|
122
|
+
* storage: memoryAdapter()
|
|
123
|
+
* });
|
|
124
|
+
* ```
|
|
125
|
+
*
|
|
126
|
+
* @example
|
|
127
|
+
* Advanced initialization with type parameters:
|
|
128
|
+
* ```typescript
|
|
129
|
+
* type MyPlugins = [typeof geoPlugin, typeof analyticsPlugin];
|
|
130
|
+
*
|
|
131
|
+
* const c15t = c15tInstance<MyPlugins>({
|
|
132
|
+
* secret: process.env.SECRET_KEY,
|
|
133
|
+
* storage: kyselyAdapter(db),
|
|
134
|
+
* plugins: [geoPlugin(), analyticsPlugin()]
|
|
135
|
+
* });
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export const c15tInstance = <
|
|
139
|
+
PluginTypes extends C15TPlugin[] = C15TPlugin[],
|
|
140
|
+
ConfigOptions extends C15TOptions<PluginTypes> = C15TOptions<PluginTypes>,
|
|
141
|
+
>(
|
|
142
|
+
options: ConfigOptions
|
|
143
|
+
): C15TInstance<PluginTypes> => {
|
|
144
|
+
const contextPromise = init(options);
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Processes incoming requests and routes them to the appropriate handler
|
|
148
|
+
* using the Result pattern for error handling
|
|
149
|
+
*
|
|
150
|
+
* @param request - The incoming web request
|
|
151
|
+
* @returns A Promise resolving to a Result containing a web response
|
|
152
|
+
*/
|
|
153
|
+
const handler = async (
|
|
154
|
+
request: Request
|
|
155
|
+
): Promise<C15TResultAsync<Response>> => {
|
|
156
|
+
const contextResult = await contextPromise;
|
|
157
|
+
|
|
158
|
+
// Map the Result to a ResultAsync for proper chaining
|
|
159
|
+
return contextResult.asyncAndThen((ctx: C15TContext) => {
|
|
160
|
+
const basePath = ctx.options.basePath || '/api/c15t';
|
|
161
|
+
const url = new URL(request.url);
|
|
162
|
+
if (ctx.options.baseURL) {
|
|
163
|
+
// If baseURL is provided but doesn't include the basePath, add it
|
|
164
|
+
const baseURL = new URL(ctx.options.baseURL);
|
|
165
|
+
if (!baseURL.pathname || baseURL.pathname === '/') {
|
|
166
|
+
ctx.options.baseURL = `${baseURL.origin}${basePath}`;
|
|
167
|
+
ctx.baseURL = ctx.options.baseURL;
|
|
168
|
+
}
|
|
169
|
+
} else {
|
|
170
|
+
const baseURL =
|
|
171
|
+
getBaseURL(undefined, basePath) || `${url.origin}${basePath}`;
|
|
172
|
+
ctx.options.baseURL = baseURL;
|
|
173
|
+
ctx.baseURL = baseURL;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Extract trusted origins logic to avoid nested ternaries
|
|
177
|
+
let originsFromOptions: string[] = [];
|
|
178
|
+
if (options.trustedOrigins) {
|
|
179
|
+
originsFromOptions = Array.isArray(options.trustedOrigins)
|
|
180
|
+
? options.trustedOrigins
|
|
181
|
+
: options.trustedOrigins(request);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
ctx.trustedOrigins = [
|
|
185
|
+
...originsFromOptions,
|
|
186
|
+
ctx.options.baseURL || '',
|
|
187
|
+
url.origin,
|
|
188
|
+
];
|
|
189
|
+
|
|
190
|
+
try {
|
|
191
|
+
const { handler } = router(ctx, options);
|
|
192
|
+
|
|
193
|
+
// Use safeResultAsync instead of fromPromise
|
|
194
|
+
return safeResultAsync(
|
|
195
|
+
handler(request),
|
|
196
|
+
BASE_ERROR_CODES.REQUEST_HANDLER_ERROR
|
|
197
|
+
);
|
|
198
|
+
} catch (error) {
|
|
199
|
+
const safeErrorMessage =
|
|
200
|
+
error instanceof Error
|
|
201
|
+
? error.message.split('\n')[0]
|
|
202
|
+
: 'An unknown error occurred';
|
|
203
|
+
return failAsync(`Error processing request: ${safeErrorMessage}`, {
|
|
204
|
+
code: BASE_ERROR_CODES.REQUEST_HANDLER_ERROR,
|
|
205
|
+
status: 500,
|
|
206
|
+
data: { url: request.url },
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
};
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Method to get API endpoints using the Result pattern
|
|
214
|
+
*
|
|
215
|
+
* @returns A Promise resolving to a Result containing the available API endpoints
|
|
216
|
+
*/
|
|
217
|
+
const getApi = async (): Promise<
|
|
218
|
+
C15TResultAsync<FilterActions<ReturnType<typeof router>['endpoints']>>
|
|
219
|
+
> => {
|
|
220
|
+
const contextResult = await contextPromise;
|
|
221
|
+
|
|
222
|
+
return contextResult.asyncAndThen((context: C15TContext) => {
|
|
223
|
+
// Make sure context has a valid baseURL before calling router
|
|
224
|
+
if (!context.baseURL) {
|
|
225
|
+
try {
|
|
226
|
+
const basePath = context.options.basePath || '/api/c15t';
|
|
227
|
+
const baseURL = getBaseURL(context.options.baseURL, basePath);
|
|
228
|
+
if (baseURL) {
|
|
229
|
+
context.baseURL = baseURL;
|
|
230
|
+
}
|
|
231
|
+
} catch (error) {
|
|
232
|
+
return failAsync(
|
|
233
|
+
`Failed to determine base URL: ${error instanceof Error ? error.message : String(error)}`,
|
|
234
|
+
{
|
|
235
|
+
code: BASE_ERROR_CODES.API_RETRIEVAL_ERROR,
|
|
236
|
+
}
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
try {
|
|
242
|
+
const { endpoints } = router(context, options);
|
|
243
|
+
// Convert endpoints to the expected FilterActions type and wrap in okAsync
|
|
244
|
+
const typedEndpoints = endpoints as unknown as FilterActions<
|
|
245
|
+
ReturnType<typeof router>['endpoints']
|
|
246
|
+
>;
|
|
247
|
+
return okAsync(typedEndpoints);
|
|
248
|
+
} catch (error) {
|
|
249
|
+
return failAsync(
|
|
250
|
+
`Failed to get API endpoints: ${error instanceof Error ? error.message : String(error)}`,
|
|
251
|
+
{
|
|
252
|
+
code: BASE_ERROR_CODES.API_RETRIEVAL_ERROR,
|
|
253
|
+
data: { error },
|
|
254
|
+
}
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
});
|
|
258
|
+
};
|
|
259
|
+
|
|
260
|
+
// Create and return the simplified instance with access to the context
|
|
261
|
+
return {
|
|
262
|
+
handler,
|
|
263
|
+
getApi,
|
|
264
|
+
options,
|
|
265
|
+
$context: contextPromise,
|
|
266
|
+
};
|
|
267
|
+
};
|