@friggframework/core 2.0.0--canary.545.ccb5010.0 → 2.0.0--canary.549.b074651.0

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 (598) hide show
  1. package/CHANGELOG.md +67 -66
  2. package/CLAUDE.md +124 -148
  3. package/README.md +130 -165
  4. package/assertions/jest.config.ts +7 -0
  5. package/core/CLAUDE.md +156 -222
  6. package/database/MONGODB_TRANSACTION_FIX.md +52 -72
  7. package/database/encryption/README.md +36 -53
  8. package/database/jest.config.ts +7 -0
  9. package/database/models/WorkflowExecutionModel.ts +315 -0
  10. package/database/models/WorkflowModel.ts +129 -0
  11. package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +80 -135
  12. package/generated/prisma-mongodb/edge.js +5 -60
  13. package/generated/prisma-mongodb/index-browser.js +1 -49
  14. package/generated/prisma-mongodb/index.d.ts +57 -4019
  15. package/generated/prisma-mongodb/index.js +11 -66
  16. package/generated/prisma-mongodb/package.json +1 -1
  17. package/generated/prisma-mongodb/{libquery_engine-debian-openssl-3.0.x.so.node → query-engine-debian-openssl-3.0.x} +0 -0
  18. package/generated/prisma-mongodb/{libquery_engine-rhel-openssl-3.0.x.so.node → query-engine-rhel-openssl-3.0.x} +0 -0
  19. package/generated/prisma-mongodb/runtime/binary.d.ts +1 -0
  20. package/generated/prisma-mongodb/runtime/binary.js +289 -0
  21. package/generated/prisma-mongodb/schema.prisma +2 -89
  22. package/generated/prisma-mongodb/wasm.js +5 -60
  23. package/generated/prisma-postgresql/edge.js +5 -59
  24. package/generated/prisma-postgresql/index-browser.js +1 -48
  25. package/generated/prisma-postgresql/index.d.ts +44 -4732
  26. package/generated/prisma-postgresql/index.js +11 -65
  27. package/generated/prisma-postgresql/package.json +1 -1
  28. package/generated/prisma-postgresql/{libquery_engine-debian-openssl-3.0.x.so.node → query-engine-debian-openssl-3.0.x} +0 -0
  29. package/generated/prisma-postgresql/{libquery_engine-rhel-openssl-3.0.x.so.node → query-engine-rhel-openssl-3.0.x} +0 -0
  30. package/generated/prisma-postgresql/runtime/binary.d.ts +1 -0
  31. package/generated/prisma-postgresql/runtime/binary.js +289 -0
  32. package/generated/prisma-postgresql/schema.prisma +2 -87
  33. package/generated/prisma-postgresql/wasm.js +5 -59
  34. package/handlers/WEBHOOKS.md +81 -104
  35. package/handlers/routers/HEALTHCHECK.md +135 -170
  36. package/integrations/WEBHOOK-QUICKSTART.md +14 -21
  37. package/jest-global-setup-noop.ts +3 -0
  38. package/jest-global-teardown-noop.ts +3 -0
  39. package/jest-resolver.ts +36 -0
  40. package/jest-setup.ts +1 -0
  41. package/jest-teardown.ts +1 -0
  42. package/jest.config.ts +20 -0
  43. package/package.json +32 -8
  44. package/prisma-mongodb/schema.prisma +2 -89
  45. package/prisma-postgresql/schema.prisma +2 -87
  46. package/src/application/commands/command-utils.ts +17 -0
  47. package/src/application/commands/credential-commands.ts +214 -0
  48. package/src/application/commands/entity-commands.ts +253 -0
  49. package/src/application/commands/integration-commands.test.ts +158 -0
  50. package/src/application/commands/integration-commands.ts +205 -0
  51. package/{application/commands/scheduler-commands.js → src/application/commands/scheduler-commands.ts} +82 -104
  52. package/{application/commands/user-commands.js → src/application/commands/user-commands.ts} +73 -97
  53. package/src/application/index.ts +82 -0
  54. package/src/assertions/get.ts +196 -0
  55. package/src/assertions/index.ts +9 -0
  56. package/src/associations/association.ts +103 -0
  57. package/src/associations/index.ts +3 -0
  58. package/src/core/Delegate.ts +41 -0
  59. package/src/core/Worker.test.ts +158 -0
  60. package/src/core/Worker.ts +86 -0
  61. package/{core/create-handler.js → src/core/create-handler.ts} +42 -15
  62. package/src/core/index.ts +15 -0
  63. package/src/core/load-installed-modules.ts +31 -0
  64. package/{core/secrets-to-env.js → src/core/secrets-to-env.ts} +14 -14
  65. package/src/credential/index.ts +9 -0
  66. package/src/credential/repositories/credential-repository-documentdb.ts +185 -0
  67. package/src/credential/repositories/credential-repository-factory.ts +26 -0
  68. package/src/credential/repositories/credential-repository-interface.ts +62 -0
  69. package/src/credential/repositories/credential-repository-mongo.ts +163 -0
  70. package/src/credential/repositories/credential-repository-postgres.ts +169 -0
  71. package/src/credential/repositories/credential-repository.ts +162 -0
  72. package/src/credential/use-cases/get-credential-for-user.ts +27 -0
  73. package/src/credential/use-cases/update-authentication-status.ts +17 -0
  74. package/src/database/adapters/index.ts +1 -0
  75. package/src/database/adapters/lambda-invoker.test.ts +104 -0
  76. package/src/database/adapters/lambda-invoker.ts +61 -0
  77. package/src/database/config.ts +142 -0
  78. package/src/database/documentdb-encryption-service.ts +191 -0
  79. package/src/database/documentdb-utils.ts +160 -0
  80. package/src/database/encryption/encryption-schema-registry.test.ts +397 -0
  81. package/src/database/encryption/encryption-schema-registry.ts +243 -0
  82. package/src/database/encryption/field-encryption-service.test.ts +511 -0
  83. package/{database/encryption/field-encryption-service.js → src/database/encryption/field-encryption-service.ts} +46 -67
  84. package/src/database/encryption/index.ts +24 -0
  85. package/{database/encryption/logger.js → src/database/encryption/logger.ts} +19 -21
  86. package/src/database/encryption/mongo-decryption-fix-verification.test.ts +337 -0
  87. package/src/database/encryption/postgres-decryption-fix-verification.test.ts +335 -0
  88. package/src/database/encryption/postgres-relation-decryption.test.ts +205 -0
  89. package/src/database/encryption/prisma-encryption-extension.test.ts +433 -0
  90. package/{database/encryption/prisma-encryption-extension.js → src/database/encryption/prisma-encryption-extension.ts} +58 -77
  91. package/src/database/index.ts +126 -0
  92. package/src/database/prisma.test.ts +65 -0
  93. package/src/database/prisma.ts +166 -0
  94. package/{database/repositories/health-check-repository-documentdb.js → src/database/repositories/health-check-repository-documentdb.ts} +34 -45
  95. package/src/database/repositories/health-check-repository-factory.ts +38 -0
  96. package/src/database/repositories/health-check-repository-interface.ts +20 -0
  97. package/src/database/repositories/health-check-repository-mongodb.test.ts +178 -0
  98. package/src/database/repositories/health-check-repository-mongodb.ts +79 -0
  99. package/src/database/repositories/health-check-repository-postgres.test.ts +94 -0
  100. package/src/database/repositories/health-check-repository-postgres.ts +70 -0
  101. package/src/database/repositories/index.ts +10 -0
  102. package/src/database/repositories/migration-status-repository-s3.test.ts +150 -0
  103. package/src/database/repositories/migration-status-repository-s3.ts +127 -0
  104. package/src/database/use-cases/check-database-health-use-case.test.ts +131 -0
  105. package/src/database/use-cases/check-database-health-use-case.ts +30 -0
  106. package/src/database/use-cases/check-database-state-use-case.test.ts +131 -0
  107. package/src/database/use-cases/check-database-state-use-case.ts +66 -0
  108. package/src/database/use-cases/check-encryption-health-use-case.test.ts +183 -0
  109. package/{database/use-cases/check-encryption-health-use-case.js → src/database/use-cases/check-encryption-health-use-case.ts} +38 -15
  110. package/src/database/use-cases/get-database-state-via-worker-use-case.test.ts +126 -0
  111. package/src/database/use-cases/get-database-state-via-worker-use-case.ts +31 -0
  112. package/src/database/use-cases/get-migration-status-use-case.test.ts +160 -0
  113. package/src/database/use-cases/get-migration-status-use-case.ts +57 -0
  114. package/src/database/use-cases/index.ts +14 -0
  115. package/src/database/use-cases/run-database-migration-use-case.test.ts +350 -0
  116. package/src/database/use-cases/run-database-migration-use-case.ts +113 -0
  117. package/src/database/use-cases/test-encryption-use-case.ts +197 -0
  118. package/src/database/use-cases/trigger-database-migration-use-case.test.ts +256 -0
  119. package/src/database/use-cases/trigger-database-migration-use-case.ts +131 -0
  120. package/src/database/utils/index.ts +26 -0
  121. package/src/database/utils/mongodb-collection-utils.test.ts +133 -0
  122. package/src/database/utils/mongodb-collection-utils.ts +45 -0
  123. package/src/database/utils/mongodb-schema-init.test.ts +152 -0
  124. package/src/database/utils/mongodb-schema-init.ts +51 -0
  125. package/src/database/utils/prisma-runner.test.ts +513 -0
  126. package/src/database/utils/prisma-runner.ts +336 -0
  127. package/src/database/utils/prisma-schema-parser.test.ts +283 -0
  128. package/src/database/utils/prisma-schema-parser.ts +90 -0
  129. package/src/declarations.d.ts +141 -0
  130. package/src/encrypt/Cryptor.test.ts +137 -0
  131. package/src/encrypt/Cryptor.ts +92 -0
  132. package/{encrypt/aes.js → src/encrypt/aes.ts} +4 -9
  133. package/src/encrypt/index.ts +2 -0
  134. package/src/errors/base-error.test.ts +32 -0
  135. package/src/errors/base-error.ts +15 -0
  136. package/src/errors/client-safe-error.ts +12 -0
  137. package/src/errors/fetch-error.test.ts +105 -0
  138. package/{errors/fetch-error.js → src/errors/fetch-error.ts} +36 -17
  139. package/src/errors/halt-error.test.ts +11 -0
  140. package/src/errors/halt-error.ts +10 -0
  141. package/src/errors/index.ts +9 -0
  142. package/src/errors/validation-errors.test.ts +122 -0
  143. package/src/errors/validation-errors.ts +33 -0
  144. package/src/handlers/app-definition-loader.ts +52 -0
  145. package/src/handlers/app-handler-helpers.ts +62 -0
  146. package/src/handlers/auth-flow.integration.test.ts +149 -0
  147. package/{handlers/backend-utils.js → src/handlers/backend-utils.ts} +55 -52
  148. package/src/handlers/database-migration-handler.ts +172 -0
  149. package/src/handlers/index.ts +22 -0
  150. package/src/handlers/integration-event-dispatcher.test.ts +211 -0
  151. package/{handlers/integration-event-dispatcher.js → src/handlers/integration-event-dispatcher.ts} +33 -9
  152. package/src/handlers/routers/auth.ts +20 -0
  153. package/src/handlers/routers/db-migration.handler.ts +28 -0
  154. package/src/handlers/routers/db-migration.test.ts +69 -0
  155. package/src/handlers/routers/db-migration.ts +173 -0
  156. package/src/handlers/routers/health.test.ts +251 -0
  157. package/src/handlers/routers/health.ts +390 -0
  158. package/src/handlers/routers/index.ts +8 -0
  159. package/src/handlers/routers/integration-defined-routers.ts +50 -0
  160. package/src/handlers/routers/integration-webhook-routers.test.ts +116 -0
  161. package/src/handlers/routers/integration-webhook-routers.ts +72 -0
  162. package/src/handlers/routers/user.ts +63 -0
  163. package/{handlers/routers/websocket.js → src/handlers/routers/websocket.ts} +25 -28
  164. package/{handlers/use-cases/check-external-apis-health-use-case.js → src/handlers/use-cases/check-external-apis-health-use-case.ts} +31 -12
  165. package/src/handlers/use-cases/check-integrations-health-use-case.test.ts +124 -0
  166. package/src/handlers/use-cases/check-integrations-health-use-case.ts +69 -0
  167. package/src/handlers/use-cases/index.ts +9 -0
  168. package/src/handlers/webhook-flow.integration.test.ts +318 -0
  169. package/src/handlers/workers/db-migration.test.ts +168 -0
  170. package/src/handlers/workers/db-migration.ts +173 -0
  171. package/src/handlers/workers/index.ts +3 -0
  172. package/src/handlers/workers/integration-defined-workers.test.ts +254 -0
  173. package/src/handlers/workers/integration-defined-workers.ts +35 -0
  174. package/src/index.ts +400 -0
  175. package/src/infrastructure/index.ts +14 -0
  176. package/src/infrastructure/scheduler/eventbridge-scheduler-adapter.ts +148 -0
  177. package/src/infrastructure/scheduler/index.ts +19 -0
  178. package/{infrastructure/scheduler/mock-scheduler-adapter.js → src/infrastructure/scheduler/mock-scheduler-adapter.ts} +25 -59
  179. package/src/infrastructure/scheduler/scheduler-service-factory.ts +50 -0
  180. package/src/infrastructure/scheduler/scheduler-service-interface.ts +31 -0
  181. package/src/integrations/index.ts +79 -0
  182. package/src/integrations/integration-base.module-keys.test.ts +204 -0
  183. package/{integrations/integration-base.js → src/integrations/integration-base.ts} +161 -169
  184. package/src/integrations/integration-router.ts +645 -0
  185. package/src/integrations/options.ts +57 -0
  186. package/{integrations/repositories/integration-mapping-repository-documentdb.js → src/integrations/repositories/integration-mapping-repository-documentdb.ts} +54 -134
  187. package/src/integrations/repositories/integration-mapping-repository-factory.ts +27 -0
  188. package/src/integrations/repositories/integration-mapping-repository-interface.ts +56 -0
  189. package/src/integrations/repositories/integration-mapping-repository-mongo.ts +89 -0
  190. package/src/integrations/repositories/integration-mapping-repository-postgres.ts +129 -0
  191. package/src/integrations/repositories/integration-mapping-repository.ts +71 -0
  192. package/{integrations/repositories/integration-repository-documentdb.js → src/integrations/repositories/integration-repository-documentdb.ts} +51 -89
  193. package/src/integrations/repositories/integration-repository-factory.ts +27 -0
  194. package/src/integrations/repositories/integration-repository-interface.ts +52 -0
  195. package/src/integrations/repositories/integration-repository-mongo.ts +186 -0
  196. package/src/integrations/repositories/integration-repository-postgres.ts +227 -0
  197. package/{integrations/repositories/process-repository-documentdb.js → src/integrations/repositories/process-repository-documentdb.ts} +57 -124
  198. package/src/integrations/repositories/process-repository-factory.ts +27 -0
  199. package/src/integrations/repositories/process-repository-interface.ts +34 -0
  200. package/src/integrations/repositories/process-repository-mongo.ts +102 -0
  201. package/src/integrations/repositories/process-repository-postgres.ts +123 -0
  202. package/{integrations/tests/doubles/config-capturing-integration.js → src/integrations/tests/doubles/config-capturing-integration.ts} +21 -22
  203. package/src/integrations/tests/doubles/dummy-integration-class.ts +109 -0
  204. package/src/integrations/tests/doubles/test-integration-repository.ts +100 -0
  205. package/src/integrations/tests/integration-router-multi-auth.test.ts +531 -0
  206. package/src/integrations/tests/use-cases/create-integration.test.ts +131 -0
  207. package/src/integrations/tests/use-cases/delete-integration-for-user.test.ts +150 -0
  208. package/src/integrations/tests/use-cases/find-integration-context-by-external-entity-id.test.ts +92 -0
  209. package/src/integrations/tests/use-cases/get-integration-for-user.test.ts +150 -0
  210. package/src/integrations/tests/use-cases/get-integration-instance.test.ts +176 -0
  211. package/src/integrations/tests/use-cases/get-integrations-for-user.test.ts +176 -0
  212. package/src/integrations/tests/use-cases/get-possible-integrations.test.ts +188 -0
  213. package/src/integrations/tests/use-cases/update-integration-messages.test.ts +142 -0
  214. package/src/integrations/tests/use-cases/update-integration-status.test.ts +103 -0
  215. package/src/integrations/tests/use-cases/update-integration.test.ts +208 -0
  216. package/src/integrations/types.ts +195 -0
  217. package/src/integrations/use-cases/create-integration.ts +70 -0
  218. package/src/integrations/use-cases/create-process.test.ts +172 -0
  219. package/src/integrations/use-cases/create-process.ts +77 -0
  220. package/src/integrations/use-cases/delete-integration-for-user.ts +87 -0
  221. package/src/integrations/use-cases/find-integration-context-by-external-entity-id.ts +92 -0
  222. package/src/integrations/use-cases/get-integration-for-user.ts +74 -0
  223. package/src/integrations/use-cases/get-integration-instance-by-definition.ts +69 -0
  224. package/{integrations/use-cases/get-integration-instance.js → src/integrations/use-cases/get-integration-instance.ts} +20 -31
  225. package/src/integrations/use-cases/get-integrations-for-user.ts +75 -0
  226. package/src/integrations/use-cases/get-possible-integrations.ts +15 -0
  227. package/src/integrations/use-cases/get-process.test.ts +181 -0
  228. package/src/integrations/use-cases/get-process.ts +49 -0
  229. package/src/integrations/use-cases/index.ts +16 -0
  230. package/src/integrations/use-cases/load-integration-context-full.test.ts +316 -0
  231. package/src/integrations/use-cases/load-integration-context.test.ts +115 -0
  232. package/{integrations/use-cases/load-integration-context.js → src/integrations/use-cases/load-integration-context.ts} +34 -14
  233. package/src/integrations/use-cases/update-integration-messages.ts +26 -0
  234. package/src/integrations/use-cases/update-integration-status.ts +17 -0
  235. package/src/integrations/use-cases/update-integration.ts +76 -0
  236. package/src/integrations/use-cases/update-process-metrics.test.ts +278 -0
  237. package/src/integrations/use-cases/update-process-metrics.ts +128 -0
  238. package/src/integrations/use-cases/update-process-state.test.ts +249 -0
  239. package/src/integrations/use-cases/update-process-state.ts +73 -0
  240. package/src/integrations/utils/map-integration-dto.ts +55 -0
  241. package/src/lambda/TimeoutCatcher.test.ts +69 -0
  242. package/src/lambda/TimeoutCatcher.ts +57 -0
  243. package/src/lambda/index.ts +2 -0
  244. package/src/logs/index.ts +2 -0
  245. package/src/logs/logger.test.ts +76 -0
  246. package/{logs/logger.js → src/logs/logger.ts} +15 -10
  247. package/src/modules/ModuleConstants.ts +11 -0
  248. package/src/modules/index.ts +38 -0
  249. package/{modules/module-factory.js → src/modules/module-factory.ts} +16 -20
  250. package/src/modules/module-hydration.test.ts +203 -0
  251. package/src/modules/module.ts +283 -0
  252. package/src/modules/repositories/module-repository-documentdb.ts +303 -0
  253. package/src/modules/repositories/module-repository-factory.ts +29 -0
  254. package/src/modules/repositories/module-repository-interface.ts +73 -0
  255. package/src/modules/repositories/module-repository-mongo.ts +260 -0
  256. package/src/modules/repositories/module-repository-postgres.ts +293 -0
  257. package/src/modules/repositories/module-repository.ts +210 -0
  258. package/src/modules/requester/api-key.ts +58 -0
  259. package/src/modules/requester/basic.ts +49 -0
  260. package/src/modules/requester/oauth-2.test.ts +425 -0
  261. package/src/modules/requester/oauth-2.ts +298 -0
  262. package/src/modules/requester/requester.test.ts +28 -0
  263. package/src/modules/requester/requester.ts +212 -0
  264. package/{modules/test/mock-api/api.js → src/modules/test/mock-api/api.ts} +6 -8
  265. package/{modules/test/mock-api/definition.js → src/modules/test/mock-api/definition.ts} +15 -21
  266. package/src/modules/test/mock-api/mocks/hubspot.ts +41 -0
  267. package/src/modules/tests/doubles/test-module-factory.ts +11 -0
  268. package/{modules/tests/doubles/test-module-repository.js → src/modules/tests/doubles/test-module-repository.ts} +7 -7
  269. package/src/modules/tests/module-on-token-update.test.ts +125 -0
  270. package/src/modules/use-cases/get-entities-for-user.ts +36 -0
  271. package/src/modules/use-cases/get-entity-options-by-id.ts +64 -0
  272. package/src/modules/use-cases/get-entity-options-by-type.ts +25 -0
  273. package/src/modules/use-cases/get-module-instance-from-type.ts +23 -0
  274. package/src/modules/use-cases/get-module.ts +70 -0
  275. package/{modules/use-cases/process-authorization-callback.js → src/modules/use-cases/process-authorization-callback.ts} +50 -49
  276. package/src/modules/use-cases/refresh-entity-options.ts +65 -0
  277. package/src/modules/use-cases/test-module-auth.ts +64 -0
  278. package/src/modules/utils/map-module-dto.ts +23 -0
  279. package/src/queues/index.ts +1 -0
  280. package/src/queues/queuer-util.test.ts +131 -0
  281. package/src/queues/queuer-util.ts +59 -0
  282. package/src/syncs/index.ts +14 -0
  283. package/{syncs/manager.js → src/syncs/manager.ts} +140 -142
  284. package/{syncs/repositories/sync-repository-documentdb.js → src/syncs/repositories/sync-repository-documentdb.ts} +46 -67
  285. package/src/syncs/repositories/sync-repository-factory.ts +30 -0
  286. package/src/syncs/repositories/sync-repository-interface.ts +68 -0
  287. package/src/syncs/repositories/sync-repository-mongo.ts +149 -0
  288. package/src/syncs/repositories/sync-repository-postgres.ts +221 -0
  289. package/src/syncs/sync.ts +119 -0
  290. package/src/token/index.ts +7 -0
  291. package/src/token/repositories/token-repository-documentdb.ts +110 -0
  292. package/src/token/repositories/token-repository-factory.ts +26 -0
  293. package/src/token/repositories/token-repository-interface.ts +57 -0
  294. package/src/token/repositories/token-repository-mongo.ts +81 -0
  295. package/src/token/repositories/token-repository-postgres.ts +105 -0
  296. package/src/token/repositories/token-repository.ts +125 -0
  297. package/src/user/index.ts +17 -0
  298. package/src/user/repositories/user-repository-documentdb.ts +286 -0
  299. package/src/user/repositories/user-repository-factory.ts +26 -0
  300. package/src/user/repositories/user-repository-interface.ts +109 -0
  301. package/src/user/repositories/user-repository-mongo.ts +130 -0
  302. package/src/user/repositories/user-repository-postgres.ts +175 -0
  303. package/{user/tests/doubles/test-user-repository.js → src/user/tests/doubles/test-user-repository.ts} +16 -19
  304. package/src/user/tests/use-cases/create-individual-user.test.ts +24 -0
  305. package/src/user/tests/use-cases/create-organization-user.test.ts +28 -0
  306. package/src/user/tests/use-cases/create-token-for-user-id.test.ts +18 -0
  307. package/src/user/tests/use-cases/get-user-from-adopter-jwt.test.ts +113 -0
  308. package/src/user/tests/use-cases/get-user-from-bearer-token.test.ts +64 -0
  309. package/src/user/tests/use-cases/get-user-from-x-frigg-headers.test.ts +440 -0
  310. package/src/user/tests/use-cases/login-user.test.ts +220 -0
  311. package/src/user/use-cases/authenticate-user.ts +98 -0
  312. package/src/user/use-cases/authenticate-with-shared-secret.test.ts +127 -0
  313. package/src/user/use-cases/authenticate-with-shared-secret.ts +19 -0
  314. package/src/user/use-cases/create-individual-user.ts +59 -0
  315. package/src/user/use-cases/create-organization-user.ts +44 -0
  316. package/src/user/use-cases/create-token-for-user-id.ts +19 -0
  317. package/src/user/use-cases/get-user-from-adopter-jwt.ts +40 -0
  318. package/{user/use-cases/get-user-from-bearer-token.js → src/user/use-cases/get-user-from-bearer-token.ts} +23 -30
  319. package/src/user/use-cases/get-user-from-x-frigg-headers.ts +119 -0
  320. package/src/user/use-cases/login-user.ts +110 -0
  321. package/src/user/user.ts +125 -0
  322. package/{utils/backend-path.js → src/utils/backend-path.ts} +5 -8
  323. package/src/utils/index.ts +2 -0
  324. package/src/websocket/index.ts +7 -0
  325. package/src/websocket/repositories/websocket-connection-repository-documentdb.ts +93 -0
  326. package/src/websocket/repositories/websocket-connection-repository-factory.ts +26 -0
  327. package/src/websocket/repositories/websocket-connection-repository-interface.ts +47 -0
  328. package/src/websocket/repositories/websocket-connection-repository-mongo.ts +77 -0
  329. package/src/websocket/repositories/websocket-connection-repository-postgres.ts +94 -0
  330. package/src/websocket/repositories/websocket-connection-repository.test.ts +220 -0
  331. package/src/websocket/repositories/websocket-connection-repository.ts +101 -0
  332. package/tsconfig.json +17 -0
  333. package/tsconfig.test.json +10 -0
  334. package/workflows/frigg-workflow.ts +322 -0
  335. package/workflows/index.ts +205 -0
  336. package/workflows/steps/fan-out-step.ts +275 -0
  337. package/workflows/steps/function-step.ts +174 -0
  338. package/workflows/steps/index.ts +30 -0
  339. package/workflows/steps/workflow-step.ts +115 -0
  340. package/workflows/use-cases/create-workflow.ts +332 -0
  341. package/workflows/use-cases/execute-workflow-step.ts +465 -0
  342. package/workflows/use-cases/execute-workflow.ts +403 -0
  343. package/workflows/workflow-execution-repository.ts +415 -0
  344. package/workflows/workflow-execution.ts +209 -0
  345. package/workflows/workflow-queue-service.ts +379 -0
  346. package/workflows/workflow-repository.ts +295 -0
  347. package/workflows/workflow.ts +117 -0
  348. package/admin-scripts/index.js +0 -52
  349. package/admin-scripts/repositories/admin-api-key-repository-documentdb.js +0 -21
  350. package/admin-scripts/repositories/admin-api-key-repository-factory.js +0 -51
  351. package/admin-scripts/repositories/admin-api-key-repository-interface.js +0 -121
  352. package/admin-scripts/repositories/admin-api-key-repository-mongo.js +0 -155
  353. package/admin-scripts/repositories/admin-api-key-repository-postgres.js +0 -189
  354. package/admin-scripts/repositories/admin-process-repository-documentdb.js +0 -21
  355. package/admin-scripts/repositories/admin-process-repository-factory.js +0 -49
  356. package/admin-scripts/repositories/admin-process-repository-interface.js +0 -150
  357. package/admin-scripts/repositories/admin-process-repository-mongo.js +0 -213
  358. package/admin-scripts/repositories/admin-process-repository-postgres.js +0 -251
  359. package/admin-scripts/repositories/script-execution-repository-documentdb.js +0 -21
  360. package/admin-scripts/repositories/script-execution-repository-factory.js +0 -51
  361. package/admin-scripts/repositories/script-execution-repository-interface.js +0 -193
  362. package/admin-scripts/repositories/script-execution-repository-mongo.js +0 -278
  363. package/admin-scripts/repositories/script-execution-repository-postgres.js +0 -320
  364. package/admin-scripts/repositories/script-schedule-repository-documentdb.js +0 -21
  365. package/admin-scripts/repositories/script-schedule-repository-factory.js +0 -49
  366. package/admin-scripts/repositories/script-schedule-repository-interface.js +0 -108
  367. package/admin-scripts/repositories/script-schedule-repository-mongo.js +0 -179
  368. package/admin-scripts/repositories/script-schedule-repository-postgres.js +0 -210
  369. package/application/commands/admin-script-commands.js +0 -348
  370. package/application/commands/credential-commands.js +0 -245
  371. package/application/commands/entity-commands.js +0 -336
  372. package/application/commands/integration-commands.js +0 -216
  373. package/application/index.js +0 -75
  374. package/assertions/get.js +0 -149
  375. package/assertions/index.js +0 -16
  376. package/assertions/jest.config.js +0 -5
  377. package/associations/association.js +0 -80
  378. package/core/Delegate.js +0 -29
  379. package/core/Worker.js +0 -93
  380. package/core/index.js +0 -6
  381. package/core/load-installed-modules.js +0 -28
  382. package/credential/credential-router.js +0 -262
  383. package/credential/repositories/credential-repository-documentdb.js +0 -374
  384. package/credential/repositories/credential-repository-factory.js +0 -52
  385. package/credential/repositories/credential-repository-interface.js +0 -104
  386. package/credential/repositories/credential-repository-mongo.js +0 -310
  387. package/credential/repositories/credential-repository-postgres.js +0 -328
  388. package/credential/repositories/credential-repository.js +0 -302
  389. package/credential/use-cases/delete-credential-for-user.js +0 -50
  390. package/credential/use-cases/get-credential-for-user.js +0 -43
  391. package/credential/use-cases/list-credentials-for-user.js +0 -31
  392. package/credential/use-cases/reauthorize-credential.js +0 -103
  393. package/credential/use-cases/update-authentication-status.js +0 -18
  394. package/database/config.js +0 -108
  395. package/database/documentdb-encryption-service.js +0 -346
  396. package/database/documentdb-utils.js +0 -145
  397. package/database/encryption/encryption-schema-registry.js +0 -314
  398. package/database/index.js +0 -25
  399. package/database/jest.config.js +0 -5
  400. package/database/prisma.js +0 -193
  401. package/database/repositories/health-check-repository-factory.js +0 -50
  402. package/database/repositories/health-check-repository-interface.js +0 -92
  403. package/database/repositories/health-check-repository-mongodb.js +0 -89
  404. package/database/repositories/health-check-repository-postgres.js +0 -82
  405. package/database/use-cases/check-database-health-use-case.js +0 -30
  406. package/database/use-cases/check-database-state-use-case.js +0 -82
  407. package/database/use-cases/get-database-state-via-worker-use-case.js +0 -64
  408. package/database/use-cases/get-migration-status-use-case.js +0 -95
  409. package/database/use-cases/run-database-migration-use-case.js +0 -171
  410. package/database/use-cases/test-encryption-use-case.js +0 -252
  411. package/database/use-cases/trigger-database-migration-use-case.js +0 -158
  412. package/database/utils/mongodb-collection-utils.js +0 -102
  413. package/database/utils/mongodb-schema-init.js +0 -114
  414. package/database/utils/prisma-runner.js +0 -547
  415. package/database/utils/prisma-schema-parser.js +0 -182
  416. package/encrypt/Cryptor.js +0 -107
  417. package/encrypt/aes-encryption-key-provider.js +0 -82
  418. package/encrypt/encryption-key-provider-interface.js +0 -50
  419. package/encrypt/index.js +0 -3
  420. package/errors/base-error.js +0 -23
  421. package/errors/client-safe-error.js +0 -26
  422. package/errors/halt-error.js +0 -10
  423. package/errors/index.js +0 -17
  424. package/errors/validation-errors.js +0 -23
  425. package/extensions/bootstrap-runner.js +0 -43
  426. package/extensions/extension-loader.js +0 -167
  427. package/extensions/index.js +0 -37
  428. package/extensions/initialize-app.js +0 -123
  429. package/extensions/route-mounter.js +0 -59
  430. package/extensions/schema-composer.js +0 -188
  431. package/generated/prisma-mongodb/runtime/library.js +0 -146
  432. package/generated/prisma-postgresql/runtime/library.js +0 -146
  433. package/handlers/app-definition-loader.js +0 -81
  434. package/handlers/app-handler-helpers.js +0 -68
  435. package/handlers/database-migration-handler.js +0 -246
  436. package/handlers/middleware/admin-auth.js +0 -53
  437. package/handlers/routers/admin.js +0 -474
  438. package/handlers/routers/auth.js +0 -57
  439. package/handlers/routers/db-migration.handler.js +0 -28
  440. package/handlers/routers/db-migration.js +0 -362
  441. package/handlers/routers/docs.js +0 -180
  442. package/handlers/routers/health.js +0 -317
  443. package/handlers/routers/integration-defined-routers.js +0 -56
  444. package/handlers/routers/integration-webhook-routers.js +0 -88
  445. package/handlers/routers/middleware/loadUser.js +0 -39
  446. package/handlers/routers/middleware/requireAdmin.js +0 -43
  447. package/handlers/routers/middleware/requireLoggedInUser.js +0 -19
  448. package/handlers/routers/user.js +0 -79
  449. package/handlers/use-cases/check-integrations-health-use-case.js +0 -51
  450. package/handlers/workers/db-migration.js +0 -391
  451. package/handlers/workers/integration-defined-workers.js +0 -38
  452. package/index.js +0 -220
  453. package/infrastructure/scheduler/index.js +0 -37
  454. package/infrastructure/scheduler/netlify-scheduler-adapter.js +0 -185
  455. package/infrastructure/scheduler/scheduler-service-factory.js +0 -80
  456. package/infrastructure/scheduler/scheduler-service-interface.js +0 -47
  457. package/integrations/index.js +0 -25
  458. package/integrations/integration-router.js +0 -2354
  459. package/integrations/options.js +0 -80
  460. package/integrations/repositories/integration-mapping-repository-factory.js +0 -53
  461. package/integrations/repositories/integration-mapping-repository-interface.js +0 -106
  462. package/integrations/repositories/integration-mapping-repository-mongo.js +0 -161
  463. package/integrations/repositories/integration-mapping-repository-postgres.js +0 -227
  464. package/integrations/repositories/integration-mapping-repository.js +0 -156
  465. package/integrations/repositories/integration-repository-factory.js +0 -51
  466. package/integrations/repositories/integration-repository-interface.js +0 -145
  467. package/integrations/repositories/integration-repository-mongo.js +0 -303
  468. package/integrations/repositories/integration-repository-postgres.js +0 -352
  469. package/integrations/repositories/process-repository-factory.js +0 -50
  470. package/integrations/repositories/process-repository-interface.js +0 -94
  471. package/integrations/repositories/process-repository-mongo.js +0 -194
  472. package/integrations/repositories/process-repository-postgres.js +0 -217
  473. package/integrations/tests/doubles/dummy-integration-class.js +0 -178
  474. package/integrations/tests/doubles/test-integration-repository.js +0 -139
  475. package/integrations/use-cases/create-integration.js +0 -87
  476. package/integrations/use-cases/create-process.js +0 -139
  477. package/integrations/use-cases/delete-integration-for-user.js +0 -102
  478. package/integrations/use-cases/execute-proxy-request.js +0 -564
  479. package/integrations/use-cases/find-integration-context-by-external-entity-id.js +0 -72
  480. package/integrations/use-cases/get-integration-for-user.js +0 -93
  481. package/integrations/use-cases/get-integration-instance-by-definition.js +0 -73
  482. package/integrations/use-cases/get-integrations-for-user.js +0 -91
  483. package/integrations/use-cases/get-possible-integrations.js +0 -27
  484. package/integrations/use-cases/get-process.js +0 -86
  485. package/integrations/use-cases/index.js +0 -21
  486. package/integrations/use-cases/update-integration-messages.js +0 -44
  487. package/integrations/use-cases/update-integration-status.js +0 -32
  488. package/integrations/use-cases/update-integration.js +0 -92
  489. package/integrations/use-cases/update-process-metrics.js +0 -201
  490. package/integrations/use-cases/update-process-state.js +0 -121
  491. package/integrations/utils/map-integration-dto.js +0 -43
  492. package/jest-global-setup-noop.js +0 -3
  493. package/jest-global-teardown-noop.js +0 -3
  494. package/jest-setup.js +0 -2
  495. package/jest-teardown.js +0 -2
  496. package/jest.config.js +0 -21
  497. package/lambda/TimeoutCatcher.js +0 -45
  498. package/lambda/index.js +0 -3
  499. package/logs/index.js +0 -7
  500. package/modules/ModuleConstants.js +0 -10
  501. package/modules/domain/entities/AuthorizationSession.js +0 -131
  502. package/modules/domain/entities/index.js +0 -10
  503. package/modules/index.js +0 -15
  504. package/modules/module.js +0 -261
  505. package/modules/repositories/authorization-session-repository-factory.js +0 -53
  506. package/modules/repositories/authorization-session-repository-interface.js +0 -75
  507. package/modules/repositories/authorization-session-repository-mongo.js +0 -169
  508. package/modules/repositories/authorization-session-repository-postgres.js +0 -170
  509. package/modules/repositories/module-repository-documentdb.js +0 -383
  510. package/modules/repositories/module-repository-factory.js +0 -38
  511. package/modules/repositories/module-repository-interface.js +0 -142
  512. package/modules/repositories/module-repository-mongo.js +0 -443
  513. package/modules/repositories/module-repository-postgres.js +0 -490
  514. package/modules/repositories/module-repository.js +0 -373
  515. package/modules/requester/api-key.js +0 -50
  516. package/modules/requester/basic.js +0 -42
  517. package/modules/requester/oauth-2.js +0 -385
  518. package/modules/requester/requester.js +0 -167
  519. package/modules/test/mock-api/mocks/hubspot.js +0 -43
  520. package/modules/tests/doubles/test-module-factory.js +0 -22
  521. package/modules/use-cases/delete-module-entity.js +0 -23
  522. package/modules/use-cases/get-authorization-requirements.js +0 -110
  523. package/modules/use-cases/get-entities-for-user.js +0 -32
  524. package/modules/use-cases/get-entity-options-by-id.js +0 -73
  525. package/modules/use-cases/get-entity-options-by-type.js +0 -34
  526. package/modules/use-cases/get-module-entity-by-id.js +0 -16
  527. package/modules/use-cases/get-module-instance-from-type.js +0 -31
  528. package/modules/use-cases/get-module.js +0 -77
  529. package/modules/use-cases/process-authorization-step.js +0 -160
  530. package/modules/use-cases/refresh-entity-options.js +0 -74
  531. package/modules/use-cases/start-authorization-session.js +0 -86
  532. package/modules/use-cases/test-module-auth.js +0 -74
  533. package/modules/use-cases/update-module-entity.js +0 -27
  534. package/modules/utils/map-module-dto.js +0 -18
  535. package/openapi/openapi-spec-generator.js +0 -370
  536. package/openapi/openapi-v1.yaml +0 -1360
  537. package/openapi/openapi-v2.yaml +0 -1535
  538. package/prisma-postgresql/migrations/20260222000000_add_admin_process_and_script_schedule/migration.sql +0 -55
  539. package/providers/index.js +0 -13
  540. package/providers/resolve-provider.js +0 -93
  541. package/queues/index.js +0 -23
  542. package/queues/providers/index.js +0 -7
  543. package/queues/providers/netlify-background-provider.js +0 -76
  544. package/queues/providers/qstash-queue-provider.js +0 -122
  545. package/queues/queue-client-interface.js +0 -55
  546. package/queues/queue-provider-factory.js +0 -93
  547. package/queues/queue-provider.js +0 -46
  548. package/queues/queuer-util.js +0 -74
  549. package/syncs/repositories/sync-repository-factory.js +0 -43
  550. package/syncs/repositories/sync-repository-interface.js +0 -113
  551. package/syncs/repositories/sync-repository-mongo.js +0 -239
  552. package/syncs/repositories/sync-repository-postgres.js +0 -325
  553. package/syncs/sync.js +0 -117
  554. package/token/repositories/token-repository-documentdb.js +0 -137
  555. package/token/repositories/token-repository-factory.js +0 -38
  556. package/token/repositories/token-repository-interface.js +0 -131
  557. package/token/repositories/token-repository-mongo.js +0 -219
  558. package/token/repositories/token-repository-postgres.js +0 -264
  559. package/token/repositories/token-repository.js +0 -219
  560. package/types/assertions/index.d.ts +0 -83
  561. package/types/associations/index.d.ts +0 -57
  562. package/types/core/index.d.ts +0 -99
  563. package/types/database/index.d.ts +0 -11
  564. package/types/encrypt/index.d.ts +0 -7
  565. package/types/errors/index.d.ts +0 -73
  566. package/types/eslint-config/index.d.ts +0 -41
  567. package/types/index.d.ts +0 -14
  568. package/types/integrations/index.d.ts +0 -186
  569. package/types/lambda/index.d.ts +0 -31
  570. package/types/logs/index.d.ts +0 -5
  571. package/types/module-plugin/index.d.ts +0 -241
  572. package/types/prettier-config/index.d.ts +0 -6
  573. package/types/syncs/index.d.ts +0 -111
  574. package/types/test-environment/index.d.ts +0 -17
  575. package/types/tsconfig.json +0 -105
  576. package/user/repositories/user-repository-documentdb.js +0 -441
  577. package/user/repositories/user-repository-factory.js +0 -52
  578. package/user/repositories/user-repository-interface.js +0 -201
  579. package/user/repositories/user-repository-mongo.js +0 -308
  580. package/user/repositories/user-repository-postgres.js +0 -360
  581. package/user/use-cases/authenticate-user.js +0 -125
  582. package/user/use-cases/authenticate-with-shared-secret.js +0 -48
  583. package/user/use-cases/create-individual-user.js +0 -62
  584. package/user/use-cases/create-organization-user.js +0 -47
  585. package/user/use-cases/create-token-for-user-id.js +0 -30
  586. package/user/use-cases/delete-user.js +0 -47
  587. package/user/use-cases/get-user-from-adopter-jwt.js +0 -147
  588. package/user/use-cases/get-user-from-x-frigg-headers.js +0 -135
  589. package/user/use-cases/login-user.js +0 -122
  590. package/user/user.js +0 -139
  591. package/utils/index.js +0 -9
  592. package/websocket/repositories/websocket-connection-repository-documentdb.js +0 -144
  593. package/websocket/repositories/websocket-connection-repository-factory.js +0 -40
  594. package/websocket/repositories/websocket-connection-repository-interface.js +0 -106
  595. package/websocket/repositories/websocket-connection-repository-mongo.js +0 -166
  596. package/websocket/repositories/websocket-connection-repository-postgres.js +0 -207
  597. package/websocket/repositories/websocket-connection-repository.js +0 -167
  598. package/websocket/websocket-message-sender-interface.js +0 -38
@@ -3,16 +3,37 @@
3
3
  * Intercepts Prisma queries to encrypt on write and decrypt on read.
4
4
  */
5
5
 
6
- const { getEncryptedFields } = require('./encryption-schema-registry');
7
- const { FieldEncryptionService } = require('./field-encryption-service');
6
+ import { getEncryptedFields } from './encryption-schema-registry';
7
+ import { FieldEncryptionService } from './field-encryption-service';
8
+ import { Cryptor } from '../../encrypt';
8
9
 
9
- function createEncryptionExtension({ cryptor, enabled = true }) {
10
+ interface CreateEncryptionExtensionOptions {
11
+ cryptor: Cryptor;
12
+ enabled?: boolean;
13
+ }
14
+
15
+ interface QueryArgs {
16
+ model: string;
17
+ args: Record<string, unknown>;
18
+ query: (args: Record<string, unknown>) => Promise<unknown>;
19
+ }
20
+
21
+ type PrismaExtension = {
22
+ name: string;
23
+ query: {
24
+ $allModels: Record<string, (params: QueryArgs) => Promise<unknown>>;
25
+ };
26
+ } | ((client: unknown) => unknown);
27
+
28
+ export function createEncryptionExtension({ cryptor, enabled = true }: CreateEncryptionExtensionOptions): PrismaExtension {
10
29
  if (!enabled) {
11
- return (client) => client;
30
+ return (client: unknown) => client;
12
31
  }
13
32
 
14
33
  if (!cryptor) {
15
- throw new Error('Cryptor instance required for encryption extension');
34
+ throw new Error(
35
+ 'Cryptor instance required for encryption extension'
36
+ );
16
37
  }
17
38
 
18
39
  const encryptionService = new FieldEncryptionService({
@@ -24,196 +45,156 @@ function createEncryptionExtension({ cryptor, enabled = true }) {
24
45
  name: 'frigg-field-encryption',
25
46
  query: {
26
47
  $allModels: {
27
- async create({ model, args, query }) {
48
+ async create({ model, args, query }: QueryArgs) {
28
49
  if (args.data) {
29
50
  args.data = await encryptionService.encryptFields(
30
51
  model,
31
- args.data
52
+ args.data as Record<string, unknown>
32
53
  );
33
54
  }
34
-
35
55
  const result = await query(args);
36
-
37
56
  if (result) {
38
57
  return await encryptionService.decryptFields(
39
58
  model,
40
- result
59
+ result as Record<string, unknown>
41
60
  );
42
61
  }
43
-
44
62
  return result;
45
63
  },
46
64
 
47
- async createMany({ model, args, query }) {
65
+ async createMany({ model, args, query }: QueryArgs) {
48
66
  if (args.data && Array.isArray(args.data)) {
49
67
  args.data = await encryptionService.encryptFieldsInBulk(
50
68
  model,
51
- args.data
69
+ args.data as Record<string, unknown>[]
52
70
  );
53
71
  } else if (args.data) {
54
72
  args.data = await encryptionService.encryptFields(
55
73
  model,
56
- args.data
74
+ args.data as Record<string, unknown>
57
75
  );
58
76
  }
59
-
60
77
  return await query(args);
61
78
  },
62
79
 
63
- async update({ model, args, query }) {
80
+ async update({ model, args, query }: QueryArgs) {
64
81
  if (args.data) {
65
82
  args.data = await encryptionService.encryptFields(
66
83
  model,
67
- args.data
84
+ args.data as Record<string, unknown>
68
85
  );
69
86
  }
70
-
71
87
  const result = await query(args);
72
-
73
88
  if (result) {
74
89
  return await encryptionService.decryptFields(
75
90
  model,
76
- result
91
+ result as Record<string, unknown>
77
92
  );
78
93
  }
79
-
80
94
  return result;
81
95
  },
82
96
 
83
- async updateMany({ model, args, query }) {
97
+ async updateMany({ model, args, query }: QueryArgs) {
84
98
  if (args.data) {
85
99
  args.data = await encryptionService.encryptFields(
86
100
  model,
87
- args.data
101
+ args.data as Record<string, unknown>
88
102
  );
89
103
  }
90
-
91
104
  return await query(args);
92
105
  },
93
106
 
94
- async upsert({ model, args, query }) {
107
+ async upsert({ model, args, query }: QueryArgs) {
95
108
  if (args.create) {
96
109
  args.create = await encryptionService.encryptFields(
97
110
  model,
98
- args.create
111
+ args.create as Record<string, unknown>
99
112
  );
100
113
  }
101
-
102
114
  if (args.update) {
103
115
  args.update = await encryptionService.encryptFields(
104
116
  model,
105
- args.update
117
+ args.update as Record<string, unknown>
106
118
  );
107
119
  }
108
-
109
120
  const result = await query(args);
110
-
111
121
  if (result) {
112
122
  return await encryptionService.decryptFields(
113
123
  model,
114
- result
124
+ result as Record<string, unknown>
115
125
  );
116
126
  }
117
-
118
127
  return result;
119
128
  },
120
129
 
121
- async findUnique({ model, args, query }) {
130
+ async findUnique({ model, args, query }: QueryArgs) {
122
131
  const result = await query(args);
123
-
124
132
  if (result) {
125
- return await encryptionService.decryptFields(
126
- model,
127
- result
128
- );
133
+ return await encryptionService.decryptFields(model, result as Record<string, unknown>);
129
134
  }
130
-
131
135
  return result;
132
136
  },
133
137
 
134
- async findFirst({ model, args, query }) {
138
+ async findFirst({ model, args, query }: QueryArgs) {
135
139
  const result = await query(args);
136
-
137
140
  if (result) {
138
- return await encryptionService.decryptFields(
139
- model,
140
- result
141
- );
141
+ return await encryptionService.decryptFields(model, result as Record<string, unknown>);
142
142
  }
143
-
144
143
  return result;
145
144
  },
146
145
 
147
- async findMany({ model, args, query }) {
148
- const results = await query(args);
149
146
 
147
+ async findMany({ model, args, query }: QueryArgs) {
148
+ const results = await query(args);
150
149
  if (results && Array.isArray(results)) {
151
150
  return await encryptionService.decryptFieldsInBulk(
152
151
  model,
153
- results
152
+ results as Record<string, unknown>[]
154
153
  );
155
154
  }
156
-
157
155
  return results;
158
156
  },
159
157
 
160
- async delete({ model, args, query }) {
158
+ async delete({ model, args, query }: QueryArgs) {
161
159
  const result = await query(args);
162
-
163
160
  if (result) {
164
- return await encryptionService.decryptFields(
165
- model,
166
- result
167
- );
161
+ return await encryptionService.decryptFields(model, result as Record<string, unknown>);
168
162
  }
169
-
170
163
  return result;
171
164
  },
172
165
 
173
- async deleteMany({ model, args, query }) {
166
+ async deleteMany({ model: _model, args, query }: QueryArgs) {
174
167
  return await query(args);
175
168
  },
176
169
 
177
- async count({ model, args, query }) {
170
+ async count({ model: _model, args, query }: QueryArgs) {
178
171
  return await query(args);
179
172
  },
180
173
 
181
- async aggregate({ model, args, query }) {
174
+ async aggregate({ model: _model, args, query }: QueryArgs) {
182
175
  return await query(args);
183
176
  },
184
177
 
185
- async groupBy({ model, args, query }) {
178
+ async groupBy({ model: _model, args, query }: QueryArgs) {
186
179
  return await query(args);
187
180
  },
188
181
 
189
- async findFirstOrThrow({ model, args, query }) {
182
+ async findFirstOrThrow({ model, args, query }: QueryArgs) {
190
183
  const result = await query(args);
191
-
192
184
  if (result) {
193
- return await encryptionService.decryptFields(
194
- model,
195
- result
196
- );
185
+ return await encryptionService.decryptFields(model, result as Record<string, unknown>);
197
186
  }
198
-
199
187
  return result;
200
188
  },
201
189
 
202
- async findUniqueOrThrow({ model, args, query }) {
190
+ async findUniqueOrThrow({ model, args, query }: QueryArgs) {
203
191
  const result = await query(args);
204
-
205
192
  if (result) {
206
- return await encryptionService.decryptFields(
207
- model,
208
- result
209
- );
193
+ return await encryptionService.decryptFields(model, result as Record<string, unknown>);
210
194
  }
211
-
212
195
  return result;
213
196
  },
214
197
  },
215
198
  },
216
199
  };
217
200
  }
218
-
219
- module.exports = { createEncryptionExtension };
@@ -0,0 +1,126 @@
1
+ // Database configuration
2
+ export { default as config } from './config';
3
+ export { getDatabaseType, getDbType } from './config';
4
+ export type { DatabaseType } from './config';
5
+
6
+ // Prisma client
7
+ export {
8
+ prisma,
9
+ connectPrisma,
10
+ disconnectPrisma,
11
+ getEncryptionConfig,
12
+ ensureMongoDbUrl,
13
+ } from './prisma';
14
+ export type { PrismaClientLike, EncryptionConfig } from './prisma';
15
+
16
+ // Encryption
17
+ export {
18
+ logger,
19
+ EncryptionLogger,
20
+ CORE_ENCRYPTION_SCHEMA,
21
+ getEncryptedFields,
22
+ hasEncryptedFields,
23
+ getEncryptedModels,
24
+ registerCustomSchema,
25
+ loadCustomEncryptionSchema,
26
+ loadModuleEncryptionSchemas,
27
+ extractCredentialFieldsFromModules,
28
+ validateCustomSchema,
29
+ resetCustomSchema,
30
+ FieldEncryptionService,
31
+ createEncryptionExtension,
32
+ } from './encryption';
33
+ export type {
34
+ EncryptionModelConfig,
35
+ EncryptionSchema,
36
+ ValidationResult,
37
+ ModuleDefinition,
38
+ IntegrationClass,
39
+ EncryptionSchemaProvider,
40
+ } from './encryption';
41
+
42
+ // Repositories
43
+ export {
44
+ HealthCheckRepositoryInterface,
45
+ HealthCheckRepositoryMongoDB,
46
+ HealthCheckRepositoryPostgreSQL,
47
+ HealthCheckRepositoryDocumentDB,
48
+ createHealthCheckRepository,
49
+ } from './repositories';
50
+ export type {
51
+ MigrationStatusRepositoryS3,
52
+ DatabaseConnectionState,
53
+ CredentialData,
54
+ MigrationStatus,
55
+ CreateMigrationStatusData,
56
+ UpdateMigrationStatusData,
57
+ } from './repositories';
58
+
59
+ // Use Cases
60
+ export {
61
+ CheckDatabaseHealthUseCase,
62
+ CheckDatabaseStateUseCase,
63
+ CheckEncryptionHealthUseCase,
64
+ TestEncryptionUseCase,
65
+ GetDatabaseStateViaWorkerUseCase,
66
+ GetMigrationStatusUseCase,
67
+ RunDatabaseMigrationUseCase,
68
+ TriggerDatabaseMigrationUseCase,
69
+ MigrationError,
70
+ NotFoundError,
71
+ CheckDatabaseStateValidationError,
72
+ GetMigrationStatusValidationError,
73
+ RunMigrationValidationError,
74
+ TriggerMigrationValidationError,
75
+ } from './use-cases';
76
+ export type {
77
+ DatabaseHealthResult,
78
+ PrismaRunner,
79
+ DatabaseStateResult,
80
+ EncryptionHealthResult,
81
+ EncryptionTestResult,
82
+ MigrationResult,
83
+ TriggerMigrationResult,
84
+ } from './use-cases';
85
+
86
+ // Adapters
87
+ export { LambdaInvoker, LambdaInvocationError } from './adapters';
88
+
89
+ // Utils
90
+ export {
91
+ ensureCollectionExists,
92
+ ensureCollectionsExist,
93
+ collectionExists,
94
+ initializeMongoDBSchema,
95
+ getPrismaCollections,
96
+ getPrismaSchemaPath,
97
+ runPrismaGenerate,
98
+ checkDatabaseState,
99
+ runPrismaMigrate,
100
+ runPrismaMigrateResolve,
101
+ runPrismaDbPush,
102
+ getMigrationCommand,
103
+ parseCollectionsFromSchema,
104
+ parseCollectionsFromSchemaSync,
105
+ extractCollectionNames,
106
+ findMongoDBSchemaFile,
107
+ getCollectionsFromSchema,
108
+ getCollectionsFromSchemaSync,
109
+ } from './utils';
110
+
111
+ // DocumentDB-specific
112
+ export { DocumentDBEncryptionService } from './documentdb-encryption-service';
113
+ export {
114
+ toObjectId,
115
+ toObjectIdArray,
116
+ fromObjectId,
117
+ findOne,
118
+ findMany,
119
+ insertOne,
120
+ updateOne,
121
+ deleteOne,
122
+ deleteMany,
123
+ aggregate,
124
+ } from './documentdb-utils';
125
+ export type { FindManyOptions } from './documentdb-utils';
126
+
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Tests for Prisma MongoDB adapter initialization
3
+ * Validates DATABASE_URL configuration with MONGO_URI fallback
4
+ */
5
+
6
+ import { ensureMongoDbUrl } from './prisma';
7
+
8
+ describe('Prisma MongoDB Adapter', () => {
9
+ let originalEnv: NodeJS.ProcessEnv;
10
+
11
+ beforeEach(() => {
12
+ originalEnv = { ...process.env };
13
+ });
14
+
15
+ afterEach(() => {
16
+ process.env = originalEnv;
17
+ });
18
+
19
+ describe('ensureMongoDbUrl() - MongoDB DATABASE_URL setup', () => {
20
+ it('should use DATABASE_URL when already set', () => {
21
+ process.env.DATABASE_URL = 'mongodb://localhost:27017/primary';
22
+ process.env.MONGO_URI = 'mongodb://localhost:27017/fallback';
23
+
24
+ ensureMongoDbUrl();
25
+
26
+ expect(process.env.DATABASE_URL).toBe('mongodb://localhost:27017/primary');
27
+ });
28
+
29
+ it('should set DATABASE_URL from MONGO_URI when DATABASE_URL is not set', () => {
30
+ delete process.env.DATABASE_URL;
31
+ process.env.MONGO_URI = 'mongodb://localhost:27017/from-mongo-uri';
32
+
33
+ ensureMongoDbUrl();
34
+
35
+ expect(process.env.DATABASE_URL).toBe('mongodb://localhost:27017/from-mongo-uri');
36
+ });
37
+
38
+ it('should throw error when neither DATABASE_URL nor MONGO_URI is set', () => {
39
+ delete process.env.DATABASE_URL;
40
+ delete process.env.MONGO_URI;
41
+
42
+ expect(() => ensureMongoDbUrl()).toThrow(
43
+ 'DATABASE_URL or MONGO_URI environment variable must be set for MongoDB'
44
+ );
45
+ });
46
+
47
+ it('should throw error when MONGO_URI is empty string', () => {
48
+ delete process.env.DATABASE_URL;
49
+ process.env.MONGO_URI = '';
50
+
51
+ expect(() => ensureMongoDbUrl()).toThrow(
52
+ 'DATABASE_URL or MONGO_URI environment variable must be set for MongoDB'
53
+ );
54
+ });
55
+
56
+ it('should throw error when MONGO_URI is whitespace', () => {
57
+ delete process.env.DATABASE_URL;
58
+ process.env.MONGO_URI = ' ';
59
+
60
+ expect(() => ensureMongoDbUrl()).toThrow(
61
+ 'DATABASE_URL or MONGO_URI environment variable must be set for MongoDB'
62
+ );
63
+ });
64
+ });
65
+ });
@@ -0,0 +1,166 @@
1
+ import { createEncryptionExtension } from './encryption/prisma-encryption-extension';
2
+ import { loadCustomEncryptionSchema } from './encryption/encryption-schema-registry';
3
+ import { logger } from './encryption/logger';
4
+ import { Cryptor } from '../encrypt';
5
+ import config from './config';
6
+
7
+ export interface EncryptionConfig {
8
+ enabled: boolean;
9
+ method?: 'kms' | 'aes';
10
+ }
11
+
12
+ export function ensureMongoDbUrl(): void {
13
+ if (process.env.DATABASE_URL?.trim()) {
14
+ return;
15
+ }
16
+
17
+ if (process.env.MONGO_URI?.trim()) {
18
+ process.env.DATABASE_URL = process.env.MONGO_URI;
19
+ logger.debug('Using MONGO_URI as DATABASE_URL for Mongo-compatible connection');
20
+ return;
21
+ }
22
+
23
+ throw new Error(
24
+ 'DATABASE_URL or MONGO_URI environment variable must be set for MongoDB/DocumentDB'
25
+ );
26
+ }
27
+
28
+ export function getEncryptionConfig(): EncryptionConfig {
29
+ const STAGE = process.env.STAGE || process.env.NODE_ENV || 'development';
30
+ const shouldBypassEncryption = ['dev', 'test', 'local'].includes(STAGE);
31
+
32
+ if (shouldBypassEncryption) {
33
+ return { enabled: false };
34
+ }
35
+
36
+ const hasKMS = !!process.env.KMS_KEY_ARN?.trim();
37
+ const hasAES = !!process.env.AES_KEY_ID?.trim();
38
+
39
+ if (!hasKMS && !hasAES) {
40
+ logger.warn(
41
+ 'No encryption keys configured (KMS_KEY_ARN or AES_KEY_ID). ' +
42
+ 'Field-level encryption disabled. Set STAGE=production and configure keys to enable.'
43
+ );
44
+ return { enabled: false };
45
+ }
46
+
47
+ return {
48
+ enabled: true,
49
+ method: hasKMS ? 'kms' : 'aes',
50
+ };
51
+ }
52
+
53
+ export interface PrismaClientLike {
54
+ $extends(extension: unknown): PrismaClientLike;
55
+ $connect(): Promise<void>;
56
+ $disconnect(): Promise<void>;
57
+ $runCommandRaw?(command: Record<string, unknown>): Promise<unknown>;
58
+ $queryRaw?(query: TemplateStringsArray, ...values: unknown[]): Promise<unknown[]>;
59
+ [key: string]: unknown;
60
+ }
61
+
62
+ const prismaClientSingleton = (): PrismaClientLike => {
63
+ let PrismaClientConstructor: new (options: Record<string, unknown>) => PrismaClientLike;
64
+
65
+ const loadPrismaClient = (dbType: string): new (options: Record<string, unknown>) => PrismaClientLike => {
66
+ const paths = [
67
+ `/opt/nodejs/node_modules/generated/prisma-${dbType}`,
68
+ `../generated/prisma-${dbType}`,
69
+ ];
70
+
71
+ for (const modulePath of paths) {
72
+ try {
73
+ return require(modulePath).PrismaClient;
74
+ } catch {
75
+ // Continue to next path
76
+ }
77
+ }
78
+
79
+ throw new Error(
80
+ `Cannot find Prisma client for ${dbType}. Tried paths: ${paths.join(', ')}`
81
+ );
82
+ };
83
+
84
+ if (config.DB_TYPE === 'mongodb' || config.DB_TYPE === 'documentdb') {
85
+ ensureMongoDbUrl();
86
+ PrismaClientConstructor = loadPrismaClient('mongodb');
87
+ } else if (config.DB_TYPE === 'postgresql') {
88
+ PrismaClientConstructor = loadPrismaClient('postgresql');
89
+ } else {
90
+ throw new Error(
91
+ `Unsupported database type: ${config.DB_TYPE}. Supported values: 'mongodb', 'documentdb', 'postgresql'`
92
+ );
93
+ }
94
+
95
+ let client: PrismaClientLike = new PrismaClientConstructor({
96
+ log: process.env.PRISMA_LOG_LEVEL
97
+ ? process.env.PRISMA_LOG_LEVEL.split(',')
98
+ : ['error', 'warn'],
99
+ errorFormat: 'pretty',
100
+ });
101
+
102
+ const encryptionConfig = getEncryptionConfig();
103
+
104
+ if (encryptionConfig.enabled) {
105
+ try {
106
+ loadCustomEncryptionSchema();
107
+
108
+ const cryptor = new Cryptor({
109
+ shouldUseAws: encryptionConfig.method === 'kms',
110
+ });
111
+
112
+ client = client.$extends(
113
+ createEncryptionExtension({
114
+ cryptor,
115
+ enabled: true,
116
+ })
117
+ );
118
+
119
+ logger.info(
120
+ `Field-level encryption enabled using ${encryptionConfig.method!.toUpperCase()}`
121
+ );
122
+ } catch (error) {
123
+ logger.error(
124
+ 'Failed to initialize encryption extension:',
125
+ error
126
+ );
127
+ logger.warn('Continuing without encryption...');
128
+ }
129
+ } else {
130
+ logger.info('Field-level encryption disabled');
131
+ }
132
+
133
+ return client;
134
+ };
135
+
136
+ const globalForPrisma = globalThis as typeof globalThis & {
137
+ _prismaInstance?: PrismaClientLike;
138
+ };
139
+
140
+ function getPrismaClient(): PrismaClientLike {
141
+ if (!globalForPrisma._prismaInstance) {
142
+ globalForPrisma._prismaInstance = prismaClientSingleton();
143
+ }
144
+ return globalForPrisma._prismaInstance;
145
+ }
146
+
147
+ export const prisma: PrismaClientLike = new Proxy({} as PrismaClientLike, {
148
+ get(_target, prop: string | symbol) {
149
+ return (getPrismaClient() as unknown as Record<string | symbol, unknown>)[prop];
150
+ },
151
+ });
152
+
153
+ export async function disconnectPrisma(): Promise<void> {
154
+ await getPrismaClient().$disconnect();
155
+ }
156
+
157
+ export async function connectPrisma(): Promise<PrismaClientLike> {
158
+ await getPrismaClient().$connect();
159
+
160
+ if (config.DB_TYPE === 'mongodb' || config.DB_TYPE === 'documentdb') {
161
+ const { initializeMongoDBSchema } = require('./utils/mongodb-schema-init');
162
+ await initializeMongoDBSchema();
163
+ }
164
+
165
+ return getPrismaClient();
166
+ }