@c15t/backend 0.0.1-rc.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.turbo/turbo-build.log +11 -0
- package/.turbo/turbo-check-types.log +5 -0
- package/.turbo/turbo-fmt.log +7 -0
- package/.turbo/turbo-lint.log +6 -0
- package/.turbo/turbo-test.log +26 -0
- package/README-next.md +223 -0
- package/README.md +164 -0
- package/dist/api/call.d.ts +176 -0
- package/dist/api/call.d.ts.map +1 -0
- package/dist/api/index.d.ts +935 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/middlewares/index.d.ts +39 -0
- package/dist/api/middlewares/index.d.ts.map +1 -0
- package/dist/api/middlewares/origin-check.d.ts +82 -0
- package/dist/api/middlewares/origin-check.d.ts.map +1 -0
- package/dist/api/middlewares/validate-context.d.ts +38 -0
- package/dist/api/middlewares/validate-context.d.ts.map +1 -0
- package/dist/api/routes/__tests__/consent.test.d.ts +2 -0
- package/dist/api/routes/__tests__/consent.test.d.ts.map +1 -0
- package/dist/api/routes/__tests__/status.test.d.ts +2 -0
- package/dist/api/routes/__tests__/status.test.d.ts.map +1 -0
- package/dist/api/routes/error.d.ts +57 -0
- package/dist/api/routes/error.d.ts.map +1 -0
- package/dist/api/routes/generate-consent-receipt.d.ts +130 -0
- package/dist/api/routes/generate-consent-receipt.d.ts.map +1 -0
- package/dist/api/routes/get-consent-history.d.ts +133 -0
- package/dist/api/routes/get-consent-history.d.ts.map +1 -0
- package/dist/api/routes/get-consent-policy.d.ts +164 -0
- package/dist/api/routes/get-consent-policy.d.ts.map +1 -0
- package/dist/api/routes/get-consent.d.ts +148 -0
- package/dist/api/routes/get-consent.d.ts.map +1 -0
- package/dist/api/routes/index.d.ts +339 -0
- package/dist/api/routes/index.d.ts.map +1 -0
- package/dist/api/routes/ok.d.ts +87 -0
- package/dist/api/routes/ok.d.ts.map +1 -0
- package/dist/api/routes/set-consent.d.ts +245 -0
- package/dist/api/routes/set-consent.d.ts.map +1 -0
- package/dist/api/routes/show-consent-banner.d.ts +127 -0
- package/dist/api/routes/show-consent-banner.d.ts.map +1 -0
- package/dist/api/routes/status.d.ts +61 -0
- package/dist/api/routes/status.d.ts.map +1 -0
- package/dist/api/routes/verify-consent.d.ts +179 -0
- package/dist/api/routes/verify-consent.d.ts.map +1 -0
- package/dist/api/routes/withdraw-consent.d.ts +194 -0
- package/dist/api/routes/withdraw-consent.d.ts.map +1 -0
- package/dist/api/to-endpoints.d.ts +35 -0
- package/dist/api/to-endpoints.d.ts.map +1 -0
- package/dist/client/index.cjs +139 -0
- package/dist/client/index.d.ts +203 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +106 -0
- package/dist/client/types.d.ts +431 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/core.d.ts +124 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.test.d.ts +2 -0
- package/dist/core.test.d.ts.map +1 -0
- package/dist/db/adapters/drizzle-adapter/drizzle-adapter.d.ts +122 -0
- package/dist/db/adapters/drizzle-adapter/drizzle-adapter.d.ts.map +1 -0
- package/dist/db/adapters/drizzle-adapter/index.d.ts +2 -0
- package/dist/db/adapters/drizzle-adapter/index.d.ts.map +1 -0
- package/dist/db/adapters/drizzle.cjs +1531 -0
- package/dist/db/adapters/drizzle.js +1489 -0
- package/dist/db/adapters/kysely-adapter/dialect.d.ts +72 -0
- package/dist/db/adapters/kysely-adapter/dialect.d.ts.map +1 -0
- package/dist/db/adapters/kysely-adapter/index.d.ts +4 -0
- package/dist/db/adapters/kysely-adapter/index.d.ts.map +1 -0
- package/dist/db/adapters/kysely-adapter/kysely-adapter.d.ts +98 -0
- package/dist/db/adapters/kysely-adapter/kysely-adapter.d.ts.map +1 -0
- package/dist/db/adapters/kysely-adapter/types.d.ts +281 -0
- package/dist/db/adapters/kysely-adapter/types.d.ts.map +1 -0
- package/dist/db/adapters/kysely.cjs +1551 -0
- package/dist/db/adapters/kysely.js +1508 -0
- package/dist/db/adapters/memory-adapter/index.d.ts +2 -0
- package/dist/db/adapters/memory-adapter/index.d.ts.map +1 -0
- package/dist/db/adapters/memory-adapter/memory-adapter.d.ts +56 -0
- package/dist/db/adapters/memory-adapter/memory-adapter.d.ts.map +1 -0
- package/dist/db/adapters/memory.cjs +1391 -0
- package/dist/db/adapters/memory.js +1349 -0
- package/dist/db/adapters/prisma-adapter/index.d.ts +2 -0
- package/dist/db/adapters/prisma-adapter/index.d.ts.map +1 -0
- package/dist/db/adapters/prisma-adapter/prisma-adapter.d.ts +143 -0
- package/dist/db/adapters/prisma-adapter/prisma-adapter.d.ts.map +1 -0
- package/dist/db/adapters/prisma.cjs +1503 -0
- package/dist/db/adapters/prisma.js +1461 -0
- package/dist/db/adapters/types.d.ts +154 -0
- package/dist/db/adapters/types.d.ts.map +1 -0
- package/dist/db/adapters/utils.d.ts +36 -0
- package/dist/db/adapters/utils.d.ts.map +1 -0
- package/dist/db/core/fields/field-factory.d.ts +383 -0
- package/dist/db/core/fields/field-factory.d.ts.map +1 -0
- package/dist/db/core/fields/field-inference.d.ts +218 -0
- package/dist/db/core/fields/field-inference.d.ts.map +1 -0
- package/dist/db/core/fields/field-options-integration.d.ts +90 -0
- package/dist/db/core/fields/field-options-integration.d.ts.map +1 -0
- package/dist/db/core/fields/field-types.d.ts +182 -0
- package/dist/db/core/fields/field-types.d.ts.map +1 -0
- package/dist/db/core/fields/id-generator.d.ts +19 -0
- package/dist/db/core/fields/id-generator.d.ts.map +1 -0
- package/dist/db/core/fields/index.d.ts +8 -0
- package/dist/db/core/fields/index.d.ts.map +1 -0
- package/dist/db/core/fields/superjson-utils.d.ts +34 -0
- package/dist/db/core/fields/superjson-utils.d.ts.map +1 -0
- package/dist/db/core/fields/zod-fields.d.ts +1011 -0
- package/dist/db/core/fields/zod-fields.d.ts.map +1 -0
- package/dist/db/core/get-schema.d.ts +36 -0
- package/dist/db/core/get-schema.d.ts.map +1 -0
- package/dist/db/core/types.d.ts +41 -0
- package/dist/db/core/types.d.ts.map +1 -0
- package/dist/db/create-registry.d.ts +760 -0
- package/dist/db/create-registry.d.ts.map +1 -0
- package/dist/db/hooks/create-hooks.d.ts +32 -0
- package/dist/db/hooks/create-hooks.d.ts.map +1 -0
- package/dist/db/hooks/index.d.ts +40 -0
- package/dist/db/hooks/index.d.ts.map +1 -0
- package/dist/db/hooks/types.d.ts +133 -0
- package/dist/db/hooks/types.d.ts.map +1 -0
- package/dist/db/hooks/update-hooks.d.ts +33 -0
- package/dist/db/hooks/update-hooks.d.ts.map +1 -0
- package/dist/db/hooks/update-many-hooks.d.ts +55 -0
- package/dist/db/hooks/update-many-hooks.d.ts.map +1 -0
- package/dist/db/hooks/utils.d.ts +62 -0
- package/dist/db/hooks/utils.d.ts.map +1 -0
- package/dist/db/hooks/with-hooks-factory.d.ts +33 -0
- package/dist/db/hooks/with-hooks-factory.d.ts.map +1 -0
- package/dist/db/index.cjs +2458 -0
- package/dist/db/index.d.ts +11 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +2404 -0
- package/dist/db/migration/get-migration.d.ts +32 -0
- package/dist/db/migration/get-migration.d.ts.map +1 -0
- package/dist/db/migration/get-schema/get-schema.d.ts +27 -0
- package/dist/db/migration/get-schema/get-schema.d.ts.map +1 -0
- package/dist/db/migration/get-schema/index.d.ts +21 -0
- package/dist/db/migration/get-schema/index.d.ts.map +1 -0
- package/dist/db/migration/get-schema/process-fields.d.ts +16 -0
- package/dist/db/migration/get-schema/process-fields.d.ts.map +1 -0
- package/dist/db/migration/get-schema/process-tables.d.ts +13 -0
- package/dist/db/migration/get-schema/process-tables.d.ts.map +1 -0
- package/dist/db/migration/get-schema/types.d.ts +17 -0
- package/dist/db/migration/get-schema/types.d.ts.map +1 -0
- package/dist/db/migration/index.cjs +1613 -0
- package/dist/db/migration/index.d.ts +14 -0
- package/dist/db/migration/index.d.ts.map +1 -0
- package/dist/db/migration/index.js +1571 -0
- package/dist/db/migration/migration-builders.d.ts +28 -0
- package/dist/db/migration/migration-builders.d.ts.map +1 -0
- package/dist/db/migration/migration-execution.d.ts +12 -0
- package/dist/db/migration/migration-execution.d.ts.map +1 -0
- package/dist/db/migration/schema-comparison.d.ts +54 -0
- package/dist/db/migration/schema-comparison.d.ts.map +1 -0
- package/dist/db/migration/type-mapping.d.ts +86 -0
- package/dist/db/migration/type-mapping.d.ts.map +1 -0
- package/dist/db/migration/types.d.ts +37 -0
- package/dist/db/migration/types.d.ts.map +1 -0
- package/dist/db/schema/audit-log/index.d.ts +4 -0
- package/dist/db/schema/audit-log/index.d.ts.map +1 -0
- package/dist/db/schema/audit-log/registry.d.ts +128 -0
- package/dist/db/schema/audit-log/registry.d.ts.map +1 -0
- package/dist/db/schema/audit-log/schema.d.ts +67 -0
- package/dist/db/schema/audit-log/schema.d.ts.map +1 -0
- package/dist/db/schema/audit-log/table.d.ts +175 -0
- package/dist/db/schema/audit-log/table.d.ts.map +1 -0
- package/dist/db/schema/audit-log/types.d.ts +29 -0
- package/dist/db/schema/audit-log/types.d.ts.map +1 -0
- package/dist/db/schema/consent/index.d.ts +4 -0
- package/dist/db/schema/consent/index.d.ts.map +1 -0
- package/dist/db/schema/consent/registry.d.ts +318 -0
- package/dist/db/schema/consent/registry.d.ts.map +1 -0
- package/dist/db/schema/consent/schema.d.ts +135 -0
- package/dist/db/schema/consent/schema.d.ts.map +1 -0
- package/dist/db/schema/consent/table.d.ts +245 -0
- package/dist/db/schema/consent/table.d.ts.map +1 -0
- package/dist/db/schema/consent/types.d.ts +37 -0
- package/dist/db/schema/consent/types.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/index.d.ts +4 -0
- package/dist/db/schema/consent-geo-location/index.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/registry.d.ts +96 -0
- package/dist/db/schema/consent-geo-location/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/schema.d.ts +71 -0
- package/dist/db/schema/consent-geo-location/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/table.d.ts +167 -0
- package/dist/db/schema/consent-geo-location/table.d.ts.map +1 -0
- package/dist/db/schema/consent-geo-location/types.d.ts +21 -0
- package/dist/db/schema/consent-geo-location/types.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/index.d.ts +4 -0
- package/dist/db/schema/consent-policy/index.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/registry.d.ts +186 -0
- package/dist/db/schema/consent-policy/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/schema.d.ts +68 -0
- package/dist/db/schema/consent-policy/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/table.d.ts +147 -0
- package/dist/db/schema/consent-policy/table.d.ts.map +1 -0
- package/dist/db/schema/consent-policy/types.d.ts +28 -0
- package/dist/db/schema/consent-policy/types.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/index.d.ts +4 -0
- package/dist/db/schema/consent-purpose/index.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/registry.d.ts +136 -0
- package/dist/db/schema/consent-purpose/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/schema.d.ts +79 -0
- package/dist/db/schema/consent-purpose/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/table.d.ts +161 -0
- package/dist/db/schema/consent-purpose/table.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose/types.d.ts +16 -0
- package/dist/db/schema/consent-purpose/types.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/index.d.ts +4 -0
- package/dist/db/schema/consent-purpose-junction/index.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/registry.d.ts +109 -0
- package/dist/db/schema/consent-purpose-junction/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/schema.d.ts +57 -0
- package/dist/db/schema/consent-purpose-junction/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/table.d.ts +138 -0
- package/dist/db/schema/consent-purpose-junction/table.d.ts.map +1 -0
- package/dist/db/schema/consent-purpose-junction/types.d.ts +14 -0
- package/dist/db/schema/consent-purpose-junction/types.d.ts.map +1 -0
- package/dist/db/schema/consent-record/index.d.ts +4 -0
- package/dist/db/schema/consent-record/index.d.ts.map +1 -0
- package/dist/db/schema/consent-record/registry.d.ts +119 -0
- package/dist/db/schema/consent-record/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-record/schema.d.ts +57 -0
- package/dist/db/schema/consent-record/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-record/table.d.ts +123 -0
- package/dist/db/schema/consent-record/table.d.ts.map +1 -0
- package/dist/db/schema/consent-record/types.d.ts +21 -0
- package/dist/db/schema/consent-record/types.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/index.d.ts +4 -0
- package/dist/db/schema/consent-withdrawal/index.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/registry.d.ts +134 -0
- package/dist/db/schema/consent-withdrawal/registry.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/schema.d.ts +67 -0
- package/dist/db/schema/consent-withdrawal/schema.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/table.d.ts +170 -0
- package/dist/db/schema/consent-withdrawal/table.d.ts.map +1 -0
- package/dist/db/schema/consent-withdrawal/types.d.ts +28 -0
- package/dist/db/schema/consent-withdrawal/types.d.ts.map +1 -0
- package/dist/db/schema/definition.d.ts +1100 -0
- package/dist/db/schema/definition.d.ts.map +1 -0
- package/dist/db/schema/domain/index.d.ts +4 -0
- package/dist/db/schema/domain/index.d.ts.map +1 -0
- package/dist/db/schema/domain/registry.d.ts +169 -0
- package/dist/db/schema/domain/registry.d.ts.map +1 -0
- package/dist/db/schema/domain/schema.d.ts +60 -0
- package/dist/db/schema/domain/schema.d.ts.map +1 -0
- package/dist/db/schema/domain/table.d.ts +140 -0
- package/dist/db/schema/domain/table.d.ts.map +1 -0
- package/dist/db/schema/domain/types.d.ts +27 -0
- package/dist/db/schema/domain/types.d.ts.map +1 -0
- package/dist/db/schema/geo-location/index.d.ts +4 -0
- package/dist/db/schema/geo-location/index.d.ts.map +1 -0
- package/dist/db/schema/geo-location/registry.d.ts +114 -0
- package/dist/db/schema/geo-location/registry.d.ts.map +1 -0
- package/dist/db/schema/geo-location/schema.d.ts +58 -0
- package/dist/db/schema/geo-location/schema.d.ts.map +1 -0
- package/dist/db/schema/geo-location/table.d.ts +132 -0
- package/dist/db/schema/geo-location/table.d.ts.map +1 -0
- package/dist/db/schema/geo-location/types.d.ts +17 -0
- package/dist/db/schema/geo-location/types.d.ts.map +1 -0
- package/dist/db/schema/index.d.ts +85 -0
- package/dist/db/schema/index.d.ts.map +1 -0
- package/dist/db/schema/parser.d.ts +183 -0
- package/dist/db/schema/parser.d.ts.map +1 -0
- package/dist/db/schema/schemas.d.ts +383 -0
- package/dist/db/schema/schemas.d.ts.map +1 -0
- package/dist/db/schema/subject/index.d.ts +4 -0
- package/dist/db/schema/subject/index.d.ts.map +1 -0
- package/dist/db/schema/subject/registry.d.ts +141 -0
- package/dist/db/schema/subject/registry.d.ts.map +1 -0
- package/dist/db/schema/subject/schema.d.ts +56 -0
- package/dist/db/schema/subject/schema.d.ts.map +1 -0
- package/dist/db/schema/subject/table.d.ts +136 -0
- package/dist/db/schema/subject/table.d.ts.map +1 -0
- package/dist/db/schema/subject/types.d.ts +22 -0
- package/dist/db/schema/subject/types.d.ts.map +1 -0
- package/dist/db/schema/types.d.ts +136 -0
- package/dist/db/schema/types.d.ts.map +1 -0
- package/dist/db/utils/adapter-factory.d.ts +21 -0
- package/dist/db/utils/adapter-factory.d.ts.map +1 -0
- package/dist/db/utils/index.d.ts +10 -0
- package/dist/db/utils/index.d.ts.map +1 -0
- package/dist/db/utils.d.ts +4 -0
- package/dist/db/utils.d.ts.map +1 -0
- package/dist/error/codes.cjs +68 -0
- package/dist/error/codes.d.ts +175 -0
- package/dist/error/codes.d.ts.map +1 -0
- package/dist/error/codes.js +35 -0
- package/dist/error/error.d.ts +79 -0
- package/dist/error/error.d.ts.map +1 -0
- package/dist/error/index.cjs +172 -0
- package/dist/error/index.d.ts +9 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +129 -0
- package/dist/error/logging.d.ts +25 -0
- package/dist/error/logging.d.ts.map +1 -0
- package/dist/error/pipeline.d.ts +19 -0
- package/dist/error/pipeline.d.ts.map +1 -0
- package/dist/error/recovery.d.ts +22 -0
- package/dist/error/recovery.d.ts.map +1 -0
- package/dist/error/results.d.ts +56 -0
- package/dist/error/results.d.ts.map +1 -0
- package/dist/index.cjs +4777 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4708 -0
- package/dist/init.d.ts +52 -0
- package/dist/init.d.ts.map +1 -0
- package/dist/init.test.d.ts +2 -0
- package/dist/init.test.d.ts.map +1 -0
- package/dist/integrations/index.cjs +281 -0
- package/dist/integrations/index.d.ts +7 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +248 -0
- package/dist/integrations/next.cjs +131 -0
- package/dist/integrations/next.d.ts +29 -0
- package/dist/integrations/next.d.ts.map +1 -0
- package/dist/integrations/next.js +99 -0
- package/dist/integrations/react.cjs +182 -0
- package/dist/integrations/react.d.ts +257 -0
- package/dist/integrations/react.d.ts.map +1 -0
- package/dist/integrations/react.js +150 -0
- package/dist/plugins/geo/index.d.ts +2 -0
- package/dist/plugins/geo/index.d.ts.map +1 -0
- package/dist/test/utils.d.ts +65 -0
- package/dist/test/utils.d.ts.map +1 -0
- package/dist/types/api.d.ts +89 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/context.d.ts +205 -0
- package/dist/types/context.d.ts.map +1 -0
- package/dist/types/helper.d.ts +78 -0
- package/dist/types/helper.d.ts.map +1 -0
- package/dist/types/index.cjs +19 -0
- package/dist/types/index.d.ts +6 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +0 -0
- package/dist/types/options.d.ts +172 -0
- package/dist/types/options.d.ts.map +1 -0
- package/dist/types/plugins.d.ts +442 -0
- package/dist/types/plugins.d.ts.map +1 -0
- package/dist/utils/env.d.ts +77 -0
- package/dist/utils/env.d.ts.map +1 -0
- package/dist/utils/hide-metadata.d.ts +22 -0
- package/dist/utils/hide-metadata.d.ts.map +1 -0
- package/dist/utils/index.cjs +268 -0
- package/dist/utils/index.d.ts +18 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +210 -0
- package/dist/utils/ip.d.ts +10 -0
- package/dist/utils/ip.d.ts.map +1 -0
- package/dist/utils/json.d.ts +14 -0
- package/dist/utils/json.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +108 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/url.d.ts +87 -0
- package/dist/utils/url.d.ts.map +1 -0
- package/dist/utils/wildcard.d.ts +46 -0
- package/dist/utils/wildcard.d.ts.map +1 -0
- package/knip.json +37 -0
- package/package.json +146 -0
- package/rslib.config.ts +104 -0
- package/src/api/call.ts +177 -0
- package/src/api/index.ts +303 -0
- package/src/api/middlewares/index.ts +38 -0
- package/src/api/middlewares/origin-check.ts +260 -0
- package/src/api/middlewares/validate-context.ts +175 -0
- package/src/api/routes/__tests__/consent.test.ts +270 -0
- package/src/api/routes/__tests__/status.test.ts +36 -0
- package/src/api/routes/error.ts +130 -0
- package/src/api/routes/generate-consent-receipt.ts +244 -0
- package/src/api/routes/get-consent-history.ts +128 -0
- package/src/api/routes/get-consent-policy.ts +327 -0
- package/src/api/routes/get-consent.ts +230 -0
- package/src/api/routes/index.ts +12 -0
- package/src/api/routes/ok.ts +45 -0
- package/src/api/routes/set-consent.ts +328 -0
- package/src/api/routes/show-consent-banner.ts +149 -0
- package/src/api/routes/status.ts +62 -0
- package/src/api/routes/verify-consent.ts +272 -0
- package/src/api/routes/withdraw-consent.ts +293 -0
- package/src/api/to-endpoints.ts +371 -0
- package/src/client/index.ts +471 -0
- package/src/client/types.ts +458 -0
- package/src/core.test.ts +303 -0
- package/src/core.ts +267 -0
- package/src/db/adapters/drizzle-adapter/drizzle-adapter.ts +711 -0
- package/src/db/adapters/drizzle-adapter/index.ts +1 -0
- package/src/db/adapters/kysely-adapter/dialect.ts +192 -0
- package/src/db/adapters/kysely-adapter/index.ts +3 -0
- package/src/db/adapters/kysely-adapter/kysely-adapter.ts +1168 -0
- package/src/db/adapters/kysely-adapter/types.ts +307 -0
- package/src/db/adapters/memory-adapter/index.ts +1 -0
- package/src/db/adapters/memory-adapter/memory-adapter.ts +648 -0
- package/src/db/adapters/prisma-adapter/index.ts +1 -0
- package/src/db/adapters/prisma-adapter/prisma-adapter.ts +586 -0
- package/src/db/adapters/types.ts +203 -0
- package/src/db/adapters/utils.ts +51 -0
- package/src/db/core/fields/field-factory.ts +804 -0
- package/src/db/core/fields/field-inference.ts +298 -0
- package/src/db/core/fields/field-options-integration.ts +135 -0
- package/src/db/core/fields/field-types.ts +233 -0
- package/src/db/core/fields/id-generator.ts +57 -0
- package/src/db/core/fields/index.ts +56 -0
- package/src/db/core/fields/superjson-utils.ts +155 -0
- package/src/db/core/fields/zod-fields.ts +269 -0
- package/src/db/core/get-schema.ts +102 -0
- package/src/db/core/types.ts +52 -0
- package/src/db/create-registry.ts +31 -0
- package/src/db/hooks/create-hooks.ts +88 -0
- package/src/db/hooks/index.ts +39 -0
- package/src/db/hooks/types.ts +164 -0
- package/src/db/hooks/update-hooks.ts +91 -0
- package/src/db/hooks/update-many-hooks.ts +176 -0
- package/src/db/hooks/utils.ts +151 -0
- package/src/db/hooks/with-hooks-factory.ts +68 -0
- package/src/db/index.ts +32 -0
- package/src/db/migration/get-migration.ts +89 -0
- package/src/db/migration/get-schema/get-schema.ts +44 -0
- package/src/db/migration/get-schema/index.ts +20 -0
- package/src/db/migration/get-schema/process-fields.ts +66 -0
- package/src/db/migration/get-schema/process-tables.ts +68 -0
- package/src/db/migration/get-schema/types.ts +18 -0
- package/src/db/migration/index.ts +18 -0
- package/src/db/migration/migration-builders.ts +170 -0
- package/src/db/migration/migration-execution.ts +79 -0
- package/src/db/migration/schema-comparison.ts +216 -0
- package/src/db/migration/type-mapping.ts +255 -0
- package/src/db/migration/types.ts +46 -0
- package/src/db/schema/audit-log/index.ts +3 -0
- package/src/db/schema/audit-log/registry.ts +228 -0
- package/src/db/schema/audit-log/schema.ts +46 -0
- package/src/db/schema/audit-log/table.ts +185 -0
- package/src/db/schema/audit-log/types.ts +29 -0
- package/src/db/schema/consent/index.ts +3 -0
- package/src/db/schema/consent/registry.ts +381 -0
- package/src/db/schema/consent/schema.ts +65 -0
- package/src/db/schema/consent/table.ts +220 -0
- package/src/db/schema/consent/types.ts +39 -0
- package/src/db/schema/consent-geo-location/index.ts +3 -0
- package/src/db/schema/consent-geo-location/registry.ts +124 -0
- package/src/db/schema/consent-geo-location/schema.ts +51 -0
- package/src/db/schema/consent-geo-location/table.ts +169 -0
- package/src/db/schema/consent-geo-location/types.ts +21 -0
- package/src/db/schema/consent-policy/index.ts +3 -0
- package/src/db/schema/consent-policy/registry.ts +313 -0
- package/src/db/schema/consent-policy/schema.ts +47 -0
- package/src/db/schema/consent-policy/table.ts +141 -0
- package/src/db/schema/consent-policy/types.ts +28 -0
- package/src/db/schema/consent-purpose/index.ts +3 -0
- package/src/db/schema/consent-purpose/registry.ts +188 -0
- package/src/db/schema/consent-purpose/schema.ts +58 -0
- package/src/db/schema/consent-purpose/table.ts +154 -0
- package/src/db/schema/consent-purpose/types.ts +16 -0
- package/src/db/schema/consent-purpose-junction/index.ts +3 -0
- package/src/db/schema/consent-purpose-junction/registry.ts +189 -0
- package/src/db/schema/consent-purpose-junction/schema.ts +49 -0
- package/src/db/schema/consent-purpose-junction/table.ts +142 -0
- package/src/db/schema/consent-purpose-junction/types.ts +14 -0
- package/src/db/schema/consent-record/index.ts +3 -0
- package/src/db/schema/consent-record/registry.ts +209 -0
- package/src/db/schema/consent-record/schema.ts +42 -0
- package/src/db/schema/consent-record/table.ts +124 -0
- package/src/db/schema/consent-record/types.ts +21 -0
- package/src/db/schema/consent-withdrawal/index.ts +3 -0
- package/src/db/schema/consent-withdrawal/registry.ts +219 -0
- package/src/db/schema/consent-withdrawal/schema.ts +48 -0
- package/src/db/schema/consent-withdrawal/table.ts +181 -0
- package/src/db/schema/consent-withdrawal/types.ts +29 -0
- package/src/db/schema/definition.ts +196 -0
- package/src/db/schema/domain/index.ts +3 -0
- package/src/db/schema/domain/registry.ts +272 -0
- package/src/db/schema/domain/schema.ts +43 -0
- package/src/db/schema/domain/table.ts +137 -0
- package/src/db/schema/domain/types.ts +27 -0
- package/src/db/schema/geo-location/index.ts +3 -0
- package/src/db/schema/geo-location/registry.ts +159 -0
- package/src/db/schema/geo-location/schema.ts +45 -0
- package/src/db/schema/geo-location/table.ts +148 -0
- package/src/db/schema/geo-location/types.ts +18 -0
- package/src/db/schema/index.ts +96 -0
- package/src/db/schema/parser.ts +417 -0
- package/src/db/schema/schemas.ts +35 -0
- package/src/db/schema/subject/index.ts +3 -0
- package/src/db/schema/subject/registry.ts +371 -0
- package/src/db/schema/subject/schema.ts +41 -0
- package/src/db/schema/subject/table.ts +139 -0
- package/src/db/schema/subject/types.ts +22 -0
- package/src/db/schema/types.ts +154 -0
- package/src/db/utils/adapter-factory.ts +64 -0
- package/src/db/utils/index.ts +10 -0
- package/src/db/utils.ts +42 -0
- package/src/docs/ADVANCED_JSON_HANDLING.md +99 -0
- package/src/docs/neverthrow.md +171 -0
- package/src/error/codes.ts +201 -0
- package/src/error/error.ts +145 -0
- package/src/error/index.ts +23 -0
- package/src/error/logging.ts +52 -0
- package/src/error/pipeline.ts +57 -0
- package/src/error/recovery.ts +45 -0
- package/src/error/results.ts +100 -0
- package/src/index.ts +79 -0
- package/src/init.test.ts +235 -0
- package/src/init.ts +261 -0
- package/src/integrations/index.ts +10 -0
- package/src/integrations/next.ts +136 -0
- package/src/integrations/react.ts +567 -0
- package/src/plugins/geo/index.ts +563 -0
- package/src/test/utils.ts +244 -0
- package/src/types/api.ts +101 -0
- package/src/types/context.ts +235 -0
- package/src/types/helper.ts +87 -0
- package/src/types/index.ts +5 -0
- package/src/types/options.ts +189 -0
- package/src/types/plugins.ts +538 -0
- package/src/utils/env.ts +103 -0
- package/src/utils/hide-metadata.ts +21 -0
- package/src/utils/index.ts +17 -0
- package/src/utils/ip.ts +45 -0
- package/src/utils/json.ts +19 -0
- package/src/utils/logger.ts +252 -0
- package/src/utils/url.ts +194 -0
- package/src/utils/wildcard.ts +253 -0
- package/tsconfig.json +12 -0
- package/vitest.config.ts +14 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { RegistryContext } from '~/types/context';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
auditLogRegistry,
|
|
5
|
+
consentGeoLocationRegistry,
|
|
6
|
+
consentPurposeJunctionRegistry,
|
|
7
|
+
consentPurposeRegistry,
|
|
8
|
+
consentRecordRegistry,
|
|
9
|
+
consentRegistry,
|
|
10
|
+
consentWithdrawalRegistry,
|
|
11
|
+
domainRegistry,
|
|
12
|
+
geoLocationRegistry,
|
|
13
|
+
policyRegistry,
|
|
14
|
+
subjectRegistry,
|
|
15
|
+
} from './schema/index';
|
|
16
|
+
|
|
17
|
+
export const createRegistry = (ctx: RegistryContext) => {
|
|
18
|
+
return {
|
|
19
|
+
...auditLogRegistry(ctx),
|
|
20
|
+
...consentRegistry(ctx),
|
|
21
|
+
...domainRegistry(ctx),
|
|
22
|
+
...geoLocationRegistry(ctx),
|
|
23
|
+
...consentGeoLocationRegistry(ctx),
|
|
24
|
+
...consentPurposeJunctionRegistry(ctx),
|
|
25
|
+
...consentPurposeRegistry(ctx),
|
|
26
|
+
...policyRegistry(ctx),
|
|
27
|
+
...consentRecordRegistry(ctx),
|
|
28
|
+
...subjectRegistry(ctx),
|
|
29
|
+
...consentWithdrawalRegistry(ctx),
|
|
30
|
+
};
|
|
31
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import type { Adapter } from '../adapters/types';
|
|
2
|
+
import type { EntityName } from '../core/types';
|
|
3
|
+
import type { CreateWithHooksProps, HookContext } from './types';
|
|
4
|
+
import { processHooks } from './utils';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Creates a record with hooks applied before and after creation.
|
|
8
|
+
*
|
|
9
|
+
* @typeParam TInputData - Type of the data being created
|
|
10
|
+
* @typeParam TOutputData - Type of the data returned after creation
|
|
11
|
+
*
|
|
12
|
+
* @param adapter - The database adapter to use
|
|
13
|
+
* @param ctx - Context containing hooks and options
|
|
14
|
+
* @param props - Properties for the create operation
|
|
15
|
+
* @returns The created record or null if a hook aborted the operation
|
|
16
|
+
*
|
|
17
|
+
* @remarks
|
|
18
|
+
* This function orchestrates the entity creation process, executing hooks
|
|
19
|
+
* at appropriate times to allow validation, transformation, and post-processing.
|
|
20
|
+
* It supports both standard adapter-based creation and custom creation functions.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const subject = await createWithHook(
|
|
25
|
+
* mysqlAdapter,
|
|
26
|
+
* { hooks: subjectHooks, options: config },
|
|
27
|
+
* {
|
|
28
|
+
* data: { name: 'Alice' },
|
|
29
|
+
* model: 'subject'
|
|
30
|
+
* }
|
|
31
|
+
* );
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export async function createWithHook<
|
|
35
|
+
TInputData extends Record<string, unknown> = Record<string, unknown>,
|
|
36
|
+
TOutputData extends Record<string, unknown> = TInputData,
|
|
37
|
+
>(
|
|
38
|
+
adapter: Adapter,
|
|
39
|
+
ctx: HookContext,
|
|
40
|
+
props: CreateWithHooksProps<TInputData>
|
|
41
|
+
): Promise<TOutputData | null> {
|
|
42
|
+
const { data, model, customFn, context } = props;
|
|
43
|
+
const hooks = ctx.hooks || [];
|
|
44
|
+
|
|
45
|
+
// Process before hooks
|
|
46
|
+
const transformedData = await processHooks<EntityName, TInputData>(
|
|
47
|
+
data,
|
|
48
|
+
model,
|
|
49
|
+
'create',
|
|
50
|
+
'before',
|
|
51
|
+
hooks,
|
|
52
|
+
context
|
|
53
|
+
);
|
|
54
|
+
if (transformedData === null) {
|
|
55
|
+
return null;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Execute operation
|
|
59
|
+
let created: TOutputData | null = null;
|
|
60
|
+
|
|
61
|
+
if (customFn) {
|
|
62
|
+
created = (await customFn.fn(transformedData)) as TOutputData | null;
|
|
63
|
+
if (!customFn.executeMainFn && created) {
|
|
64
|
+
return created;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if (!created) {
|
|
69
|
+
created = (await adapter.create({
|
|
70
|
+
model: model as EntityName,
|
|
71
|
+
data: transformedData,
|
|
72
|
+
})) as unknown as TOutputData;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Process after hooks
|
|
76
|
+
if (created) {
|
|
77
|
+
await processHooks<EntityName, TOutputData>(
|
|
78
|
+
created,
|
|
79
|
+
model,
|
|
80
|
+
'create',
|
|
81
|
+
'after',
|
|
82
|
+
hooks,
|
|
83
|
+
context
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return created;
|
|
88
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Database Hooks Module
|
|
3
|
+
*
|
|
4
|
+
* A comprehensive system for intercepting, validating, and transforming data
|
|
5
|
+
* during database operations. Hooks provide a powerful way to implement
|
|
6
|
+
* cross-cutting concerns like validation, authorization, and data enrichment.
|
|
7
|
+
*
|
|
8
|
+
* This module provides:
|
|
9
|
+
* - Type definitions for hooks and their operations
|
|
10
|
+
* - Core hook processing utilities
|
|
11
|
+
* - Operation-specific hook implementations (create, update, updateMany)
|
|
12
|
+
* - A factory for generating hook-enabled database operations
|
|
13
|
+
*
|
|
14
|
+
* @module db/hooks
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* import { getWithHooks } from '~/db/hooks';
|
|
19
|
+
* import { adapter } from '~/adapters';
|
|
20
|
+
*
|
|
21
|
+
* // Create hook-enabled database operations
|
|
22
|
+
* const { createWithHooks } = getWithHooks(adapter, {
|
|
23
|
+
* options: config,
|
|
24
|
+
* hooks: config.databaseHooks || []
|
|
25
|
+
* });
|
|
26
|
+
*
|
|
27
|
+
* // Use hooks with database operations
|
|
28
|
+
* const subject = await createWithHooks({
|
|
29
|
+
* data: { name: 'Alice', email: 'alice@example.com' },
|
|
30
|
+
* model: 'subject'
|
|
31
|
+
* });
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export * from './types';
|
|
35
|
+
export * from './utils';
|
|
36
|
+
export * from './create-hooks';
|
|
37
|
+
export * from './update-hooks';
|
|
38
|
+
export * from './update-many-hooks';
|
|
39
|
+
export * from './with-hooks-factory';
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import type { Where } from '~/db/adapters/types';
|
|
2
|
+
import type { C15TOptions, GenericEndpointContext } from '~/types';
|
|
3
|
+
import type { EntityName, EntityTypeMap } from '../core/types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Defines execution phases when hooks can run in the database operation lifecycle.
|
|
7
|
+
*/
|
|
8
|
+
export type HookPhase = 'before' | 'after';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Defines database operations that can have hooks attached.
|
|
12
|
+
*/
|
|
13
|
+
export type HookOperation = 'create' | 'update';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Result types for hook execution that control the flow of operations.
|
|
17
|
+
*
|
|
18
|
+
* @typeParam TData - The data type being processed by the hook
|
|
19
|
+
*
|
|
20
|
+
* @remarks
|
|
21
|
+
* Hook functions can return different result types to control operation flow:
|
|
22
|
+
* - `{ kind: 'abort' }` - Abort the operation entirely
|
|
23
|
+
* - `{ kind: 'transform', data: TData }` - Transform the data and continue
|
|
24
|
+
* - `{ kind: 'continue' }` - Continue with unchanged data
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* // Abort if validation fails
|
|
29
|
+
* if (!isValid(data)) {
|
|
30
|
+
* return { kind: 'abort' };
|
|
31
|
+
* }
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export type HookResult<TData> =
|
|
35
|
+
| { kind: 'abort' }
|
|
36
|
+
| { kind: 'transform'; data: TData }
|
|
37
|
+
| { kind: 'continue' };
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Hook function for a specific entity type, providing before/after hooks
|
|
41
|
+
* for create and update operations.
|
|
42
|
+
*
|
|
43
|
+
* @typeParam TEntityName - The entity type this hook applies to
|
|
44
|
+
*
|
|
45
|
+
* @remarks
|
|
46
|
+
* ModelHook provides a structured way to define hooks for different
|
|
47
|
+
* database operations on a specific entity type.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* const subjectHook: ModelHook<'subject'> = {
|
|
52
|
+
* create: {
|
|
53
|
+
* before: (subjectData) => ({
|
|
54
|
+
* kind: 'transform',
|
|
55
|
+
* data: { ...subjectData, createdAt: new Date() }
|
|
56
|
+
* })
|
|
57
|
+
* }
|
|
58
|
+
* };
|
|
59
|
+
* ```
|
|
60
|
+
*/
|
|
61
|
+
export interface ModelHook<TEntityName extends EntityName = EntityName> {
|
|
62
|
+
create?: {
|
|
63
|
+
before?: (
|
|
64
|
+
data: EntityTypeMap[TEntityName],
|
|
65
|
+
context?: GenericEndpointContext
|
|
66
|
+
) =>
|
|
67
|
+
| Promise<HookResult<EntityTypeMap[TEntityName]> | undefined>
|
|
68
|
+
| HookResult<EntityTypeMap[TEntityName]>
|
|
69
|
+
| undefined;
|
|
70
|
+
after?: (
|
|
71
|
+
data: EntityTypeMap[TEntityName],
|
|
72
|
+
context?: GenericEndpointContext
|
|
73
|
+
) => Promise<void> | void;
|
|
74
|
+
};
|
|
75
|
+
update?: {
|
|
76
|
+
before?: (
|
|
77
|
+
data: Partial<EntityTypeMap[TEntityName]>,
|
|
78
|
+
context?: GenericEndpointContext
|
|
79
|
+
) =>
|
|
80
|
+
| Promise<HookResult<Partial<EntityTypeMap[TEntityName]>> | undefined>
|
|
81
|
+
| HookResult<Partial<EntityTypeMap[TEntityName]>>
|
|
82
|
+
| undefined;
|
|
83
|
+
after?: (
|
|
84
|
+
data: EntityTypeMap[TEntityName],
|
|
85
|
+
context?: GenericEndpointContext
|
|
86
|
+
) => Promise<void> | void;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* A collection of hooks for different entity types in the database.
|
|
92
|
+
*
|
|
93
|
+
* @remarks
|
|
94
|
+
* This is the primary way to register hooks in the system.
|
|
95
|
+
*/
|
|
96
|
+
export type DatabaseHook = {
|
|
97
|
+
[TEntityName in EntityName]?: ModelHook<TEntityName>;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Context object containing application options and registered hooks.
|
|
102
|
+
*/
|
|
103
|
+
export interface HookContext {
|
|
104
|
+
hooks: DatabaseHook[];
|
|
105
|
+
options: C15TOptions;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Interface for defining custom operation functions that can be used
|
|
110
|
+
* in place of or alongside standard database operations.
|
|
111
|
+
*
|
|
112
|
+
* @typeParam TInputData - The input data type for the operation
|
|
113
|
+
* @typeParam TOutputData - The output data type for the operation
|
|
114
|
+
*
|
|
115
|
+
* @remarks
|
|
116
|
+
* Custom functions allow for specialized behavior when standard
|
|
117
|
+
* CRUD operations aren't sufficient.
|
|
118
|
+
*/
|
|
119
|
+
export interface CustomOperationFunction<
|
|
120
|
+
TInputData extends Record<string, unknown> = Record<string, unknown>,
|
|
121
|
+
TOutputData = TInputData,
|
|
122
|
+
> {
|
|
123
|
+
fn: (data: TOutputData) => Promise<TOutputData | null> | TOutputData | null;
|
|
124
|
+
executeMainFn?: boolean;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Properties for creating a record with hooks.
|
|
129
|
+
*
|
|
130
|
+
* @typeParam TData - The data type being created
|
|
131
|
+
*
|
|
132
|
+
* @remarks
|
|
133
|
+
* This is the parameter object for the createWithHook function.
|
|
134
|
+
*/
|
|
135
|
+
export interface CreateWithHooksProps<
|
|
136
|
+
TData extends Record<string, unknown> = Record<string, unknown>,
|
|
137
|
+
> {
|
|
138
|
+
data: TData;
|
|
139
|
+
model: EntityName;
|
|
140
|
+
customFn?: CustomOperationFunction<TData>;
|
|
141
|
+
context?: GenericEndpointContext;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Properties for updating records with hooks.
|
|
146
|
+
*
|
|
147
|
+
* @typeParam TInputData - The input data type for the update
|
|
148
|
+
* @typeParam TOutputData - The expected output data type
|
|
149
|
+
* @typeParam TResultData - The final result data type
|
|
150
|
+
*
|
|
151
|
+
* @remarks
|
|
152
|
+
* This is the parameter object for updateWithHooks and updateManyWithHooks functions.
|
|
153
|
+
*/
|
|
154
|
+
export interface UpdateWithHooksProps<
|
|
155
|
+
TInputData extends Record<string, unknown> = Record<string, unknown>,
|
|
156
|
+
TOutputData = TInputData,
|
|
157
|
+
TResultData = TOutputData,
|
|
158
|
+
> {
|
|
159
|
+
data: Partial<TInputData>;
|
|
160
|
+
where: Where<EntityName>;
|
|
161
|
+
model: EntityName;
|
|
162
|
+
customFn?: CustomOperationFunction<Partial<TInputData>, TResultData>;
|
|
163
|
+
context?: GenericEndpointContext;
|
|
164
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { Adapter } from '../adapters/types';
|
|
2
|
+
import type { EntityName } from '../core/types';
|
|
3
|
+
import type { HookContext, UpdateWithHooksProps } from './types';
|
|
4
|
+
import { processHooks } from './utils';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Updates a record with hooks applied before and after the update operation.
|
|
8
|
+
*
|
|
9
|
+
* @typeParam TInputData - Type of the data being updated
|
|
10
|
+
* @typeParam TOutputData - Type of the data returned after update
|
|
11
|
+
*
|
|
12
|
+
* @param adapter - The database adapter to use
|
|
13
|
+
* @param ctx - Context containing hooks and options
|
|
14
|
+
* @param props - Properties for the update operation
|
|
15
|
+
* @returns The updated record or null if a hook aborted the operation
|
|
16
|
+
*
|
|
17
|
+
* @remarks
|
|
18
|
+
* This function orchestrates the entity update process, executing hooks
|
|
19
|
+
* at appropriate times to allow validation, transformation, and post-processing.
|
|
20
|
+
* It supports both standard adapter-based updates and custom update functions.
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* const updatedSubject = await updateWithHooks(
|
|
25
|
+
* mysqlAdapter,
|
|
26
|
+
* { hooks: subjectHooks, options: config },
|
|
27
|
+
* {
|
|
28
|
+
* data: { status: 'active' },
|
|
29
|
+
* where: { id: 'sub_x1pftyoufsm7xgo1kv' },
|
|
30
|
+
* model: 'subject'
|
|
31
|
+
* }
|
|
32
|
+
* );
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export async function updateWithHooks<
|
|
36
|
+
TInputData extends Record<string, unknown> = Record<string, unknown>,
|
|
37
|
+
TOutputData extends Record<string, unknown> = TInputData,
|
|
38
|
+
>(
|
|
39
|
+
adapter: Adapter,
|
|
40
|
+
ctx: HookContext,
|
|
41
|
+
props: UpdateWithHooksProps<TInputData, TOutputData>
|
|
42
|
+
): Promise<TOutputData | null> {
|
|
43
|
+
const { data, where, model, customFn, context } = props;
|
|
44
|
+
const hooks = ctx.hooks || [];
|
|
45
|
+
|
|
46
|
+
// Process before hooks
|
|
47
|
+
const transformedData = await processHooks<EntityName, Partial<TInputData>>(
|
|
48
|
+
data,
|
|
49
|
+
model,
|
|
50
|
+
'update',
|
|
51
|
+
'before',
|
|
52
|
+
hooks,
|
|
53
|
+
context
|
|
54
|
+
);
|
|
55
|
+
if (transformedData === null) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// Execute operation
|
|
60
|
+
let updated: TOutputData | null = null;
|
|
61
|
+
if (customFn) {
|
|
62
|
+
// Ensure customFn handles partial updates correctly
|
|
63
|
+
const result = await customFn.fn(transformedData as TOutputData);
|
|
64
|
+
updated = result;
|
|
65
|
+
if (!customFn.executeMainFn && updated) {
|
|
66
|
+
return updated;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
if (!updated) {
|
|
71
|
+
updated = (await adapter.update({
|
|
72
|
+
model: model as EntityName,
|
|
73
|
+
update: transformedData,
|
|
74
|
+
where,
|
|
75
|
+
})) as TOutputData | null;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Process after hooks
|
|
79
|
+
if (updated) {
|
|
80
|
+
await processHooks<EntityName, TOutputData>(
|
|
81
|
+
updated,
|
|
82
|
+
model,
|
|
83
|
+
'update',
|
|
84
|
+
'after',
|
|
85
|
+
hooks,
|
|
86
|
+
context
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return updated;
|
|
91
|
+
}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import type { Adapter } from '~/db/adapters/types';
|
|
2
|
+
import type { EntityName } from '~/db/core/types';
|
|
3
|
+
import type {
|
|
4
|
+
CustomOperationFunction,
|
|
5
|
+
HookContext,
|
|
6
|
+
UpdateWithHooksProps,
|
|
7
|
+
} from './types';
|
|
8
|
+
import { processAfterHooksForMany, processHooks } from './utils';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Executes a custom function if provided for batch updates.
|
|
12
|
+
*
|
|
13
|
+
* This internal helper handles custom function execution and determines
|
|
14
|
+
* whether the standard update operation should also be performed.
|
|
15
|
+
*
|
|
16
|
+
* @template TInputData - Type of the input data
|
|
17
|
+
* @template TOutputData - Type of the output data
|
|
18
|
+
*
|
|
19
|
+
* @param data - The data to process
|
|
20
|
+
* @param customFn - Optional custom function to execute
|
|
21
|
+
*
|
|
22
|
+
* @returns Object containing the result and whether to continue with standard update
|
|
23
|
+
*/
|
|
24
|
+
async function executeCustomFunction<
|
|
25
|
+
TInputData extends Record<string, unknown>,
|
|
26
|
+
TOutputData,
|
|
27
|
+
>(
|
|
28
|
+
data: TInputData,
|
|
29
|
+
customFn?: CustomOperationFunction<Partial<TInputData>, TOutputData>
|
|
30
|
+
): Promise<{ result: TOutputData | null; shouldContinue: boolean }> {
|
|
31
|
+
if (!customFn) {
|
|
32
|
+
return { result: null, shouldContinue: true };
|
|
33
|
+
}
|
|
34
|
+
const result = (await customFn.fn(
|
|
35
|
+
data as unknown as TOutputData
|
|
36
|
+
)) as TOutputData | null;
|
|
37
|
+
const shouldContinue = !result || !!customFn.executeMainFn;
|
|
38
|
+
|
|
39
|
+
return { result, shouldContinue };
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Processes the result from updateMany adapter operations.
|
|
44
|
+
*
|
|
45
|
+
* This internal helper normalizes various result formats that may be
|
|
46
|
+
* returned by different adapters when performing batch updates.
|
|
47
|
+
*
|
|
48
|
+
* @template TEntityData - The entity data type
|
|
49
|
+
*
|
|
50
|
+
* @param result - The raw result from the adapter
|
|
51
|
+
* @returns Normalized array of entity data or null
|
|
52
|
+
*/
|
|
53
|
+
function processUpdateManyResult<TEntityData extends Record<string, unknown>>(
|
|
54
|
+
result: unknown
|
|
55
|
+
): TEntityData[] | null {
|
|
56
|
+
if (Array.isArray(result)) {
|
|
57
|
+
return result;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if (typeof result === 'number' && result > 0) {
|
|
61
|
+
return []; // Empty array if we just got a count
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Updates multiple records with hooks applied before and after the batch update.
|
|
69
|
+
*
|
|
70
|
+
* This function orchestrates the batch update process, executing hooks
|
|
71
|
+
* at appropriate times to allow validation, transformation, and post-processing
|
|
72
|
+
* for multiple records simultaneously.
|
|
73
|
+
*
|
|
74
|
+
* @template TInputData - Type of the data being updated
|
|
75
|
+
* @template TOutputData - Type of the data returned after update
|
|
76
|
+
*
|
|
77
|
+
* @param adapter - The database adapter to use
|
|
78
|
+
* @param ctx - Context containing hooks and options
|
|
79
|
+
* @param props - Properties for the updateMany operation
|
|
80
|
+
*
|
|
81
|
+
* @returns The updated records or null if a hook aborted the operation
|
|
82
|
+
*
|
|
83
|
+
* @example
|
|
84
|
+
* ```typescript
|
|
85
|
+
* // Batch update subjects
|
|
86
|
+
* const updatedSubjects = await updateManyWithHooks(
|
|
87
|
+
* mysqlAdapter,
|
|
88
|
+
* { hooks: subjectHooks, options: config },
|
|
89
|
+
* {
|
|
90
|
+
* data: { isVerified: true },
|
|
91
|
+
* where: { emailDomain: 'example.com' },
|
|
92
|
+
* model: 'subject'
|
|
93
|
+
* }
|
|
94
|
+
* );
|
|
95
|
+
*
|
|
96
|
+
* // With custom function for complex batch processing
|
|
97
|
+
* const updatedPosts = await updateManyWithHooks(
|
|
98
|
+
* mysqlAdapter,
|
|
99
|
+
* { hooks: postHooks, options: config },
|
|
100
|
+
* {
|
|
101
|
+
* data: { isArchived: true },
|
|
102
|
+
* where: { createdAt: { lt: oneYearAgo } },
|
|
103
|
+
* model: 'post',
|
|
104
|
+
* customFn: {
|
|
105
|
+
* fn: async (data) => {
|
|
106
|
+
* // Get posts to be archived
|
|
107
|
+
* const postsToArchive = await postService.findOldPosts();
|
|
108
|
+
* // Custom batch processing
|
|
109
|
+
* const archivedPosts = await postService.batchArchive(postsToArchive, data);
|
|
110
|
+
* return archivedPosts;
|
|
111
|
+
* },
|
|
112
|
+
* executeMainFn: false // Skip standard update as custom function handles it
|
|
113
|
+
* }
|
|
114
|
+
* }
|
|
115
|
+
* );
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
export async function updateManyWithHooks<
|
|
119
|
+
TInputData extends Record<string, unknown> = Record<string, unknown>,
|
|
120
|
+
TOutputData extends Record<string, unknown> = TInputData,
|
|
121
|
+
>(
|
|
122
|
+
adapter: Adapter,
|
|
123
|
+
ctx: HookContext,
|
|
124
|
+
props: UpdateWithHooksProps<TInputData, TOutputData>
|
|
125
|
+
): Promise<TOutputData[] | null> {
|
|
126
|
+
const { data, where, model, customFn, context } = props;
|
|
127
|
+
const hooks = ctx.hooks || [];
|
|
128
|
+
|
|
129
|
+
// Process before hooks
|
|
130
|
+
const transformedData = await processHooks<EntityName, Partial<TInputData>>(
|
|
131
|
+
data,
|
|
132
|
+
model,
|
|
133
|
+
'update',
|
|
134
|
+
'before',
|
|
135
|
+
hooks,
|
|
136
|
+
context
|
|
137
|
+
);
|
|
138
|
+
if (transformedData === null) {
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Try custom function first
|
|
143
|
+
const { result: customResult, shouldContinue } = await executeCustomFunction<
|
|
144
|
+
Partial<TInputData>,
|
|
145
|
+
TOutputData[]
|
|
146
|
+
//@ts-expect-error
|
|
147
|
+
>(transformedData, customFn);
|
|
148
|
+
|
|
149
|
+
if (customResult && !shouldContinue) {
|
|
150
|
+
return customResult;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Use adapter if needed
|
|
154
|
+
let updated = customResult;
|
|
155
|
+
if (!updated) {
|
|
156
|
+
const adapterResult = await adapter.updateMany({
|
|
157
|
+
model: model as EntityName,
|
|
158
|
+
update: transformedData,
|
|
159
|
+
where,
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
updated = processUpdateManyResult<TOutputData>(adapterResult);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
// Process after hooks
|
|
166
|
+
if (updated && updated.length > 0) {
|
|
167
|
+
await processAfterHooksForMany<EntityName, TOutputData>(
|
|
168
|
+
updated,
|
|
169
|
+
model,
|
|
170
|
+
hooks,
|
|
171
|
+
context
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return updated;
|
|
176
|
+
}
|