@c15t/backend 2.0.0-rc.0 → 2.0.0-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/README.md +3 -3
- package/dist/302.js +473 -0
- package/dist/583.js +540 -0
- package/dist/915.js +1771 -0
- package/dist/cache.cjs +5 -5
- package/dist/cache.js +4 -415
- package/dist/core.cjs +1356 -120
- package/dist/core.js +163 -1981
- package/dist/db/adapters/drizzle.cjs +1 -1
- package/dist/db/adapters/drizzle.js +1 -2
- package/dist/db/adapters/kysely.cjs +1 -1
- package/dist/db/adapters/kysely.js +1 -2
- package/dist/db/adapters/mongo.cjs +1 -1
- package/dist/db/adapters/mongo.js +1 -2
- package/dist/db/adapters/prisma.cjs +1 -1
- package/dist/db/adapters/prisma.js +1 -2
- package/dist/db/adapters/typeorm.cjs +1 -1
- package/dist/db/adapters/typeorm.js +1 -2
- package/dist/db/adapters.cjs +1 -1
- package/dist/db/migrator.cjs +1 -1
- package/dist/db/schema.cjs +43 -3
- package/dist/db/schema.js +35 -4
- package/dist/define-config.cjs +1 -1
- package/dist/edge.cjs +1106 -0
- package/dist/edge.js +190 -0
- package/dist/router.cjs +885 -123
- package/dist/router.js +1 -1507
- package/dist/{types.cjs → types/index.cjs} +1 -1
- package/{dist → dist-types}/cache/adapters/cloudflare-kv.d.ts +0 -1
- package/{dist → dist-types}/cache/adapters/index.d.ts +0 -1
- package/{dist → dist-types}/cache/adapters/memory.d.ts +0 -1
- package/{dist → dist-types}/cache/adapters/upstash-redis.d.ts +0 -1
- package/{dist → dist-types}/cache/gvl-resolver.d.ts +0 -1
- package/{dist → dist-types}/cache/index.d.ts +0 -1
- package/{dist → dist-types}/cache/keys.d.ts +0 -1
- package/{dist → dist-types}/cache/types.d.ts +0 -1
- package/{dist → dist-types}/core.d.ts +8 -1
- package/{dist → dist-types}/db/migrator/index.d.ts +0 -1
- package/dist-types/db/registry/consent-policy.d.ts +78 -0
- package/{dist → dist-types}/db/registry/consent-purpose.d.ts +0 -1
- package/{dist → dist-types}/db/registry/domain.d.ts +0 -1
- package/dist-types/db/registry/index.d.ts +118 -0
- package/dist-types/db/registry/runtime-policy-decision.d.ts +60 -0
- package/{dist → dist-types}/db/registry/subject.d.ts +0 -2
- package/{dist → dist-types}/db/registry/types.d.ts +1 -1
- package/{dist → dist-types}/db/registry/utils/generate-id.d.ts +0 -1
- package/{dist → dist-types}/db/registry/utils.d.ts +0 -1
- package/{dist → dist-types}/db/schema/1.0.0/audit-log.d.ts +0 -1
- package/{dist → dist-types}/db/schema/1.0.0/consent-policy.d.ts +0 -1
- package/{dist → dist-types}/db/schema/1.0.0/consent-purpose.d.ts +0 -1
- package/{dist → dist-types}/db/schema/1.0.0/consent-record.d.ts +0 -1
- package/{dist → dist-types}/db/schema/1.0.0/consent.d.ts +1 -2
- package/{dist → dist-types}/db/schema/1.0.0/domain.d.ts +0 -1
- package/{dist → dist-types}/db/schema/1.0.0/index.d.ts +0 -32
- package/{dist → dist-types}/db/schema/1.0.0/subject.d.ts +0 -2
- package/{dist → dist-types}/db/schema/2.0.0/audit-log.d.ts +1 -2
- package/{dist → dist-types}/db/schema/2.0.0/consent-policy.d.ts +3 -3
- package/{dist → dist-types}/db/schema/2.0.0/consent-purpose.d.ts +1 -2
- package/{dist → dist-types}/db/schema/2.0.0/consent.d.ts +7 -2
- package/{dist → dist-types}/db/schema/2.0.0/domain.d.ts +1 -2
- package/{dist → dist-types}/db/schema/2.0.0/index.d.ts +455 -28
- package/dist-types/db/schema/2.0.0/runtime-policy-decision.d.ts +23 -0
- package/{dist → dist-types}/db/schema/2.0.0/subject.d.ts +1 -3
- package/{dist → dist-types}/db/schema/index.d.ts +908 -86
- package/{dist → dist-types}/db/tenant-scope.d.ts +0 -1
- package/dist-types/define-config.d.ts +17 -0
- package/dist-types/edge/index.d.ts +5 -0
- package/dist-types/edge/init-handler.d.ts +40 -0
- package/dist-types/edge/resolve-consent.d.ts +80 -0
- package/dist-types/edge/types.d.ts +13 -0
- package/{dist → dist-types}/handlers/consent/check.handler.d.ts +0 -1
- package/{src/handlers/consent/index.ts → dist-types/handlers/consent/index.d.ts} +0 -1
- package/{dist → dist-types}/handlers/init/geo.d.ts +2 -3
- package/{dist → dist-types}/handlers/init/index.d.ts +2 -3
- package/dist-types/handlers/init/policy.d.ts +26 -0
- package/dist-types/handlers/init/resolve-init.d.ts +44 -0
- package/dist-types/handlers/init/translations.d.ts +48 -0
- package/dist-types/handlers/legal-document/current.handler.d.ts +11 -0
- package/dist-types/handlers/legal-document/snapshot.d.ts +39 -0
- package/dist-types/handlers/policy/snapshot.d.ts +99 -0
- package/{src/handlers/status/index.ts → dist-types/handlers/status/index.d.ts} +0 -1
- package/{dist → dist-types}/handlers/status/status.handler.d.ts +0 -1
- package/{dist → dist-types}/handlers/subject/get.handler.d.ts +3 -2
- package/{src/handlers/subject/index.ts → dist-types/handlers/subject/index.d.ts} +0 -1
- package/{dist → dist-types}/handlers/subject/list.handler.d.ts +3 -2
- package/{dist → dist-types}/handlers/subject/patch.handler.d.ts +0 -2
- package/{dist → dist-types}/handlers/subject/post.handler.d.ts +12 -1
- package/{dist → dist-types}/handlers/utils/consent-enrichment.d.ts +3 -1
- package/{dist → dist-types}/init.d.ts +4 -7
- package/{dist → dist-types}/middleware/auth/index.d.ts +0 -1
- package/{dist → dist-types}/middleware/auth/validate-api-key.d.ts +0 -1
- package/{dist → dist-types}/middleware/cors/cors.d.ts +0 -1
- package/{src/middleware/cors/index.ts → dist-types/middleware/cors/index.d.ts} +0 -1
- package/{dist → dist-types}/middleware/cors/is-origin-trusted.d.ts +0 -1
- package/{dist → dist-types}/middleware/cors/process-cors.d.ts +0 -1
- package/{dist → dist-types}/middleware/openapi/config.d.ts +0 -1
- package/{dist → dist-types}/middleware/openapi/handlers.d.ts +0 -1
- package/{src/middleware/openapi/index.ts → dist-types/middleware/openapi/index.d.ts} +0 -1
- package/{dist → dist-types}/middleware/process-ip/index.d.ts +0 -1
- package/dist-types/policies/builder.d.ts +127 -0
- package/dist-types/policies/defaults.d.ts +2 -0
- package/dist-types/policies/matchers.d.ts +3 -0
- package/{dist → dist-types}/router.d.ts +0 -1
- package/{dist → dist-types}/routes/consent.d.ts +0 -1
- package/{dist → dist-types}/routes/index.d.ts +1 -1
- package/{dist → dist-types}/routes/init.d.ts +0 -1
- package/dist-types/routes/legal-document.d.ts +7 -0
- package/{dist → dist-types}/routes/status.d.ts +0 -1
- package/{dist → dist-types}/routes/subject.d.ts +0 -1
- package/{dist → dist-types}/types/api.d.ts +0 -1
- package/dist-types/types/index.d.ts +464 -0
- package/dist-types/utils/background.d.ts +6 -0
- package/{dist → dist-types}/utils/create-telemetry-options.d.ts +1 -2
- package/{dist → dist-types}/utils/env.d.ts +0 -1
- package/{dist → dist-types}/utils/extract-error-message.d.ts +0 -1
- package/{dist → dist-types}/utils/instrumentation.d.ts +2 -3
- package/{dist → dist-types}/utils/logger.d.ts +0 -1
- package/{dist → dist-types}/utils/metrics.d.ts +0 -1
- package/dist-types/version.d.ts +1 -0
- package/docs/README.md +49 -0
- package/docs/api/configuration.md +208 -0
- package/docs/api/endpoints.md +211 -0
- package/docs/guides/caching.md +85 -0
- package/docs/guides/database-setup.md +128 -0
- package/docs/guides/edge-deployment.md +251 -0
- package/docs/guides/framework-integration.md +142 -0
- package/docs/guides/iab-tcf.md +89 -0
- package/docs/guides/observability.md +96 -0
- package/docs/guides/policy-packs.md +396 -0
- package/docs/quickstart.md +129 -0
- package/package.json +53 -39
- package/.turbo/turbo-build.log +0 -49
- package/CHANGELOG.md +0 -89
- package/dist/cache/adapters/cloudflare-kv.d.ts.map +0 -1
- package/dist/cache/adapters/index.d.ts.map +0 -1
- package/dist/cache/adapters/memory.d.ts.map +0 -1
- package/dist/cache/adapters/upstash-redis.d.ts.map +0 -1
- package/dist/cache/gvl-resolver.d.ts.map +0 -1
- package/dist/cache/index.d.ts.map +0 -1
- package/dist/cache/keys.d.ts.map +0 -1
- package/dist/cache/types.d.ts.map +0 -1
- package/dist/core.d.ts.map +0 -1
- package/dist/db/adapters/drizzle.d.ts +0 -2
- package/dist/db/adapters/drizzle.d.ts.map +0 -1
- package/dist/db/adapters/index.d.ts +0 -2
- package/dist/db/adapters/index.d.ts.map +0 -1
- package/dist/db/adapters/kysely.d.ts +0 -2
- package/dist/db/adapters/kysely.d.ts.map +0 -1
- package/dist/db/adapters/mongo.d.ts +0 -2
- package/dist/db/adapters/mongo.d.ts.map +0 -1
- package/dist/db/adapters/prisma.d.ts +0 -2
- package/dist/db/adapters/prisma.d.ts.map +0 -1
- package/dist/db/adapters/typeorm.d.ts +0 -2
- package/dist/db/adapters/typeorm.d.ts.map +0 -1
- package/dist/db/migrator/index.d.ts.map +0 -1
- package/dist/db/registry/consent-policy.d.ts +0 -23
- package/dist/db/registry/consent-policy.d.ts.map +0 -1
- package/dist/db/registry/consent-purpose.d.ts.map +0 -1
- package/dist/db/registry/domain.d.ts.map +0 -1
- package/dist/db/registry/index.d.ts +0 -57
- package/dist/db/registry/index.d.ts.map +0 -1
- package/dist/db/registry/subject.d.ts.map +0 -1
- package/dist/db/registry/types.d.ts.map +0 -1
- package/dist/db/registry/utils/generate-id.d.ts.map +0 -1
- package/dist/db/registry/utils.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/audit-log.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/consent-policy.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/consent-purpose.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/consent-record.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/consent.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/domain.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/index.d.ts.map +0 -1
- package/dist/db/schema/1.0.0/subject.d.ts.map +0 -1
- package/dist/db/schema/2.0.0/audit-log.d.ts.map +0 -1
- package/dist/db/schema/2.0.0/consent-policy.d.ts.map +0 -1
- package/dist/db/schema/2.0.0/consent-purpose.d.ts.map +0 -1
- package/dist/db/schema/2.0.0/consent.d.ts.map +0 -1
- package/dist/db/schema/2.0.0/domain.d.ts.map +0 -1
- package/dist/db/schema/2.0.0/index.d.ts.map +0 -1
- package/dist/db/schema/2.0.0/subject.d.ts.map +0 -1
- package/dist/db/schema/index.d.ts.map +0 -1
- package/dist/db/tenant-scope.d.ts.map +0 -1
- package/dist/define-config.d.ts +0 -5
- package/dist/define-config.d.ts.map +0 -1
- package/dist/handlers/consent/check.handler.d.ts.map +0 -1
- package/dist/handlers/consent/index.d.ts +0 -12
- package/dist/handlers/consent/index.d.ts.map +0 -1
- package/dist/handlers/init/geo.d.ts.map +0 -1
- package/dist/handlers/init/index.d.ts.map +0 -1
- package/dist/handlers/init/translations.d.ts +0 -28
- package/dist/handlers/init/translations.d.ts.map +0 -1
- package/dist/handlers/status/index.d.ts +0 -7
- package/dist/handlers/status/index.d.ts.map +0 -1
- package/dist/handlers/status/status.handler.d.ts.map +0 -1
- package/dist/handlers/subject/get.handler.d.ts.map +0 -1
- package/dist/handlers/subject/index.d.ts +0 -10
- package/dist/handlers/subject/index.d.ts.map +0 -1
- package/dist/handlers/subject/list.handler.d.ts.map +0 -1
- package/dist/handlers/subject/patch.handler.d.ts.map +0 -1
- package/dist/handlers/subject/post.handler.d.ts.map +0 -1
- package/dist/handlers/utils/consent-enrichment.d.ts.map +0 -1
- package/dist/init.d.ts.map +0 -1
- package/dist/middleware/auth/index.d.ts.map +0 -1
- package/dist/middleware/auth/validate-api-key.d.ts.map +0 -1
- package/dist/middleware/cors/cors.d.ts.map +0 -1
- package/dist/middleware/cors/index.d.ts +0 -30
- package/dist/middleware/cors/index.d.ts.map +0 -1
- package/dist/middleware/cors/is-origin-trusted.d.ts.map +0 -1
- package/dist/middleware/cors/process-cors.d.ts.map +0 -1
- package/dist/middleware/openapi/config.d.ts.map +0 -1
- package/dist/middleware/openapi/handlers.d.ts.map +0 -1
- package/dist/middleware/openapi/index.d.ts +0 -12
- package/dist/middleware/openapi/index.d.ts.map +0 -1
- package/dist/middleware/process-ip/index.d.ts.map +0 -1
- package/dist/router.d.ts.map +0 -1
- package/dist/routes/consent.d.ts.map +0 -1
- package/dist/routes/index.d.ts.map +0 -1
- package/dist/routes/init.d.ts.map +0 -1
- package/dist/routes/status.d.ts.map +0 -1
- package/dist/routes/subject.d.ts.map +0 -1
- package/dist/types/api.d.ts.map +0 -1
- package/dist/types/index.d.ts +0 -255
- package/dist/types/index.d.ts.map +0 -1
- package/dist/utils/create-telemetry-options.d.ts.map +0 -1
- package/dist/utils/env.d.ts.map +0 -1
- package/dist/utils/extract-error-message.d.ts.map +0 -1
- package/dist/utils/index.d.ts +0 -4
- package/dist/utils/index.d.ts.map +0 -1
- package/dist/utils/instrumentation.d.ts.map +0 -1
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/metrics.d.ts.map +0 -1
- package/dist/version.d.ts +0 -2
- package/dist/version.d.ts.map +0 -1
- package/knip.json +0 -31
- package/rslib.config.ts +0 -93
- package/src/cache/adapters/cloudflare-kv.ts +0 -71
- package/src/cache/adapters/index.ts +0 -22
- package/src/cache/adapters/memory.ts +0 -111
- package/src/cache/adapters/upstash-redis.ts +0 -113
- package/src/cache/gvl-resolver.ts +0 -289
- package/src/cache/index.ts +0 -34
- package/src/cache/keys.ts +0 -68
- package/src/cache/types.ts +0 -66
- package/src/core.ts +0 -368
- package/src/db/migrator/index.ts +0 -80
- package/src/db/registry/consent-policy.test.ts +0 -451
- package/src/db/registry/consent-policy.ts +0 -82
- package/src/db/registry/consent-purpose.test.ts +0 -428
- package/src/db/registry/consent-purpose.ts +0 -61
- package/src/db/registry/domain.test.ts +0 -445
- package/src/db/registry/domain.ts +0 -91
- package/src/db/registry/index.ts +0 -14
- package/src/db/registry/subject.test.ts +0 -388
- package/src/db/registry/subject.ts +0 -129
- package/src/db/registry/types.ts +0 -10
- package/src/db/registry/utils/generate-id.test.ts +0 -216
- package/src/db/registry/utils/generate-id.ts +0 -133
- package/src/db/registry/utils.ts +0 -133
- package/src/db/schema/1.0.0/audit-log.ts +0 -15
- package/src/db/schema/1.0.0/consent-policy.ts +0 -14
- package/src/db/schema/1.0.0/consent-purpose.ts +0 -14
- package/src/db/schema/1.0.0/consent-record.ts +0 -10
- package/src/db/schema/1.0.0/consent.ts +0 -20
- package/src/db/schema/1.0.0/domain.ts +0 -12
- package/src/db/schema/1.0.0/index.ts +0 -48
- package/src/db/schema/1.0.0/subject.ts +0 -12
- package/src/db/schema/2.0.0/audit-log.ts +0 -18
- package/src/db/schema/2.0.0/consent-policy.ts +0 -28
- package/src/db/schema/2.0.0/consent-purpose.ts +0 -12
- package/src/db/schema/2.0.0/consent.ts +0 -26
- package/src/db/schema/2.0.0/domain.ts +0 -12
- package/src/db/schema/2.0.0/index.ts +0 -47
- package/src/db/schema/2.0.0/subject.ts +0 -14
- package/src/db/schema/index.ts +0 -15
- package/src/db/tenant-scope.test.ts +0 -750
- package/src/db/tenant-scope.ts +0 -103
- package/src/define-config.ts +0 -5
- package/src/handlers/consent/check.handler.ts +0 -126
- package/src/handlers/init/geo.test.ts +0 -317
- package/src/handlers/init/geo.ts +0 -195
- package/src/handlers/init/index.test.ts +0 -205
- package/src/handlers/init/index.ts +0 -114
- package/src/handlers/init/translations.test.ts +0 -121
- package/src/handlers/init/translations.ts +0 -72
- package/src/handlers/status/status.handler.test.ts +0 -155
- package/src/handlers/status/status.handler.ts +0 -51
- package/src/handlers/subject/get.handler.ts +0 -93
- package/src/handlers/subject/list.handler.ts +0 -93
- package/src/handlers/subject/patch.handler.ts +0 -122
- package/src/handlers/subject/post.handler.test.ts +0 -294
- package/src/handlers/subject/post.handler.ts +0 -254
- package/src/handlers/utils/consent-enrichment.test.ts +0 -380
- package/src/handlers/utils/consent-enrichment.ts +0 -218
- package/src/init.test.ts +0 -126
- package/src/init.ts +0 -87
- package/src/middleware/auth/index.ts +0 -11
- package/src/middleware/auth/validate-api-key.test.ts +0 -86
- package/src/middleware/auth/validate-api-key.ts +0 -107
- package/src/middleware/cors/cors.test.ts +0 -135
- package/src/middleware/cors/cors.ts +0 -186
- package/src/middleware/cors/is-origin-trusted.test.ts +0 -164
- package/src/middleware/cors/is-origin-trusted.ts +0 -130
- package/src/middleware/cors/process-cors.ts +0 -91
- package/src/middleware/openapi/config.ts +0 -29
- package/src/middleware/openapi/handlers.ts +0 -34
- package/src/middleware/process-ip/index.test.ts +0 -195
- package/src/middleware/process-ip/index.ts +0 -199
- package/src/router.ts +0 -15
- package/src/routes/consent.ts +0 -52
- package/src/routes/index.ts +0 -10
- package/src/routes/init.ts +0 -102
- package/src/routes/status.ts +0 -46
- package/src/routes/subject.ts +0 -152
- package/src/types/api.ts +0 -48
- package/src/types/index.ts +0 -288
- package/src/utils/create-telemetry-options.test.ts +0 -302
- package/src/utils/create-telemetry-options.ts +0 -229
- package/src/utils/env.ts +0 -84
- package/src/utils/extract-error-message.ts +0 -21
- package/src/utils/instrumentation.test.ts +0 -185
- package/src/utils/instrumentation.ts +0 -196
- package/src/utils/logger.ts +0 -41
- package/src/utils/metrics.test.ts +0 -323
- package/src/utils/metrics.ts +0 -402
- package/src/utils/telemetry-pii.test.ts +0 -325
- package/src/version.ts +0 -2
- package/tsconfig.json +0 -11
- package/vitest.config.ts +0 -28
- /package/dist/{types.js → types/index.js} +0 -0
- /package/{src/db/adapters/drizzle.ts → dist-types/db/adapters/drizzle.d.ts} +0 -0
- /package/{src/db/adapters/index.ts → dist-types/db/adapters/index.d.ts} +0 -0
- /package/{src/db/adapters/kysely.ts → dist-types/db/adapters/kysely.d.ts} +0 -0
- /package/{src/db/adapters/mongo.ts → dist-types/db/adapters/mongo.d.ts} +0 -0
- /package/{src/db/adapters/prisma.ts → dist-types/db/adapters/prisma.d.ts} +0 -0
- /package/{src/db/adapters/typeorm.ts → dist-types/db/adapters/typeorm.d.ts} +0 -0
- /package/{src/utils/index.ts → dist-types/utils/index.d.ts} +0 -0
package/src/cache/index.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cache Module
|
|
3
|
-
*
|
|
4
|
-
* Multi-layer caching system with pluggable adapters for GVL and other data.
|
|
5
|
-
*
|
|
6
|
-
* @packageDocumentation
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
// Adapters
|
|
10
|
-
export {
|
|
11
|
-
clearMemoryCache,
|
|
12
|
-
// Cloudflare KV
|
|
13
|
-
createCloudflareKVAdapter,
|
|
14
|
-
// Memory
|
|
15
|
-
createMemoryCacheAdapter,
|
|
16
|
-
// Upstash Redis
|
|
17
|
-
createUpstashRedisAdapter,
|
|
18
|
-
createUpstashRedisAdapterFromClient,
|
|
19
|
-
getMemoryCacheSize,
|
|
20
|
-
type KVNamespace,
|
|
21
|
-
type UpstashRedisAdapterOptions,
|
|
22
|
-
} from './adapters';
|
|
23
|
-
// GVL Resolver
|
|
24
|
-
export {
|
|
25
|
-
createGVLResolver,
|
|
26
|
-
type GVLResolver,
|
|
27
|
-
type GVLResolverOptions,
|
|
28
|
-
} from './gvl-resolver';
|
|
29
|
-
|
|
30
|
-
// Cache Key Utilities
|
|
31
|
-
export { createCacheKey, createGVLCacheKey } from './keys';
|
|
32
|
-
// Types
|
|
33
|
-
export type { CacheAdapter } from './types';
|
|
34
|
-
export { GVL_TTL_MS, MEMORY_TTL_MS } from './types';
|
package/src/cache/keys.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cache Key Utilities
|
|
3
|
-
*
|
|
4
|
-
* Functions for generating consistent cache keys with app name prefixing.
|
|
5
|
-
*
|
|
6
|
-
* @packageDocumentation
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Create a GVL cache key.
|
|
11
|
-
*
|
|
12
|
-
* Format: `{appName}:gvl:{language}:{sortedVendorIds}`
|
|
13
|
-
*
|
|
14
|
-
* @param appName - The application name for key prefixing
|
|
15
|
-
* @param language - The language code (e.g., "en", "de")
|
|
16
|
-
* @param vendorIds - Optional array of vendor IDs to include in the key
|
|
17
|
-
* @returns A unique cache key for the GVL configuration
|
|
18
|
-
*
|
|
19
|
-
* @example
|
|
20
|
-
* ```typescript
|
|
21
|
-
* // All vendors
|
|
22
|
-
* createGVLCacheKey('my-app', 'en');
|
|
23
|
-
* // => 'my-app:gvl:en:all'
|
|
24
|
-
*
|
|
25
|
-
* // Specific vendors
|
|
26
|
-
* createGVLCacheKey('my-app', 'de', [1, 10, 2]);
|
|
27
|
-
* // => 'my-app:gvl:de:1,2,10'
|
|
28
|
-
* ```
|
|
29
|
-
*
|
|
30
|
-
* @public
|
|
31
|
-
*/
|
|
32
|
-
export function createGVLCacheKey(
|
|
33
|
-
appName: string,
|
|
34
|
-
language: string,
|
|
35
|
-
vendorIds?: number[]
|
|
36
|
-
): string {
|
|
37
|
-
const sortedIds = vendorIds
|
|
38
|
-
? [...vendorIds].sort((a, b) => a - b).join(',')
|
|
39
|
-
: 'all';
|
|
40
|
-
return `${appName}:gvl:${language}:${sortedIds}`;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Create a generic cache key with namespace and parts.
|
|
45
|
-
*
|
|
46
|
-
* Format: `{appName}:{namespace}:{part1}:{part2}:...`
|
|
47
|
-
*
|
|
48
|
-
* @param appName - The application name for key prefixing
|
|
49
|
-
* @param namespace - The cache namespace (e.g., "gvl", "translations")
|
|
50
|
-
* @param parts - Additional key parts
|
|
51
|
-
* @returns A namespaced cache key
|
|
52
|
-
*
|
|
53
|
-
* @example
|
|
54
|
-
* ```typescript
|
|
55
|
-
* createCacheKey('my-app', 'translations', 'en', 'banner');
|
|
56
|
-
* // => 'my-app:translations:en:banner'
|
|
57
|
-
* ```
|
|
58
|
-
*
|
|
59
|
-
* @public
|
|
60
|
-
*/
|
|
61
|
-
export function createCacheKey(
|
|
62
|
-
appName: string,
|
|
63
|
-
namespace: string,
|
|
64
|
-
...parts: (string | number)[]
|
|
65
|
-
): string {
|
|
66
|
-
const allParts = [appName, namespace, ...parts];
|
|
67
|
-
return allParts.join(':');
|
|
68
|
-
}
|
package/src/cache/types.ts
DELETED
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Cache Adapter Types
|
|
3
|
-
*
|
|
4
|
-
* Generic cache adapter interface for pluggable caching implementations.
|
|
5
|
-
* Supports in-memory, Redis, Cloudflare KV, and custom adapters.
|
|
6
|
-
*
|
|
7
|
-
* @packageDocumentation
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* Generic cache adapter interface.
|
|
12
|
-
*
|
|
13
|
-
* Implementations should handle serialization/deserialization internally.
|
|
14
|
-
* All methods are async to support both sync (memory) and async (Redis/KV) backends.
|
|
15
|
-
*
|
|
16
|
-
* @public
|
|
17
|
-
*/
|
|
18
|
-
export interface CacheAdapter {
|
|
19
|
-
/**
|
|
20
|
-
* Get a value from the cache.
|
|
21
|
-
*
|
|
22
|
-
* @param key - Cache key
|
|
23
|
-
* @returns The cached value, or null if not found or expired
|
|
24
|
-
*/
|
|
25
|
-
get<T>(key: string): Promise<T | null>;
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* Set a value in the cache.
|
|
29
|
-
*
|
|
30
|
-
* @param key - Cache key
|
|
31
|
-
* @param value - Value to cache
|
|
32
|
-
* @param ttlMs - Time to live in milliseconds (optional)
|
|
33
|
-
*/
|
|
34
|
-
set<T>(key: string, value: T, ttlMs?: number): Promise<void>;
|
|
35
|
-
|
|
36
|
-
/**
|
|
37
|
-
* Delete a value from the cache.
|
|
38
|
-
*
|
|
39
|
-
* @param key - Cache key
|
|
40
|
-
*/
|
|
41
|
-
delete(key: string): Promise<void>;
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Check if a key exists in the cache.
|
|
45
|
-
*
|
|
46
|
-
* @param key - Cache key
|
|
47
|
-
* @returns True if the key exists and is not expired
|
|
48
|
-
*/
|
|
49
|
-
has(key: string): Promise<boolean>;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/**
|
|
53
|
-
* Default TTL for GVL cache entries (3 days).
|
|
54
|
-
* Matches the typical GVL update frequency.
|
|
55
|
-
*
|
|
56
|
-
* @public
|
|
57
|
-
*/
|
|
58
|
-
export const GVL_TTL_MS = 3 * 24 * 60 * 60 * 1000; // 3 days
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* Default TTL for in-memory cache entries (5 minutes).
|
|
62
|
-
* Shorter TTL to handle worker restarts and keep memory usage low.
|
|
63
|
-
*
|
|
64
|
-
* @public
|
|
65
|
-
*/
|
|
66
|
-
export const MEMORY_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
package/src/core.ts
DELETED
|
@@ -1,368 +0,0 @@
|
|
|
1
|
-
import { createLogger } from '@c15t/logger';
|
|
2
|
-
import { SpanStatusCode } from '@opentelemetry/api';
|
|
3
|
-
import { apiReference } from '@scalar/hono-api-reference';
|
|
4
|
-
import { Hono } from 'hono';
|
|
5
|
-
import { cors } from 'hono/cors';
|
|
6
|
-
import { HTTPException } from 'hono/http-exception';
|
|
7
|
-
import { openAPIRouteHandler } from 'hono-openapi';
|
|
8
|
-
import { validateRequestAuth } from '~/middleware/auth';
|
|
9
|
-
import { createCORSOptions } from '~/middleware/cors';
|
|
10
|
-
import { createOpenAPIConfig } from '~/middleware/openapi';
|
|
11
|
-
import { getIpAddress } from '~/middleware/process-ip';
|
|
12
|
-
import type { C15TContext, C15TOptions } from '~/types';
|
|
13
|
-
import { init } from './init';
|
|
14
|
-
import { createConsentRoutes } from './routes/consent';
|
|
15
|
-
// Import route handlers
|
|
16
|
-
import { createInitRoute } from './routes/init';
|
|
17
|
-
import { createStatusRoute } from './routes/status';
|
|
18
|
-
import { createSubjectRoutes } from './routes/subject';
|
|
19
|
-
import {
|
|
20
|
-
createRequestSpan,
|
|
21
|
-
handleSpanError,
|
|
22
|
-
withSpanContext,
|
|
23
|
-
} from './utils/create-telemetry-options';
|
|
24
|
-
import { extractErrorMessage } from './utils/extract-error-message';
|
|
25
|
-
import { getMetrics } from './utils/metrics';
|
|
26
|
-
import { version } from './version';
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* Type representing an API route
|
|
30
|
-
*/
|
|
31
|
-
export type Route = {
|
|
32
|
-
path: string;
|
|
33
|
-
method: string;
|
|
34
|
-
description?: string;
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Hono app type with c15t context
|
|
39
|
-
*/
|
|
40
|
-
export type C15TApp = Hono<{ Variables: { c15tContext: C15TContext } }>;
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Interface representing a configured c15t consent management instance.
|
|
44
|
-
*
|
|
45
|
-
* @remarks
|
|
46
|
-
* The C15TInstance provides the main interface for interacting with the consent
|
|
47
|
-
* management system. It includes methods for handling requests, accessing API
|
|
48
|
-
* endpoints, and managing the system's configuration.
|
|
49
|
-
*/
|
|
50
|
-
export interface C15TInstance {
|
|
51
|
-
/**
|
|
52
|
-
* Processes incoming HTTP requests and routes them to appropriate handlers.
|
|
53
|
-
*
|
|
54
|
-
* @param request - The incoming web request
|
|
55
|
-
* @returns A Promise containing the HTTP response
|
|
56
|
-
*
|
|
57
|
-
* @example
|
|
58
|
-
* ```typescript
|
|
59
|
-
* try {
|
|
60
|
-
* const response = await instance.handler(request);
|
|
61
|
-
* sendResponse(response);
|
|
62
|
-
* } catch (error) {
|
|
63
|
-
* handleError(error);
|
|
64
|
-
* }
|
|
65
|
-
* ```
|
|
66
|
-
*/
|
|
67
|
-
handler: (request: Request) => Promise<Response>;
|
|
68
|
-
|
|
69
|
-
/**
|
|
70
|
-
* The configuration options used for this instance.
|
|
71
|
-
*/
|
|
72
|
-
options: C15TOptions;
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Access to the underlying context.
|
|
76
|
-
*/
|
|
77
|
-
$context: C15TContext;
|
|
78
|
-
|
|
79
|
-
/**
|
|
80
|
-
* Access to the Hono app for direct usage.
|
|
81
|
-
*/
|
|
82
|
-
app: C15TApp;
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Generates and returns the OpenAPI specification as a JSON object.
|
|
86
|
-
*
|
|
87
|
-
* @returns A Promise containing the OpenAPI specification
|
|
88
|
-
*/
|
|
89
|
-
getOpenAPISpec: () => Promise<Record<string, unknown>>;
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Returns an HTML document with the API documentation UI.
|
|
93
|
-
*
|
|
94
|
-
* @returns An HTML string with the API reference UI
|
|
95
|
-
*/
|
|
96
|
-
getDocsUI: () => string;
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
/**
|
|
100
|
-
* Creates a new c15t consent management instance.
|
|
101
|
-
*
|
|
102
|
-
* This version uses Hono as the HTTP framework with OpenAPI support.
|
|
103
|
-
*/
|
|
104
|
-
export const c15tInstance = (options: C15TOptions): C15TInstance => {
|
|
105
|
-
const context = init(options);
|
|
106
|
-
const logger = createLogger(options.logger);
|
|
107
|
-
|
|
108
|
-
// Create the Hono app
|
|
109
|
-
const app = new Hono<{ Variables: { c15tContext: C15TContext } }>();
|
|
110
|
-
|
|
111
|
-
// Set up OpenAPI configuration
|
|
112
|
-
const openApiConfig = createOpenAPIConfig(options);
|
|
113
|
-
const basePath = options.basePath || '/';
|
|
114
|
-
|
|
115
|
-
// CORS middleware
|
|
116
|
-
const corsOptions = createCORSOptions(options.trustedOrigins);
|
|
117
|
-
app.use('*', cors(corsOptions));
|
|
118
|
-
|
|
119
|
-
// Note: Compression disabled - causes issues with response passthrough in wrapper scenarios
|
|
120
|
-
// app.use('*', compress());
|
|
121
|
-
|
|
122
|
-
// Get metrics instance (null if telemetry is disabled)
|
|
123
|
-
const metrics = getMetrics(options);
|
|
124
|
-
|
|
125
|
-
// Context middleware - enriches each request with c15t context
|
|
126
|
-
app.use('*', async (c, next) => {
|
|
127
|
-
const request = c.req.raw;
|
|
128
|
-
const startTime = Date.now();
|
|
129
|
-
|
|
130
|
-
// Check API key authentication
|
|
131
|
-
const apiKeyAuthenticated = validateRequestAuth(
|
|
132
|
-
request.headers,
|
|
133
|
-
options.advanced?.apiKeys
|
|
134
|
-
);
|
|
135
|
-
|
|
136
|
-
const enrichedContext: C15TContext = {
|
|
137
|
-
...context,
|
|
138
|
-
ipAddress: getIpAddress(request, options),
|
|
139
|
-
userAgent: request.headers.get('user-agent') || undefined,
|
|
140
|
-
apiKeyAuthenticated,
|
|
141
|
-
path: c.req.path,
|
|
142
|
-
method: c.req.method,
|
|
143
|
-
headers: request.headers,
|
|
144
|
-
};
|
|
145
|
-
|
|
146
|
-
c.set('c15tContext', enrichedContext);
|
|
147
|
-
|
|
148
|
-
// Create a telemetry span for the request (if enabled)
|
|
149
|
-
const span = createRequestSpan(c.req.method, c.req.path, options);
|
|
150
|
-
|
|
151
|
-
const runNext = async () => {
|
|
152
|
-
await next();
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
try {
|
|
156
|
-
if (span) {
|
|
157
|
-
await withSpanContext(span, runNext);
|
|
158
|
-
// After routing, update span name with matched route pattern
|
|
159
|
-
const matchedRoutes = c.req.matchedRoutes;
|
|
160
|
-
const routePattern =
|
|
161
|
-
matchedRoutes
|
|
162
|
-
.map((r) => r.path)
|
|
163
|
-
.filter((p) => p !== '/*')
|
|
164
|
-
.pop() ?? c.req.path;
|
|
165
|
-
span.updateName(`${c.req.method} ${routePattern}`);
|
|
166
|
-
span.setAttribute('http.route', routePattern);
|
|
167
|
-
span.setStatus({ code: SpanStatusCode.OK });
|
|
168
|
-
} else {
|
|
169
|
-
await runNext();
|
|
170
|
-
}
|
|
171
|
-
} catch (error) {
|
|
172
|
-
if (span) {
|
|
173
|
-
handleSpanError(span, error);
|
|
174
|
-
}
|
|
175
|
-
throw error;
|
|
176
|
-
} finally {
|
|
177
|
-
span?.end();
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// Record HTTP metrics after request completes
|
|
181
|
-
if (metrics) {
|
|
182
|
-
const durationMs = Date.now() - startTime;
|
|
183
|
-
// Use route pattern instead of raw path to avoid high cardinality
|
|
184
|
-
const matchedRoutes = c.req.matchedRoutes;
|
|
185
|
-
const routePattern =
|
|
186
|
-
matchedRoutes
|
|
187
|
-
.map((r) => r.path)
|
|
188
|
-
.filter((p) => p !== '/*')
|
|
189
|
-
.pop() ?? c.req.path;
|
|
190
|
-
metrics.recordHttpRequest(
|
|
191
|
-
{
|
|
192
|
-
method: c.req.method,
|
|
193
|
-
route: routePattern,
|
|
194
|
-
status: c.res.status,
|
|
195
|
-
},
|
|
196
|
-
durationMs
|
|
197
|
-
);
|
|
198
|
-
}
|
|
199
|
-
});
|
|
200
|
-
|
|
201
|
-
// OpenAPI spec endpoint
|
|
202
|
-
if (openApiConfig.enabled) {
|
|
203
|
-
app.get(
|
|
204
|
-
openApiConfig.specPath,
|
|
205
|
-
openAPIRouteHandler(app, {
|
|
206
|
-
documentation: {
|
|
207
|
-
openapi: '3.1.0',
|
|
208
|
-
info: {
|
|
209
|
-
title: options.appName || 'c15t API',
|
|
210
|
-
version,
|
|
211
|
-
description: 'API for consent management',
|
|
212
|
-
},
|
|
213
|
-
servers: [{ url: basePath }],
|
|
214
|
-
components: {
|
|
215
|
-
securitySchemes: {
|
|
216
|
-
bearerAuth: {
|
|
217
|
-
type: 'http',
|
|
218
|
-
scheme: 'bearer',
|
|
219
|
-
},
|
|
220
|
-
},
|
|
221
|
-
},
|
|
222
|
-
},
|
|
223
|
-
})
|
|
224
|
-
);
|
|
225
|
-
|
|
226
|
-
// Docs UI endpoint
|
|
227
|
-
// The spec URL needs to include the basePath since it's used by the browser
|
|
228
|
-
const publicSpecUrl = `${basePath}${openApiConfig.specPath}`.replace(
|
|
229
|
-
/\/+/g,
|
|
230
|
-
'/'
|
|
231
|
-
);
|
|
232
|
-
app.get(
|
|
233
|
-
openApiConfig.docsPath,
|
|
234
|
-
apiReference({
|
|
235
|
-
spec: {
|
|
236
|
-
url: publicSpecUrl,
|
|
237
|
-
},
|
|
238
|
-
pageTitle: `${options.appName || 'c15t API'} Documentation`,
|
|
239
|
-
})
|
|
240
|
-
);
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
// Mount routes - using plural nouns for REST conventions
|
|
244
|
-
app.route('/init', createInitRoute(options));
|
|
245
|
-
app.route('/subjects', createSubjectRoutes());
|
|
246
|
-
app.route('/consents', createConsentRoutes());
|
|
247
|
-
app.route('/status', createStatusRoute());
|
|
248
|
-
|
|
249
|
-
// Global error handler
|
|
250
|
-
app.onError((err, c) => {
|
|
251
|
-
const ctx = c.get('c15tContext');
|
|
252
|
-
const log = ctx?.logger || logger;
|
|
253
|
-
|
|
254
|
-
log.error('Request handling error:', extractErrorMessage(err));
|
|
255
|
-
|
|
256
|
-
if (err instanceof HTTPException) {
|
|
257
|
-
const cause = err.cause as
|
|
258
|
-
| { code?: string; message?: string; [key: string]: unknown }
|
|
259
|
-
| undefined;
|
|
260
|
-
return c.json(
|
|
261
|
-
{
|
|
262
|
-
code: cause?.code || 'HTTP_ERROR',
|
|
263
|
-
message: err.message,
|
|
264
|
-
status: err.status,
|
|
265
|
-
defined: true,
|
|
266
|
-
data: {},
|
|
267
|
-
},
|
|
268
|
-
err.status
|
|
269
|
-
);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
|
-
return c.json(
|
|
273
|
-
{
|
|
274
|
-
code: 'INTERNAL_SERVER_ERROR',
|
|
275
|
-
message: 'Internal server error',
|
|
276
|
-
status: 500,
|
|
277
|
-
defined: true,
|
|
278
|
-
data: {},
|
|
279
|
-
},
|
|
280
|
-
500
|
|
281
|
-
);
|
|
282
|
-
});
|
|
283
|
-
|
|
284
|
-
// 404 handler
|
|
285
|
-
app.notFound((c) => {
|
|
286
|
-
return c.json(
|
|
287
|
-
{
|
|
288
|
-
code: 'NOT_FOUND',
|
|
289
|
-
message: 'Not Found',
|
|
290
|
-
status: 404,
|
|
291
|
-
defined: true,
|
|
292
|
-
data: {},
|
|
293
|
-
},
|
|
294
|
-
404
|
|
295
|
-
);
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
// Create the handler function
|
|
299
|
-
const handler = async (request: Request): Promise<Response> => {
|
|
300
|
-
logger?.debug?.('Incoming request', {
|
|
301
|
-
method: request.method,
|
|
302
|
-
url: request.url,
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
// Strip the basePath from the URL if present
|
|
306
|
-
// This allows Hono routes to be defined without the basePath prefix
|
|
307
|
-
let modifiedRequest = request;
|
|
308
|
-
if (basePath && basePath !== '/') {
|
|
309
|
-
const url = new URL(request.url);
|
|
310
|
-
const normalizedBasePath = basePath.replace(/\/$/, ''); // Remove trailing slash
|
|
311
|
-
if (url.pathname.startsWith(normalizedBasePath)) {
|
|
312
|
-
const newPath = url.pathname.slice(normalizedBasePath.length) || '/';
|
|
313
|
-
url.pathname = newPath;
|
|
314
|
-
modifiedRequest = new Request(url.toString(), {
|
|
315
|
-
method: request.method,
|
|
316
|
-
headers: request.headers,
|
|
317
|
-
body: request.body,
|
|
318
|
-
duplex: 'half',
|
|
319
|
-
} as RequestInit);
|
|
320
|
-
}
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
return app.fetch(modifiedRequest);
|
|
324
|
-
};
|
|
325
|
-
|
|
326
|
-
// Create docs UI helper
|
|
327
|
-
const getDocsUI = () => {
|
|
328
|
-
const specUrl = `${basePath}${openApiConfig.specPath}`.replace(/\/+/g, '/');
|
|
329
|
-
return `
|
|
330
|
-
<!doctype html>
|
|
331
|
-
<html>
|
|
332
|
-
<head>
|
|
333
|
-
<title>${options.appName || 'c15t API'} Documentation</title>
|
|
334
|
-
<meta charset="utf-8" />
|
|
335
|
-
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
336
|
-
<link rel="icon" type="image/svg+xml" href="https://c15t.com/icon.svg" />
|
|
337
|
-
</head>
|
|
338
|
-
<body>
|
|
339
|
-
<script
|
|
340
|
-
id="api-reference"
|
|
341
|
-
data-url="${encodeURI(specUrl)}">
|
|
342
|
-
</script>
|
|
343
|
-
<script src="https://cdn.jsdelivr.net/npm/@scalar/api-reference"></script>
|
|
344
|
-
</body>
|
|
345
|
-
</html>
|
|
346
|
-
`;
|
|
347
|
-
};
|
|
348
|
-
|
|
349
|
-
// Return the instance
|
|
350
|
-
return {
|
|
351
|
-
options,
|
|
352
|
-
$context: context,
|
|
353
|
-
app,
|
|
354
|
-
handler,
|
|
355
|
-
getOpenAPISpec: async () => {
|
|
356
|
-
// Generate OpenAPI spec by fetching from our own endpoint
|
|
357
|
-
const specResponse = await app.fetch(
|
|
358
|
-
new Request(`http://localhost${openApiConfig.specPath}`)
|
|
359
|
-
);
|
|
360
|
-
return specResponse.json() as Promise<Record<string, unknown>>;
|
|
361
|
-
},
|
|
362
|
-
getDocsUI,
|
|
363
|
-
};
|
|
364
|
-
};
|
|
365
|
-
|
|
366
|
-
export { defineConfig } from './define-config';
|
|
367
|
-
export type { C15TContext, C15TOptions } from './types';
|
|
368
|
-
export { version } from './version';
|
package/src/db/migrator/index.ts
DELETED
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import type { InferFumaDB } from 'fumadb';
|
|
2
|
-
import type { DB } from '~/db/schema';
|
|
3
|
-
|
|
4
|
-
type DatabaseInstance = InferFumaDB<typeof DB>;
|
|
5
|
-
type MigratorInstance = ReturnType<DatabaseInstance['createMigrator']>;
|
|
6
|
-
type VersionTag = ReturnType<(typeof DB)['version']>;
|
|
7
|
-
|
|
8
|
-
type MigrateToLatestResult = Awaited<
|
|
9
|
-
ReturnType<MigratorInstance['migrateToLatest']>
|
|
10
|
-
>;
|
|
11
|
-
type MigrateToResult = Awaited<ReturnType<MigratorInstance['migrateTo']>>;
|
|
12
|
-
type DownResult = Awaited<ReturnType<MigratorInstance['down']>>;
|
|
13
|
-
|
|
14
|
-
export type MigrationResult =
|
|
15
|
-
| MigrateToLatestResult
|
|
16
|
-
| MigrateToResult
|
|
17
|
-
| DownResult;
|
|
18
|
-
|
|
19
|
-
export type ORMResult = {
|
|
20
|
-
code: string;
|
|
21
|
-
path: string;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
interface BaseOptions {
|
|
25
|
-
db: DatabaseInstance;
|
|
26
|
-
schema: VersionTag | 'latest';
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Executes database migrations for supported adapters, or generates ORM schema
|
|
31
|
-
* code for ORM-based adapters.
|
|
32
|
-
*
|
|
33
|
-
* - For 'kysely' and 'mongo', this function runs migrations using the
|
|
34
|
-
* underlying migrator returned by `db.createMigrator()`.
|
|
35
|
-
* - For 'drizzle', 'prisma', and 'typeorm', this function generates schema
|
|
36
|
-
* code via `db.generateSchema()`.
|
|
37
|
-
*/
|
|
38
|
-
export async function migrator(
|
|
39
|
-
options: BaseOptions
|
|
40
|
-
): Promise<MigrationResult | ORMResult> {
|
|
41
|
-
const { db } = options;
|
|
42
|
-
|
|
43
|
-
let version: VersionTag | 'legacy';
|
|
44
|
-
try {
|
|
45
|
-
version = await db.version();
|
|
46
|
-
} catch {
|
|
47
|
-
// If FumaDB isn't initalized yet, we're in legacy mode
|
|
48
|
-
version = 'legacy';
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
const migratorInstance = db.adapter?.createMigrationEngine
|
|
52
|
-
? db.createMigrator()
|
|
53
|
-
: undefined;
|
|
54
|
-
|
|
55
|
-
const schema = db.adapter?.generateSchema
|
|
56
|
-
? db.generateSchema(options.schema)
|
|
57
|
-
: undefined;
|
|
58
|
-
|
|
59
|
-
if (migratorInstance) {
|
|
60
|
-
switch (options.schema) {
|
|
61
|
-
case 'latest':
|
|
62
|
-
return await migratorInstance.migrateToLatest({
|
|
63
|
-
mode: version === 'legacy' ? 'from-database' : 'from-schema',
|
|
64
|
-
});
|
|
65
|
-
default:
|
|
66
|
-
return await migratorInstance.migrateTo(options.schema, {
|
|
67
|
-
mode: version === 'legacy' ? 'from-database' : 'from-schema',
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
if (schema) {
|
|
73
|
-
return {
|
|
74
|
-
code: schema.code,
|
|
75
|
-
path: schema.path,
|
|
76
|
-
};
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
throw new Error('Adapter does not support migrations or schema generation');
|
|
80
|
-
}
|