@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
@@ -0,0 +1,513 @@
1
+ jest.mock('node:child_process', () => ({
2
+ execSync: jest.fn(),
3
+ spawn: jest.fn()
4
+ }));
5
+ jest.mock('node:fs', () => ({
6
+ existsSync: jest.fn(),
7
+ readFileSync: jest.fn(),
8
+ writeFileSync: jest.fn()
9
+ }));
10
+
11
+ const { execSync, spawn } = require('node:child_process');
12
+ const fs = require('node:fs');
13
+ const {
14
+ getPrismaSchemaPath,
15
+ runPrismaGenerate,
16
+ checkDatabaseState,
17
+ runPrismaMigrate,
18
+ runPrismaDbPush,
19
+ getMigrationCommand
20
+ } = require('./prisma-runner');
21
+
22
+ describe('Prisma Runner Utility', () => {
23
+ beforeEach(() => {
24
+ jest.clearAllMocks();
25
+ delete process.env.STAGE;
26
+ delete process.env.PRISMA_HIDE_UPDATE_MESSAGE;
27
+ });
28
+
29
+ afterEach(() => {
30
+ delete process.env.STAGE;
31
+ delete process.env.PRISMA_HIDE_UPDATE_MESSAGE;
32
+ });
33
+
34
+ describe('getPrismaSchemaPath()', () => {
35
+ it('should return Lambda layer path when available (MongoDB)', () => {
36
+ fs.existsSync.mockImplementation((path: string) => {
37
+ return path.includes('/opt/nodejs/node_modules/generated/prisma-mongodb/schema.prisma');
38
+ });
39
+
40
+ const path = getPrismaSchemaPath('mongodb');
41
+
42
+ expect(path).toBe('/opt/nodejs/node_modules/generated/prisma-mongodb/schema.prisma');
43
+ });
44
+
45
+ it('should return Lambda layer path when available (PostgreSQL)', () => {
46
+ fs.existsSync.mockImplementation((path: string) => {
47
+ return path.includes('/opt/nodejs/node_modules/generated/prisma-postgresql/schema.prisma');
48
+ });
49
+
50
+ const path = getPrismaSchemaPath('postgresql');
51
+
52
+ expect(path).toBe('/opt/nodejs/node_modules/generated/prisma-postgresql/schema.prisma');
53
+ });
54
+
55
+ it('should fallback to node_modules path when Lambda layer not available (MongoDB)', () => {
56
+ fs.existsSync.mockImplementation((path: string) => {
57
+ return path.includes('@friggframework/core') && path.includes('prisma-mongodb');
58
+ });
59
+
60
+ const path = getPrismaSchemaPath('mongodb');
61
+
62
+ expect(path).toContain('prisma-mongodb');
63
+ expect(path).toContain('schema.prisma');
64
+ expect(path).toContain('@friggframework/core');
65
+ });
66
+
67
+ it('should fallback to node_modules path when Lambda layer not available (PostgreSQL)', () => {
68
+ fs.existsSync.mockImplementation((path: string) => {
69
+ return path.includes('@friggframework/core') && path.includes('prisma-postgresql');
70
+ });
71
+
72
+ const path = getPrismaSchemaPath('postgresql');
73
+
74
+ expect(path).toContain('prisma-postgresql');
75
+ expect(path).toContain('schema.prisma');
76
+ expect(path).toContain('@friggframework/core');
77
+ });
78
+
79
+ it('should throw error when schema file does not exist', () => {
80
+ fs.existsSync.mockReturnValue(false);
81
+
82
+ expect(() => getPrismaSchemaPath('mongodb')).toThrow('Prisma schema not found');
83
+ });
84
+
85
+ it('should include helpful error message when schema missing', () => {
86
+ fs.existsSync.mockReturnValue(false);
87
+
88
+ expect(() => getPrismaSchemaPath('mongodb')).toThrow('@friggframework/core');
89
+ });
90
+
91
+ it('should use process.cwd() for base path when Lambda layer not available', () => {
92
+ const originalCwd = process.cwd();
93
+ fs.existsSync.mockImplementation((path: string) => {
94
+ return path.includes('@friggframework/core') && path.includes('prisma-mongodb');
95
+ });
96
+
97
+ const path = getPrismaSchemaPath('mongodb');
98
+
99
+ expect(path).toContain(originalCwd);
100
+ });
101
+
102
+ it('should accept custom project root when Lambda layer not available', () => {
103
+ const customRoot = '/custom/project';
104
+ fs.existsSync.mockImplementation((path: string) => {
105
+ return path.includes('@friggframework/core') && path.includes('prisma-mongodb');
106
+ });
107
+
108
+ const path = getPrismaSchemaPath('mongodb', customRoot);
109
+
110
+ expect(path).toContain(customRoot);
111
+ });
112
+ });
113
+
114
+ describe('runPrismaGenerate()', () => {
115
+ beforeEach(() => {
116
+ fs.existsSync.mockReturnValue(true);
117
+ });
118
+
119
+ it('should execute prisma generate successfully', async () => {
120
+ execSync.mockReturnValue('Generated successfully');
121
+
122
+ const result = await runPrismaGenerate('mongodb');
123
+
124
+ expect(result.success).toBe(true);
125
+ expect(execSync).toHaveBeenCalled();
126
+ });
127
+
128
+ it('should use correct schema path for MongoDB', async () => {
129
+ execSync.mockReturnValue('');
130
+
131
+ await runPrismaGenerate('mongodb');
132
+
133
+ const call = execSync.mock.calls[0][0];
134
+ expect(call).toContain('prisma generate');
135
+ expect(call).toContain('--schema');
136
+ expect(call).toContain('prisma-mongodb');
137
+ });
138
+
139
+ it('should use correct schema path for PostgreSQL', async () => {
140
+ execSync.mockReturnValue('');
141
+
142
+ await runPrismaGenerate('postgresql');
143
+
144
+ const call = execSync.mock.calls[0][0];
145
+ expect(call).toContain('prisma-postgresql');
146
+ });
147
+
148
+ it('should suppress telemetry when verbose false', async () => {
149
+ execSync.mockReturnValue('');
150
+
151
+ await runPrismaGenerate('mongodb', false);
152
+
153
+ const options = execSync.mock.calls[0][1];
154
+ expect(options.env.PRISMA_HIDE_UPDATE_MESSAGE).toBe('1');
155
+ });
156
+
157
+ it('should show output when verbose true', async () => {
158
+ execSync.mockReturnValue('Generated successfully');
159
+
160
+ await runPrismaGenerate('mongodb', true);
161
+
162
+ const options = execSync.mock.calls[0][1];
163
+ expect(options.stdio).toBe('inherit');
164
+ });
165
+
166
+ it('should hide output when verbose false', async () => {
167
+ execSync.mockReturnValue('');
168
+
169
+ await runPrismaGenerate('mongodb', false);
170
+
171
+ const options = execSync.mock.calls[0][1];
172
+ expect(options.stdio).toBe('pipe');
173
+ });
174
+
175
+ it('should handle generation failures with error details', async () => {
176
+ const error = new Error('Generation failed') as any;
177
+ error.stdout = 'Schema validation error';
178
+ execSync.mockImplementation(() => {
179
+ throw error;
180
+ });
181
+
182
+ const result = await runPrismaGenerate('mongodb');
183
+
184
+ expect(result.success).toBe(false);
185
+ expect(result.error).toContain('Generation failed');
186
+ });
187
+
188
+ it('should include stdout in error output', async () => {
189
+ const error = new Error('Failed') as any;
190
+ error.stdout = Buffer.from('Detailed error info');
191
+ execSync.mockImplementation(() => {
192
+ throw error;
193
+ });
194
+
195
+ const result = await runPrismaGenerate('mongodb');
196
+
197
+ expect(result.output).toContain('Detailed error info');
198
+ });
199
+
200
+ it('should handle schema syntax errors', async () => {
201
+ execSync.mockImplementation(() => {
202
+ throw new Error('Schema parsing failed');
203
+ });
204
+
205
+ const result = await runPrismaGenerate('mongodb');
206
+
207
+ expect(result.success).toBe(false);
208
+ expect(result.error).toBeDefined();
209
+ });
210
+ });
211
+
212
+ describe('checkDatabaseState()', () => {
213
+ beforeEach(() => {
214
+ fs.existsSync.mockReturnValue(true);
215
+ });
216
+
217
+ it('should return upToDate: true when migrations current (PostgreSQL)', async () => {
218
+ execSync.mockReturnValue('Database schema is up to date');
219
+
220
+ const result = await checkDatabaseState('postgresql');
221
+
222
+ expect(result.upToDate).toBe(true);
223
+ });
224
+
225
+ it('should return upToDate: true for MongoDB (N/A)', async () => {
226
+ const result = await checkDatabaseState('mongodb');
227
+
228
+ expect(result.upToDate).toBe(true);
229
+ });
230
+
231
+ it('should return pendingMigrations count when migrations pending', async () => {
232
+ execSync.mockReturnValue('3 migrations have not been applied');
233
+
234
+ const result = await checkDatabaseState('postgresql');
235
+
236
+ expect(result.upToDate).toBe(false);
237
+ expect(result.pendingMigrations).toBe(3);
238
+ });
239
+
240
+ it('should handle uninitialized database', async () => {
241
+ execSync.mockImplementation(() => {
242
+ throw new Error('No migrations found');
243
+ });
244
+
245
+ const result = await checkDatabaseState('postgresql');
246
+
247
+ expect(result.upToDate).toBe(false);
248
+ expect(result.error).toBeDefined();
249
+ });
250
+
251
+ it('should handle migrate status command errors', async () => {
252
+ execSync.mockImplementation(() => {
253
+ throw new Error('Migration status failed');
254
+ });
255
+
256
+ const result = await checkDatabaseState('postgresql');
257
+
258
+ expect(result.upToDate).toBe(false);
259
+ expect(result.error).toContain('Migration status failed');
260
+ });
261
+
262
+ it('should not run migrate status for MongoDB', async () => {
263
+ await checkDatabaseState('mongodb');
264
+
265
+ expect(execSync).not.toHaveBeenCalled();
266
+ });
267
+ });
268
+
269
+ describe('runPrismaMigrate()', () => {
270
+ let mockChildProcess: any;
271
+
272
+ beforeEach(() => {
273
+ fs.existsSync.mockReturnValue(true);
274
+ mockChildProcess = {
275
+ on: jest.fn((event: string, callback: Function) => {
276
+ if (event === 'close') {
277
+ callback(0);
278
+ }
279
+ }),
280
+ stdout: { on: jest.fn() },
281
+ stderr: { on: jest.fn() }
282
+ };
283
+ spawn.mockReturnValue(mockChildProcess);
284
+ });
285
+
286
+ it('should run migrate dev successfully', async () => {
287
+ const result = await runPrismaMigrate('dev');
288
+
289
+ expect(result.success).toBe(true);
290
+ expect(spawn).toHaveBeenCalled();
291
+ });
292
+
293
+ it('should run migrate deploy successfully', async () => {
294
+ const result = await runPrismaMigrate('deploy');
295
+
296
+ expect(result.success).toBe(true);
297
+ expect(spawn).toHaveBeenCalled();
298
+ });
299
+
300
+ it('should use correct command for dev mode', async () => {
301
+ await runPrismaMigrate('dev');
302
+
303
+ const args = spawn.mock.calls[0][1];
304
+ expect(args).toContain('migrate');
305
+ expect(args).toContain('dev');
306
+ });
307
+
308
+ it('should use correct command for deploy mode', async () => {
309
+ await runPrismaMigrate('deploy');
310
+
311
+ const args = spawn.mock.calls[0][1];
312
+ expect(args).toContain('migrate');
313
+ expect(args).toContain('deploy');
314
+ });
315
+
316
+ it('should handle migration failures with error', async () => {
317
+ mockChildProcess.on.mockImplementation((event: string, callback: Function) => {
318
+ if (event === 'close') {
319
+ callback(1);
320
+ }
321
+ });
322
+
323
+ const result = await runPrismaMigrate('dev');
324
+
325
+ expect(result.success).toBe(false);
326
+ expect(result.error).toContain('exited with code 1');
327
+ });
328
+
329
+ it('should respect verbose flag', async () => {
330
+ await runPrismaMigrate('dev', true);
331
+
332
+ const options = spawn.mock.calls[0][2];
333
+ expect(options.stdio).toBe('inherit');
334
+ });
335
+
336
+ it('should handle process spawn errors', async () => {
337
+ mockChildProcess.on.mockImplementation((event: string, callback: Function) => {
338
+ if (event === 'error') {
339
+ callback(new Error('Spawn failed'));
340
+ }
341
+ });
342
+
343
+ const result = await runPrismaMigrate('dev');
344
+
345
+ expect(result.success).toBe(false);
346
+ });
347
+
348
+ it('should hide telemetry messages', async () => {
349
+ await runPrismaMigrate('dev');
350
+
351
+ const options = spawn.mock.calls[0][2];
352
+ expect(options.env.PRISMA_HIDE_UPDATE_MESSAGE).toBe('1');
353
+ });
354
+ });
355
+
356
+ describe('runPrismaDbPush()', () => {
357
+ let mockChildProcess: any;
358
+
359
+ beforeEach(() => {
360
+ fs.existsSync.mockReturnValue(true);
361
+ mockChildProcess = {
362
+ on: jest.fn((event: string, callback: Function) => {
363
+ if (event === 'close') {
364
+ callback(0);
365
+ }
366
+ }),
367
+ stdout: { on: jest.fn() },
368
+ stderr: { on: jest.fn() }
369
+ };
370
+ spawn.mockReturnValue(mockChildProcess);
371
+ });
372
+
373
+ it('should push schema successfully for MongoDB', async () => {
374
+ const result = await runPrismaDbPush();
375
+
376
+ expect(result.success).toBe(true);
377
+ expect(spawn).toHaveBeenCalled();
378
+ });
379
+
380
+ it('should use --skip-generate flag', async () => {
381
+ await runPrismaDbPush();
382
+
383
+ const args = spawn.mock.calls[0][1];
384
+ expect(args).toContain('--skip-generate');
385
+ });
386
+
387
+ it('should use db push command', async () => {
388
+ await runPrismaDbPush();
389
+
390
+ const args = spawn.mock.calls[0][1];
391
+ expect(args).toContain('db');
392
+ expect(args).toContain('push');
393
+ });
394
+
395
+ it('should handle push failures with error', async () => {
396
+ mockChildProcess.on.mockImplementation((event: string, callback: Function) => {
397
+ if (event === 'close') {
398
+ callback(1);
399
+ }
400
+ });
401
+
402
+ const result = await runPrismaDbPush();
403
+
404
+ expect(result.success).toBe(false);
405
+ expect(result.error).toContain('exited with code 1');
406
+ });
407
+
408
+ it('should respect verbose flag', async () => {
409
+ await runPrismaDbPush(true);
410
+
411
+ const options = spawn.mock.calls[0][2];
412
+ expect(options.stdio).toBe('inherit');
413
+ });
414
+
415
+ it('should use interactive mode (stdio: inherit)', async () => {
416
+ await runPrismaDbPush();
417
+
418
+ const options = spawn.mock.calls[0][2];
419
+ expect(options.stdio).toBe('inherit');
420
+ });
421
+
422
+ it('should handle schema validation errors', async () => {
423
+ mockChildProcess.on.mockImplementation((event: string, callback: Function) => {
424
+ if (event === 'close') {
425
+ callback(1);
426
+ }
427
+ });
428
+
429
+ const result = await runPrismaDbPush();
430
+
431
+ expect(result.success).toBe(false);
432
+ });
433
+ });
434
+
435
+ describe('getMigrationCommand()', () => {
436
+ it('should return dev for development stage', () => {
437
+ const command = getMigrationCommand('development');
438
+
439
+ expect(command).toBe('dev');
440
+ });
441
+
442
+ it('should return dev for dev stage', () => {
443
+ const command = getMigrationCommand('dev');
444
+
445
+ expect(command).toBe('dev');
446
+ });
447
+
448
+ it('should return dev for local stage', () => {
449
+ const command = getMigrationCommand('local');
450
+
451
+ expect(command).toBe('dev');
452
+ });
453
+
454
+ it('should return dev for test stage', () => {
455
+ const command = getMigrationCommand('test');
456
+
457
+ expect(command).toBe('dev');
458
+ });
459
+
460
+ it('should return deploy for production stage', () => {
461
+ const command = getMigrationCommand('production');
462
+
463
+ expect(command).toBe('deploy');
464
+ });
465
+
466
+ it('should return deploy for prod stage', () => {
467
+ const command = getMigrationCommand('prod');
468
+
469
+ expect(command).toBe('deploy');
470
+ });
471
+
472
+ it('should return deploy for staging stage', () => {
473
+ const command = getMigrationCommand('staging');
474
+
475
+ expect(command).toBe('deploy');
476
+ });
477
+
478
+ it('should default to dev when stage undefined', () => {
479
+ const command = getMigrationCommand();
480
+
481
+ expect(command).toBe('dev');
482
+ });
483
+
484
+ it('should read from STAGE environment variable when no argument', () => {
485
+ process.env.STAGE = 'production';
486
+
487
+ const command = getMigrationCommand();
488
+
489
+ expect(command).toBe('deploy');
490
+ });
491
+
492
+ it('should prioritize argument over STAGE env var', () => {
493
+ process.env.STAGE = 'production';
494
+
495
+ const command = getMigrationCommand('development');
496
+
497
+ expect(command).toBe('dev');
498
+ });
499
+
500
+ it('should handle case-insensitive stage names', () => {
501
+ expect(getMigrationCommand('DEVELOPMENT')).toBe('dev');
502
+ expect(getMigrationCommand('PRODUCTION')).toBe('deploy');
503
+ expect(getMigrationCommand('Dev')).toBe('dev');
504
+ expect(getMigrationCommand('Prod')).toBe('deploy');
505
+ });
506
+
507
+ it('should return deploy for unknown stages', () => {
508
+ const command = getMigrationCommand('unknown-stage');
509
+
510
+ expect(command).toBe('deploy');
511
+ });
512
+ });
513
+ });