@friggframework/core 2.0.0-next.12 → 2.0.0-next.121

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 (410) hide show
  1. package/.eslintrc.json +18 -1
  2. package/CLAUDE.md +830 -0
  3. package/README.md +996 -50
  4. package/admin-scripts/index.js +52 -0
  5. package/admin-scripts/repositories/admin-script-execution-repository-documentdb.js +21 -0
  6. package/admin-scripts/repositories/admin-script-execution-repository-factory.js +51 -0
  7. package/admin-scripts/repositories/admin-script-execution-repository-interface.js +171 -0
  8. package/admin-scripts/repositories/admin-script-execution-repository-mongo.js +238 -0
  9. package/admin-scripts/repositories/admin-script-execution-repository-postgres.js +278 -0
  10. package/admin-scripts/repositories/script-schedule-repository-documentdb.js +21 -0
  11. package/admin-scripts/repositories/script-schedule-repository-factory.js +51 -0
  12. package/admin-scripts/repositories/script-schedule-repository-interface.js +108 -0
  13. package/admin-scripts/repositories/script-schedule-repository-mongo.js +179 -0
  14. package/admin-scripts/repositories/script-schedule-repository-postgres.js +210 -0
  15. package/application/commands/README.md +451 -0
  16. package/application/commands/admin-script-commands.js +359 -0
  17. package/application/commands/credential-commands.js +262 -0
  18. package/application/commands/entity-commands.js +294 -0
  19. package/application/commands/integration-commands.js +419 -0
  20. package/application/commands/integration-mapping-commands.js +25 -0
  21. package/application/commands/process-commands.js +135 -0
  22. package/application/commands/report-commands.js +188 -0
  23. package/application/commands/scheduler-commands.js +263 -0
  24. package/application/commands/usage-commands.js +56 -0
  25. package/application/commands/user-commands.js +312 -0
  26. package/application/index.js +83 -0
  27. package/artifacts/repositories/artifact-repository-factory.js +19 -0
  28. package/artifacts/repositories/artifact-repository-interface.js +27 -0
  29. package/artifacts/repositories/artifact-repository-local.js +42 -0
  30. package/artifacts/repositories/artifact-repository-s3.js +61 -0
  31. package/assertions/index.js +0 -3
  32. package/core/CLAUDE.md +715 -0
  33. package/core/Worker.js +55 -24
  34. package/core/create-handler.js +121 -38
  35. package/core/index.js +8 -1
  36. package/core/invocation-scope.js +225 -0
  37. package/core/parameters-to-env.js +257 -0
  38. package/core/secrets-to-env.js +7 -6
  39. package/core/ssm-preload.mjs +34 -0
  40. package/credential/repositories/credential-active-type.js +32 -0
  41. package/credential/repositories/credential-repository-documentdb.js +355 -0
  42. package/credential/repositories/credential-repository-factory.js +54 -0
  43. package/credential/repositories/credential-repository-interface.js +113 -0
  44. package/credential/repositories/credential-repository-mongo.js +294 -0
  45. package/credential/repositories/credential-repository-postgres.js +312 -0
  46. package/credential/repositories/credential-repository.js +300 -0
  47. package/credential/use-cases/get-credential-for-user.js +25 -0
  48. package/credential/use-cases/update-authentication-status.js +15 -0
  49. package/database/MONGODB_TRANSACTION_FIX.md +198 -0
  50. package/database/adapters/lambda-invoker.js +97 -0
  51. package/database/config.js +147 -0
  52. package/database/documentdb-encryption-service.js +334 -0
  53. package/database/documentdb-utils.js +196 -0
  54. package/database/encryption/README.md +863 -0
  55. package/database/encryption/documentdb-encryption-service.md +3575 -0
  56. package/database/encryption/encryption-schema-registry.js +404 -0
  57. package/database/encryption/field-encryption-service.js +254 -0
  58. package/database/encryption/integration-mapping-encryption.js +97 -0
  59. package/database/encryption/logger.js +82 -0
  60. package/database/encryption/prisma-encryption-extension.js +241 -0
  61. package/database/index.js +21 -21
  62. package/database/prisma.js +182 -0
  63. package/database/repositories/health-check-repository-documentdb.js +138 -0
  64. package/database/repositories/health-check-repository-factory.js +48 -0
  65. package/database/repositories/health-check-repository-interface.js +82 -0
  66. package/database/repositories/health-check-repository-mongodb.js +89 -0
  67. package/database/repositories/health-check-repository-postgres.js +82 -0
  68. package/database/repositories/migration-status-repository-s3.js +137 -0
  69. package/database/use-cases/check-database-health-use-case.js +29 -0
  70. package/database/use-cases/check-database-state-use-case.js +81 -0
  71. package/database/use-cases/check-encryption-health-use-case.js +83 -0
  72. package/database/use-cases/get-database-state-via-worker-use-case.js +61 -0
  73. package/database/use-cases/get-migration-status-use-case.js +93 -0
  74. package/database/use-cases/resolve-migration-via-worker-use-case.js +49 -0
  75. package/database/use-cases/run-database-migration-use-case.js +139 -0
  76. package/database/use-cases/test-encryption-use-case.js +253 -0
  77. package/database/use-cases/trigger-database-migration-use-case.js +157 -0
  78. package/database/utils/mongodb-collection-utils.js +94 -0
  79. package/database/utils/mongodb-schema-init.js +108 -0
  80. package/database/utils/prisma-runner.js +491 -0
  81. package/database/utils/prisma-schema-parser.js +182 -0
  82. package/docs/PROCESS_MANAGEMENT_QUEUE_SPEC.md +517 -0
  83. package/encrypt/Cryptor.js +34 -168
  84. package/encrypt/index.js +1 -2
  85. package/errors/client-safe-error.js +26 -0
  86. package/errors/fetch-error.js +59 -57
  87. package/errors/index.js +6 -0
  88. package/errors/mapping-already-exists-error.js +14 -0
  89. package/generated/prisma-mongodb/client.d.ts +1 -0
  90. package/generated/prisma-mongodb/client.js +5 -0
  91. package/generated/prisma-mongodb/default.d.ts +1 -0
  92. package/generated/prisma-mongodb/default.js +5 -0
  93. package/generated/prisma-mongodb/edge.d.ts +1 -0
  94. package/generated/prisma-mongodb/edge.js +386 -0
  95. package/generated/prisma-mongodb/index-browser.js +368 -0
  96. package/generated/prisma-mongodb/index.d.ts +27065 -0
  97. package/generated/prisma-mongodb/index.js +411 -0
  98. package/generated/prisma-mongodb/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  99. package/generated/prisma-mongodb/libquery_engine-rhel-openssl-3.0.x.so.node +0 -0
  100. package/generated/prisma-mongodb/package.json +183 -0
  101. package/generated/prisma-mongodb/runtime/edge-esm.js +35 -0
  102. package/generated/prisma-mongodb/runtime/edge.js +35 -0
  103. package/generated/prisma-mongodb/runtime/index-browser.d.ts +370 -0
  104. package/generated/prisma-mongodb/runtime/index-browser.js +17 -0
  105. package/generated/prisma-mongodb/runtime/library.d.ts +3982 -0
  106. package/generated/prisma-mongodb/runtime/library.js +147 -0
  107. package/generated/prisma-mongodb/runtime/react-native.js +84 -0
  108. package/generated/prisma-mongodb/runtime/wasm-compiler-edge.js +85 -0
  109. package/generated/prisma-mongodb/runtime/wasm-engine-edge.js +38 -0
  110. package/generated/prisma-mongodb/schema.prisma +455 -0
  111. package/generated/prisma-mongodb/wasm-edge-light-loader.mjs +5 -0
  112. package/generated/prisma-mongodb/wasm-worker-loader.mjs +5 -0
  113. package/generated/prisma-mongodb/wasm.d.ts +1 -0
  114. package/generated/prisma-mongodb/wasm.js +393 -0
  115. package/generated/prisma-postgresql/client.d.ts +1 -0
  116. package/generated/prisma-postgresql/client.js +5 -0
  117. package/generated/prisma-postgresql/default.d.ts +1 -0
  118. package/generated/prisma-postgresql/default.js +5 -0
  119. package/generated/prisma-postgresql/edge.d.ts +1 -0
  120. package/generated/prisma-postgresql/edge.js +407 -0
  121. package/generated/prisma-postgresql/index-browser.js +389 -0
  122. package/generated/prisma-postgresql/index.d.ts +29904 -0
  123. package/generated/prisma-postgresql/index.js +432 -0
  124. package/generated/prisma-postgresql/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
  125. package/generated/prisma-postgresql/libquery_engine-rhel-openssl-3.0.x.so.node +0 -0
  126. package/generated/prisma-postgresql/package.json +183 -0
  127. package/generated/prisma-postgresql/query_engine_bg.js +2 -0
  128. package/generated/prisma-postgresql/query_engine_bg.wasm +0 -0
  129. package/generated/prisma-postgresql/runtime/edge-esm.js +35 -0
  130. package/generated/prisma-postgresql/runtime/edge.js +35 -0
  131. package/generated/prisma-postgresql/runtime/index-browser.d.ts +370 -0
  132. package/generated/prisma-postgresql/runtime/index-browser.js +17 -0
  133. package/generated/prisma-postgresql/runtime/library.d.ts +3982 -0
  134. package/generated/prisma-postgresql/runtime/library.js +147 -0
  135. package/generated/prisma-postgresql/runtime/react-native.js +84 -0
  136. package/generated/prisma-postgresql/runtime/wasm-compiler-edge.js +85 -0
  137. package/generated/prisma-postgresql/runtime/wasm-engine-edge.js +38 -0
  138. package/generated/prisma-postgresql/schema.prisma +436 -0
  139. package/generated/prisma-postgresql/wasm-edge-light-loader.mjs +5 -0
  140. package/generated/prisma-postgresql/wasm-worker-loader.mjs +5 -0
  141. package/generated/prisma-postgresql/wasm.d.ts +1 -0
  142. package/generated/prisma-postgresql/wasm.js +414 -0
  143. package/handlers/WEBHOOKS.md +682 -0
  144. package/handlers/app-definition-loader.js +103 -0
  145. package/handlers/app-handler-helpers.js +20 -6
  146. package/handlers/backend-utils.js +272 -46
  147. package/handlers/database-migration-handler.js +236 -0
  148. package/handlers/integration-event-dispatcher.js +68 -0
  149. package/handlers/middleware/admin-auth.js +73 -0
  150. package/handlers/routers/HEALTHCHECK.md +342 -0
  151. package/handlers/routers/auth.js +4 -15
  152. package/handlers/routers/db-migration.handler.js +29 -0
  153. package/handlers/routers/db-migration.js +329 -0
  154. package/handlers/routers/health.js +518 -0
  155. package/handlers/routers/integration-defined-routers.js +85 -10
  156. package/handlers/routers/integration-webhook-routers.js +87 -0
  157. package/handlers/routers/user.js +27 -5
  158. package/handlers/routers/websocket.js +31 -9
  159. package/handlers/use-cases/check-external-apis-health-use-case.js +81 -0
  160. package/handlers/use-cases/check-integrations-health-use-case.js +44 -0
  161. package/handlers/workers/db-migration.js +438 -0
  162. package/handlers/workers/dlq-processor.js +89 -0
  163. package/handlers/workers/integration-defined-workers.js +13 -7
  164. package/index.js +123 -47
  165. package/infrastructure/scheduler/eventbridge-scheduler-adapter.js +238 -0
  166. package/infrastructure/scheduler/index.js +33 -0
  167. package/infrastructure/scheduler/mock-scheduler-adapter.js +143 -0
  168. package/infrastructure/scheduler/scheduler-service-factory.js +73 -0
  169. package/infrastructure/scheduler/scheduler-service-interface.js +47 -0
  170. package/integrations/EXTENSIONS.md +240 -0
  171. package/integrations/WEBHOOK-QUICKSTART.md +151 -0
  172. package/integrations/extension.js +254 -0
  173. package/integrations/index.js +20 -10
  174. package/integrations/integration-base.js +777 -74
  175. package/integrations/integration-router.js +399 -180
  176. package/integrations/options.js +1 -1
  177. package/integrations/repositories/config-patch-shared.js +43 -0
  178. package/integrations/repositories/integration-mapping-query-pipeline.js +152 -0
  179. package/integrations/repositories/integration-mapping-query.js +193 -0
  180. package/integrations/repositories/integration-mapping-repository-documentdb.js +406 -0
  181. package/integrations/repositories/integration-mapping-repository-factory.js +57 -0
  182. package/integrations/repositories/integration-mapping-repository-interface.js +183 -0
  183. package/integrations/repositories/integration-mapping-repository-mongo.js +284 -0
  184. package/integrations/repositories/integration-mapping-repository-postgres.js +403 -0
  185. package/integrations/repositories/integration-mapping-repository.js +185 -0
  186. package/integrations/repositories/integration-repository-documentdb.js +354 -0
  187. package/integrations/repositories/integration-repository-factory.js +51 -0
  188. package/integrations/repositories/integration-repository-interface.js +219 -0
  189. package/integrations/repositories/integration-repository-mongo.js +502 -0
  190. package/integrations/repositories/integration-repository-postgres.js +550 -0
  191. package/integrations/repositories/process-repository-documentdb.js +311 -0
  192. package/integrations/repositories/process-repository-factory.js +53 -0
  193. package/integrations/repositories/process-repository-interface.js +136 -0
  194. package/integrations/repositories/process-repository-mongo.js +262 -0
  195. package/integrations/repositories/process-repository-postgres.js +380 -0
  196. package/integrations/repositories/process-update-ops-shared.js +112 -0
  197. package/integrations/repositories/report-id.js +13 -0
  198. package/integrations/tests/doubles/config-capturing-integration.js +81 -0
  199. package/integrations/tests/doubles/dummy-integration-class.js +113 -0
  200. package/integrations/tests/doubles/test-integration-repository.js +146 -0
  201. package/integrations/use-cases/add-entities-to-integration.js +92 -0
  202. package/integrations/use-cases/create-integration.js +253 -0
  203. package/integrations/use-cases/create-process.js +130 -0
  204. package/integrations/use-cases/delete-integration-for-user.js +130 -0
  205. package/integrations/use-cases/find-integration-by-entity-external-id.js +74 -0
  206. package/integrations/use-cases/find-integration-context-by-external-entity-id.js +76 -0
  207. package/integrations/use-cases/get-integration-for-user.js +78 -0
  208. package/integrations/use-cases/get-integration-instance-by-definition.js +67 -0
  209. package/integrations/use-cases/get-integration-instance.js +83 -0
  210. package/integrations/use-cases/get-integrations-for-user.js +88 -0
  211. package/integrations/use-cases/get-possible-integrations.js +27 -0
  212. package/integrations/use-cases/get-process.js +89 -0
  213. package/integrations/use-cases/index.js +19 -0
  214. package/integrations/use-cases/list-integrations-by-entity-external-id.js +46 -0
  215. package/integrations/use-cases/load-integration-context.js +71 -0
  216. package/integrations/use-cases/patch-integration-config.js +39 -0
  217. package/integrations/use-cases/process-errors.js +28 -0
  218. package/integrations/use-cases/remove-entities-from-integration.js +70 -0
  219. package/integrations/use-cases/update-integration-config.js +32 -0
  220. package/integrations/use-cases/update-integration-messages.js +44 -0
  221. package/integrations/use-cases/update-integration-status.js +32 -0
  222. package/integrations/use-cases/update-integration.js +92 -0
  223. package/integrations/use-cases/update-process-metrics.js +222 -0
  224. package/integrations/use-cases/update-process-state.js +163 -0
  225. package/integrations/utils/assert-entity-ids-input.js +42 -0
  226. package/integrations/utils/map-integration-dto.js +37 -0
  227. package/jest-global-setup-noop.js +3 -0
  228. package/jest-global-teardown-noop.js +3 -0
  229. package/jest.config.js +2 -0
  230. package/logs/.eslintrc.json +26 -1
  231. package/logs/__fixtures__/events.js +82 -0
  232. package/logs/__fixtures__/matchers.js +45 -0
  233. package/logs/__fixtures__/secrets.js +59 -0
  234. package/logs/__fixtures__/vectors.js +329 -0
  235. package/logs/__fixtures__/with-env.js +45 -0
  236. package/logs/context.js +109 -0
  237. package/logs/contract-keys.js +67 -0
  238. package/logs/debug-shims.js +46 -0
  239. package/logs/denied-keys.js +21 -0
  240. package/logs/index.js +14 -3
  241. package/logs/jest-logger-setup.js +25 -0
  242. package/logs/levels.js +71 -0
  243. package/logs/logger-runtime.js +137 -0
  244. package/logs/logger.js +134 -46
  245. package/logs/record.js +276 -0
  246. package/logs/redact.js +328 -0
  247. package/logs/serialize.js +329 -0
  248. package/logs/sinks.js +93 -0
  249. package/logs/summarize-event.js +163 -0
  250. package/{module-plugin → modules}/index.js +0 -10
  251. package/modules/module-factory.js +56 -0
  252. package/modules/module.js +320 -0
  253. package/modules/repositories/module-repository-documentdb.js +350 -0
  254. package/modules/repositories/module-repository-factory.js +40 -0
  255. package/modules/repositories/module-repository-interface.js +145 -0
  256. package/modules/repositories/module-repository-mongo.js +436 -0
  257. package/modules/repositories/module-repository-postgres.js +481 -0
  258. package/modules/repositories/module-repository.js +369 -0
  259. package/modules/requester/api-key.js +52 -0
  260. package/modules/requester/oauth-2.js +561 -0
  261. package/modules/requester/requester.js +605 -0
  262. package/{module-plugin → modules}/test/mock-api/api.js +8 -3
  263. package/{module-plugin → modules}/test/mock-api/definition.js +14 -10
  264. package/modules/tests/doubles/test-module-factory.js +16 -0
  265. package/modules/tests/doubles/test-module-repository.js +39 -0
  266. package/modules/use-cases/get-entities-for-user.js +32 -0
  267. package/modules/use-cases/get-entity-options-by-id.js +71 -0
  268. package/modules/use-cases/get-entity-options-by-type.js +34 -0
  269. package/modules/use-cases/get-module-instance-from-type.js +34 -0
  270. package/modules/use-cases/get-module.js +74 -0
  271. package/modules/use-cases/process-authorization-callback.js +294 -0
  272. package/modules/use-cases/refresh-entity-options.js +72 -0
  273. package/modules/use-cases/test-module-auth.js +72 -0
  274. package/modules/utils/map-module-dto.js +20 -0
  275. package/modules/utils/to-credential-id.js +14 -0
  276. package/package.json +92 -52
  277. package/prisma-mongodb/schema.prisma +455 -0
  278. package/prisma-postgresql/migrations/20250930193005_init/migration.sql +315 -0
  279. package/prisma-postgresql/migrations/20251006135218_init/migration.sql +9 -0
  280. package/prisma-postgresql/migrations/20251010000000_remove_unused_entity_reference_map/migration.sql +3 -0
  281. package/prisma-postgresql/migrations/20251112195422_update_user_unique_constraints/migration.sql +25 -0
  282. package/prisma-postgresql/migrations/20260422120000_add_entity_data_column/migration.sql +10 -0
  283. package/prisma-postgresql/migrations/20260422120001_create_process_table/migration.sql +48 -0
  284. package/prisma-postgresql/migrations/20260625000000_add_user_organization_id_index/migration.sql +2 -0
  285. package/prisma-postgresql/migrations/20260703000000_add_integration_status_in_creation_in_deletion/migration.sql +11 -0
  286. package/prisma-postgresql/migrations/20260703000001_integration_status_default_in_creation/migration.sql +8 -0
  287. package/prisma-postgresql/migrations/20260705000000_create_usage_counter/migration.sql +26 -0
  288. package/prisma-postgresql/migrations/20260706000000_add_admin_script_execution_and_schedule/migration.sql +61 -0
  289. package/prisma-postgresql/migrations/migration_lock.toml +3 -0
  290. package/prisma-postgresql/schema.prisma +436 -0
  291. package/queues/queue-delivery.js +41 -0
  292. package/queues/queuer-util.js +89 -21
  293. package/reporting/README.md +154 -0
  294. package/reporting/builtin-reports.js +6 -0
  295. package/reporting/index.js +13 -0
  296. package/reporting/report-base.js +49 -0
  297. package/reporting/reports/integrations-report.js +221 -0
  298. package/syncs/manager.js +468 -443
  299. package/syncs/repositories/sync-repository-documentdb.js +240 -0
  300. package/syncs/repositories/sync-repository-factory.js +43 -0
  301. package/syncs/repositories/sync-repository-interface.js +109 -0
  302. package/syncs/repositories/sync-repository-mongo.js +239 -0
  303. package/syncs/repositories/sync-repository-postgres.js +319 -0
  304. package/syncs/sync.js +0 -1
  305. package/telemetry/README.md +331 -0
  306. package/telemetry/bind-telemetry-context.js +77 -0
  307. package/telemetry/canonical-counters.js +52 -0
  308. package/telemetry/exporters.js +85 -0
  309. package/telemetry/index.js +26 -0
  310. package/telemetry/instrument-handler.js +104 -0
  311. package/telemetry/no-op-telemetry.js +71 -0
  312. package/telemetry/north-star.js +103 -0
  313. package/telemetry/otel-telemetry.js +232 -0
  314. package/telemetry/plugin-subscribers.js +77 -0
  315. package/telemetry/telemetry-config.js +120 -0
  316. package/telemetry/telemetry-context.js +51 -0
  317. package/telemetry/telemetry-event-bus.js +58 -0
  318. package/telemetry/telemetry-runtime.js +164 -0
  319. package/telemetry/telemetry-service.js +52 -0
  320. package/telemetry/usage-rollup-subscriber.js +116 -0
  321. package/token/repositories/token-repository-documentdb.js +137 -0
  322. package/token/repositories/token-repository-factory.js +40 -0
  323. package/token/repositories/token-repository-interface.js +131 -0
  324. package/token/repositories/token-repository-mongo.js +219 -0
  325. package/token/repositories/token-repository-postgres.js +264 -0
  326. package/token/repositories/token-repository.js +219 -0
  327. package/types/associations/index.d.ts +0 -17
  328. package/types/core/index.d.ts +12 -4
  329. package/types/database/index.d.ts +10 -2
  330. package/types/encrypt/index.d.ts +5 -3
  331. package/types/errors/index.d.ts +24 -10
  332. package/types/integrations/index.d.ts +3 -8
  333. package/types/logs/index.d.ts +61 -2
  334. package/types/module-plugin/index.d.ts +20 -69
  335. package/types/syncs/index.d.ts +0 -17
  336. package/usage/README.md +54 -0
  337. package/usage/index.js +17 -0
  338. package/usage/repositories/usage-repository-documentdb.js +194 -0
  339. package/usage/repositories/usage-repository-factory.js +25 -0
  340. package/usage/repositories/usage-repository-interface.js +37 -0
  341. package/usage/repositories/usage-repository-prisma.js +146 -0
  342. package/usage/tracked-metrics.js +38 -0
  343. package/usage/usage-windows.js +24 -0
  344. package/user/repositories/user-repository-documentdb.js +426 -0
  345. package/user/repositories/user-repository-factory.js +52 -0
  346. package/user/repositories/user-repository-interface.js +214 -0
  347. package/user/repositories/user-repository-mongo.js +323 -0
  348. package/user/repositories/user-repository-postgres.js +377 -0
  349. package/user/tests/doubles/test-user-repository.js +72 -0
  350. package/user/use-cases/authenticate-user.js +143 -0
  351. package/user/use-cases/authenticate-with-shared-secret.js +48 -0
  352. package/user/use-cases/create-individual-user.js +61 -0
  353. package/user/use-cases/create-organization-user.js +47 -0
  354. package/user/use-cases/create-token-for-user-id.js +30 -0
  355. package/user/use-cases/get-user-from-adopter-jwt.js +149 -0
  356. package/user/use-cases/get-user-from-bearer-token.js +82 -0
  357. package/user/use-cases/get-user-from-x-frigg-headers.js +132 -0
  358. package/user/use-cases/login-user.js +122 -0
  359. package/user/user.js +125 -0
  360. package/utils/backend-path.js +38 -0
  361. package/utils/index.js +6 -0
  362. package/websocket/repositories/websocket-connection-repository-documentdb.js +119 -0
  363. package/websocket/repositories/websocket-connection-repository-factory.js +44 -0
  364. package/websocket/repositories/websocket-connection-repository-interface.js +106 -0
  365. package/websocket/repositories/websocket-connection-repository-mongo.js +156 -0
  366. package/websocket/repositories/websocket-connection-repository-postgres.js +196 -0
  367. package/websocket/repositories/websocket-connection-repository.js +161 -0
  368. package/assertions/is-equal.js +0 -17
  369. package/associations/model.js +0 -54
  370. package/database/models/IndividualUser.js +0 -76
  371. package/database/models/OrganizationUser.js +0 -29
  372. package/database/models/State.js +0 -9
  373. package/database/models/Token.js +0 -70
  374. package/database/models/UserModel.js +0 -7
  375. package/database/models/WebsocketConnection.js +0 -49
  376. package/database/mongo.js +0 -45
  377. package/database/mongoose.js +0 -5
  378. package/encrypt/Cryptor.test.js +0 -32
  379. package/encrypt/encrypt.js +0 -132
  380. package/encrypt/encrypt.test.js +0 -1069
  381. package/encrypt/test-encrypt.js +0 -107
  382. package/errors/base-error.test.js +0 -32
  383. package/errors/fetch-error.test.js +0 -79
  384. package/errors/halt-error.test.js +0 -11
  385. package/errors/validation-errors.test.js +0 -120
  386. package/handlers/routers/middleware/loadUser.js +0 -15
  387. package/handlers/routers/middleware/requireLoggedInUser.js +0 -12
  388. package/integrations/create-frigg-backend.js +0 -31
  389. package/integrations/integration-factory.js +0 -251
  390. package/integrations/integration-mapping.js +0 -43
  391. package/integrations/integration-model.js +0 -46
  392. package/integrations/integration-user.js +0 -144
  393. package/integrations/test/integration-base.test.js +0 -144
  394. package/lambda/TimeoutCatcher.test.js +0 -68
  395. package/logs/logger.test.js +0 -76
  396. package/module-plugin/auther.js +0 -393
  397. package/module-plugin/credential.js +0 -22
  398. package/module-plugin/entity-manager.js +0 -70
  399. package/module-plugin/entity.js +0 -46
  400. package/module-plugin/manager.js +0 -169
  401. package/module-plugin/module-factory.js +0 -61
  402. package/module-plugin/requester/api-key.js +0 -36
  403. package/module-plugin/requester/oauth-2.js +0 -219
  404. package/module-plugin/requester/requester.js +0 -165
  405. package/module-plugin/requester/requester.test.js +0 -28
  406. package/module-plugin/test/auther.test.js +0 -97
  407. package/syncs/model.js +0 -62
  408. /package/{module-plugin → modules}/ModuleConstants.js +0 -0
  409. /package/{module-plugin → modules}/requester/basic.js +0 -0
  410. /package/{module-plugin → modules}/test/mock-api/mocks/hubspot.js +0 -0
@@ -0,0 +1,236 @@
1
+ /**
2
+ * Database Migration Handler for AWS Lambda
3
+ *
4
+ * Executes Prisma migrations in a Lambda environment.
5
+ * Based on AWS best practices for running migrations in serverless environments.
6
+ *
7
+ * Supported Commands:
8
+ * - deploy: Apply pending migrations to the database (production-safe)
9
+ * - reset: Reset database and apply all migrations (DANGEROUS - dev only)
10
+ *
11
+ * Usage:
12
+ * // Via Lambda invoke
13
+ * {
14
+ * "command": "deploy" // or "reset"
15
+ * }
16
+ *
17
+ * Requirements:
18
+ * - Prisma CLI must be included in deployment or Lambda layer
19
+ * - DATABASE_URL environment variable must be set
20
+ * - VPC configuration for Aurora access
21
+ *
22
+ * Reference: https://www.prisma.io/docs/guides/deployment/deployment-guides/deploying-to-aws-lambda
23
+ */
24
+
25
+ const { execFile } = require('child_process');
26
+ const path = require('path');
27
+ const { getLogger } = require('../logs');
28
+
29
+ const log = getLogger('frigg.database.migration');
30
+
31
+ /**
32
+ * Execute Prisma migration command
33
+ *
34
+ * @param {string} command - Migration command ('deploy' or 'reset')
35
+ * @param {string} schemaPath - Path to Prisma schema file
36
+ * @returns {Promise<number>} Exit code
37
+ */
38
+ async function executePrismaMigration(command, schemaPath) {
39
+ console.log(`Executing Prisma migration: ${command}`);
40
+ console.log(`Schema path: ${schemaPath}`);
41
+ console.log(`Database URL: ${process.env.DATABASE_URL ? '[SET]' : '[NOT SET]'}`);
42
+
43
+ return new Promise((resolve, reject) => {
44
+ // Build command arguments
45
+ const args = ['migrate', command];
46
+
47
+ // Add command-specific options
48
+ if (command === 'reset') {
49
+ args.push('--force'); // Skip confirmation prompt
50
+ args.push('--skip-generate'); // Skip client generation (already done in layer)
51
+ }
52
+
53
+ // Add schema path if provided
54
+ if (schemaPath) {
55
+ args.push('--schema', schemaPath);
56
+ }
57
+
58
+ console.log(`Running: prisma ${args.join(' ')}`);
59
+
60
+ // Execute Prisma CLI
61
+ execFile(
62
+ path.resolve('./node_modules/prisma/build/index.js'),
63
+ args,
64
+ {
65
+ env: {
66
+ ...process.env,
67
+ // Ensure Prisma uses the correct binary target
68
+ PRISMA_CLI_BINARY_TARGETS: 'rhel-openssl-3.0.x',
69
+ }
70
+ },
71
+ (error, stdout, stderr) => {
72
+ // Log all output
73
+ if (stdout) {
74
+ console.log('STDOUT:', stdout);
75
+ }
76
+ if (stderr) {
77
+ console.error('STDERR:', stderr);
78
+ }
79
+
80
+ if (error) {
81
+ console.error(`Migration ${command} exited with error:`, error.message);
82
+ console.error(`Exit code: ${error.code || 1}`);
83
+ resolve(error.code || 1);
84
+ } else {
85
+ console.log(`Migration ${command} completed successfully`);
86
+ resolve(0);
87
+ }
88
+ }
89
+ );
90
+ });
91
+ }
92
+
93
+ /**
94
+ * Validate migration command
95
+ */
96
+ function validateCommand(command) {
97
+ const validCommands = ['deploy', 'reset'];
98
+
99
+ if (!validCommands.includes(command)) {
100
+ throw new Error(
101
+ `Invalid migration command: "${command}". ` +
102
+ `Valid commands are: ${validCommands.join(', ')}`
103
+ );
104
+ }
105
+
106
+ // Extra validation for dangerous commands
107
+ if (command === 'reset') {
108
+ const stage = process.env.STAGE || process.env.NODE_ENV;
109
+ if (stage === 'production' || stage === 'prod') {
110
+ throw new Error(
111
+ 'BLOCKED: "reset" command is not allowed in production environment. ' +
112
+ 'This command would delete all data. Use "deploy" instead.'
113
+ );
114
+ }
115
+ console.warn('⚠️ WARNING: "reset" will DELETE all data and reset the database!');
116
+ }
117
+ }
118
+
119
+ /**
120
+ * Determine which Prisma schema to use based on database type
121
+ */
122
+ function getSchemaPath() {
123
+ // In Lambda, schemas are in @friggframework/core/generated/
124
+ const baseSchemaPath = './node_modules/@friggframework/core/generated';
125
+
126
+ // Check if Postgres is enabled
127
+ if (process.env.DATABASE_URL?.includes('postgresql') || process.env.DATABASE_URL?.includes('postgres')) {
128
+ const schemaPath = `${baseSchemaPath}/prisma-postgresql/schema.prisma`;
129
+ console.log(`Using PostgreSQL schema: ${schemaPath}`);
130
+ return schemaPath;
131
+ }
132
+
133
+ // Check if MongoDB is enabled
134
+ if (process.env.DATABASE_URL?.includes('mongodb')) {
135
+ const schemaPath = `${baseSchemaPath}/prisma-mongodb/schema.prisma`;
136
+ console.log(`Using MongoDB schema: ${schemaPath}`);
137
+ return schemaPath;
138
+ }
139
+
140
+ // Default to PostgreSQL
141
+ console.log('DATABASE_URL not set or database type unknown, defaulting to PostgreSQL');
142
+ return `${baseSchemaPath}/prisma-postgresql/schema.prisma`;
143
+ }
144
+
145
+ /**
146
+ * Lambda handler for database migrations
147
+ *
148
+ * @param {Object} event - Lambda event
149
+ * @param {string} event.command - Migration command ('deploy' or 'reset')
150
+ * @param {Object} context - Lambda context
151
+ * @returns {Promise<Object>} Migration result
152
+ */
153
+ exports.handler = async (event, context) => {
154
+ const startTime = Date.now();
155
+
156
+ console.log('='.repeat(60));
157
+ console.log('Database Migration Handler');
158
+ console.log('='.repeat(60));
159
+ log.info('Database migration invoked', {
160
+ eventName: 'frigg.database.migration.invoked',
161
+ migrationId: event.migrationId,
162
+ dbType: process.env.DB_TYPE,
163
+ targetStage: process.env.STAGE,
164
+ action: event.command || 'deploy',
165
+ });
166
+ console.log('Context:', JSON.stringify({
167
+ functionName: context.functionName,
168
+ functionVersion: context.functionVersion,
169
+ memoryLimitInMB: context.memoryLimitInMB,
170
+ logGroupName: context.logGroupName,
171
+ }, null, 2));
172
+
173
+ try {
174
+ // Get migration command (default to 'deploy')
175
+ const command = event.command || 'deploy';
176
+
177
+ // Validate command
178
+ validateCommand(command);
179
+
180
+ // Check required environment variables
181
+ if (!process.env.DATABASE_URL) {
182
+ throw new Error(
183
+ 'DATABASE_URL environment variable is not set. ' +
184
+ 'Cannot connect to database for migrations.'
185
+ );
186
+ }
187
+
188
+ // Determine schema path
189
+ const schemaPath = getSchemaPath();
190
+
191
+ // Execute migration
192
+ const exitCode = await executePrismaMigration(command, schemaPath);
193
+
194
+ const duration = Date.now() - startTime;
195
+
196
+ if (exitCode === 0) {
197
+ const result = {
198
+ success: true,
199
+ command,
200
+ message: `Migration ${command} completed successfully`,
201
+ duration: `${duration}ms`,
202
+ timestamp: new Date().toISOString(),
203
+ };
204
+
205
+ console.log('='.repeat(60));
206
+ console.log('Migration completed successfully');
207
+ console.log(JSON.stringify(result, null, 2));
208
+ console.log('='.repeat(60));
209
+
210
+ return result;
211
+ } else {
212
+ throw new Error(`Migration ${command} failed with exit code ${exitCode}`);
213
+ }
214
+
215
+ } catch (error) {
216
+ const duration = Date.now() - startTime;
217
+
218
+ console.error('='.repeat(60));
219
+ console.error('Migration failed');
220
+ console.error('Error:', error.message);
221
+ console.error('Stack:', error.stack);
222
+ console.error('='.repeat(60));
223
+
224
+ const errorResult = {
225
+ success: false,
226
+ command: event.command || 'unknown',
227
+ error: error.message,
228
+ duration: `${duration}ms`,
229
+ timestamp: new Date().toISOString(),
230
+ };
231
+
232
+ // Return error (don't throw) so Lambda doesn't retry
233
+ return errorResult;
234
+ }
235
+ };
236
+
@@ -0,0 +1,68 @@
1
+ const { instrumentHandler } = require('../telemetry/instrument-handler');
2
+
3
+ /**
4
+ * Lightweight dispatcher that executes integration event handlers.
5
+ * @param {import('../integrations/integration-base')} integrationInstance Pre-instantiated integration.
6
+ */
7
+ class IntegrationEventDispatcher {
8
+ constructor(integrationInstance) {
9
+ if (!integrationInstance) {
10
+ throw new Error('Integration instance is required');
11
+ }
12
+ this.integrationInstance = integrationInstance;
13
+ }
14
+
15
+ async dispatchHttp({ event, req, res, next }) {
16
+ return this._dispatch(event, (instance, handler) =>
17
+ handler.call(instance, { req, res, next })
18
+ );
19
+ }
20
+
21
+ async dispatchJob({ event, data, context, delivery }) {
22
+ return this._dispatch(event, (instance, handler) =>
23
+ handler.call(instance, { data, context, delivery })
24
+ );
25
+ }
26
+
27
+ /**
28
+ * Resolve + invoke a handler, auto-instrumented. This
29
+ * is the seam for queue/webhook/defined-route dispatch; the `this.on` path
30
+ * (user actions, lifecycle) is instrumented in IntegrationBase.send().
31
+ */
32
+ async _dispatch(event, invoke) {
33
+ const instance = this.integrationInstance;
34
+ const handler = this.findEventHandler(instance, event);
35
+
36
+ if (!handler) {
37
+ const name =
38
+ instance.constructor?.Definition?.name || 'integration';
39
+ throw new Error(`Event ${event} not registered for ${name}`);
40
+ }
41
+
42
+ const eventDef = this.findEventDef(instance, event);
43
+
44
+ return instrumentHandler(
45
+ instance.telemetry,
46
+ { event, eventType: eventDef?.type },
47
+ () => invoke(instance, handler)
48
+ );
49
+ }
50
+
51
+ findEventHandler(integration, event) {
52
+ return this.findEventDef(integration, event)?.handler || null;
53
+ }
54
+
55
+ findEventDef(integration, event) {
56
+ if (integration.events && integration.events[event]) {
57
+ return integration.events[event];
58
+ }
59
+
60
+ if (integration.defaultEvents && integration.defaultEvents[event]) {
61
+ return integration.defaultEvents[event];
62
+ }
63
+
64
+ return null;
65
+ }
66
+ }
67
+
68
+ module.exports = { IntegrationEventDispatcher };
@@ -0,0 +1,73 @@
1
+ const crypto = require('node:crypto');
2
+
3
+ /**
4
+ * Admin Auth Middleware
5
+ *
6
+ * Shared authentication middleware for all admin endpoints:
7
+ * - /admin/db-migrate/*
8
+ * - /admin/scripts/*
9
+ *
10
+ * Uses simple ENV-based API key validation.
11
+ * Expects: x-frigg-admin-api-key header
12
+ */
13
+
14
+ /**
15
+ * Constant-time comparison of two secrets. Hashing both to a fixed-length
16
+ * digest first means timingSafeEqual never throws on length mismatch and the
17
+ * comparison leaks neither the key nor its length.
18
+ * @private
19
+ */
20
+ function secretsMatch(provided, expected) {
21
+ const providedHash = crypto
22
+ .createHash('sha256')
23
+ .update(String(provided))
24
+ .digest();
25
+ const expectedHash = crypto
26
+ .createHash('sha256')
27
+ .update(String(expected))
28
+ .digest();
29
+ return crypto.timingSafeEqual(providedHash, expectedHash);
30
+ }
31
+
32
+ /**
33
+ * Validate admin API key from request header
34
+ * @param {import('express').Request} req
35
+ * @param {import('express').Response} res
36
+ * @param {import('express').NextFunction} next
37
+ */
38
+ function validateAdminApiKey(req, res, next) {
39
+ const expectedKey = process.env.ADMIN_API_KEY;
40
+
41
+ // Check if admin API key is configured
42
+ if (!expectedKey) {
43
+ console.error('ADMIN_API_KEY environment variable not configured');
44
+ return res.status(401).json({
45
+ error: 'Unauthorized',
46
+ message: 'Admin API key not configured',
47
+ });
48
+ }
49
+
50
+ const apiKey = req.headers['x-frigg-admin-api-key'];
51
+
52
+ // Check if header is present
53
+ if (!apiKey) {
54
+ console.error('Missing x-frigg-admin-api-key header');
55
+ return res.status(401).json({
56
+ error: 'Unauthorized',
57
+ message: 'x-frigg-admin-api-key header required',
58
+ });
59
+ }
60
+
61
+ // Validate key using a constant-time comparison
62
+ if (!secretsMatch(apiKey, expectedKey)) {
63
+ console.error('Invalid admin API key provided');
64
+ return res.status(401).json({
65
+ error: 'Unauthorized',
66
+ message: 'Invalid admin API key',
67
+ });
68
+ }
69
+
70
+ next();
71
+ }
72
+
73
+ module.exports = { validateAdminApiKey };