@c15t/backend 1.2.0-canary.9 → 1.2.1

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.
Files changed (186) hide show
  1. package/.turbo/turbo-build.log +53 -52
  2. package/CHANGELOG.md +13 -0
  3. package/dist/__tests__/server.test.d.ts +2 -0
  4. package/dist/__tests__/server.test.d.ts.map +1 -0
  5. package/dist/contracts/index.d.ts +1 -1
  6. package/dist/contracts/index.d.ts.map +1 -1
  7. package/dist/contracts.cjs +708 -0
  8. package/dist/contracts.js +661 -0
  9. package/dist/core.cjs +96 -49
  10. package/dist/core.d.ts.map +1 -1
  11. package/dist/core.js +96 -49
  12. package/dist/middleware/openapi/config.d.ts +1 -1
  13. package/dist/middleware/openapi/config.d.ts.map +1 -1
  14. package/dist/pkgs/data-model/index.cjs +59 -41
  15. package/dist/pkgs/data-model/index.js +59 -41
  16. package/dist/pkgs/data-model/schema/index.cjs +59 -41
  17. package/dist/pkgs/data-model/schema/index.js +59 -41
  18. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.cjs +2 -2
  19. package/dist/pkgs/db-adapters/adapters/drizzle-adapter/index.js +2 -2
  20. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.cjs +2 -2
  21. package/dist/pkgs/db-adapters/adapters/kysely-adapter/index.js +2 -2
  22. package/dist/pkgs/db-adapters/adapters/memory-adapter/index.cjs +2 -2
  23. package/dist/pkgs/db-adapters/adapters/memory-adapter/index.js +2 -2
  24. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.cjs +2 -2
  25. package/dist/pkgs/db-adapters/adapters/prisma-adapter/index.js +2 -2
  26. package/dist/pkgs/db-adapters/index.cjs +2 -2
  27. package/dist/pkgs/db-adapters/index.js +2 -2
  28. package/dist/pkgs/migrations/index.cjs +2 -2
  29. package/dist/pkgs/migrations/index.js +2 -2
  30. package/dist/router.cjs +5 -3
  31. package/dist/router.js +5 -3
  32. package/dist/schema/consent-policy/registry.d.ts.map +1 -1
  33. package/dist/schema/consent-purpose/registry.d.ts +4 -4
  34. package/dist/schema/consent-purpose/schema.d.ts +6 -6
  35. package/dist/schema/consent-purpose/table.d.ts +6 -6
  36. package/dist/schema/create-registry.d.ts +4 -4
  37. package/dist/schema/create-registry.d.ts.map +1 -1
  38. package/dist/schema/definition.d.ts +6 -6
  39. package/dist/schema/index.cjs +59 -41
  40. package/dist/schema/index.js +59 -41
  41. package/dist/schema/schemas.d.ts +6 -6
  42. package/package.json +7 -2
  43. package/rslib.config.ts +1 -0
  44. package/src/__tests__/server.test.ts +96 -0
  45. package/src/contracts/index.ts +2 -0
  46. package/src/core.ts +29 -1
  47. package/src/middleware/cors/cors.test.ts +0 -1
  48. package/src/middleware/openapi/config.ts +10 -7
  49. package/src/schema/consent-policy/registry.ts +74 -51
  50. package/src/schema/consent-purpose/schema.ts +2 -2
  51. package/.turbo/turbo-fmt.log +0 -7
  52. package/.turbo/turbo-test.log +0 -426
  53. package/coverage/coverage-final.json +0 -88
  54. package/coverage/coverage-summary.json +0 -89
  55. package/coverage/html/backend/index.html +0 -116
  56. package/coverage/html/backend/rslib.config.ts.html +0 -415
  57. package/coverage/html/backend/src/contracts/consent/index.html +0 -161
  58. package/coverage/html/backend/src/contracts/consent/index.ts.html +0 -112
  59. package/coverage/html/backend/src/contracts/consent/post.contract.ts.html +0 -550
  60. package/coverage/html/backend/src/contracts/consent/show-banner.contract.ts.html +0 -220
  61. package/coverage/html/backend/src/contracts/consent/verify.contract.ts.html +0 -463
  62. package/coverage/html/backend/src/contracts/index.html +0 -116
  63. package/coverage/html/backend/src/contracts/index.ts.html +0 -139
  64. package/coverage/html/backend/src/contracts/meta/index.html +0 -131
  65. package/coverage/html/backend/src/contracts/meta/index.ts.html +0 -100
  66. package/coverage/html/backend/src/contracts/meta/status.contract.ts.html +0 -196
  67. package/coverage/html/backend/src/contracts/shared/index.html +0 -116
  68. package/coverage/html/backend/src/contracts/shared/jurisdiction.schema.ts.html +0 -175
  69. package/coverage/html/backend/src/core.ts.html +0 -1342
  70. package/coverage/html/backend/src/handlers/consent/index.html +0 -161
  71. package/coverage/html/backend/src/handlers/consent/index.ts.html +0 -112
  72. package/coverage/html/backend/src/handlers/consent/post.handler.ts.html +0 -904
  73. package/coverage/html/backend/src/handlers/consent/show-banner.handler.ts.html +0 -532
  74. package/coverage/html/backend/src/handlers/consent/verify.handler.ts.html +0 -1000
  75. package/coverage/html/backend/src/handlers/meta/index.html +0 -131
  76. package/coverage/html/backend/src/handlers/meta/index.ts.html +0 -100
  77. package/coverage/html/backend/src/handlers/meta/status.handler.ts.html +0 -226
  78. package/coverage/html/backend/src/index.html +0 -161
  79. package/coverage/html/backend/src/init.ts.html +0 -1018
  80. package/coverage/html/backend/src/middleware/cors/cors.ts.html +0 -661
  81. package/coverage/html/backend/src/middleware/cors/index.html +0 -146
  82. package/coverage/html/backend/src/middleware/cors/is-origin-trusted.ts.html +0 -463
  83. package/coverage/html/backend/src/middleware/cors/process-cors.ts.html +0 -358
  84. package/coverage/html/backend/src/middleware/openapi/config.ts.html +0 -160
  85. package/coverage/html/backend/src/middleware/openapi/handlers.ts.html +0 -481
  86. package/coverage/html/backend/src/middleware/openapi/index.html +0 -131
  87. package/coverage/html/backend/src/pkgs/api-router/hooks/index.html +0 -116
  88. package/coverage/html/backend/src/pkgs/api-router/hooks/processor.ts.html +0 -544
  89. package/coverage/html/backend/src/pkgs/api-router/index.html +0 -116
  90. package/coverage/html/backend/src/pkgs/api-router/telemetry.ts.html +0 -334
  91. package/coverage/html/backend/src/pkgs/api-router/utils/index.html +0 -116
  92. package/coverage/html/backend/src/pkgs/api-router/utils/ip.ts.html +0 -361
  93. package/coverage/html/backend/src/pkgs/data-model/fields/field-factory.ts.html +0 -709
  94. package/coverage/html/backend/src/pkgs/data-model/fields/id-generator.ts.html +0 -256
  95. package/coverage/html/backend/src/pkgs/data-model/fields/index.html +0 -161
  96. package/coverage/html/backend/src/pkgs/data-model/fields/superjson-utils.ts.html +0 -136
  97. package/coverage/html/backend/src/pkgs/data-model/fields/zod-fields.ts.html +0 -496
  98. package/coverage/html/backend/src/pkgs/data-model/hooks/create-hooks.ts.html +0 -349
  99. package/coverage/html/backend/src/pkgs/data-model/hooks/index.html +0 -176
  100. package/coverage/html/backend/src/pkgs/data-model/hooks/update-hooks.ts.html +0 -358
  101. package/coverage/html/backend/src/pkgs/data-model/hooks/update-many-hooks.ts.html +0 -613
  102. package/coverage/html/backend/src/pkgs/data-model/hooks/utils.ts.html +0 -538
  103. package/coverage/html/backend/src/pkgs/data-model/hooks/with-hooks-factory.ts.html +0 -289
  104. package/coverage/html/backend/src/pkgs/db-adapters/adapter-factory.ts.html +0 -289
  105. package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/drizzle-adapter.ts.html +0 -2203
  106. package/coverage/html/backend/src/pkgs/db-adapters/adapters/drizzle-adapter/index.html +0 -116
  107. package/coverage/html/backend/src/pkgs/db-adapters/adapters/index.html +0 -116
  108. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/dialect.ts.html +0 -670
  109. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/index.html +0 -131
  110. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/kysely-adapter.ts.html +0 -3634
  111. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/index.html +0 -116
  112. package/coverage/html/backend/src/pkgs/db-adapters/adapters/kysely-adapter/tests/test-utils.ts.html +0 -1417
  113. package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/index.html +0 -116
  114. package/coverage/html/backend/src/pkgs/db-adapters/adapters/memory-adapter/memory-adapter.ts.html +0 -2071
  115. package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/index.html +0 -116
  116. package/coverage/html/backend/src/pkgs/db-adapters/adapters/prisma-adapter/prisma-adapter.ts.html +0 -1834
  117. package/coverage/html/backend/src/pkgs/db-adapters/adapters/test.ts.html +0 -316
  118. package/coverage/html/backend/src/pkgs/db-adapters/index.html +0 -131
  119. package/coverage/html/backend/src/pkgs/db-adapters/utils.ts.html +0 -238
  120. package/coverage/html/backend/src/pkgs/migrations/get-migration.ts.html +0 -343
  121. package/coverage/html/backend/src/pkgs/migrations/get-schema/get-schema.ts.html +0 -217
  122. package/coverage/html/backend/src/pkgs/migrations/get-schema/index.html +0 -146
  123. package/coverage/html/backend/src/pkgs/migrations/get-schema/process-fields.ts.html +0 -280
  124. package/coverage/html/backend/src/pkgs/migrations/get-schema/process-tables.ts.html +0 -289
  125. package/coverage/html/backend/src/pkgs/migrations/index.html +0 -176
  126. package/coverage/html/backend/src/pkgs/migrations/migration-builders.ts.html +0 -595
  127. package/coverage/html/backend/src/pkgs/migrations/migration-execution.ts.html +0 -301
  128. package/coverage/html/backend/src/pkgs/migrations/schema-comparison.ts.html +0 -694
  129. package/coverage/html/backend/src/pkgs/migrations/type-mapping.ts.html +0 -817
  130. package/coverage/html/backend/src/pkgs/results/core/error-class.ts.html +0 -976
  131. package/coverage/html/backend/src/pkgs/results/core/error-codes.ts.html +0 -703
  132. package/coverage/html/backend/src/pkgs/results/core/index.html +0 -146
  133. package/coverage/html/backend/src/pkgs/results/core/tracing.ts.html +0 -280
  134. package/coverage/html/backend/src/pkgs/results/create-telemetry-options.ts.html +0 -271
  135. package/coverage/html/backend/src/pkgs/results/index.html +0 -131
  136. package/coverage/html/backend/src/pkgs/results/orpc-error-handler.ts.html +0 -496
  137. package/coverage/html/backend/src/pkgs/results/results/index.html +0 -131
  138. package/coverage/html/backend/src/pkgs/results/results/recovery-utils.ts.html +0 -628
  139. package/coverage/html/backend/src/pkgs/results/results/result-helpers.ts.html +0 -1234
  140. package/coverage/html/backend/src/pkgs/utils/env.ts.html +0 -337
  141. package/coverage/html/backend/src/pkgs/utils/index.html +0 -146
  142. package/coverage/html/backend/src/pkgs/utils/logger.ts.html +0 -199
  143. package/coverage/html/backend/src/pkgs/utils/url.ts.html +0 -400
  144. package/coverage/html/backend/src/router.ts.html +0 -109
  145. package/coverage/html/backend/src/schema/audit-log/index.html +0 -146
  146. package/coverage/html/backend/src/schema/audit-log/registry.ts.html +0 -436
  147. package/coverage/html/backend/src/schema/audit-log/schema.ts.html +0 -223
  148. package/coverage/html/backend/src/schema/audit-log/table.ts.html +0 -640
  149. package/coverage/html/backend/src/schema/consent/index.html +0 -146
  150. package/coverage/html/backend/src/schema/consent/registry.ts.html +0 -616
  151. package/coverage/html/backend/src/schema/consent/schema.ts.html +0 -238
  152. package/coverage/html/backend/src/schema/consent/table.ts.html +0 -748
  153. package/coverage/html/backend/src/schema/consent-policy/index.html +0 -146
  154. package/coverage/html/backend/src/schema/consent-policy/registry.ts.html +0 -1063
  155. package/coverage/html/backend/src/schema/consent-policy/schema.ts.html +0 -265
  156. package/coverage/html/backend/src/schema/consent-policy/table.ts.html +0 -535
  157. package/coverage/html/backend/src/schema/consent-purpose/index.html +0 -146
  158. package/coverage/html/backend/src/schema/consent-purpose/registry.ts.html +0 -589
  159. package/coverage/html/backend/src/schema/consent-purpose/schema.ts.html +0 -259
  160. package/coverage/html/backend/src/schema/consent-purpose/table.ts.html +0 -547
  161. package/coverage/html/backend/src/schema/consent-record/index.html +0 -131
  162. package/coverage/html/backend/src/schema/consent-record/schema.ts.html +0 -211
  163. package/coverage/html/backend/src/schema/consent-record/table.ts.html +0 -457
  164. package/coverage/html/backend/src/schema/create-registry.ts.html +0 -148
  165. package/coverage/html/backend/src/schema/definition.ts.html +0 -685
  166. package/coverage/html/backend/src/schema/domain/index.html +0 -146
  167. package/coverage/html/backend/src/schema/domain/registry.ts.html +0 -973
  168. package/coverage/html/backend/src/schema/domain/schema.ts.html +0 -214
  169. package/coverage/html/backend/src/schema/domain/table.ts.html +0 -496
  170. package/coverage/html/backend/src/schema/index.html +0 -146
  171. package/coverage/html/backend/src/schema/schemas.ts.html +0 -166
  172. package/coverage/html/backend/src/schema/subject/index.html +0 -146
  173. package/coverage/html/backend/src/schema/subject/registry.ts.html +0 -973
  174. package/coverage/html/backend/src/schema/subject/schema.ts.html +0 -208
  175. package/coverage/html/backend/src/schema/subject/table.ts.html +0 -499
  176. package/coverage/html/backend/src/server.ts.html +0 -463
  177. package/coverage/html/backend/src/testing/contract-testing.ts.html +0 -1396
  178. package/coverage/html/backend/src/testing/index.html +0 -116
  179. package/coverage/html/base.css +0 -224
  180. package/coverage/html/block-navigation.js +0 -87
  181. package/coverage/html/favicon.png +0 -0
  182. package/coverage/html/index.html +0 -656
  183. package/coverage/html/prettify.css +0 -1
  184. package/coverage/html/prettify.js +0 -2
  185. package/coverage/html/sort-arrow-sprite.png +0 -0
  186. package/coverage/html/sorter.js +0 -196
package/dist/core.cjs CHANGED
@@ -607,8 +607,8 @@ const schema_purposeSchema = external_zod_namespaceObject.z.object({
607
607
  name: external_zod_namespaceObject.z.string(),
608
608
  description: external_zod_namespaceObject.z.string(),
609
609
  isEssential: external_zod_namespaceObject.z.boolean().default(false),
610
- dataCategory: external_zod_namespaceObject.z.string().optional(),
611
- legalBasis: external_zod_namespaceObject.z.string().optional(),
610
+ dataCategory: external_zod_namespaceObject.z.string().nullish(),
611
+ legalBasis: external_zod_namespaceObject.z.string().nullish(),
612
612
  isActive: external_zod_namespaceObject.z.boolean().default(true),
613
613
  createdAt: external_zod_namespaceObject.z.date().default(()=>new Date()),
614
614
  updatedAt: external_zod_namespaceObject.z.date().default(()=>new Date())
@@ -1212,10 +1212,19 @@ function consentRegistry({ adapter, ...ctx }) {
1212
1212
  }
1213
1213
  async function generatePolicyPlaceholder(name, date) {
1214
1214
  const content = `[PLACEHOLDER] This is an automatically generated version of the ${name} policy.\n\nThis placeholder content should be replaced with actual policy terms before being presented to users.\n\nGenerated on: ${date.toISOString()}`;
1215
- const encoder = new TextEncoder();
1216
- const data = encoder.encode(content);
1217
- const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1218
- const contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1215
+ let contentHash;
1216
+ try {
1217
+ const encoder = new TextEncoder();
1218
+ const data = encoder.encode(content);
1219
+ const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1220
+ contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1221
+ } catch (error) {
1222
+ throw new error_class_DoubleTieError('Failed to generate policy content hash', {
1223
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1224
+ status: 500,
1225
+ cause: error instanceof Error ? error : new Error(String(error))
1226
+ });
1227
+ }
1219
1228
  return {
1220
1229
  content,
1221
1230
  contentHash
@@ -1277,42 +1286,51 @@ function policyRegistry({ adapter, ...ctx }) {
1277
1286
  },
1278
1287
  findOrCreatePolicy: async (type)=>await adapter.transaction({
1279
1288
  callback: async (txAdapter)=>{
1280
- const now = new Date();
1281
- const txRegistry = policyRegistry({
1282
- adapter: txAdapter,
1283
- ...ctx
1284
- });
1285
- const rawLatestPolicy = await txAdapter.findOne({
1286
- model: 'consentPolicy',
1287
- where: [
1288
- {
1289
- field: 'isActive',
1290
- value: true
1291
- },
1292
- {
1293
- field: 'type',
1294
- value: type
1289
+ try {
1290
+ const now = new Date();
1291
+ const txRegistry = policyRegistry({
1292
+ adapter: txAdapter,
1293
+ ...ctx
1294
+ });
1295
+ const rawLatestPolicy = await txAdapter.findOne({
1296
+ model: 'consentPolicy',
1297
+ where: [
1298
+ {
1299
+ field: 'isActive',
1300
+ value: true
1301
+ },
1302
+ {
1303
+ field: 'type',
1304
+ value: type
1305
+ }
1306
+ ],
1307
+ sortBy: {
1308
+ field: 'effectiveDate',
1309
+ direction: 'desc'
1295
1310
  }
1296
- ],
1297
- sortBy: {
1298
- field: 'effectiveDate',
1299
- direction: 'desc'
1300
- }
1301
- });
1302
- const latestPolicy = rawLatestPolicy ? validateEntityOutput('consentPolicy', rawLatestPolicy, ctx.options) : null;
1303
- if (latestPolicy) return latestPolicy;
1304
- const { content: defaultContent, contentHash } = await generatePolicyPlaceholder(type, now);
1305
- return txRegistry.createConsentPolicy({
1306
- version: '1.0.0',
1307
- type,
1308
- name: type,
1309
- effectiveDate: now,
1310
- content: defaultContent,
1311
- contentHash,
1312
- isActive: true,
1313
- updatedAt: now,
1314
- expirationDate: null
1315
- });
1311
+ });
1312
+ const latestPolicy = rawLatestPolicy ? validateEntityOutput('consentPolicy', rawLatestPolicy, ctx.options) : null;
1313
+ if (latestPolicy) return latestPolicy;
1314
+ const { content: defaultContent, contentHash } = await generatePolicyPlaceholder(type, now);
1315
+ return txRegistry.createConsentPolicy({
1316
+ version: '1.0.0',
1317
+ type,
1318
+ name: type,
1319
+ effectiveDate: now,
1320
+ content: defaultContent,
1321
+ contentHash,
1322
+ isActive: true,
1323
+ updatedAt: now,
1324
+ expirationDate: null
1325
+ });
1326
+ } catch (error) {
1327
+ ctx.logger.error('Error in findOrCreatePolicy transaction:', error);
1328
+ throw new error_class_DoubleTieError('Failed to find or create policy', {
1329
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1330
+ status: 500,
1331
+ cause: error instanceof Error ? error : new Error(String(error))
1332
+ });
1333
+ }
1316
1334
  }
1317
1335
  })
1318
1336
  };
@@ -2215,7 +2233,9 @@ function getBaseURL(url, path) {
2215
2233
  const fromEnv = env.C15T_URL || env.NEXT_PUBLIC_C15T_URL || env.PUBLIC_C15T_URL || env.NUXT_PUBLIC_C15T_URL || env.NUXT_PUBLIC_AUTH_URL || ('/' !== env.BASE_URL ? env.BASE_URL : void 0);
2216
2234
  if (fromEnv) return withPath(fromEnv, path);
2217
2235
  }
2218
- var package_namespaceObject = JSON.parse('{"i8":"1.2.0-canary.9"}');
2236
+ var package_namespaceObject = {
2237
+ i8: "1.2.1"
2238
+ };
2219
2239
  const createRegistry = (ctx)=>({
2220
2240
  ...auditLogRegistry(ctx),
2221
2241
  ...consentRegistry(ctx),
@@ -2494,12 +2514,15 @@ const processCors = (request, context, trustedOrigins)=>{
2494
2514
  }
2495
2515
  return context;
2496
2516
  };
2497
- const createOpenAPIConfig = (options)=>({
2517
+ const createOpenAPIConfig = (options)=>{
2518
+ const basePath = options.basePath || '';
2519
+ return {
2498
2520
  enabled: true,
2499
- specPath: '/spec.json',
2500
- docsPath: '/docs',
2521
+ specPath: `${basePath}/spec.json`,
2522
+ docsPath: `${basePath}/docs`,
2501
2523
  ...options.openapi || {}
2502
- });
2524
+ };
2525
+ };
2503
2526
  const createDefaultOpenAPIOptions = (options)=>({
2504
2527
  info: {
2505
2528
  title: options.appName || 'c15t API',
@@ -2508,7 +2531,7 @@ const createDefaultOpenAPIOptions = (options)=>({
2508
2531
  },
2509
2532
  servers: [
2510
2533
  {
2511
- url: '/'
2534
+ url: options.basePath || '/'
2512
2535
  }
2513
2536
  ],
2514
2537
  security: [
@@ -3614,11 +3637,26 @@ const c15tInstance = (options)=>{
3614
3637
  processCors(request, orpcContext, options.trustedOrigins);
3615
3638
  processTelemetry(request, orpcContext);
3616
3639
  const handlerContext = orpcContext;
3640
+ orpcContext.logger.debug?.('Handling prefix', {
3641
+ prefix: options.basePath || '/'
3642
+ });
3617
3643
  const { matched, response } = await rpcHandler.handle(request, {
3618
- prefix: options.baseURL || '/',
3644
+ prefix: options.basePath || '/',
3619
3645
  context: handlerContext
3620
3646
  });
3621
- if (matched && response) return response;
3647
+ if (matched && response) {
3648
+ orpcContext.logger.debug('Handler matched', {
3649
+ request,
3650
+ matched,
3651
+ response
3652
+ });
3653
+ return response;
3654
+ }
3655
+ orpcContext.logger.debug('No handler matched', {
3656
+ request,
3657
+ matched,
3658
+ response
3659
+ });
3622
3660
  return new Response('Not Found', {
3623
3661
  status: 404
3624
3662
  });
@@ -3637,6 +3675,15 @@ const c15tInstance = (options)=>{
3637
3675
  const ctxResult = await contextPromise;
3638
3676
  if (!ctxResult.isOk()) throw ctxResult.error;
3639
3677
  const ctx = ctxResult.value;
3678
+ const basePath = options.basePath || options.baseURL || '/';
3679
+ (0, logger_namespaceObject.createLogger)(options.logger)?.debug?.('[c15t] Using basePath/baseURL', {
3680
+ basePath
3681
+ });
3682
+ (0, logger_namespaceObject.createLogger)(options.logger)?.debug?.('[c15t] Routing request', {
3683
+ method: request.method,
3684
+ url: request.url,
3685
+ prefix: basePath
3686
+ });
3640
3687
  return await handleApiRequest(request, ctx);
3641
3688
  } catch (error) {
3642
3689
  const logger = options.logger ? (0, logger_namespaceObject.createLogger)(options.logger) : console;
@@ -1 +1 @@
1
- {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAUpE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,YAAY,CAAC,WAAW,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE;IAC5E;;;;;;;;;;;;;;;OAeG;IACH,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEjD;;OAEG;IACH,OAAO,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAElC;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE/B;;OAEG;IACH,MAAM,EAAE,OAAO,MAAM,CAAC;IAEtB;;;;OAIG;IACH,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEvD;;;;OAIG;IACH,SAAS,EAAE,MAAM,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,WAAW,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,EAC3E,SAAS,WAAW,CAAC,WAAW,CAAC;;;mBAiQI,OAAO;oBAAP,OAAO;mBAAP,OAAO;qBAAP,OAAO;sBAAP,OAAO;uBAAP,OAAO;oBAAP,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBA7CZ,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;CAyG3D,CAAC;AAEF,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAUpE,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC;;GAEG;AACH,MAAM,MAAM,KAAK,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,WAAW,YAAY,CAAC,WAAW,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE;IAC5E;;;;;;;;;;;;;;;OAeG;IACH,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEjD;;OAEG;IACH,OAAO,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IAElC;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAE/B;;OAEG;IACH,MAAM,EAAE,OAAO,MAAM,CAAC;IAEtB;;;;OAIG;IACH,cAAc,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEvD;;;;OAIG;IACH,SAAS,EAAE,MAAM,MAAM,CAAC;CACxB;AAED;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,WAAW,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,EAC3E,SAAS,WAAW,CAAC,WAAW,CAAC;;;mBA6RI,OAAO;oBAAP,OAAO;mBAAP,OAAO;qBAAP,OAAO;sBAAP,OAAO;uBAAP,OAAO;oBAAP,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;uBA1DZ,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC;CAsH3D,CAAC;AAEF,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,CAAC;AACrD,YAAY,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
package/dist/core.js CHANGED
@@ -573,8 +573,8 @@ const schema_purposeSchema = __WEBPACK_EXTERNAL_MODULE_zod__.z.object({
573
573
  name: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
574
574
  description: __WEBPACK_EXTERNAL_MODULE_zod__.z.string(),
575
575
  isEssential: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(false),
576
- dataCategory: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
577
- legalBasis: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().optional(),
576
+ dataCategory: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
577
+ legalBasis: __WEBPACK_EXTERNAL_MODULE_zod__.z.string().nullish(),
578
578
  isActive: __WEBPACK_EXTERNAL_MODULE_zod__.z.boolean().default(true),
579
579
  createdAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().default(()=>new Date()),
580
580
  updatedAt: __WEBPACK_EXTERNAL_MODULE_zod__.z.date().default(()=>new Date())
@@ -1178,10 +1178,19 @@ function consentRegistry({ adapter, ...ctx }) {
1178
1178
  }
1179
1179
  async function generatePolicyPlaceholder(name, date) {
1180
1180
  const content = `[PLACEHOLDER] This is an automatically generated version of the ${name} policy.\n\nThis placeholder content should be replaced with actual policy terms before being presented to users.\n\nGenerated on: ${date.toISOString()}`;
1181
- const encoder = new TextEncoder();
1182
- const data = encoder.encode(content);
1183
- const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1184
- const contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1181
+ let contentHash;
1182
+ try {
1183
+ const encoder = new TextEncoder();
1184
+ const data = encoder.encode(content);
1185
+ const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1186
+ contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1187
+ } catch (error) {
1188
+ throw new error_class_DoubleTieError('Failed to generate policy content hash', {
1189
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1190
+ status: 500,
1191
+ cause: error instanceof Error ? error : new Error(String(error))
1192
+ });
1193
+ }
1185
1194
  return {
1186
1195
  content,
1187
1196
  contentHash
@@ -1243,42 +1252,51 @@ function policyRegistry({ adapter, ...ctx }) {
1243
1252
  },
1244
1253
  findOrCreatePolicy: async (type)=>await adapter.transaction({
1245
1254
  callback: async (txAdapter)=>{
1246
- const now = new Date();
1247
- const txRegistry = policyRegistry({
1248
- adapter: txAdapter,
1249
- ...ctx
1250
- });
1251
- const rawLatestPolicy = await txAdapter.findOne({
1252
- model: 'consentPolicy',
1253
- where: [
1254
- {
1255
- field: 'isActive',
1256
- value: true
1257
- },
1258
- {
1259
- field: 'type',
1260
- value: type
1255
+ try {
1256
+ const now = new Date();
1257
+ const txRegistry = policyRegistry({
1258
+ adapter: txAdapter,
1259
+ ...ctx
1260
+ });
1261
+ const rawLatestPolicy = await txAdapter.findOne({
1262
+ model: 'consentPolicy',
1263
+ where: [
1264
+ {
1265
+ field: 'isActive',
1266
+ value: true
1267
+ },
1268
+ {
1269
+ field: 'type',
1270
+ value: type
1271
+ }
1272
+ ],
1273
+ sortBy: {
1274
+ field: 'effectiveDate',
1275
+ direction: 'desc'
1261
1276
  }
1262
- ],
1263
- sortBy: {
1264
- field: 'effectiveDate',
1265
- direction: 'desc'
1266
- }
1267
- });
1268
- const latestPolicy = rawLatestPolicy ? validateEntityOutput('consentPolicy', rawLatestPolicy, ctx.options) : null;
1269
- if (latestPolicy) return latestPolicy;
1270
- const { content: defaultContent, contentHash } = await generatePolicyPlaceholder(type, now);
1271
- return txRegistry.createConsentPolicy({
1272
- version: '1.0.0',
1273
- type,
1274
- name: type,
1275
- effectiveDate: now,
1276
- content: defaultContent,
1277
- contentHash,
1278
- isActive: true,
1279
- updatedAt: now,
1280
- expirationDate: null
1281
- });
1277
+ });
1278
+ const latestPolicy = rawLatestPolicy ? validateEntityOutput('consentPolicy', rawLatestPolicy, ctx.options) : null;
1279
+ if (latestPolicy) return latestPolicy;
1280
+ const { content: defaultContent, contentHash } = await generatePolicyPlaceholder(type, now);
1281
+ return txRegistry.createConsentPolicy({
1282
+ version: '1.0.0',
1283
+ type,
1284
+ name: type,
1285
+ effectiveDate: now,
1286
+ content: defaultContent,
1287
+ contentHash,
1288
+ isActive: true,
1289
+ updatedAt: now,
1290
+ expirationDate: null
1291
+ });
1292
+ } catch (error) {
1293
+ ctx.logger.error('Error in findOrCreatePolicy transaction:', error);
1294
+ throw new error_class_DoubleTieError('Failed to find or create policy', {
1295
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1296
+ status: 500,
1297
+ cause: error instanceof Error ? error : new Error(String(error))
1298
+ });
1299
+ }
1282
1300
  }
1283
1301
  })
1284
1302
  };
@@ -2179,7 +2197,9 @@ function getBaseURL(url, path) {
2179
2197
  const fromEnv = env.C15T_URL || env.NEXT_PUBLIC_C15T_URL || env.PUBLIC_C15T_URL || env.NUXT_PUBLIC_C15T_URL || env.NUXT_PUBLIC_AUTH_URL || ('/' !== env.BASE_URL ? env.BASE_URL : void 0);
2180
2198
  if (fromEnv) return withPath(fromEnv, path);
2181
2199
  }
2182
- var package_namespaceObject = JSON.parse('{"i8":"1.2.0-canary.9"}');
2200
+ var package_namespaceObject = {
2201
+ i8: "1.2.1"
2202
+ };
2183
2203
  const createRegistry = (ctx)=>({
2184
2204
  ...auditLogRegistry(ctx),
2185
2205
  ...consentRegistry(ctx),
@@ -2458,12 +2478,15 @@ const processCors = (request, context, trustedOrigins)=>{
2458
2478
  }
2459
2479
  return context;
2460
2480
  };
2461
- const createOpenAPIConfig = (options)=>({
2481
+ const createOpenAPIConfig = (options)=>{
2482
+ const basePath = options.basePath || '';
2483
+ return {
2462
2484
  enabled: true,
2463
- specPath: '/spec.json',
2464
- docsPath: '/docs',
2485
+ specPath: `${basePath}/spec.json`,
2486
+ docsPath: `${basePath}/docs`,
2465
2487
  ...options.openapi || {}
2466
- });
2488
+ };
2489
+ };
2467
2490
  const createDefaultOpenAPIOptions = (options)=>({
2468
2491
  info: {
2469
2492
  title: options.appName || 'c15t API',
@@ -2472,7 +2495,7 @@ const createDefaultOpenAPIOptions = (options)=>({
2472
2495
  },
2473
2496
  servers: [
2474
2497
  {
2475
- url: '/'
2498
+ url: options.basePath || '/'
2476
2499
  }
2477
2500
  ],
2478
2501
  security: [
@@ -3575,11 +3598,26 @@ const c15tInstance = (options)=>{
3575
3598
  processCors(request, orpcContext, options.trustedOrigins);
3576
3599
  processTelemetry(request, orpcContext);
3577
3600
  const handlerContext = orpcContext;
3601
+ orpcContext.logger.debug?.('Handling prefix', {
3602
+ prefix: options.basePath || '/'
3603
+ });
3578
3604
  const { matched, response } = await rpcHandler.handle(request, {
3579
- prefix: options.baseURL || '/',
3605
+ prefix: options.basePath || '/',
3580
3606
  context: handlerContext
3581
3607
  });
3582
- if (matched && response) return response;
3608
+ if (matched && response) {
3609
+ orpcContext.logger.debug('Handler matched', {
3610
+ request,
3611
+ matched,
3612
+ response
3613
+ });
3614
+ return response;
3615
+ }
3616
+ orpcContext.logger.debug('No handler matched', {
3617
+ request,
3618
+ matched,
3619
+ response
3620
+ });
3583
3621
  return new Response('Not Found', {
3584
3622
  status: 404
3585
3623
  });
@@ -3598,6 +3636,15 @@ const c15tInstance = (options)=>{
3598
3636
  const ctxResult = await contextPromise;
3599
3637
  if (!ctxResult.isOk()) throw ctxResult.error;
3600
3638
  const ctx = ctxResult.value;
3639
+ const basePath = options.basePath || options.baseURL || '/';
3640
+ (0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options.logger)?.debug?.('[c15t] Using basePath/baseURL', {
3641
+ basePath
3642
+ });
3643
+ (0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options.logger)?.debug?.('[c15t] Routing request', {
3644
+ method: request.method,
3645
+ url: request.url,
3646
+ prefix: basePath
3647
+ });
3601
3648
  return await handleApiRequest(request, ctx);
3602
3649
  } catch (error) {
3603
3650
  const logger = options.logger ? (0, __WEBPACK_EXTERNAL_MODULE__doubletie_logger_91c58a8f__.createLogger)(options.logger) : console;
@@ -19,7 +19,7 @@ export declare const createDefaultOpenAPIOptions: (options: C15TOptions) => {
19
19
  description: string;
20
20
  };
21
21
  servers: {
22
- url: string;
22
+ url: {};
23
23
  }[];
24
24
  security: {
25
25
  bearerAuth: never[];
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/middleware/openapi/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,WAAW;;;;;;CAKtD,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,2BAA2B,GAAI,SAAS,WAAW;;;;;;;;;;;;CAQ9D,CAAC"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../src/middleware/openapi/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG3C;;GAEG;AACH,eAAO,MAAM,mBAAmB,GAAI,SAAS,WAAW;;;;;;CAQvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,2BAA2B,GAAI,SAAS,WAAW;;;;;;;;;;;;CAQ9D,CAAC"}
@@ -684,8 +684,8 @@ const purposeSchema = external_zod_namespaceObject.z.object({
684
684
  name: external_zod_namespaceObject.z.string(),
685
685
  description: external_zod_namespaceObject.z.string(),
686
686
  isEssential: external_zod_namespaceObject.z.boolean().default(false),
687
- dataCategory: external_zod_namespaceObject.z.string().optional(),
688
- legalBasis: external_zod_namespaceObject.z.string().optional(),
687
+ dataCategory: external_zod_namespaceObject.z.string().nullish(),
688
+ legalBasis: external_zod_namespaceObject.z.string().nullish(),
689
689
  isActive: external_zod_namespaceObject.z.boolean().default(true),
690
690
  createdAt: external_zod_namespaceObject.z.date().default(()=>new Date()),
691
691
  updatedAt: external_zod_namespaceObject.z.date().default(()=>new Date())
@@ -1289,10 +1289,19 @@ function consentRegistry({ adapter, ...ctx }) {
1289
1289
  }
1290
1290
  async function generatePolicyPlaceholder(name, date) {
1291
1291
  const content = `[PLACEHOLDER] This is an automatically generated version of the ${name} policy.\n\nThis placeholder content should be replaced with actual policy terms before being presented to users.\n\nGenerated on: ${date.toISOString()}`;
1292
- const encoder = new TextEncoder();
1293
- const data = encoder.encode(content);
1294
- const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1295
- const contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1292
+ let contentHash;
1293
+ try {
1294
+ const encoder = new TextEncoder();
1295
+ const data = encoder.encode(content);
1296
+ const hashBuffer = await crypto.subtle.digest('SHA-256', data);
1297
+ contentHash = Array.from(new Uint8Array(hashBuffer)).map((b)=>b.toString(16).padStart(2, '0')).join('');
1298
+ } catch (error) {
1299
+ throw new error_class_DoubleTieError('Failed to generate policy content hash', {
1300
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1301
+ status: 500,
1302
+ cause: error instanceof Error ? error : new Error(String(error))
1303
+ });
1304
+ }
1296
1305
  return {
1297
1306
  content,
1298
1307
  contentHash
@@ -1354,42 +1363,51 @@ function policyRegistry({ adapter, ...ctx }) {
1354
1363
  },
1355
1364
  findOrCreatePolicy: async (type)=>await adapter.transaction({
1356
1365
  callback: async (txAdapter)=>{
1357
- const now = new Date();
1358
- const txRegistry = policyRegistry({
1359
- adapter: txAdapter,
1360
- ...ctx
1361
- });
1362
- const rawLatestPolicy = await txAdapter.findOne({
1363
- model: 'consentPolicy',
1364
- where: [
1365
- {
1366
- field: 'isActive',
1367
- value: true
1368
- },
1369
- {
1370
- field: 'type',
1371
- value: type
1366
+ try {
1367
+ const now = new Date();
1368
+ const txRegistry = policyRegistry({
1369
+ adapter: txAdapter,
1370
+ ...ctx
1371
+ });
1372
+ const rawLatestPolicy = await txAdapter.findOne({
1373
+ model: 'consentPolicy',
1374
+ where: [
1375
+ {
1376
+ field: 'isActive',
1377
+ value: true
1378
+ },
1379
+ {
1380
+ field: 'type',
1381
+ value: type
1382
+ }
1383
+ ],
1384
+ sortBy: {
1385
+ field: 'effectiveDate',
1386
+ direction: 'desc'
1372
1387
  }
1373
- ],
1374
- sortBy: {
1375
- field: 'effectiveDate',
1376
- direction: 'desc'
1377
- }
1378
- });
1379
- const latestPolicy = rawLatestPolicy ? validateEntityOutput('consentPolicy', rawLatestPolicy, ctx.options) : null;
1380
- if (latestPolicy) return latestPolicy;
1381
- const { content: defaultContent, contentHash } = await generatePolicyPlaceholder(type, now);
1382
- return txRegistry.createConsentPolicy({
1383
- version: '1.0.0',
1384
- type,
1385
- name: type,
1386
- effectiveDate: now,
1387
- content: defaultContent,
1388
- contentHash,
1389
- isActive: true,
1390
- updatedAt: now,
1391
- expirationDate: null
1392
- });
1388
+ });
1389
+ const latestPolicy = rawLatestPolicy ? validateEntityOutput('consentPolicy', rawLatestPolicy, ctx.options) : null;
1390
+ if (latestPolicy) return latestPolicy;
1391
+ const { content: defaultContent, contentHash } = await generatePolicyPlaceholder(type, now);
1392
+ return txRegistry.createConsentPolicy({
1393
+ version: '1.0.0',
1394
+ type,
1395
+ name: type,
1396
+ effectiveDate: now,
1397
+ content: defaultContent,
1398
+ contentHash,
1399
+ isActive: true,
1400
+ updatedAt: now,
1401
+ expirationDate: null
1402
+ });
1403
+ } catch (error) {
1404
+ ctx.logger.error('Error in findOrCreatePolicy transaction:', error);
1405
+ throw new error_class_DoubleTieError('Failed to find or create policy', {
1406
+ code: error_codes_ERROR_CODES.INTERNAL_SERVER_ERROR,
1407
+ status: 500,
1408
+ cause: error instanceof Error ? error : new Error(String(error))
1409
+ });
1410
+ }
1393
1411
  }
1394
1412
  })
1395
1413
  };