@teleporthq/teleport-plugin-next-workflows 0.44.11 → 0.45.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 (976) hide show
  1. package/__tests__/_helpers/fake-fetch.ts +75 -0
  2. package/__tests__/_helpers/gui-place-order-statements.ts +17 -0
  3. package/__tests__/_helpers/inserted-lines.ts +22 -0
  4. package/__tests__/_helpers/invoice-store.ts +10 -1
  5. package/__tests__/_helpers/load-security-runtime.ts +45 -0
  6. package/__tests__/_helpers/load-server-runtime.ts +26 -3
  7. package/__tests__/_helpers/run-account-delete-route.ts +3 -1
  8. package/__tests__/_helpers/run-generated-middleware.ts +7 -2
  9. package/__tests__/account-delete-owned-rows.test.ts +3 -1
  10. package/__tests__/adopted-element-trigger-code.test.ts +128 -0
  11. package/__tests__/analytics-track-outcome.test.ts +145 -0
  12. package/__tests__/auth-password-change-ends-sessions.test.ts +8 -1
  13. package/__tests__/auth-password-security.test.ts +2275 -0
  14. package/__tests__/auth-session-cost.test.ts +31 -0
  15. package/__tests__/auth-signup-route.test.ts +960 -0
  16. package/__tests__/authored-code-every-path.test.ts +247 -0
  17. package/__tests__/automations-bus.test.ts +3820 -0
  18. package/__tests__/automations-catalog-drift.test.ts +97 -0
  19. package/__tests__/booking-calendar-feed-route.test.ts +20 -3
  20. package/__tests__/cart-price-order.test.ts +336 -1
  21. package/__tests__/code-lookup-rate-limit-route.test.ts +189 -0
  22. package/__tests__/cost-bearing-node-types.test.ts +119 -0
  23. package/__tests__/credential-columns-reply.test.ts +9 -0
  24. package/__tests__/credential-result-reply.test.ts +19 -5
  25. package/__tests__/cron-route-loop-templateparams.test.ts +6 -3
  26. package/__tests__/custom-js-authored-code.test.ts +304 -0
  27. package/__tests__/custom-node-custom-code-gate.test.ts +136 -0
  28. package/__tests__/custom-node-step-handlers.test.ts +251 -0
  29. package/__tests__/custom-node-step-reach.test.ts +63 -0
  30. package/__tests__/data-api-anon-user-id-fallback.test.ts +7 -2
  31. package/__tests__/data-api-browser-reads.test.ts +7 -0
  32. package/__tests__/data-api-business-events.test.ts +403 -0
  33. package/__tests__/data-api-invalid-body.test.ts +7 -0
  34. package/__tests__/data-api-low-stock-autofire.test.ts +30 -4
  35. package/__tests__/data-api-optional-feature-columns.test.ts +44 -0
  36. package/__tests__/data-api-owner-scope-credentials.test.ts +1324 -0
  37. package/__tests__/data-api-protected-tables.test.ts +48 -15
  38. package/__tests__/data-api-retired-table-and-account-fields.test.ts +208 -0
  39. package/__tests__/email-locale-senders.test.ts +5 -3
  40. package/__tests__/expression-injection.test.ts +343 -0
  41. package/__tests__/fixtures/admin-file-workflows.json +242 -0
  42. package/__tests__/form-confirmation-email-template.test.ts +44 -0
  43. package/__tests__/internal-request-headers.test.ts +25 -0
  44. package/__tests__/invoice-pdf-service-project-header.test.ts +120 -0
  45. package/__tests__/invoice-self-call-origin.test.ts +57 -1
  46. package/__tests__/legacy-webhook-self-calls.test.ts +86 -1
  47. package/__tests__/middleware-home-route-protection.test.ts +3 -1
  48. package/__tests__/middleware-subscriber-access.test.ts +1 -1
  49. package/__tests__/newsletter-admin-route.test.ts +649 -0
  50. package/__tests__/newsletter-plugin.test.ts +1248 -0
  51. package/__tests__/outbound-nodes-security.test.ts +1929 -0
  52. package/__tests__/page-access-guard.test.ts +217 -0
  53. package/__tests__/page-access-route-table.test.ts +231 -0
  54. package/__tests__/payment-drivers-module.test.ts +23 -0
  55. package/__tests__/payment-legacy-webhook-routes.test.ts +100 -5
  56. package/__tests__/payment-webhook-route.test.ts +4 -1
  57. package/__tests__/paypal-webhook-signature-verification.test.ts +44 -0
  58. package/__tests__/place-order-guards.test.ts +506 -0
  59. package/__tests__/public-step-guards.test.ts +310 -0
  60. package/__tests__/publish-refusals.test.ts +505 -0
  61. package/__tests__/realtime-identity-routes.test.ts +492 -0
  62. package/__tests__/record-event-writer-server-only.test.ts +975 -0
  63. package/__tests__/resolve-config-template-params.test.ts +3 -3
  64. package/__tests__/runtime-storage-upload-access.test.ts +280 -17
  65. package/__tests__/security-integration-env-names.test.ts +74 -0
  66. package/__tests__/security-lists-parity.test.ts +245 -0
  67. package/__tests__/security-runtime-shadow.test.ts +224 -1
  68. package/__tests__/security-runtime.test.ts +893 -0
  69. package/__tests__/segment-rate-limit-error-branch.test.ts +284 -0
  70. package/__tests__/segment-route-abuse-gate.test.ts +309 -0
  71. package/__tests__/server-job-hops-real-data-api.test.ts +669 -0
  72. package/__tests__/server-session-identity.test.ts +522 -0
  73. package/__tests__/server-step-chain.test.ts +222 -0
  74. package/__tests__/server-step-signing.test.ts +107 -2
  75. package/__tests__/session-cookie-resolver.test.ts +62 -106
  76. package/__tests__/signup-event.test.ts +649 -0
  77. package/__tests__/signup-reply-identical.test.ts +144 -0
  78. package/__tests__/slack-message-escaping.test.ts +123 -0
  79. package/__tests__/visitor-step-limits.test.ts +318 -0
  80. package/__tests__/webhook-delivery-lease.test.ts +4 -1
  81. package/__tests__/webpack-safe-handlers.test.ts +57 -8
  82. package/__tests__/workflow-auth-guard.test.ts +9 -1
  83. package/dist/cjs/account-delete-route-generator.d.ts +1 -0
  84. package/dist/cjs/account-delete-route-generator.d.ts.map +1 -1
  85. package/dist/cjs/account-delete-route-generator.js +18 -3
  86. package/dist/cjs/account-delete-route-generator.js.map +1 -1
  87. package/dist/cjs/api-route-generator.d.ts +52 -3
  88. package/dist/cjs/api-route-generator.d.ts.map +1 -1
  89. package/dist/cjs/api-route-generator.js +600 -145
  90. package/dist/cjs/api-route-generator.js.map +1 -1
  91. package/dist/cjs/auth-generator.d.ts +126 -3
  92. package/dist/cjs/auth-generator.d.ts.map +1 -1
  93. package/dist/cjs/auth-generator.js +1353 -139
  94. package/dist/cjs/auth-generator.js.map +1 -1
  95. package/dist/cjs/automations/activity-kicks.d.ts +12 -0
  96. package/dist/cjs/automations/activity-kicks.d.ts.map +1 -0
  97. package/dist/cjs/automations/activity-kicks.js +123 -0
  98. package/dist/cjs/automations/activity-kicks.js.map +1 -0
  99. package/dist/cjs/automations/app-events-source.d.ts +33 -0
  100. package/dist/cjs/automations/app-events-source.d.ts.map +1 -0
  101. package/dist/cjs/automations/app-events-source.js +109 -0
  102. package/dist/cjs/automations/app-events-source.js.map +1 -0
  103. package/dist/cjs/automations/automations-project-plugin.d.ts +21 -0
  104. package/dist/cjs/automations/automations-project-plugin.d.ts.map +1 -0
  105. package/dist/cjs/automations/automations-project-plugin.js +102 -0
  106. package/dist/cjs/automations/automations-project-plugin.js.map +1 -0
  107. package/dist/cjs/automations/automations-scope.d.ts +104 -0
  108. package/dist/cjs/automations/automations-scope.d.ts.map +1 -0
  109. package/dist/cjs/automations/automations-scope.js +176 -0
  110. package/dist/cjs/automations/automations-scope.js.map +1 -0
  111. package/dist/cjs/automations/dispatcher-source.d.ts +72 -0
  112. package/dist/cjs/automations/dispatcher-source.d.ts.map +1 -0
  113. package/dist/cjs/automations/dispatcher-source.js +1008 -0
  114. package/dist/cjs/automations/dispatcher-source.js.map +1 -0
  115. package/dist/cjs/automations/event-bus-source.d.ts +44 -0
  116. package/dist/cjs/automations/event-bus-source.d.ts.map +1 -0
  117. package/dist/cjs/automations/event-bus-source.js +427 -0
  118. package/dist/cjs/automations/event-bus-source.js.map +1 -0
  119. package/dist/cjs/automations/handler-module-generator.d.ts +25 -0
  120. package/dist/cjs/automations/handler-module-generator.d.ts.map +1 -0
  121. package/dist/cjs/automations/handler-module-generator.js +78 -0
  122. package/dist/cjs/automations/handler-module-generator.js.map +1 -0
  123. package/dist/cjs/automations/hydrators-source.d.ts +33 -0
  124. package/dist/cjs/automations/hydrators-source.d.ts.map +1 -0
  125. package/dist/cjs/automations/hydrators-source.js +571 -0
  126. package/dist/cjs/automations/hydrators-source.js.map +1 -0
  127. package/dist/cjs/booking-calendar-feed-route-generator.d.ts.map +1 -1
  128. package/dist/cjs/booking-calendar-feed-route-generator.js +8 -0
  129. package/dist/cjs/booking-calendar-feed-route-generator.js.map +1 -1
  130. package/dist/cjs/configured-nextauth-url.d.ts +17 -0
  131. package/dist/cjs/configured-nextauth-url.d.ts.map +1 -0
  132. package/dist/cjs/configured-nextauth-url.js +20 -0
  133. package/dist/cjs/configured-nextauth-url.js.map +1 -0
  134. package/dist/cjs/cron-request-verification.d.ts +22 -1
  135. package/dist/cjs/cron-request-verification.d.ts.map +1 -1
  136. package/dist/cjs/cron-request-verification.js +50 -6
  137. package/dist/cjs/cron-request-verification.js.map +1 -1
  138. package/dist/cjs/data-api-route-generator.d.ts +19 -0
  139. package/dist/cjs/data-api-route-generator.d.ts.map +1 -1
  140. package/dist/cjs/data-api-route-generator.js +711 -43
  141. package/dist/cjs/data-api-route-generator.js.map +1 -1
  142. package/dist/cjs/ecommerce/parameterized-stock-chain.d.ts +3 -1
  143. package/dist/cjs/ecommerce/parameterized-stock-chain.d.ts.map +1 -1
  144. package/dist/cjs/ecommerce/parameterized-stock-chain.js +45 -5
  145. package/dist/cjs/ecommerce/parameterized-stock-chain.js.map +1 -1
  146. package/dist/cjs/ecommerce/place-order-guards.d.ts +126 -0
  147. package/dist/cjs/ecommerce/place-order-guards.d.ts.map +1 -0
  148. package/dist/cjs/ecommerce/place-order-guards.js +670 -0
  149. package/dist/cjs/ecommerce/place-order-guards.js.map +1 -0
  150. package/dist/cjs/ecommerce-customhandler-rewriter.d.ts +2 -0
  151. package/dist/cjs/ecommerce-customhandler-rewriter.d.ts.map +1 -1
  152. package/dist/cjs/ecommerce-customhandler-rewriter.js +38 -2
  153. package/dist/cjs/ecommerce-customhandler-rewriter.js.map +1 -1
  154. package/dist/cjs/executor-generator.d.ts.map +1 -1
  155. package/dist/cjs/executor-generator.js +368 -60
  156. package/dist/cjs/executor-generator.js.map +1 -1
  157. package/dist/cjs/graph-utils.d.ts +9 -0
  158. package/dist/cjs/graph-utils.d.ts.map +1 -1
  159. package/dist/cjs/graph-utils.js +32 -1
  160. package/dist/cjs/graph-utils.js.map +1 -1
  161. package/dist/cjs/index.d.ts +20 -1
  162. package/dist/cjs/index.d.ts.map +1 -1
  163. package/dist/cjs/index.js +72 -2
  164. package/dist/cjs/index.js.map +1 -1
  165. package/dist/cjs/invoice/api-routes-code.d.ts +9 -3
  166. package/dist/cjs/invoice/api-routes-code.d.ts.map +1 -1
  167. package/dist/cjs/invoice/api-routes-code.js +9 -7
  168. package/dist/cjs/invoice/api-routes-code.js.map +1 -1
  169. package/dist/cjs/invoice/index.d.ts.map +1 -1
  170. package/dist/cjs/invoice/index.js +12 -7
  171. package/dist/cjs/invoice/index.js.map +1 -1
  172. package/dist/cjs/invoice/invoice-assembly-code.d.ts.map +1 -1
  173. package/dist/cjs/invoice/invoice-assembly-code.js +8 -3
  174. package/dist/cjs/invoice/invoice-assembly-code.js.map +1 -1
  175. package/dist/cjs/invoice/pdf-generator-code.d.ts.map +1 -1
  176. package/dist/cjs/invoice/pdf-generator-code.js +2 -1
  177. package/dist/cjs/invoice/pdf-generator-code.js.map +1 -1
  178. package/dist/cjs/invoice/pdf-service-client-code.d.ts.map +1 -1
  179. package/dist/cjs/invoice/pdf-service-client-code.js +15 -7
  180. package/dist/cjs/invoice/pdf-service-client-code.js.map +1 -1
  181. package/dist/cjs/newsletter/admin-route-code.d.ts +60 -0
  182. package/dist/cjs/newsletter/admin-route-code.d.ts.map +1 -0
  183. package/dist/cjs/newsletter/admin-route-code.js +300 -0
  184. package/dist/cjs/newsletter/admin-route-code.js.map +1 -0
  185. package/dist/cjs/newsletter/helper-code.d.ts +109 -0
  186. package/dist/cjs/newsletter/helper-code.d.ts.map +1 -0
  187. package/dist/cjs/newsletter/helper-code.js +662 -0
  188. package/dist/cjs/newsletter/helper-code.js.map +1 -0
  189. package/dist/cjs/newsletter/newsletter-scope.d.ts +65 -0
  190. package/dist/cjs/newsletter/newsletter-scope.d.ts.map +1 -0
  191. package/dist/cjs/newsletter/newsletter-scope.js +103 -0
  192. package/dist/cjs/newsletter/newsletter-scope.js.map +1 -0
  193. package/dist/cjs/newsletter/project-plugin.d.ts +18 -0
  194. package/dist/cjs/newsletter/project-plugin.d.ts.map +1 -0
  195. package/dist/cjs/newsletter/project-plugin.js +97 -0
  196. package/dist/cjs/newsletter/project-plugin.js.map +1 -0
  197. package/dist/cjs/newsletter/routes-code.d.ts +6 -0
  198. package/dist/cjs/newsletter/routes-code.d.ts.map +1 -0
  199. package/dist/cjs/newsletter/routes-code.js +181 -0
  200. package/dist/cjs/newsletter/routes-code.js.map +1 -0
  201. package/dist/cjs/nodes/account/account-compare-passwords.d.ts.map +1 -1
  202. package/dist/cjs/nodes/account/account-compare-passwords.js +16 -6
  203. package/dist/cjs/nodes/account/account-compare-passwords.js.map +1 -1
  204. package/dist/cjs/nodes/account/account-delete-current.js +1 -1
  205. package/dist/cjs/nodes/account/account-get-current.js +1 -1
  206. package/dist/cjs/nodes/account/account-hash-password.d.ts.map +1 -1
  207. package/dist/cjs/nodes/account/account-hash-password.js +15 -3
  208. package/dist/cjs/nodes/account/account-hash-password.js.map +1 -1
  209. package/dist/cjs/nodes/account/account-login.d.ts.map +1 -1
  210. package/dist/cjs/nodes/account/account-login.js +23 -6
  211. package/dist/cjs/nodes/account/account-login.js.map +1 -1
  212. package/dist/cjs/nodes/account/account-logout.js +1 -1
  213. package/dist/cjs/nodes/account/account-refresh-session.js +1 -1
  214. package/dist/cjs/nodes/account/account-request-password-reset.d.ts +3 -0
  215. package/dist/cjs/nodes/account/account-request-password-reset.d.ts.map +1 -0
  216. package/dist/cjs/nodes/account/account-request-password-reset.js +46 -0
  217. package/dist/cjs/nodes/account/account-request-password-reset.js.map +1 -0
  218. package/dist/cjs/nodes/account/account-reset-password.d.ts +3 -0
  219. package/dist/cjs/nodes/account/account-reset-password.d.ts.map +1 -0
  220. package/dist/cjs/nodes/account/account-reset-password.js +44 -0
  221. package/dist/cjs/nodes/account/account-reset-password.js.map +1 -0
  222. package/dist/cjs/nodes/account/account-signup.d.ts.map +1 -1
  223. package/dist/cjs/nodes/account/account-signup.js +82 -19
  224. package/dist/cjs/nodes/account/account-signup.js.map +1 -1
  225. package/dist/cjs/nodes/account/account-social-login.js +1 -1
  226. package/dist/cjs/nodes/ai/ai-custom-prompt.d.ts.map +1 -1
  227. package/dist/cjs/nodes/ai/ai-custom-prompt.js +20 -5
  228. package/dist/cjs/nodes/ai/ai-custom-prompt.js.map +1 -1
  229. package/dist/cjs/nodes/ai/ai-detect-language.d.ts.map +1 -1
  230. package/dist/cjs/nodes/ai/ai-detect-language.js +20 -5
  231. package/dist/cjs/nodes/ai/ai-detect-language.js.map +1 -1
  232. package/dist/cjs/nodes/ai/ai-generate-text-embedding.d.ts.map +1 -1
  233. package/dist/cjs/nodes/ai/ai-generate-text-embedding.js +10 -2
  234. package/dist/cjs/nodes/ai/ai-generate-text-embedding.js.map +1 -1
  235. package/dist/cjs/nodes/ai/ai-provider-utils-sources.generated.js +2 -2
  236. package/dist/cjs/nodes/ai/ai-provider-utils-sources.generated.js.map +1 -1
  237. package/dist/cjs/nodes/ai/ai-provider-utils.d.ts +31 -2
  238. package/dist/cjs/nodes/ai/ai-provider-utils.d.ts.map +1 -1
  239. package/dist/cjs/nodes/ai/ai-provider-utils.js +125 -11
  240. package/dist/cjs/nodes/ai/ai-provider-utils.js.map +1 -1
  241. package/dist/cjs/nodes/ai/ai-select-database-data.d.ts.map +1 -1
  242. package/dist/cjs/nodes/ai/ai-select-database-data.js +6 -2
  243. package/dist/cjs/nodes/ai/ai-select-database-data.js.map +1 -1
  244. package/dist/cjs/nodes/ai/ai-sentiment-analysis.d.ts.map +1 -1
  245. package/dist/cjs/nodes/ai/ai-sentiment-analysis.js +20 -5
  246. package/dist/cjs/nodes/ai/ai-sentiment-analysis.js.map +1 -1
  247. package/dist/cjs/nodes/ai/ai-summarization.d.ts.map +1 -1
  248. package/dist/cjs/nodes/ai/ai-summarization.js +20 -5
  249. package/dist/cjs/nodes/ai/ai-summarization.js.map +1 -1
  250. package/dist/cjs/nodes/ai/ai-text-classifier.d.ts.map +1 -1
  251. package/dist/cjs/nodes/ai/ai-text-classifier.js +20 -5
  252. package/dist/cjs/nodes/ai/ai-text-classifier.js.map +1 -1
  253. package/dist/cjs/nodes/ai/ai-text-transform.d.ts.map +1 -1
  254. package/dist/cjs/nodes/ai/ai-text-transform.js +20 -5
  255. package/dist/cjs/nodes/ai/ai-text-transform.js.map +1 -1
  256. package/dist/cjs/nodes/analytics/analytics-track-outcome.d.ts +3 -0
  257. package/dist/cjs/nodes/analytics/analytics-track-outcome.d.ts.map +1 -0
  258. package/dist/cjs/nodes/analytics/analytics-track-outcome.js +110 -0
  259. package/dist/cjs/nodes/analytics/analytics-track-outcome.js.map +1 -0
  260. package/dist/cjs/nodes/cart/cart-price-order.d.ts.map +1 -1
  261. package/dist/cjs/nodes/cart/cart-price-order.js +161 -2
  262. package/dist/cjs/nodes/cart/cart-price-order.js.map +1 -1
  263. package/dist/cjs/nodes/cost-bearing-node-types.d.ts +4 -0
  264. package/dist/cjs/nodes/cost-bearing-node-types.d.ts.map +1 -0
  265. package/dist/cjs/nodes/cost-bearing-node-types.js +43 -0
  266. package/dist/cjs/nodes/cost-bearing-node-types.js.map +1 -0
  267. package/dist/cjs/nodes/data/data-select.d.ts.map +1 -1
  268. package/dist/cjs/nodes/data/data-select.js +12 -2
  269. package/dist/cjs/nodes/data/data-select.js.map +1 -1
  270. package/dist/cjs/nodes/email/email-mailersend.d.ts.map +1 -1
  271. package/dist/cjs/nodes/email/email-mailersend.js +15 -11
  272. package/dist/cjs/nodes/email/email-mailersend.js.map +1 -1
  273. package/dist/cjs/nodes/email/email-mailgun.d.ts.map +1 -1
  274. package/dist/cjs/nodes/email/email-mailgun.js +15 -15
  275. package/dist/cjs/nodes/email/email-mailgun.js.map +1 -1
  276. package/dist/cjs/nodes/email/email-postmark.d.ts.map +1 -1
  277. package/dist/cjs/nodes/email/email-postmark.js +15 -15
  278. package/dist/cjs/nodes/email/email-postmark.js.map +1 -1
  279. package/dist/cjs/nodes/email/email-resend.d.ts.map +1 -1
  280. package/dist/cjs/nodes/email/email-resend.js +15 -15
  281. package/dist/cjs/nodes/email/email-resend.js.map +1 -1
  282. package/dist/cjs/nodes/email/email-sendgrid.d.ts.map +1 -1
  283. package/dist/cjs/nodes/email/email-sendgrid.js +15 -15
  284. package/dist/cjs/nodes/email/email-sendgrid.js.map +1 -1
  285. package/dist/cjs/nodes/email/html-escape-code.d.ts +3 -0
  286. package/dist/cjs/nodes/email/html-escape-code.d.ts.map +1 -0
  287. package/dist/cjs/nodes/email/html-escape-code.js +23 -0
  288. package/dist/cjs/nodes/email/html-escape-code.js.map +1 -0
  289. package/dist/cjs/nodes/email/message-trust.d.ts +40 -0
  290. package/dist/cjs/nodes/email/message-trust.d.ts.map +1 -0
  291. package/dist/cjs/nodes/email/message-trust.js +167 -0
  292. package/dist/cjs/nodes/email/message-trust.js.map +1 -0
  293. package/dist/cjs/nodes/email/outbound-message-guard.d.ts +113 -0
  294. package/dist/cjs/nodes/email/outbound-message-guard.d.ts.map +1 -0
  295. package/dist/cjs/nodes/email/outbound-message-guard.js +460 -0
  296. package/dist/cjs/nodes/email/outbound-message-guard.js.map +1 -0
  297. package/dist/cjs/nodes/email/trusted-html-code.d.ts +22 -0
  298. package/dist/cjs/nodes/email/trusted-html-code.d.ts.map +1 -0
  299. package/dist/cjs/nodes/email/trusted-html-code.js +52 -0
  300. package/dist/cjs/nodes/email/trusted-html-code.js.map +1 -0
  301. package/dist/cjs/nodes/general/general-custom-js.d.ts.map +1 -1
  302. package/dist/cjs/nodes/general/general-custom-js.js +44 -7
  303. package/dist/cjs/nodes/general/general-custom-js.js.map +1 -1
  304. package/dist/cjs/nodes/general/general-http-request.d.ts.map +1 -1
  305. package/dist/cjs/nodes/general/general-http-request.js +431 -45
  306. package/dist/cjs/nodes/general/general-http-request.js.map +1 -1
  307. package/dist/cjs/nodes/general/general-rate-limiter.d.ts.map +1 -1
  308. package/dist/cjs/nodes/general/general-rate-limiter.js +46 -78
  309. package/dist/cjs/nodes/general/general-rate-limiter.js.map +1 -1
  310. package/dist/cjs/nodes/general/general-wait.d.ts +3 -0
  311. package/dist/cjs/nodes/general/general-wait.d.ts.map +1 -0
  312. package/dist/cjs/nodes/general/general-wait.js +81 -0
  313. package/dist/cjs/nodes/general/general-wait.js.map +1 -0
  314. package/dist/cjs/nodes/general/visitor-request.d.ts +44 -0
  315. package/dist/cjs/nodes/general/visitor-request.d.ts.map +1 -0
  316. package/dist/cjs/nodes/general/visitor-request.js +72 -0
  317. package/dist/cjs/nodes/general/visitor-request.js.map +1 -0
  318. package/dist/cjs/nodes/index.d.ts.map +1 -1
  319. package/dist/cjs/nodes/index.js +7 -1
  320. package/dist/cjs/nodes/index.js.map +1 -1
  321. package/dist/cjs/nodes/integrations/integration-slack.d.ts.map +1 -1
  322. package/dist/cjs/nodes/integrations/integration-slack.js +17 -6
  323. package/dist/cjs/nodes/integrations/integration-slack.js.map +1 -1
  324. package/dist/cjs/nodes/newsletter/newsletter-confirm.d.ts +3 -0
  325. package/dist/cjs/nodes/newsletter/newsletter-confirm.d.ts.map +1 -0
  326. package/dist/cjs/nodes/newsletter/newsletter-confirm.js +41 -0
  327. package/dist/cjs/nodes/newsletter/newsletter-confirm.js.map +1 -0
  328. package/dist/cjs/nodes/newsletter/newsletter-subscribe.d.ts +7 -0
  329. package/dist/cjs/nodes/newsletter/newsletter-subscribe.d.ts.map +1 -0
  330. package/dist/cjs/nodes/newsletter/newsletter-subscribe.js +69 -0
  331. package/dist/cjs/nodes/newsletter/newsletter-subscribe.js.map +1 -0
  332. package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.d.ts +3 -0
  333. package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.d.ts.map +1 -0
  334. package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.js +42 -0
  335. package/dist/cjs/nodes/newsletter/newsletter-unsubscribe.js.map +1 -0
  336. package/dist/cjs/nodes/realtime/realtime-join-channel.d.ts.map +1 -1
  337. package/dist/cjs/nodes/realtime/realtime-join-channel.js +5 -4
  338. package/dist/cjs/nodes/realtime/realtime-join-channel.js.map +1 -1
  339. package/dist/cjs/nodes/realtime/realtime-send-channel-event.d.ts.map +1 -1
  340. package/dist/cjs/nodes/realtime/realtime-send-channel-event.js +11 -2
  341. package/dist/cjs/nodes/realtime/realtime-send-channel-event.js.map +1 -1
  342. package/dist/cjs/nodes/realtime/realtime-send-channel-message.d.ts.map +1 -1
  343. package/dist/cjs/nodes/realtime/realtime-send-channel-message.js +11 -2
  344. package/dist/cjs/nodes/realtime/realtime-send-channel-message.js.map +1 -1
  345. package/dist/cjs/nodes/sms/sms-infobip.d.ts.map +1 -1
  346. package/dist/cjs/nodes/sms/sms-infobip.js +11 -8
  347. package/dist/cjs/nodes/sms/sms-infobip.js.map +1 -1
  348. package/dist/cjs/nodes/sms/sms-smsapi.d.ts.map +1 -1
  349. package/dist/cjs/nodes/sms/sms-smsapi.js +11 -8
  350. package/dist/cjs/nodes/sms/sms-smsapi.js.map +1 -1
  351. package/dist/cjs/nodes/sms/sms-textmagic.d.ts.map +1 -1
  352. package/dist/cjs/nodes/sms/sms-textmagic.js +11 -8
  353. package/dist/cjs/nodes/sms/sms-textmagic.js.map +1 -1
  354. package/dist/cjs/nodes/sms/sms-twilio.d.ts.map +1 -1
  355. package/dist/cjs/nodes/sms/sms-twilio.js +12 -10
  356. package/dist/cjs/nodes/sms/sms-twilio.js.map +1 -1
  357. package/dist/cjs/nodes/types.d.ts +8 -1
  358. package/dist/cjs/nodes/types.d.ts.map +1 -1
  359. package/dist/cjs/nodes/utility/utility-similarity-scoring.d.ts.map +1 -1
  360. package/dist/cjs/nodes/utility/utility-similarity-scoring.js +29 -10
  361. package/dist/cjs/nodes/utility/utility-similarity-scoring.js.map +1 -1
  362. package/dist/cjs/page-access-guard-generator.d.ts +23 -0
  363. package/dist/cjs/page-access-guard-generator.d.ts.map +1 -0
  364. package/dist/cjs/page-access-guard-generator.js +135 -0
  365. package/dist/cjs/page-access-guard-generator.js.map +1 -0
  366. package/dist/cjs/password-reset-route-generator.d.ts +119 -0
  367. package/dist/cjs/password-reset-route-generator.d.ts.map +1 -0
  368. package/dist/cjs/password-reset-route-generator.js +460 -0
  369. package/dist/cjs/password-reset-route-generator.js.map +1 -0
  370. package/dist/cjs/payments/payment-core-code.d.ts.map +1 -1
  371. package/dist/cjs/payments/payment-core-code.js +12 -7
  372. package/dist/cjs/payments/payment-core-code.js.map +1 -1
  373. package/dist/cjs/project-code-scanner.d.ts +11 -0
  374. package/dist/cjs/project-code-scanner.d.ts.map +1 -0
  375. package/dist/cjs/project-code-scanner.js +80 -0
  376. package/dist/cjs/project-code-scanner.js.map +1 -0
  377. package/dist/cjs/public-step-guards.d.ts +122 -0
  378. package/dist/cjs/public-step-guards.d.ts.map +1 -0
  379. package/dist/cjs/public-step-guards.js +288 -0
  380. package/dist/cjs/public-step-guards.js.map +1 -0
  381. package/dist/cjs/publish-refusals.d.ts +66 -0
  382. package/dist/cjs/publish-refusals.d.ts.map +1 -0
  383. package/dist/cjs/publish-refusals.js +278 -0
  384. package/dist/cjs/publish-refusals.js.map +1 -0
  385. package/dist/cjs/realtime-generator.d.ts +63 -1
  386. package/dist/cjs/realtime-generator.d.ts.map +1 -1
  387. package/dist/cjs/realtime-generator.js +404 -230
  388. package/dist/cjs/realtime-generator.js.map +1 -1
  389. package/dist/cjs/runtime-storage-generator.d.ts +32 -1
  390. package/dist/cjs/runtime-storage-generator.d.ts.map +1 -1
  391. package/dist/cjs/runtime-storage-generator.js +265 -12
  392. package/dist/cjs/runtime-storage-generator.js.map +1 -1
  393. package/dist/cjs/security-runtime/index.d.ts +14 -0
  394. package/dist/cjs/security-runtime/index.d.ts.map +1 -0
  395. package/dist/cjs/security-runtime/index.js +48 -0
  396. package/dist/cjs/security-runtime/index.js.map +1 -0
  397. package/dist/cjs/security-runtime/security-runtime-code.d.ts +53 -0
  398. package/dist/cjs/security-runtime/security-runtime-code.d.ts.map +1 -0
  399. package/dist/cjs/security-runtime/security-runtime-code.js +580 -0
  400. package/dist/cjs/security-runtime/security-runtime-code.js.map +1 -0
  401. package/dist/cjs/security-scanner.d.ts +72 -3
  402. package/dist/cjs/security-scanner.d.ts.map +1 -1
  403. package/dist/cjs/security-scanner.js +220 -8
  404. package/dist/cjs/security-scanner.js.map +1 -1
  405. package/dist/cjs/segment-splitter.d.ts.map +1 -1
  406. package/dist/cjs/segment-splitter.js +10 -2
  407. package/dist/cjs/segment-splitter.js.map +1 -1
  408. package/dist/cjs/segment-trust.d.ts +36 -0
  409. package/dist/cjs/segment-trust.d.ts.map +1 -1
  410. package/dist/cjs/segment-trust.js +147 -3
  411. package/dist/cjs/segment-trust.js.map +1 -1
  412. package/dist/cjs/self-call-headers.d.ts +31 -0
  413. package/dist/cjs/self-call-headers.d.ts.map +1 -0
  414. package/dist/cjs/self-call-headers.js +48 -0
  415. package/dist/cjs/self-call-headers.js.map +1 -0
  416. package/dist/cjs/sent-email-log/index.d.ts +7 -0
  417. package/dist/cjs/sent-email-log/index.d.ts.map +1 -1
  418. package/dist/cjs/sent-email-log/index.js +17 -1
  419. package/dist/cjs/sent-email-log/index.js.map +1 -1
  420. package/dist/cjs/sent-email-log/sent-email-log-code.d.ts +7 -0
  421. package/dist/cjs/sent-email-log/sent-email-log-code.d.ts.map +1 -1
  422. package/dist/cjs/sent-email-log/sent-email-log-code.js +17 -3
  423. package/dist/cjs/sent-email-log/sent-email-log-code.js.map +1 -1
  424. package/dist/cjs/server-custom-node-call.d.ts +79 -0
  425. package/dist/cjs/server-custom-node-call.d.ts.map +1 -0
  426. package/dist/cjs/server-custom-node-call.js +285 -0
  427. package/dist/cjs/server-custom-node-call.js.map +1 -0
  428. package/dist/cjs/server-runtime-code.d.ts +39 -12
  429. package/dist/cjs/server-runtime-code.d.ts.map +1 -1
  430. package/dist/cjs/server-runtime-code.js +484 -41
  431. package/dist/cjs/server-runtime-code.js.map +1 -1
  432. package/dist/cjs/session-cookie-resolver.d.ts +3 -1
  433. package/dist/cjs/session-cookie-resolver.d.ts.map +1 -1
  434. package/dist/cjs/session-revocation-generator.d.ts +39 -0
  435. package/dist/cjs/session-revocation-generator.d.ts.map +1 -0
  436. package/dist/cjs/session-revocation-generator.js +177 -0
  437. package/dist/cjs/session-revocation-generator.js.map +1 -0
  438. package/dist/cjs/slack-message-values.d.ts +6 -0
  439. package/dist/cjs/slack-message-values.d.ts.map +1 -0
  440. package/dist/cjs/slack-message-values.js +73 -0
  441. package/dist/cjs/slack-message-values.js.map +1 -0
  442. package/dist/cjs/transactional-email-code.d.ts +11 -0
  443. package/dist/cjs/transactional-email-code.d.ts.map +1 -1
  444. package/dist/cjs/transactional-email-code.js +29 -5
  445. package/dist/cjs/transactional-email-code.js.map +1 -1
  446. package/dist/cjs/trigger-generator.d.ts +2 -0
  447. package/dist/cjs/trigger-generator.d.ts.map +1 -1
  448. package/dist/cjs/trigger-generator.js +17 -4
  449. package/dist/cjs/trigger-generator.js.map +1 -1
  450. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  451. package/dist/cjs/visitor-step-limits.d.ts +66 -0
  452. package/dist/cjs/visitor-step-limits.d.ts.map +1 -0
  453. package/dist/cjs/visitor-step-limits.js +187 -0
  454. package/dist/cjs/visitor-step-limits.js.map +1 -0
  455. package/dist/cjs/webhook-generator.d.ts.map +1 -1
  456. package/dist/cjs/webhook-generator.js +93 -15
  457. package/dist/cjs/webhook-generator.js.map +1 -1
  458. package/dist/cjs/webhook-signature-verification.d.ts.map +1 -1
  459. package/dist/cjs/webhook-signature-verification.js +13 -3
  460. package/dist/cjs/webhook-signature-verification.js.map +1 -1
  461. package/dist/cjs/workflow-auth-generator.d.ts +4 -1
  462. package/dist/cjs/workflow-auth-generator.d.ts.map +1 -1
  463. package/dist/cjs/workflow-auth-generator.js +8 -3
  464. package/dist/cjs/workflow-auth-generator.js.map +1 -1
  465. package/dist/cjs/workflow-component-plugin.js +11 -3
  466. package/dist/cjs/workflow-component-plugin.js.map +1 -1
  467. package/dist/cjs/workflow-project-plugin.d.ts.map +1 -1
  468. package/dist/cjs/workflow-project-plugin.js +302 -56
  469. package/dist/cjs/workflow-project-plugin.js.map +1 -1
  470. package/dist/cjs/workflow-scope.d.ts.map +1 -1
  471. package/dist/cjs/workflow-scope.js +5 -0
  472. package/dist/cjs/workflow-scope.js.map +1 -1
  473. package/dist/esm/account-delete-route-generator.d.ts +1 -0
  474. package/dist/esm/account-delete-route-generator.d.ts.map +1 -1
  475. package/dist/esm/account-delete-route-generator.js +18 -3
  476. package/dist/esm/account-delete-route-generator.js.map +1 -1
  477. package/dist/esm/api-route-generator.d.ts +52 -3
  478. package/dist/esm/api-route-generator.d.ts.map +1 -1
  479. package/dist/esm/api-route-generator.js +595 -142
  480. package/dist/esm/api-route-generator.js.map +1 -1
  481. package/dist/esm/auth-generator.d.ts +126 -3
  482. package/dist/esm/auth-generator.d.ts.map +1 -1
  483. package/dist/esm/auth-generator.js +1350 -140
  484. package/dist/esm/auth-generator.js.map +1 -1
  485. package/dist/esm/automations/activity-kicks.d.ts +12 -0
  486. package/dist/esm/automations/activity-kicks.d.ts.map +1 -0
  487. package/dist/esm/automations/activity-kicks.js +118 -0
  488. package/dist/esm/automations/activity-kicks.js.map +1 -0
  489. package/dist/esm/automations/app-events-source.d.ts +33 -0
  490. package/dist/esm/automations/app-events-source.d.ts.map +1 -0
  491. package/dist/esm/automations/app-events-source.js +104 -0
  492. package/dist/esm/automations/app-events-source.js.map +1 -0
  493. package/dist/esm/automations/automations-project-plugin.d.ts +21 -0
  494. package/dist/esm/automations/automations-project-plugin.d.ts.map +1 -0
  495. package/dist/esm/automations/automations-project-plugin.js +98 -0
  496. package/dist/esm/automations/automations-project-plugin.js.map +1 -0
  497. package/dist/esm/automations/automations-scope.d.ts +104 -0
  498. package/dist/esm/automations/automations-scope.d.ts.map +1 -0
  499. package/dist/esm/automations/automations-scope.js +165 -0
  500. package/dist/esm/automations/automations-scope.js.map +1 -0
  501. package/dist/esm/automations/dispatcher-source.d.ts +72 -0
  502. package/dist/esm/automations/dispatcher-source.d.ts.map +1 -0
  503. package/dist/esm/automations/dispatcher-source.js +999 -0
  504. package/dist/esm/automations/dispatcher-source.js.map +1 -0
  505. package/dist/esm/automations/event-bus-source.d.ts +44 -0
  506. package/dist/esm/automations/event-bus-source.d.ts.map +1 -0
  507. package/dist/esm/automations/event-bus-source.js +421 -0
  508. package/dist/esm/automations/event-bus-source.js.map +1 -0
  509. package/dist/esm/automations/handler-module-generator.d.ts +25 -0
  510. package/dist/esm/automations/handler-module-generator.d.ts.map +1 -0
  511. package/dist/esm/automations/handler-module-generator.js +71 -0
  512. package/dist/esm/automations/handler-module-generator.js.map +1 -0
  513. package/dist/esm/automations/hydrators-source.d.ts +33 -0
  514. package/dist/esm/automations/hydrators-source.d.ts.map +1 -0
  515. package/dist/esm/automations/hydrators-source.js +567 -0
  516. package/dist/esm/automations/hydrators-source.js.map +1 -0
  517. package/dist/esm/booking-calendar-feed-route-generator.d.ts.map +1 -1
  518. package/dist/esm/booking-calendar-feed-route-generator.js +8 -0
  519. package/dist/esm/booking-calendar-feed-route-generator.js.map +1 -1
  520. package/dist/esm/configured-nextauth-url.d.ts +17 -0
  521. package/dist/esm/configured-nextauth-url.d.ts.map +1 -0
  522. package/dist/esm/configured-nextauth-url.js +17 -0
  523. package/dist/esm/configured-nextauth-url.js.map +1 -0
  524. package/dist/esm/cron-request-verification.d.ts +22 -1
  525. package/dist/esm/cron-request-verification.d.ts.map +1 -1
  526. package/dist/esm/cron-request-verification.js +48 -5
  527. package/dist/esm/cron-request-verification.js.map +1 -1
  528. package/dist/esm/data-api-route-generator.d.ts +19 -0
  529. package/dist/esm/data-api-route-generator.d.ts.map +1 -1
  530. package/dist/esm/data-api-route-generator.js +710 -43
  531. package/dist/esm/data-api-route-generator.js.map +1 -1
  532. package/dist/esm/ecommerce/parameterized-stock-chain.d.ts +3 -1
  533. package/dist/esm/ecommerce/parameterized-stock-chain.d.ts.map +1 -1
  534. package/dist/esm/ecommerce/parameterized-stock-chain.js +43 -4
  535. package/dist/esm/ecommerce/parameterized-stock-chain.js.map +1 -1
  536. package/dist/esm/ecommerce/place-order-guards.d.ts +126 -0
  537. package/dist/esm/ecommerce/place-order-guards.d.ts.map +1 -0
  538. package/dist/esm/ecommerce/place-order-guards.js +655 -0
  539. package/dist/esm/ecommerce/place-order-guards.js.map +1 -0
  540. package/dist/esm/ecommerce-customhandler-rewriter.d.ts +2 -0
  541. package/dist/esm/ecommerce-customhandler-rewriter.d.ts.map +1 -1
  542. package/dist/esm/ecommerce-customhandler-rewriter.js +38 -2
  543. package/dist/esm/ecommerce-customhandler-rewriter.js.map +1 -1
  544. package/dist/esm/executor-generator.d.ts.map +1 -1
  545. package/dist/esm/executor-generator.js +368 -60
  546. package/dist/esm/executor-generator.js.map +1 -1
  547. package/dist/esm/graph-utils.d.ts +9 -0
  548. package/dist/esm/graph-utils.d.ts.map +1 -1
  549. package/dist/esm/graph-utils.js +30 -0
  550. package/dist/esm/graph-utils.js.map +1 -1
  551. package/dist/esm/index.d.ts +20 -1
  552. package/dist/esm/index.d.ts.map +1 -1
  553. package/dist/esm/index.js +27 -1
  554. package/dist/esm/index.js.map +1 -1
  555. package/dist/esm/invoice/api-routes-code.d.ts +9 -3
  556. package/dist/esm/invoice/api-routes-code.d.ts.map +1 -1
  557. package/dist/esm/invoice/api-routes-code.js +9 -7
  558. package/dist/esm/invoice/api-routes-code.js.map +1 -1
  559. package/dist/esm/invoice/index.d.ts.map +1 -1
  560. package/dist/esm/invoice/index.js +12 -7
  561. package/dist/esm/invoice/index.js.map +1 -1
  562. package/dist/esm/invoice/invoice-assembly-code.d.ts.map +1 -1
  563. package/dist/esm/invoice/invoice-assembly-code.js +8 -3
  564. package/dist/esm/invoice/invoice-assembly-code.js.map +1 -1
  565. package/dist/esm/invoice/pdf-generator-code.d.ts.map +1 -1
  566. package/dist/esm/invoice/pdf-generator-code.js +2 -1
  567. package/dist/esm/invoice/pdf-generator-code.js.map +1 -1
  568. package/dist/esm/invoice/pdf-service-client-code.d.ts.map +1 -1
  569. package/dist/esm/invoice/pdf-service-client-code.js +15 -7
  570. package/dist/esm/invoice/pdf-service-client-code.js.map +1 -1
  571. package/dist/esm/newsletter/admin-route-code.d.ts +60 -0
  572. package/dist/esm/newsletter/admin-route-code.d.ts.map +1 -0
  573. package/dist/esm/newsletter/admin-route-code.js +295 -0
  574. package/dist/esm/newsletter/admin-route-code.js.map +1 -0
  575. package/dist/esm/newsletter/helper-code.d.ts +109 -0
  576. package/dist/esm/newsletter/helper-code.d.ts.map +1 -0
  577. package/dist/esm/newsletter/helper-code.js +656 -0
  578. package/dist/esm/newsletter/helper-code.js.map +1 -0
  579. package/dist/esm/newsletter/newsletter-scope.d.ts +65 -0
  580. package/dist/esm/newsletter/newsletter-scope.d.ts.map +1 -0
  581. package/dist/esm/newsletter/newsletter-scope.js +97 -0
  582. package/dist/esm/newsletter/newsletter-scope.js.map +1 -0
  583. package/dist/esm/newsletter/project-plugin.d.ts +18 -0
  584. package/dist/esm/newsletter/project-plugin.d.ts.map +1 -0
  585. package/dist/esm/newsletter/project-plugin.js +93 -0
  586. package/dist/esm/newsletter/project-plugin.js.map +1 -0
  587. package/dist/esm/newsletter/routes-code.d.ts +6 -0
  588. package/dist/esm/newsletter/routes-code.d.ts.map +1 -0
  589. package/dist/esm/newsletter/routes-code.js +175 -0
  590. package/dist/esm/newsletter/routes-code.js.map +1 -0
  591. package/dist/esm/nodes/account/account-compare-passwords.d.ts.map +1 -1
  592. package/dist/esm/nodes/account/account-compare-passwords.js +16 -6
  593. package/dist/esm/nodes/account/account-compare-passwords.js.map +1 -1
  594. package/dist/esm/nodes/account/account-delete-current.js +1 -1
  595. package/dist/esm/nodes/account/account-get-current.js +1 -1
  596. package/dist/esm/nodes/account/account-hash-password.d.ts.map +1 -1
  597. package/dist/esm/nodes/account/account-hash-password.js +15 -3
  598. package/dist/esm/nodes/account/account-hash-password.js.map +1 -1
  599. package/dist/esm/nodes/account/account-login.d.ts.map +1 -1
  600. package/dist/esm/nodes/account/account-login.js +23 -6
  601. package/dist/esm/nodes/account/account-login.js.map +1 -1
  602. package/dist/esm/nodes/account/account-logout.js +1 -1
  603. package/dist/esm/nodes/account/account-refresh-session.js +1 -1
  604. package/dist/esm/nodes/account/account-request-password-reset.d.ts +3 -0
  605. package/dist/esm/nodes/account/account-request-password-reset.d.ts.map +1 -0
  606. package/dist/esm/nodes/account/account-request-password-reset.js +43 -0
  607. package/dist/esm/nodes/account/account-request-password-reset.js.map +1 -0
  608. package/dist/esm/nodes/account/account-reset-password.d.ts +3 -0
  609. package/dist/esm/nodes/account/account-reset-password.d.ts.map +1 -0
  610. package/dist/esm/nodes/account/account-reset-password.js +41 -0
  611. package/dist/esm/nodes/account/account-reset-password.js.map +1 -0
  612. package/dist/esm/nodes/account/account-signup.d.ts.map +1 -1
  613. package/dist/esm/nodes/account/account-signup.js +82 -19
  614. package/dist/esm/nodes/account/account-signup.js.map +1 -1
  615. package/dist/esm/nodes/account/account-social-login.js +1 -1
  616. package/dist/esm/nodes/ai/ai-custom-prompt.d.ts.map +1 -1
  617. package/dist/esm/nodes/ai/ai-custom-prompt.js +20 -5
  618. package/dist/esm/nodes/ai/ai-custom-prompt.js.map +1 -1
  619. package/dist/esm/nodes/ai/ai-detect-language.d.ts.map +1 -1
  620. package/dist/esm/nodes/ai/ai-detect-language.js +20 -5
  621. package/dist/esm/nodes/ai/ai-detect-language.js.map +1 -1
  622. package/dist/esm/nodes/ai/ai-generate-text-embedding.d.ts.map +1 -1
  623. package/dist/esm/nodes/ai/ai-generate-text-embedding.js +10 -2
  624. package/dist/esm/nodes/ai/ai-generate-text-embedding.js.map +1 -1
  625. package/dist/esm/nodes/ai/ai-provider-utils-sources.generated.js +2 -2
  626. package/dist/esm/nodes/ai/ai-provider-utils-sources.generated.js.map +1 -1
  627. package/dist/esm/nodes/ai/ai-provider-utils.d.ts +31 -2
  628. package/dist/esm/nodes/ai/ai-provider-utils.d.ts.map +1 -1
  629. package/dist/esm/nodes/ai/ai-provider-utils.js +124 -10
  630. package/dist/esm/nodes/ai/ai-provider-utils.js.map +1 -1
  631. package/dist/esm/nodes/ai/ai-select-database-data.d.ts.map +1 -1
  632. package/dist/esm/nodes/ai/ai-select-database-data.js +6 -2
  633. package/dist/esm/nodes/ai/ai-select-database-data.js.map +1 -1
  634. package/dist/esm/nodes/ai/ai-sentiment-analysis.d.ts.map +1 -1
  635. package/dist/esm/nodes/ai/ai-sentiment-analysis.js +20 -5
  636. package/dist/esm/nodes/ai/ai-sentiment-analysis.js.map +1 -1
  637. package/dist/esm/nodes/ai/ai-summarization.d.ts.map +1 -1
  638. package/dist/esm/nodes/ai/ai-summarization.js +20 -5
  639. package/dist/esm/nodes/ai/ai-summarization.js.map +1 -1
  640. package/dist/esm/nodes/ai/ai-text-classifier.d.ts.map +1 -1
  641. package/dist/esm/nodes/ai/ai-text-classifier.js +20 -5
  642. package/dist/esm/nodes/ai/ai-text-classifier.js.map +1 -1
  643. package/dist/esm/nodes/ai/ai-text-transform.d.ts.map +1 -1
  644. package/dist/esm/nodes/ai/ai-text-transform.js +20 -5
  645. package/dist/esm/nodes/ai/ai-text-transform.js.map +1 -1
  646. package/dist/esm/nodes/analytics/analytics-track-outcome.d.ts +3 -0
  647. package/dist/esm/nodes/analytics/analytics-track-outcome.d.ts.map +1 -0
  648. package/dist/esm/nodes/analytics/analytics-track-outcome.js +107 -0
  649. package/dist/esm/nodes/analytics/analytics-track-outcome.js.map +1 -0
  650. package/dist/esm/nodes/cart/cart-price-order.d.ts.map +1 -1
  651. package/dist/esm/nodes/cart/cart-price-order.js +161 -2
  652. package/dist/esm/nodes/cart/cart-price-order.js.map +1 -1
  653. package/dist/esm/nodes/cost-bearing-node-types.d.ts +4 -0
  654. package/dist/esm/nodes/cost-bearing-node-types.d.ts.map +1 -0
  655. package/dist/esm/nodes/cost-bearing-node-types.js +39 -0
  656. package/dist/esm/nodes/cost-bearing-node-types.js.map +1 -0
  657. package/dist/esm/nodes/data/data-select.d.ts.map +1 -1
  658. package/dist/esm/nodes/data/data-select.js +12 -2
  659. package/dist/esm/nodes/data/data-select.js.map +1 -1
  660. package/dist/esm/nodes/email/email-mailersend.d.ts.map +1 -1
  661. package/dist/esm/nodes/email/email-mailersend.js +15 -11
  662. package/dist/esm/nodes/email/email-mailersend.js.map +1 -1
  663. package/dist/esm/nodes/email/email-mailgun.d.ts.map +1 -1
  664. package/dist/esm/nodes/email/email-mailgun.js +15 -15
  665. package/dist/esm/nodes/email/email-mailgun.js.map +1 -1
  666. package/dist/esm/nodes/email/email-postmark.d.ts.map +1 -1
  667. package/dist/esm/nodes/email/email-postmark.js +15 -15
  668. package/dist/esm/nodes/email/email-postmark.js.map +1 -1
  669. package/dist/esm/nodes/email/email-resend.d.ts.map +1 -1
  670. package/dist/esm/nodes/email/email-resend.js +15 -15
  671. package/dist/esm/nodes/email/email-resend.js.map +1 -1
  672. package/dist/esm/nodes/email/email-sendgrid.d.ts.map +1 -1
  673. package/dist/esm/nodes/email/email-sendgrid.js +15 -15
  674. package/dist/esm/nodes/email/email-sendgrid.js.map +1 -1
  675. package/dist/esm/nodes/email/html-escape-code.d.ts +3 -0
  676. package/dist/esm/nodes/email/html-escape-code.d.ts.map +1 -0
  677. package/dist/esm/nodes/email/html-escape-code.js +18 -0
  678. package/dist/esm/nodes/email/html-escape-code.js.map +1 -0
  679. package/dist/esm/nodes/email/message-trust.d.ts +40 -0
  680. package/dist/esm/nodes/email/message-trust.d.ts.map +1 -0
  681. package/dist/esm/nodes/email/message-trust.js +161 -0
  682. package/dist/esm/nodes/email/message-trust.js.map +1 -0
  683. package/dist/esm/nodes/email/outbound-message-guard.d.ts +113 -0
  684. package/dist/esm/nodes/email/outbound-message-guard.d.ts.map +1 -0
  685. package/dist/esm/nodes/email/outbound-message-guard.js +452 -0
  686. package/dist/esm/nodes/email/outbound-message-guard.js.map +1 -0
  687. package/dist/esm/nodes/email/trusted-html-code.d.ts +22 -0
  688. package/dist/esm/nodes/email/trusted-html-code.d.ts.map +1 -0
  689. package/dist/esm/nodes/email/trusted-html-code.js +49 -0
  690. package/dist/esm/nodes/email/trusted-html-code.js.map +1 -0
  691. package/dist/esm/nodes/general/general-custom-js.d.ts.map +1 -1
  692. package/dist/esm/nodes/general/general-custom-js.js +44 -7
  693. package/dist/esm/nodes/general/general-custom-js.js.map +1 -1
  694. package/dist/esm/nodes/general/general-http-request.d.ts.map +1 -1
  695. package/dist/esm/nodes/general/general-http-request.js +431 -45
  696. package/dist/esm/nodes/general/general-http-request.js.map +1 -1
  697. package/dist/esm/nodes/general/general-rate-limiter.d.ts.map +1 -1
  698. package/dist/esm/nodes/general/general-rate-limiter.js +46 -78
  699. package/dist/esm/nodes/general/general-rate-limiter.js.map +1 -1
  700. package/dist/esm/nodes/general/general-wait.d.ts +3 -0
  701. package/dist/esm/nodes/general/general-wait.d.ts.map +1 -0
  702. package/dist/esm/nodes/general/general-wait.js +78 -0
  703. package/dist/esm/nodes/general/general-wait.js.map +1 -0
  704. package/dist/esm/nodes/general/visitor-request.d.ts +44 -0
  705. package/dist/esm/nodes/general/visitor-request.d.ts.map +1 -0
  706. package/dist/esm/nodes/general/visitor-request.js +65 -0
  707. package/dist/esm/nodes/general/visitor-request.js.map +1 -0
  708. package/dist/esm/nodes/index.d.ts.map +1 -1
  709. package/dist/esm/nodes/index.js +7 -1
  710. package/dist/esm/nodes/index.js.map +1 -1
  711. package/dist/esm/nodes/integrations/integration-slack.d.ts.map +1 -1
  712. package/dist/esm/nodes/integrations/integration-slack.js +17 -6
  713. package/dist/esm/nodes/integrations/integration-slack.js.map +1 -1
  714. package/dist/esm/nodes/newsletter/newsletter-confirm.d.ts +3 -0
  715. package/dist/esm/nodes/newsletter/newsletter-confirm.d.ts.map +1 -0
  716. package/dist/esm/nodes/newsletter/newsletter-confirm.js +38 -0
  717. package/dist/esm/nodes/newsletter/newsletter-confirm.js.map +1 -0
  718. package/dist/esm/nodes/newsletter/newsletter-subscribe.d.ts +7 -0
  719. package/dist/esm/nodes/newsletter/newsletter-subscribe.d.ts.map +1 -0
  720. package/dist/esm/nodes/newsletter/newsletter-subscribe.js +66 -0
  721. package/dist/esm/nodes/newsletter/newsletter-subscribe.js.map +1 -0
  722. package/dist/esm/nodes/newsletter/newsletter-unsubscribe.d.ts +3 -0
  723. package/dist/esm/nodes/newsletter/newsletter-unsubscribe.d.ts.map +1 -0
  724. package/dist/esm/nodes/newsletter/newsletter-unsubscribe.js +39 -0
  725. package/dist/esm/nodes/newsletter/newsletter-unsubscribe.js.map +1 -0
  726. package/dist/esm/nodes/realtime/realtime-join-channel.d.ts.map +1 -1
  727. package/dist/esm/nodes/realtime/realtime-join-channel.js +5 -4
  728. package/dist/esm/nodes/realtime/realtime-join-channel.js.map +1 -1
  729. package/dist/esm/nodes/realtime/realtime-send-channel-event.d.ts.map +1 -1
  730. package/dist/esm/nodes/realtime/realtime-send-channel-event.js +11 -2
  731. package/dist/esm/nodes/realtime/realtime-send-channel-event.js.map +1 -1
  732. package/dist/esm/nodes/realtime/realtime-send-channel-message.d.ts.map +1 -1
  733. package/dist/esm/nodes/realtime/realtime-send-channel-message.js +11 -2
  734. package/dist/esm/nodes/realtime/realtime-send-channel-message.js.map +1 -1
  735. package/dist/esm/nodes/sms/sms-infobip.d.ts.map +1 -1
  736. package/dist/esm/nodes/sms/sms-infobip.js +11 -8
  737. package/dist/esm/nodes/sms/sms-infobip.js.map +1 -1
  738. package/dist/esm/nodes/sms/sms-smsapi.d.ts.map +1 -1
  739. package/dist/esm/nodes/sms/sms-smsapi.js +11 -8
  740. package/dist/esm/nodes/sms/sms-smsapi.js.map +1 -1
  741. package/dist/esm/nodes/sms/sms-textmagic.d.ts.map +1 -1
  742. package/dist/esm/nodes/sms/sms-textmagic.js +11 -8
  743. package/dist/esm/nodes/sms/sms-textmagic.js.map +1 -1
  744. package/dist/esm/nodes/sms/sms-twilio.d.ts.map +1 -1
  745. package/dist/esm/nodes/sms/sms-twilio.js +12 -10
  746. package/dist/esm/nodes/sms/sms-twilio.js.map +1 -1
  747. package/dist/esm/nodes/types.d.ts +8 -1
  748. package/dist/esm/nodes/types.d.ts.map +1 -1
  749. package/dist/esm/nodes/utility/utility-similarity-scoring.d.ts.map +1 -1
  750. package/dist/esm/nodes/utility/utility-similarity-scoring.js +29 -10
  751. package/dist/esm/nodes/utility/utility-similarity-scoring.js.map +1 -1
  752. package/dist/esm/page-access-guard-generator.d.ts +23 -0
  753. package/dist/esm/page-access-guard-generator.d.ts.map +1 -0
  754. package/dist/esm/page-access-guard-generator.js +131 -0
  755. package/dist/esm/page-access-guard-generator.js.map +1 -0
  756. package/dist/esm/password-reset-route-generator.d.ts +119 -0
  757. package/dist/esm/password-reset-route-generator.d.ts.map +1 -0
  758. package/dist/esm/password-reset-route-generator.js +448 -0
  759. package/dist/esm/password-reset-route-generator.js.map +1 -0
  760. package/dist/esm/payments/payment-core-code.d.ts.map +1 -1
  761. package/dist/esm/payments/payment-core-code.js +12 -7
  762. package/dist/esm/payments/payment-core-code.js.map +1 -1
  763. package/dist/esm/project-code-scanner.d.ts +11 -0
  764. package/dist/esm/project-code-scanner.d.ts.map +1 -0
  765. package/dist/esm/project-code-scanner.js +75 -0
  766. package/dist/esm/project-code-scanner.js.map +1 -0
  767. package/dist/esm/public-step-guards.d.ts +122 -0
  768. package/dist/esm/public-step-guards.d.ts.map +1 -0
  769. package/dist/esm/public-step-guards.js +280 -0
  770. package/dist/esm/public-step-guards.js.map +1 -0
  771. package/dist/esm/publish-refusals.d.ts +66 -0
  772. package/dist/esm/publish-refusals.d.ts.map +1 -0
  773. package/dist/esm/publish-refusals.js +271 -0
  774. package/dist/esm/publish-refusals.js.map +1 -0
  775. package/dist/esm/realtime-generator.d.ts +63 -1
  776. package/dist/esm/realtime-generator.d.ts.map +1 -1
  777. package/dist/esm/realtime-generator.js +401 -229
  778. package/dist/esm/realtime-generator.js.map +1 -1
  779. package/dist/esm/runtime-storage-generator.d.ts +32 -1
  780. package/dist/esm/runtime-storage-generator.d.ts.map +1 -1
  781. package/dist/esm/runtime-storage-generator.js +264 -11
  782. package/dist/esm/runtime-storage-generator.js.map +1 -1
  783. package/dist/esm/security-runtime/index.d.ts +14 -0
  784. package/dist/esm/security-runtime/index.d.ts.map +1 -0
  785. package/dist/esm/security-runtime/index.js +37 -0
  786. package/dist/esm/security-runtime/index.js.map +1 -0
  787. package/dist/esm/security-runtime/security-runtime-code.d.ts +53 -0
  788. package/dist/esm/security-runtime/security-runtime-code.d.ts.map +1 -0
  789. package/dist/esm/security-runtime/security-runtime-code.js +575 -0
  790. package/dist/esm/security-runtime/security-runtime-code.js.map +1 -0
  791. package/dist/esm/security-scanner.d.ts +72 -3
  792. package/dist/esm/security-scanner.d.ts.map +1 -1
  793. package/dist/esm/security-scanner.js +217 -8
  794. package/dist/esm/security-scanner.js.map +1 -1
  795. package/dist/esm/segment-splitter.d.ts.map +1 -1
  796. package/dist/esm/segment-splitter.js +10 -2
  797. package/dist/esm/segment-splitter.js.map +1 -1
  798. package/dist/esm/segment-trust.d.ts +36 -0
  799. package/dist/esm/segment-trust.d.ts.map +1 -1
  800. package/dist/esm/segment-trust.js +146 -2
  801. package/dist/esm/segment-trust.js.map +1 -1
  802. package/dist/esm/self-call-headers.d.ts +31 -0
  803. package/dist/esm/self-call-headers.d.ts.map +1 -0
  804. package/dist/esm/self-call-headers.js +43 -0
  805. package/dist/esm/self-call-headers.js.map +1 -0
  806. package/dist/esm/sent-email-log/index.d.ts +7 -0
  807. package/dist/esm/sent-email-log/index.d.ts.map +1 -1
  808. package/dist/esm/sent-email-log/index.js +15 -0
  809. package/dist/esm/sent-email-log/index.js.map +1 -1
  810. package/dist/esm/sent-email-log/sent-email-log-code.d.ts +7 -0
  811. package/dist/esm/sent-email-log/sent-email-log-code.d.ts.map +1 -1
  812. package/dist/esm/sent-email-log/sent-email-log-code.js +17 -3
  813. package/dist/esm/sent-email-log/sent-email-log-code.js.map +1 -1
  814. package/dist/esm/server-custom-node-call.d.ts +79 -0
  815. package/dist/esm/server-custom-node-call.d.ts.map +1 -0
  816. package/dist/esm/server-custom-node-call.js +278 -0
  817. package/dist/esm/server-custom-node-call.js.map +1 -0
  818. package/dist/esm/server-runtime-code.d.ts +39 -12
  819. package/dist/esm/server-runtime-code.d.ts.map +1 -1
  820. package/dist/esm/server-runtime-code.js +483 -40
  821. package/dist/esm/server-runtime-code.js.map +1 -1
  822. package/dist/esm/session-cookie-resolver.d.ts +3 -1
  823. package/dist/esm/session-cookie-resolver.d.ts.map +1 -1
  824. package/dist/esm/session-revocation-generator.d.ts +39 -0
  825. package/dist/esm/session-revocation-generator.d.ts.map +1 -0
  826. package/dist/esm/session-revocation-generator.js +172 -0
  827. package/dist/esm/session-revocation-generator.js.map +1 -0
  828. package/dist/esm/slack-message-values.d.ts +6 -0
  829. package/dist/esm/slack-message-values.d.ts.map +1 -0
  830. package/dist/esm/slack-message-values.js +68 -0
  831. package/dist/esm/slack-message-values.js.map +1 -0
  832. package/dist/esm/transactional-email-code.d.ts +11 -0
  833. package/dist/esm/transactional-email-code.d.ts.map +1 -1
  834. package/dist/esm/transactional-email-code.js +28 -4
  835. package/dist/esm/transactional-email-code.js.map +1 -1
  836. package/dist/esm/trigger-generator.d.ts +2 -0
  837. package/dist/esm/trigger-generator.d.ts.map +1 -1
  838. package/dist/esm/trigger-generator.js +15 -3
  839. package/dist/esm/trigger-generator.js.map +1 -1
  840. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  841. package/dist/esm/visitor-step-limits.d.ts +66 -0
  842. package/dist/esm/visitor-step-limits.d.ts.map +1 -0
  843. package/dist/esm/visitor-step-limits.js +181 -0
  844. package/dist/esm/visitor-step-limits.js.map +1 -0
  845. package/dist/esm/webhook-generator.d.ts.map +1 -1
  846. package/dist/esm/webhook-generator.js +93 -15
  847. package/dist/esm/webhook-generator.js.map +1 -1
  848. package/dist/esm/webhook-signature-verification.d.ts.map +1 -1
  849. package/dist/esm/webhook-signature-verification.js +13 -3
  850. package/dist/esm/webhook-signature-verification.js.map +1 -1
  851. package/dist/esm/workflow-auth-generator.d.ts +4 -1
  852. package/dist/esm/workflow-auth-generator.d.ts.map +1 -1
  853. package/dist/esm/workflow-auth-generator.js +8 -3
  854. package/dist/esm/workflow-auth-generator.js.map +1 -1
  855. package/dist/esm/workflow-component-plugin.js +12 -4
  856. package/dist/esm/workflow-component-plugin.js.map +1 -1
  857. package/dist/esm/workflow-project-plugin.d.ts.map +1 -1
  858. package/dist/esm/workflow-project-plugin.js +306 -60
  859. package/dist/esm/workflow-project-plugin.js.map +1 -1
  860. package/dist/esm/workflow-scope.d.ts.map +1 -1
  861. package/dist/esm/workflow-scope.js +5 -0
  862. package/dist/esm/workflow-scope.js.map +1 -1
  863. package/package.json +4 -4
  864. package/src/account-delete-route-generator.ts +28 -4
  865. package/src/api-route-generator.ts +712 -134
  866. package/src/auth-generator.ts +1471 -142
  867. package/src/automations/activity-kicks.ts +139 -0
  868. package/src/automations/app-events-source.ts +117 -0
  869. package/src/automations/automations-project-plugin.ts +202 -0
  870. package/src/automations/automations-scope.ts +196 -0
  871. package/src/automations/dispatcher-source.ts +1072 -0
  872. package/src/automations/event-bus-source.ts +428 -0
  873. package/src/automations/handler-module-generator.ts +107 -0
  874. package/src/automations/hydrators-source.ts +647 -0
  875. package/src/booking-calendar-feed-route-generator.ts +8 -0
  876. package/src/configured-nextauth-url.ts +17 -0
  877. package/src/cron-request-verification.ts +55 -5
  878. package/src/data-api-route-generator.ts +780 -43
  879. package/src/ecommerce/parameterized-stock-chain.ts +52 -5
  880. package/src/ecommerce/place-order-guards.ts +785 -0
  881. package/src/ecommerce-customhandler-rewriter.ts +55 -2
  882. package/src/executor-generator.ts +372 -60
  883. package/src/graph-utils.ts +33 -0
  884. package/src/index.ts +70 -0
  885. package/src/invoice/api-routes-code.ts +20 -7
  886. package/src/invoice/index.ts +11 -6
  887. package/src/invoice/invoice-assembly-code.ts +8 -3
  888. package/src/invoice/pdf-generator-code.ts +2 -1
  889. package/src/invoice/pdf-service-client-code.ts +15 -7
  890. package/src/newsletter/admin-route-code.ts +319 -0
  891. package/src/newsletter/helper-code.ts +748 -0
  892. package/src/newsletter/newsletter-scope.ts +116 -0
  893. package/src/newsletter/project-plugin.ts +119 -0
  894. package/src/newsletter/routes-code.ts +186 -0
  895. package/src/nodes/account/account-compare-passwords.ts +17 -6
  896. package/src/nodes/account/account-delete-current.ts +1 -1
  897. package/src/nodes/account/account-get-current.ts +1 -1
  898. package/src/nodes/account/account-hash-password.ts +19 -3
  899. package/src/nodes/account/account-login.ts +24 -7
  900. package/src/nodes/account/account-logout.ts +1 -1
  901. package/src/nodes/account/account-refresh-session.ts +1 -1
  902. package/src/nodes/account/account-request-password-reset.ts +47 -0
  903. package/src/nodes/account/account-reset-password.ts +45 -0
  904. package/src/nodes/account/account-signup.ts +86 -20
  905. package/src/nodes/account/account-social-login.ts +1 -1
  906. package/src/nodes/ai/ai-custom-prompt.ts +25 -6
  907. package/src/nodes/ai/ai-detect-language.ts +25 -6
  908. package/src/nodes/ai/ai-generate-text-embedding.ts +16 -3
  909. package/src/nodes/ai/ai-provider-utils-sources.generated.ts +2 -2
  910. package/src/nodes/ai/ai-provider-utils.ts +135 -10
  911. package/src/nodes/ai/ai-select-database-data.ts +8 -3
  912. package/src/nodes/ai/ai-sentiment-analysis.ts +25 -6
  913. package/src/nodes/ai/ai-summarization.ts +25 -6
  914. package/src/nodes/ai/ai-text-classifier.ts +25 -6
  915. package/src/nodes/ai/ai-text-transform.ts +25 -6
  916. package/src/nodes/analytics/analytics-track-outcome.ts +111 -0
  917. package/src/nodes/cart/cart-price-order.ts +200 -2
  918. package/src/nodes/cost-bearing-node-types.ts +45 -0
  919. package/src/nodes/data/data-select.ts +11 -2
  920. package/src/nodes/email/email-mailersend.ts +16 -8
  921. package/src/nodes/email/email-mailgun.ts +17 -12
  922. package/src/nodes/email/email-postmark.ts +17 -12
  923. package/src/nodes/email/email-resend.ts +17 -12
  924. package/src/nodes/email/email-sendgrid.ts +17 -12
  925. package/src/nodes/email/html-escape-code.ts +21 -0
  926. package/src/nodes/email/message-trust.ts +198 -0
  927. package/src/nodes/email/outbound-message-guard.ts +572 -0
  928. package/src/nodes/email/trusted-html-code.ts +49 -0
  929. package/src/nodes/general/general-custom-js.ts +46 -7
  930. package/src/nodes/general/general-http-request.ts +449 -46
  931. package/src/nodes/general/general-rate-limiter.ts +54 -81
  932. package/src/nodes/general/general-wait.ts +80 -0
  933. package/src/nodes/general/visitor-request.ts +79 -0
  934. package/src/nodes/index.ts +12 -0
  935. package/src/nodes/integrations/integration-slack.ts +21 -6
  936. package/src/nodes/newsletter/newsletter-confirm.ts +44 -0
  937. package/src/nodes/newsletter/newsletter-subscribe.ts +78 -0
  938. package/src/nodes/newsletter/newsletter-unsubscribe.ts +43 -0
  939. package/src/nodes/realtime/realtime-join-channel.ts +5 -4
  940. package/src/nodes/realtime/realtime-send-channel-event.ts +13 -2
  941. package/src/nodes/realtime/realtime-send-channel-message.ts +13 -2
  942. package/src/nodes/sms/sms-infobip.ts +14 -4
  943. package/src/nodes/sms/sms-smsapi.ts +14 -4
  944. package/src/nodes/sms/sms-textmagic.ts +14 -4
  945. package/src/nodes/sms/sms-twilio.ts +14 -4
  946. package/src/nodes/types.ts +9 -1
  947. package/src/nodes/utility/utility-similarity-scoring.ts +33 -12
  948. package/src/page-access-guard-generator.ts +154 -0
  949. package/src/password-reset-route-generator.ts +531 -0
  950. package/src/payments/payment-core-code.ts +12 -7
  951. package/src/project-code-scanner.ts +98 -0
  952. package/src/public-step-guards.ts +448 -0
  953. package/src/publish-refusals.ts +459 -0
  954. package/src/realtime-generator.ts +457 -234
  955. package/src/runtime-storage-generator.ts +270 -11
  956. package/src/security-runtime/index.ts +53 -0
  957. package/src/security-runtime/security-runtime-code.ts +579 -0
  958. package/src/security-scanner.ts +253 -10
  959. package/src/segment-splitter.ts +10 -2
  960. package/src/segment-trust.ts +205 -2
  961. package/src/self-call-headers.ts +46 -0
  962. package/src/sent-email-log/index.ts +16 -0
  963. package/src/sent-email-log/sent-email-log-code.ts +30 -4
  964. package/src/server-custom-node-call.ts +331 -0
  965. package/src/server-runtime-code.ts +488 -40
  966. package/src/session-revocation-generator.ts +177 -0
  967. package/src/slack-message-values.ts +84 -0
  968. package/src/transactional-email-code.ts +30 -4
  969. package/src/trigger-generator.ts +19 -3
  970. package/src/visitor-step-limits.ts +228 -0
  971. package/src/webhook-generator.ts +94 -14
  972. package/src/webhook-signature-verification.ts +13 -3
  973. package/src/workflow-auth-generator.ts +9 -4
  974. package/src/workflow-component-plugin.ts +14 -4
  975. package/src/workflow-project-plugin.ts +374 -61
  976. package/src/workflow-scope.ts +6 -0
@@ -0,0 +1,1072 @@
1
+ import {
2
+ CRON_BODY_DIGEST_HEADER,
3
+ generateCronRequestVerificationCode,
4
+ } from '../cron-request-verification'
5
+ import { AUTOMATION_QUEUE_LIMITS, AUTOMATIONS_DISPATCH_ROUTE_PATH } from './automations-scope'
6
+
7
+ /** The largest body the dispatch route reads (64 KB); a larger one is refused (413). */
8
+ const DISPATCH_MAX_BODY_BYTES = 64 * 1024
9
+
10
+ /**
11
+ * The queue worker (`lib/automations/dispatcher.js`) and the route that runs
12
+ * it for the app itself (`pages/api/automations/dispatch.js`). The table is
13
+ * the queue: a pass claims due events with FOR UPDATE SKIP LOCKED, so two
14
+ * dispatchers never take the same event, and a delivery row per (event,
15
+ * automation) — unique — keeps a handler from running twice at once.
16
+ */
17
+
18
+ const {
19
+ batchSize,
20
+ maxAttempts,
21
+ maxAgeDays,
22
+ handlerTimeoutMs,
23
+ passDeadlineMs,
24
+ staleClaimMinutes,
25
+ routeMaxDurationSeconds,
26
+ } = AUTOMATION_QUEUE_LIMITS
27
+ const STALE = `interval '${staleClaimMinutes} minutes'`
28
+
29
+ const EVENT_COLUMNS =
30
+ 'e.id, e.event_type, e.order_id, e.entity_type, e.entity_id, e.payload, e.actor, e.actor_type, e.status, e.attempts, e.claimed_at, e.created_at'
31
+
32
+ // A `pending` event is left over by a dispatcher that stopped once nothing
33
+ // has touched it for the stale window: neither its claim nor the latest start
34
+ // of one of its deliveries. Its running deliveries are then stale too, so the
35
+ // takeover never has to wait a second window for them. An event with a run
36
+ // parked at a Wait (a `waiting` delivery) is pending on purpose and never
37
+ // stale: the resume settles it. Only a run that can resume holds it: one of
38
+ // an automation of this build that is on (a switched-off, deleted or
39
+ // unpublished one's stays parked, and never resumes while it is so).
40
+ // `workflowIds` is the statement's parameter holding this build's workflow
41
+ // ids. The fragments below are shared with the activity kick's due check
42
+ // (activity-kicks.ts), so the kick wakes a pass exactly when it has work.
43
+ export const staleEventSql = (workflowIds: string): string =>
44
+ '(GREATEST(COALESCE(e.claimed_at, e.created_at), ' +
45
+ 'COALESCE((SELECT max(d.started_at) FROM teleport_event_deliveries d WHERE d.event_id = e.id), e.created_at)) ' +
46
+ `< now() - ${STALE} ` +
47
+ "AND NOT EXISTS (SELECT 1 FROM teleport_event_deliveries d WHERE d.event_id = e.id AND d.status = 'waiting' " +
48
+ `AND d.workflow_id = ANY(${workflowIds}::text[]) ` +
49
+ 'AND EXISTS (SELECT 1 FROM teleport_automations a WHERE a.workflow_id = d.workflow_id AND a.enabled)))'
50
+
51
+ const STALE_EVENT = staleEventSql('$2')
52
+
53
+ // An automation of this build of the event's type, on, and on when it happened.
54
+ const enabledForEventSql = (workflowIds: string): string =>
55
+ 'EXISTS (SELECT 1 FROM teleport_automations a WHERE a.event_type = e.event_type ' +
56
+ `AND a.workflow_id = ANY(${workflowIds}::text[]) AND a.enabled AND COALESCE(a.enabled_at, a.created_at) <= e.created_at)`
57
+
58
+ /**
59
+ * The events a pass takes besides the new ones: a failed one, and a stale
60
+ * `pending` one (below the attempt limit, of an automation that is on; or
61
+ * past it, only to be settled).
62
+ */
63
+ export const retriableEventsSql = (eventTypes: string, workflowIds: string): string =>
64
+ `e.event_type = ANY(${eventTypes}::text[]) ` +
65
+ `AND ((e.attempts < ${maxAttempts} ` +
66
+ `AND (e.status = 'failed' OR (e.status = 'pending' AND ${staleEventSql(workflowIds)})) ` +
67
+ `AND ${enabledForEventSql(workflowIds)}) ` +
68
+ `OR (e.status = 'pending' AND e.attempts >= ${maxAttempts} AND ${staleEventSql(workflowIds)}))`
69
+
70
+ /**
71
+ * The Waits a pass resumes: due ones of an automation that is on (a
72
+ * switched-off one's stay parked), and those whose resume was left running
73
+ * for longer than the stale window.
74
+ */
75
+ export const dueWaitsSql = (workflowIds: string): string =>
76
+ `w.workflow_id = ANY(${workflowIds}::text[]) ` +
77
+ "AND ((w.status = 'waiting' AND w.run_at <= now()) " +
78
+ `OR (w.status = 'resuming' AND w.run_at < now() - ${STALE})) ` +
79
+ 'AND EXISTS (SELECT 1 FROM teleport_automations a WHERE a.workflow_id = w.workflow_id AND a.enabled)'
80
+
81
+ // Due, below the attempt limit, of a type with an automation of this build
82
+ // that was on when it happened: a new event within the window, a failed one
83
+ // whatever its age, and a stale `pending` one. A stale `pending` event that
84
+ // used its last attempt is claimed too, only to be settled as failed. New
85
+ // events go first.
86
+ const CLAIM_EVENTS_SQL =
87
+ `SELECT ${EVENT_COLUMNS} FROM teleport_events e ` +
88
+ 'WHERE e.event_type = ANY($1::text[]) ' +
89
+ `AND ((e.attempts < ${maxAttempts} ` +
90
+ `AND ((e.status = 'recorded' AND e.created_at > now() - interval '${maxAgeDays} days') ` +
91
+ "OR e.status = 'failed' " +
92
+ `OR (e.status = 'pending' AND ${STALE_EVENT})) ` +
93
+ `AND ${enabledForEventSql('$2')}) ` +
94
+ `OR (e.status = 'pending' AND e.attempts >= ${maxAttempts} AND ${STALE_EVENT})) ` +
95
+ "ORDER BY CASE WHEN e.status = 'recorded' THEN 0 ELSE 1 END, e.created_at " +
96
+ `LIMIT ${batchSize} FOR UPDATE SKIP LOCKED`
97
+
98
+ // claimed_at is the claim's token (to the millisecond, so it reads back
99
+ // exactly): every later write of this claim names it, so a run that froze and
100
+ // woke after a takeover writes nothing over the dispatcher that took over.
101
+ const MARK_PENDING_SQL =
102
+ "UPDATE teleport_events SET status = 'pending', claimed_at = date_trunc('milliseconds', now()) " +
103
+ 'WHERE id = ANY($1::uuid[]) RETURNING id, claimed_at'
104
+
105
+ const CLAIM_GUARD = "status = 'pending' AND claimed_at = "
106
+
107
+ // An attempt is counted when a handler of the event actually starts.
108
+ const COUNT_ATTEMPT_SQL = `UPDATE teleport_events SET attempts = attempts + 1 WHERE id = $1 AND ${CLAIM_GUARD}$2`
109
+
110
+ // Read when the event is delivered, so an automation switched off since the
111
+ // claim is skipped.
112
+ const EVENT_AUTOMATIONS_SQL =
113
+ 'SELECT a.workflow_id FROM teleport_automations a JOIN teleport_events e ON e.event_type = a.event_type ' +
114
+ 'WHERE e.id = $1 AND a.workflow_id = ANY($2::text[]) AND a.enabled ' +
115
+ 'AND COALESCE(a.enabled_at, a.created_at) <= e.created_at'
116
+
117
+ // The (event, automation) pair is unique: a pair delivered, or running and
118
+ // not yet stale, returns no row and is left alone; a failed one (or one whose
119
+ // run was left running for longer than the stale window) is taken again.
120
+ const CLAIM_DELIVERY_SQL =
121
+ 'INSERT INTO teleport_event_deliveries AS d (event_id, workflow_id, status, attempts, started_at) ' +
122
+ "VALUES ($1, $2, 'running', 1, now()) " +
123
+ "ON CONFLICT (event_id, workflow_id) DO UPDATE SET status = 'running', attempts = d.attempts + 1, " +
124
+ 'started_at = now(), finished_at = NULL, error = NULL ' +
125
+ `WHERE d.status = 'failed' OR (d.status = 'running' AND d.started_at < now() - ${STALE}) ` +
126
+ 'RETURNING d.id, d.attempts'
127
+
128
+ // A run's outcome, written only while that same claim (its attempt number)
129
+ // still holds the row: the run awaited, and one the dispatcher stopped
130
+ // waiting for, alike.
131
+ // An automation that did not run because the event has no record behind it:
132
+ // its delivery says why (a delivered or running one is left alone).
133
+ const REFUSE_DELIVERY_SQL =
134
+ 'INSERT INTO teleport_event_deliveries AS d (event_id, workflow_id, status, attempts, error, started_at, finished_at) ' +
135
+ "VALUES ($1, $2, 'failed', 0, $3, now(), now()) " +
136
+ "ON CONFLICT (event_id, workflow_id) DO UPDATE SET status = 'failed', error = $3, finished_at = now() " +
137
+ "WHERE d.status = 'failed'"
138
+
139
+ const FINISH_DELIVERY_SQL =
140
+ 'UPDATE teleport_event_deliveries SET status = $2, error = $3, finished_at = now() ' +
141
+ "WHERE id = $1 AND status = 'running' AND attempts = $4"
142
+
143
+ // An event that used its last attempt: the runs it left running are over.
144
+ const TIME_OUT_DELIVERIES_SQL =
145
+ "UPDATE teleport_event_deliveries SET status = 'failed', error = 'Timed out', finished_at = now() " +
146
+ `WHERE event_id = $1 AND status = 'running' AND started_at < now() - ${STALE}`
147
+
148
+ // A resume's outcome, in ONE statement: the Wait is settled ('done' or
149
+ // 'failed') only while this claim (its run_at token) still holds it, and the
150
+ // run's delivery takes the resumed run's outcome ('delivered', 'failed', or
151
+ // 'waiting' again at a later Wait) only when it was. Two statements could be
152
+ // cut apart by the process dying between them, leaving the Wait done, the
153
+ // delivery waiting and the event pending for good. The delivery's started_at
154
+ // becomes the resume's, so the History's duration is the resumed part; its
155
+ // attempts stay those of the run. Its row count says whether the claim held
156
+ // (and the delivery was still waiting for it).
157
+ const FINISH_RESUME_SQL =
158
+ 'WITH w AS (UPDATE teleport_automation_waits SET status = $1 ' +
159
+ "WHERE id = $2 AND status = 'resuming' AND run_at = $3 RETURNING id) " +
160
+ 'UPDATE teleport_event_deliveries SET status = $4, error = $5, started_at = $6, finished_at = now() ' +
161
+ "WHERE event_id = $7 AND workflow_id = $8 AND status = 'waiting' AND EXISTS (SELECT 1 FROM w)"
162
+
163
+ const EVENT_DELIVERIES_SQL =
164
+ 'SELECT workflow_id, status FROM teleport_event_deliveries WHERE event_id = $1'
165
+
166
+ // Settles (or hands back) the event of this claim.
167
+ const FINISH_EVENT_SQL = `UPDATE teleport_events SET status = $2 WHERE id = $1 AND ${CLAIM_GUARD}$3`
168
+
169
+ // The ledger itself failed for this event (not a handler): retried, counted.
170
+ const FAIL_EVENT_SQL =
171
+ "UPDATE teleport_events SET status = 'failed', attempts = attempts + 1 " +
172
+ `WHERE id = $1 AND ${CLAIM_GUARD}$2`
173
+
174
+ // A test is recorded already settled, so the queue never claims it.
175
+ const INSERT_TEST_EVENT_SQL =
176
+ 'INSERT INTO teleport_events (event_type, dedupe_key, payload, actor, actor_type, status) ' +
177
+ "VALUES ($1, $2, $3, $4, $5, 'test') RETURNING id, created_at"
178
+
179
+ const START_TEST_DELIVERY_SQL =
180
+ 'INSERT INTO teleport_event_deliveries (event_id, workflow_id, status, attempts, started_at) ' +
181
+ "VALUES ($1, $2, 'running', 1, now()) RETURNING id, attempts"
182
+
183
+ // The Waits due (dueWaitsSql), oldest first.
184
+ const CLAIM_WAITS_SQL =
185
+ 'SELECT w.id, w.event_id, w.workflow_id, w.resume_node_id, w.context FROM teleport_automation_waits w ' +
186
+ `WHERE ${dueWaitsSql('$1')} ` +
187
+ `ORDER BY w.run_at LIMIT ${batchSize} FOR UPDATE SKIP LOCKED`
188
+
189
+ // run_at becomes the claim time (to the millisecond, so it reads back exactly).
190
+ const MARK_WAITS_SQL =
191
+ "UPDATE teleport_automation_waits SET status = 'resuming', run_at = date_trunc('milliseconds', now()) " +
192
+ 'WHERE id = ANY($1::int[]) RETURNING id, run_at'
193
+
194
+ // Hands a claimed Wait back, only while that same claim (its run_at token) holds it.
195
+ const RELEASE_WAIT_SQL =
196
+ "UPDATE teleport_automation_waits SET status = 'waiting' WHERE id = $1 AND status = 'resuming' AND run_at = $2"
197
+
198
+ // Where a retried run picks up: the latest Wait of this (event, automation)
199
+ // whose resumed part failed. Everything before it ran already (its emails were
200
+ // sent), so the retry starts at the step after it, with the context it stored.
201
+ const FAILED_WAIT_SQL =
202
+ 'SELECT id, resume_node_id, context FROM teleport_automation_waits ' +
203
+ "WHERE event_id = $1 AND workflow_id = $2 AND status = 'failed' ORDER BY id DESC LIMIT 1"
204
+
205
+ // A retry that got past its Wait (to the end, or to a later Wait): that Wait is done.
206
+ const SETTLE_FAILED_WAIT_SQL =
207
+ "UPDATE teleport_automation_waits SET status = 'done' WHERE id = $1 AND status = 'failed'"
208
+
209
+ const EVENT_BY_ID_SQL = `SELECT ${EVENT_COLUMNS} FROM teleport_events e WHERE e.id = $1`
210
+
211
+ const ENTITY_LABELS: Record<string, string> = {
212
+ giftCards: 'order',
213
+ giftCard: 'order',
214
+ cart: 'abandoned cart',
215
+ waitlist: 'waitlist entry',
216
+ }
217
+
218
+ const STATEMENTS: Array<[string, string]> = [
219
+ ['CLAIM_EVENTS_SQL', CLAIM_EVENTS_SQL],
220
+ ['MARK_PENDING_SQL', MARK_PENDING_SQL],
221
+ ['COUNT_ATTEMPT_SQL', COUNT_ATTEMPT_SQL],
222
+ ['EVENT_AUTOMATIONS_SQL', EVENT_AUTOMATIONS_SQL],
223
+ ['CLAIM_DELIVERY_SQL', CLAIM_DELIVERY_SQL],
224
+ ['REFUSE_DELIVERY_SQL', REFUSE_DELIVERY_SQL],
225
+ ['FINISH_DELIVERY_SQL', FINISH_DELIVERY_SQL],
226
+ ['TIME_OUT_DELIVERIES_SQL', TIME_OUT_DELIVERIES_SQL],
227
+ ['FINISH_RESUME_SQL', FINISH_RESUME_SQL],
228
+ ['EVENT_DELIVERIES_SQL', EVENT_DELIVERIES_SQL],
229
+ ['FINISH_EVENT_SQL', FINISH_EVENT_SQL],
230
+ ['FAIL_EVENT_SQL', FAIL_EVENT_SQL],
231
+ ['INSERT_TEST_EVENT_SQL', INSERT_TEST_EVENT_SQL],
232
+ ['START_TEST_DELIVERY_SQL', START_TEST_DELIVERY_SQL],
233
+ ['CLAIM_WAITS_SQL', CLAIM_WAITS_SQL],
234
+ ['MARK_WAITS_SQL', MARK_WAITS_SQL],
235
+ ['RELEASE_WAIT_SQL', RELEASE_WAIT_SQL],
236
+ ['FAILED_WAIT_SQL', FAILED_WAIT_SQL],
237
+ ['SETTLE_FAILED_WAIT_SQL', SETTLE_FAILED_WAIT_SQL],
238
+ ['EVENT_BY_ID_SQL', EVENT_BY_ID_SQL],
239
+ ]
240
+
241
+ /**
242
+ * The delivery guarantee, worded for the editor's History drawer:
243
+ *
244
+ * Every automation runs at least once for each event of its type recorded
245
+ * while it is on, and normally exactly once. A run that fails is retried the
246
+ * next time the site is active, up to 5 attempts per event. A run that is
247
+ * still going after 25 seconds is left to finish; if it never reports back
248
+ * (its server stopped), it is run again 15 minutes later — so an automation
249
+ * that is slow or interrupted can run twice for the same event. A run that
250
+ * fails after a Wait is retried from the step after that Wait. A new event is
251
+ * picked up within 3 days; a Wait resumes the next time the site is active
252
+ * after its time has passed.
253
+ */
254
+ export const AUTOMATION_DELIVERY_GUARANTEE =
255
+ 'Every automation runs at least once for each event of its type recorded while it is on, and normally exactly once. ' +
256
+ 'A run that fails is retried the next time the site is active, up to 5 attempts per event. ' +
257
+ 'A run that is still going after 25 seconds is left to finish; if it never reports back, it is run again 15 minutes later, ' +
258
+ 'so an automation that is slow or interrupted can run twice for the same event. ' +
259
+ 'A run that fails after a Wait is retried from the step after that Wait: the steps before it do not run again. ' +
260
+ 'A new event is picked up within 3 days; a Wait resumes the next time the site is active after its time has passed.'
261
+
262
+ /**
263
+ * `lib/automations/dispatcher.js`. `entityByType` maps every event type of
264
+ * the registry to its envelope key, `envelopeKeysByType` to its catalog blocks
265
+ * (null: keep the payload whole); `hydratedEntities` are the entities a
266
+ * `hydrate/<entity>.js` module was generated for.
267
+ */
268
+ export const generateAutomationDispatcherCode = (options: {
269
+ entityByType: Record<string, string | null>
270
+ envelopeKeysByType: Record<string, string[] | null>
271
+ hydratedEntities: string[]
272
+ }): string => {
273
+ const hydrators = options.hydratedEntities
274
+ .map((entity) => ` ${JSON.stringify(entity)}: require('./hydrate/${entity}.js').hydrate,`)
275
+ .join('\n')
276
+ return `'use strict';
277
+ /**
278
+ * Automations: the queue worker (generated). teleport_events is the queue;
279
+ * every pass claims due events, delivers each to the automations of its type
280
+ * that are on, records every delivery, marks the event from its delivery
281
+ * rows, then resumes the Waits that are due. Runs in-process, one handler at
282
+ * a time, and starts nothing once its time budget is spent.
283
+ *
284
+ * At least once: ${AUTOMATION_DELIVERY_GUARANTEE}
285
+ */
286
+ var crypto = require('crypto');
287
+ var store = require('./store');
288
+ var registry = require('./registry');
289
+
290
+ var HANDLER_TIMEOUT_MS = ${handlerTimeoutMs};
291
+ var PASS_DEADLINE_MS = ${passDeadlineMs};
292
+ var MAX_ATTEMPTS = ${maxAttempts};
293
+
294
+ var ENTITY_BY_TYPE = ${JSON.stringify(options.entityByType, null, 2)};
295
+
296
+ var ENVELOPE_KEYS = ${JSON.stringify(options.envelopeKeysByType, null, 2)};
297
+
298
+ // How a refusal names a missing record ("No such order").
299
+ var ENTITY_LABELS = ${JSON.stringify(ENTITY_LABELS, null, 2)};
300
+
301
+ var HYDRATORS = {
302
+ ${hydrators}
303
+ };
304
+
305
+ ${STATEMENTS.map(([name, text]) => `var ${name} = ${JSON.stringify(text)};`).join('\n')}
306
+
307
+ var TIMED_OUT = {};
308
+
309
+ function own(map, key) {
310
+ return Object.prototype.hasOwnProperty.call(map, key) ? map[key] : null;
311
+ }
312
+
313
+ function registryTypes() {
314
+ return Object.keys(registry);
315
+ }
316
+
317
+ function registryWorkflowIds() {
318
+ var ids = [];
319
+ registryTypes().forEach(function (type) {
320
+ (registry[type] || []).forEach(function (entry) { ids.push(entry.workflowId); });
321
+ });
322
+ return ids;
323
+ }
324
+
325
+ function findAutomation(workflowId) {
326
+ var types = registryTypes();
327
+ for (var i = 0; i < types.length; i++) {
328
+ var entries = registry[types[i]] || [];
329
+ for (var j = 0; j < entries.length; j++) {
330
+ if (entries[j].workflowId === workflowId) return { type: types[i], entry: entries[j] };
331
+ }
332
+ }
333
+ return null;
334
+ }
335
+
336
+ // Runs one handler, waiting at most timeoutMs for it. One still going then is
337
+ // left to finish: onLate gets its outcome when it settles.
338
+ async function runEntry(start, timeoutMs, onLate) {
339
+ var timer;
340
+ var running = Promise.resolve().then(start);
341
+ var timeout = new Promise(function (resolve) {
342
+ timer = setTimeout(function () { resolve(TIMED_OUT); }, timeoutMs);
343
+ });
344
+ try {
345
+ var value = await Promise.race([running, timeout]);
346
+ if (value === TIMED_OUT) {
347
+ running.then(function (late) { onLate(null, late); }, function (error) { onLate(error, null); });
348
+ return { timedOut: true };
349
+ }
350
+ return { timedOut: false, value: value };
351
+ } catch (error) {
352
+ return { timedOut: false, error: error };
353
+ } finally {
354
+ clearTimeout(timer);
355
+ }
356
+ }
357
+
358
+ // What a run's delivery records: a run that stopped at a Wait is waiting.
359
+ function runStatus(error, value) {
360
+ if (error) return 'failed';
361
+ return value && value.waiting === true ? 'waiting' : 'delivered';
362
+ }
363
+
364
+ // Whether a guarded write found its row (the claim it names still held it).
365
+ function wrote(result) {
366
+ return !!result && result.rowCount > 0;
367
+ }
368
+
369
+ function lateDeliveryWriter(delivery, testRun, resumePoint) {
370
+ return function (error, value) {
371
+ var message = error ? store.errorMessage(error) : null;
372
+ var status = testRun ? 'test' : runStatus(error, value);
373
+ store.withClient(async function (client) {
374
+ var finished = await client.query(FINISH_DELIVERY_SQL, [delivery.id, status, message, delivery.attempts]);
375
+ // Taken over meanwhile: the run that took it over owns the Wait too.
376
+ if (resumePoint && !error && wrote(finished)) await client.query(SETTLE_FAILED_WAIT_SQL, [resumePoint.id]);
377
+ }).catch(function (writeError) {
378
+ console.error('[automations] could not record a late run: ' + store.errorMessage(writeError));
379
+ });
380
+ };
381
+ }
382
+
383
+ function lateWaitWriter(wait, resumedAt) {
384
+ return function (error, value) {
385
+ if (error) console.error('[automations] ' + wait.workflow_id + ' failed after its Wait: ' + store.errorMessage(error));
386
+ // Nothing is written once another dispatcher took the stale resume over:
387
+ // that run records the outcome.
388
+ store.withClient(function (client) {
389
+ return finishResume(client, wait, runStatus(error, value), error ? store.errorMessage(error) : null, resumedAt);
390
+ }).catch(function (writeError) {
391
+ console.error('[automations] could not record a late resume: ' + store.errorMessage(writeError));
392
+ });
393
+ };
394
+ }
395
+
396
+ async function inTransaction(client, work) {
397
+ await client.query('BEGIN');
398
+ try {
399
+ var value = await work();
400
+ await client.query('COMMIT');
401
+ return value;
402
+ } catch (error) {
403
+ try { await client.query('ROLLBACK'); } catch (_e) {}
404
+ throw error;
405
+ }
406
+ }
407
+
408
+ // The catalog blocks of the type out of source (an envelope or a payload):
409
+ // everything but event and actor when the catalog does not describe the type.
410
+ function envelopeBlocks(type, source) {
411
+ var keys = own(ENVELOPE_KEYS, type);
412
+ var blocks = {};
413
+ Object.keys(source || {}).forEach(function (key) {
414
+ if (key === 'event' || key === 'actor' || key === '__test') return;
415
+ if (keys && keys.indexOf(key) === -1) return;
416
+ blocks[key] = source[key];
417
+ });
418
+ return blocks;
419
+ }
420
+
421
+ // The person a record names: an order's or a booking's customer, an
422
+ // account's or a subscriber's address, a review's author, a waitlist entry.
423
+ function entityEmail(block) {
424
+ if (!store.isPlainObject(block)) return null;
425
+ if (store.isPlainObject(block.customer) && block.customer.email) return String(block.customer.email);
426
+ if (store.isPlainObject(block.entry) && block.entry.email) return String(block.entry.email);
427
+ if (block.email) return String(block.email);
428
+ if (block.authorEmail) return String(block.authorEmail);
429
+ return null;
430
+ }
431
+
432
+ // Who caused it. For an event with a record, the address is the record's
433
+ // own: the ledger row (and its actor) can be written by a caller, the record
434
+ // cannot. The recorded actor is used only when the record names nobody.
435
+ function actorOf(row, envelope, entity, hydrated) {
436
+ var recorded = typeof row.actor === 'string' && row.actor.indexOf('@') !== -1 ? row.actor : null;
437
+ var recordEmail = hydrated ? entityEmail(envelope[entity]) : null;
438
+ return { type: row.actor_type || 'system', email: recordEmail || recorded };
439
+ }
440
+
441
+ // top laid over base, one level deep. A key top could not fill (undefined or
442
+ // null: the record has no such value) keeps base's value when base has one.
443
+ function overlay(base, top) {
444
+ var merged = Object.assign({}, base);
445
+ Object.keys(top).forEach(function (key) {
446
+ var value = top[key];
447
+ if (value === undefined) return;
448
+ if (value === null && merged[key] !== undefined && merged[key] !== null) return;
449
+ merged[key] = value;
450
+ });
451
+ return merged;
452
+ }
453
+
454
+ function refusal(message) {
455
+ var error = new Error(message);
456
+ error.refusal = true;
457
+ return error;
458
+ }
459
+
460
+ // The envelope every handler receives: { event, actor, <entity>, ... }. The
461
+ // record is read afresh and is the truth: laid OVER what the ledger row
462
+ // recorded (a caller could have written that row), whose other keys, and the
463
+ // values the record has none for, are kept.
464
+ // An event whose record is not there is refused ("No such <entity>"): the
465
+ // automations never act on a row nothing in the database stands behind.
466
+ // A read that fails (other than a table or column the project lacks) throws:
467
+ // the event is retried rather than delivered without its record.
468
+ async function buildEnvelope(client, row, context) {
469
+ var payload = store.parseJson(row.payload) || {};
470
+ var entity = own(ENTITY_BY_TYPE, row.event_type);
471
+ var hydrate = entity ? own(HYDRATORS, entity) : null;
472
+ var envelope = {
473
+ event: {
474
+ id: String(row.id),
475
+ type: row.event_type,
476
+ version: 1,
477
+ occurredAt: store.toIso(row.created_at),
478
+ test: false,
479
+ },
480
+ };
481
+ if (hydrate) {
482
+ Object.assign(envelope, (await hydrate(client, row, payload, { baseUrl: context.baseUrl })) || {});
483
+ if (!store.isPlainObject(envelope[entity]) && !Array.isArray(envelope[entity])) {
484
+ throw refusal('No such ' + (own(ENTITY_LABELS, entity) || entity));
485
+ }
486
+ }
487
+ var blocks = envelopeBlocks(row.event_type, payload);
488
+ Object.keys(blocks).forEach(function (key) {
489
+ var value = blocks[key];
490
+ if (store.isPlainObject(value) && store.isPlainObject(envelope[key])) {
491
+ envelope[key] = overlay(value, envelope[key]);
492
+ return;
493
+ }
494
+ // A hydrated event's flat values (an order's from / to) were read into
495
+ // its blocks by the hydrator.
496
+ if (hydrate && !store.isPlainObject(value) && !Array.isArray(value)) return;
497
+ if (!hydrate || !(key in envelope)) envelope[key] = value;
498
+ });
499
+ envelope.actor = actorOf(row, envelope, entity, !!hydrate);
500
+ return envelope;
501
+ }
502
+
503
+ async function claimEvents(client) {
504
+ return inTransaction(client, async function () {
505
+ var result = await client.query(CLAIM_EVENTS_SQL, [registryTypes(), registryWorkflowIds()]);
506
+ var rows = (result && result.rows) || [];
507
+ if (rows.length > 0) {
508
+ var marked = (await client.query(MARK_PENDING_SQL, [rows.map(function (row) { return row.id; })])).rows || [];
509
+ rows.forEach(function (row) {
510
+ var mark = marked.filter(function (m) { return String(m.id) === String(row.id); })[0];
511
+ row.claimedAt = mark ? mark.claimed_at : null;
512
+ });
513
+ }
514
+ return rows;
515
+ });
516
+ }
517
+
518
+ // The automations of the event that are on now, by workflow id.
519
+ async function enabledAutomations(client, row) {
520
+ var result = await client.query(EVENT_AUTOMATIONS_SQL, [row.id, registryWorkflowIds()]);
521
+ return ((result && result.rows) || []).map(function (a) { return a.workflow_id; });
522
+ }
523
+
524
+ // A stale event that used its last attempt: the runs it left running are
525
+ // timed out, then it settles from its delivery rows like any other (a 5th
526
+ // attempt that finished late, successfully, ends delivered). No handler starts.
527
+ async function settleExhausted(client, row) {
528
+ await client.query(TIME_OUT_DELIVERIES_SQL, [row.id]);
529
+ var enabled = await enabledAutomations(client, row);
530
+ await client.query(FINISH_EVENT_SQL, [row.id, await settledStatus(client, row, enabled), row.claimedAt]);
531
+ }
532
+
533
+ // What a claimed event goes back to when none of its automations ran.
534
+ function releasedStatus(row) {
535
+ return row.status === 'recorded' ? 'recorded' : 'failed';
536
+ }
537
+
538
+ // From the delivery rows of the automations that are on: pending while one
539
+ // is still running, failed when one failed, delivered when all were; an
540
+ // event the pass ran out of time for goes back to where it was.
541
+ async function settledStatus(client, row, workflowIds) {
542
+ var rows = ((await client.query(EVENT_DELIVERIES_SQL, [row.id])).rows) || [];
543
+ var byWorkflow = {};
544
+ rows.forEach(function (delivery) { byWorkflow[delivery.workflow_id] = delivery.status; });
545
+ var statuses = workflowIds.map(function (id) { return byWorkflow[id] || null; });
546
+ // Still open: a run going on, or one parked at a Wait.
547
+ if (statuses.indexOf('running') !== -1 || statuses.indexOf('waiting') !== -1) return 'pending';
548
+ if (statuses.indexOf('failed') !== -1) return 'failed';
549
+ // None on any more (all switched off since the claim): nothing was delivered.
550
+ if (statuses.length > 0 && statuses.every(function (status) { return status === 'delivered'; })) return 'delivered';
551
+ return releasedStatus(row);
552
+ }
553
+
554
+ async function failedWaitOf(client, eventId, workflowId) {
555
+ var result = await client.query(FAILED_WAIT_SQL, [eventId, workflowId]);
556
+ return (result && result.rows && result.rows[0]) || null;
557
+ }
558
+
559
+ // A run from its first step, or, for a retry of one that failed after a
560
+ // Wait, from the step after that Wait with the context the Wait stored.
561
+ function startRun(entry, envelope, resumePoint, baseUrl) {
562
+ return function () {
563
+ if (!resumePoint) return entry.run(envelope, { __baseUrl: baseUrl }, undefined);
564
+ var saved = store.parseJson(resumePoint.context) || {};
565
+ saved.__baseUrl = baseUrl;
566
+ return entry.run(envelope, saved, resumePoint.resume_node_id);
567
+ };
568
+ }
569
+
570
+ async function deliverEvent(client, row, context) {
571
+ var outcome = { delivered: 0, failed: 0 };
572
+ var enabled = await enabledAutomations(client, row);
573
+ // All switched off since the claim: nothing runs, so nothing is read or
574
+ // counted, and the event goes back as it was.
575
+ if (enabled.length === 0) {
576
+ await client.query(FINISH_EVENT_SQL, [row.id, releasedStatus(row), row.claimedAt]);
577
+ return outcome;
578
+ }
579
+ var envelope;
580
+ try {
581
+ envelope = await buildEnvelope(client, row, context);
582
+ } catch (error) {
583
+ if (!error || !error.refusal) throw error;
584
+ // No record behind the row: no automation runs. Each one's delivery says
585
+ // why; the event fails like any other (retried, in case the record was
586
+ // not committed yet, then given up).
587
+ console.warn('[automations] event ' + row.id + ' refused: ' + error.message);
588
+ for (var r = 0; r < enabled.length; r++) {
589
+ await client.query(REFUSE_DELIVERY_SQL, [row.id, enabled[r], error.message]);
590
+ }
591
+ await client.query(FAIL_EVENT_SQL, [row.id, row.claimedAt]);
592
+ outcome.failed = enabled.length;
593
+ return outcome;
594
+ }
595
+ var entries = (registry[row.event_type] || []).filter(function (entry) {
596
+ return enabled.indexOf(entry.workflowId) !== -1;
597
+ });
598
+ var counted = false;
599
+ for (var i = 0; i < entries.length; i++) {
600
+ if (Date.now() >= context.deadline) break;
601
+ var entry = entries[i];
602
+ var claimed = await client.query(CLAIM_DELIVERY_SQL, [row.id, entry.workflowId]);
603
+ var delivery = claimed && claimed.rows && claimed.rows[0];
604
+ if (!delivery) continue;
605
+ if (!counted) {
606
+ await client.query(COUNT_ATTEMPT_SQL, [row.id, row.claimedAt]);
607
+ counted = true;
608
+ }
609
+ // A retry of a run that failed after a Wait resumes after that Wait. A
610
+ // first attempt has no earlier run to resume.
611
+ var resumePoint = delivery.attempts > 1 ? await failedWaitOf(client, row.id, entry.workflowId) : null;
612
+ // Each handler gets its own copy: one run cannot change what the next reads.
613
+ var ran = await runEntry(
614
+ startRun(entry, JSON.parse(JSON.stringify(envelope)), resumePoint, context.baseUrl),
615
+ context.timeoutMs,
616
+ lateDeliveryWriter(delivery, false, resumePoint)
617
+ );
618
+ // Still running: its row stays running, so no dispatcher starts it again
619
+ // until the claim is stale.
620
+ if (ran.timedOut) {
621
+ console.warn('[automations] ' + entry.name + ' is still running for event ' + row.id + '; its outcome is recorded when it ends');
622
+ continue;
623
+ }
624
+ var error = ran.error ? store.errorMessage(ran.error) : null;
625
+ if (error) console.error('[automations] ' + entry.name + ' failed for event ' + row.id + ': ' + error);
626
+ // A run that stopped at a Wait is not finished: its delivery waits too.
627
+ var finished = await client.query(FINISH_DELIVERY_SQL, [delivery.id, runStatus(ran.error, ran.value), error, delivery.attempts]);
628
+ if (resumePoint && !error && wrote(finished)) await client.query(SETTLE_FAILED_WAIT_SQL, [resumePoint.id]);
629
+ if (error) outcome.failed += 1;
630
+ else outcome.delivered += 1;
631
+ }
632
+ await client.query(FINISH_EVENT_SQL, [row.id, await settledStatus(client, row, enabled), row.claimedAt]);
633
+ return outcome;
634
+ }
635
+
636
+ async function resumeWaits(client, context) {
637
+ var workflowIds = registryWorkflowIds();
638
+ if (workflowIds.length === 0 || Date.now() >= context.deadline) return 0;
639
+ var waits = await inTransaction(client, async function () {
640
+ var result = await client.query(CLAIM_WAITS_SQL, [workflowIds]);
641
+ var rows = (result && result.rows) || [];
642
+ if (rows.length === 0) return rows;
643
+ var marked = (await client.query(MARK_WAITS_SQL, [rows.map(function (wait) { return wait.id; })])).rows || [];
644
+ rows.forEach(function (wait) {
645
+ var mark = marked.filter(function (m) { return m.id === wait.id; })[0];
646
+ wait.claimedRunAt = mark ? mark.run_at : null;
647
+ });
648
+ return rows;
649
+ });
650
+ var resumed = 0;
651
+ for (var i = 0; i < waits.length; i++) {
652
+ var wait = waits[i];
653
+ if (Date.now() >= context.deadline) {
654
+ await client.query(RELEASE_WAIT_SQL, [wait.id, wait.claimedRunAt]);
655
+ continue;
656
+ }
657
+ var found = findAutomation(wait.workflow_id);
658
+ var envelope = null;
659
+ var eventRow = null;
660
+ var resumedAt = new Date();
661
+ try {
662
+ eventRow = ((await client.query(EVENT_BY_ID_SQL, [wait.event_id])).rows || [])[0] || null;
663
+ envelope = eventRow ? await buildEnvelope(client, eventRow, context) : null;
664
+ } catch (error) {
665
+ // Its record is gone: the parked run cannot go on.
666
+ if (error && error.refusal) {
667
+ console.warn('[automations] a Wait of ' + wait.workflow_id + ' cannot resume: ' + error.message);
668
+ await finishResumedRun(client, wait, eventRow, 'failed', error.message, resumedAt);
669
+ continue;
670
+ }
671
+ // The ledger, not the automation, failed: the Wait is resumed at the next kick.
672
+ console.error('[automations] could not read the event of a Wait: ' + store.errorMessage(error));
673
+ await client.query(RELEASE_WAIT_SQL, [wait.id, wait.claimedRunAt]);
674
+ continue;
675
+ }
676
+ var saved = store.parseJson(wait.context) || {};
677
+ saved.__baseUrl = context.baseUrl;
678
+ var ran = await runEntry(function () {
679
+ if (!found) throw new Error('This automation is no longer published');
680
+ return found.entry.run(envelope, saved, wait.resume_node_id);
681
+ }, context.timeoutMs, lateWaitWriter(wait, resumedAt));
682
+ if (ran.timedOut) continue;
683
+ if (ran.error) {
684
+ console.error('[automations] could not resume ' + wait.workflow_id + ' after its Wait: ' + store.errorMessage(ran.error));
685
+ } else {
686
+ resumed += 1;
687
+ }
688
+ await finishResumedRun(
689
+ client,
690
+ wait,
691
+ eventRow,
692
+ runStatus(ran.error, ran.value),
693
+ ran.error ? store.errorMessage(ran.error) : null,
694
+ resumedAt
695
+ );
696
+ }
697
+ return resumed;
698
+ }
699
+
700
+ // Settles the Wait and records the resumed run's outcome on its delivery, in
701
+ // one statement, only while this claim still holds the Wait; whether it did.
702
+ async function finishResume(client, wait, status, error, resumedAt) {
703
+ var waitStatus = status === 'failed' ? 'failed' : 'done';
704
+ return wrote(await client.query(FINISH_RESUME_SQL, [
705
+ waitStatus, wait.id, wait.claimedRunAt, status, error, resumedAt, wait.event_id, wait.workflow_id,
706
+ ]));
707
+ }
708
+
709
+ // The resume's outcome (see finishResume), then the event settled from its
710
+ // delivery rows like after any run (pending while something is still open,
711
+ // failed when a run failed, so Run again and the retries see it). Nothing
712
+ // when another dispatcher's claim holds the Wait now: that run settles it.
713
+ async function finishResumedRun(client, wait, eventRow, status, error, resumedAt) {
714
+ if (!(await finishResume(client, wait, status, error, resumedAt)) || !eventRow) return;
715
+ var enabled = await enabledAutomations(client, eventRow);
716
+ await client.query(FINISH_EVENT_SQL, [eventRow.id, await settledStatus(client, eventRow, enabled), eventRow.claimed_at]);
717
+ }
718
+
719
+ async function dispatchPass(context) {
720
+ var totals = { claimed: 0, delivered: 0, failed: 0, resumed: 0 };
721
+ if (registryTypes().length === 0) return totals;
722
+ await store.withClient(async function (client) {
723
+ var events = await claimEvents(client);
724
+ for (var i = 0; i < events.length; i++) {
725
+ var row = events[i];
726
+ // Settling starts no handler, so an exhausted event is settled even out
727
+ // of time: it never turns final with runs still marked running.
728
+ if (row.attempts >= MAX_ATTEMPTS) {
729
+ await settleExhausted(client, row);
730
+ continue;
731
+ }
732
+ // Out of time: the claims not started go back as they were.
733
+ if (Date.now() >= context.deadline) {
734
+ await client.query(FINISH_EVENT_SQL, [row.id, releasedStatus(row), row.claimedAt]);
735
+ continue;
736
+ }
737
+ totals.claimed += 1;
738
+ try {
739
+ var outcome = await deliverEvent(client, row, context);
740
+ totals.delivered += outcome.delivered;
741
+ totals.failed += outcome.failed;
742
+ } catch (error) {
743
+ console.error('[automations] could not deliver event ' + row.id + ': ' + store.errorMessage(error));
744
+ try { await client.query(FAIL_EVENT_SQL, [row.id, row.claimedAt]); } catch (_e) {}
745
+ }
746
+ }
747
+ totals.resumed = await resumeWaits(client, context);
748
+ });
749
+ return totals;
750
+ }
751
+
752
+ // One dispatcher per process at a time. A call while one runs joins it and
753
+ // asks for another pass, run while the time budget lasts. Once it is spent,
754
+ // nothing more starts in this call (the host stops it soon after): what the
755
+ // late caller recorded stays in the queue for the next kick.
756
+ var running = null;
757
+ var again = false;
758
+
759
+ function dispatch(options) {
760
+ if (running) {
761
+ again = true;
762
+ return running;
763
+ }
764
+ var settings = options || {};
765
+ var context = {
766
+ baseUrl: store.appBaseUrl(settings.req),
767
+ deadline: Date.now() + (settings.deadlineMs || PASS_DEADLINE_MS),
768
+ timeoutMs: settings.handlerTimeoutMs || HANDLER_TIMEOUT_MS,
769
+ };
770
+ running = (async function () {
771
+ var totals = { claimed: 0, delivered: 0, failed: 0, resumed: 0 };
772
+ do {
773
+ again = false;
774
+ var pass = await dispatchPass(context);
775
+ totals.claimed += pass.claimed;
776
+ totals.delivered += pass.delivered;
777
+ totals.failed += pass.failed;
778
+ totals.resumed += pass.resumed;
779
+ } while (again && Date.now() < context.deadline);
780
+ return totals;
781
+ })();
782
+ var current = running;
783
+ var settle = function () {
784
+ running = null;
785
+ again = false;
786
+ };
787
+ current.then(settle, settle);
788
+ return current;
789
+ }
790
+
791
+ function httpError(status, message) {
792
+ var error = new Error(message);
793
+ error.status = status;
794
+ return error;
795
+ }
796
+
797
+ // The editor's "send a test": runs ONE automation once, with the catalog
798
+ // blocks of the example it sends, switched on or not. It is recorded as a
799
+ // test (never claimed, never retried), and a Wait it meets stops the run and
800
+ // is reported as wouldWait instead of parking it.
801
+ async function runTest(input, options) {
802
+ var request = input || {};
803
+ var found = findAutomation(request.workflowId);
804
+ if (!found) throw httpError(404, 'This automation is not on the published site yet');
805
+ var source = store.isPlainObject(request.event) ? request.event : {};
806
+ var sourceType = source.event && source.event.type;
807
+ if (sourceType && sourceType !== found.type) {
808
+ throw httpError(400, 'The test is a ' + sourceType + ' event, and this automation reacts to ' + found.type);
809
+ }
810
+ var blocks = envelopeBlocks(found.type, source);
811
+ var actor = store.isPlainObject(source.actor) ? source.actor : {};
812
+ var settings = options || {};
813
+ var baseUrl = store.appBaseUrl(settings.req);
814
+ var timeoutMs = settings.handlerTimeoutMs || HANDLER_TIMEOUT_MS;
815
+ return store.withClient(async function (client) {
816
+ var event = (await client.query(INSERT_TEST_EVENT_SQL, [
817
+ found.type,
818
+ 'test:' + crypto.randomUUID(),
819
+ JSON.stringify(Object.assign({}, blocks, { __test: true })),
820
+ store.toText(actor.email),
821
+ store.toText(actor.type) || 'system',
822
+ ])).rows[0];
823
+ var delivery = (await client.query(START_TEST_DELIVERY_SQL, [event.id, found.entry.workflowId])).rows[0];
824
+ var envelope = Object.assign(
825
+ {
826
+ event: { id: String(event.id), type: found.type, version: 1, occurredAt: store.toIso(event.created_at), test: true },
827
+ actor: { type: store.toText(actor.type) || 'system', email: store.toText(actor.email) },
828
+ },
829
+ blocks
830
+ );
831
+ var totals = { claimed: 1, delivered: 0, failed: 0, resumed: 0 };
832
+ var ran = await runEntry(function () {
833
+ return found.entry.run(envelope, { __baseUrl: baseUrl }, undefined);
834
+ }, timeoutMs, lateDeliveryWriter(delivery, true));
835
+ if (ran.timedOut) return totals;
836
+ var wouldWait = ran.value && ran.value.wouldWait ? ran.value.wouldWait : null;
837
+ var note = ran.error ? store.errorMessage(ran.error) : wouldWait ? JSON.stringify({ wouldWait: wouldWait }) : null;
838
+ await client.query(FINISH_DELIVERY_SQL, [delivery.id, 'test', note, delivery.attempts]);
839
+ if (ran.error) totals.failed = 1;
840
+ else totals.delivered = 1;
841
+ if (wouldWait) totals.wouldWait = wouldWait;
842
+ return totals;
843
+ });
844
+ }
845
+
846
+ module.exports = { dispatch: dispatch, runTest: runTest };
847
+ `
848
+ }
849
+
850
+ /**
851
+ * `pages/api/automations/dispatch.js`: POST, for this app's own server code
852
+ * (the app secret in `x-internal-data-secret`) or a signed request (the cron
853
+ * signature, see cron-request-verification.ts). Runs the queue and answers
854
+ * `{ claimed, delivered, failed, resumed }`.
855
+ *
856
+ * `{ test: true, workflowId, event }` runs that one automation once instead
857
+ * and answers the same, plus `wouldWait` when the test met a Wait. A test acts
858
+ * on what its body says, so it is taken only from a signed request whose
859
+ * signature covers the body (`x-teleport-body-sha256`): 400 "Unsigned body"
860
+ * otherwise, and 400 naming what is missing when `workflowId` or `event` is.
861
+ * The route reads its body itself (`bodyParser: false`) to hash exactly what
862
+ * was sent. A request that presents none of the credentials is refused (401)
863
+ * before a byte of its body is read, unless the site allows unsigned calls (a
864
+ * local run, `TELEPORT_CRON_ALLOW_UNSIGNED`); a body over 64 KB is refused
865
+ * (413) without reading past it.
866
+ *
867
+ * A signed request is taken once: its execution id, bound into the signature,
868
+ * is remembered (`takeSignedRequest`, table `teleport_automation_requests`)
869
+ * for as long as that signature could still verify, and the same request
870
+ * again is refused (409) before anything runs. A captured request cannot run
871
+ * an automation a second time. When the database cannot say whether it was
872
+ * seen, the request is refused (503). The app's own calls (the app secret)
873
+ * name no execution and are never remembered.
874
+ */
875
+ export const generateAutomationDispatchRouteCode = (): string => {
876
+ const rootPrefix = AUTOMATIONS_DISPATCH_ROUTE_PATH.map(() => '..').join('/')
877
+ return `/**
878
+ * Automations dispatch route (generated): runs lib/automations/dispatcher.js.
879
+ */
880
+ var crypto = require('crypto');
881
+ var bus = require('${rootPrefix}/lib/automations/event-bus');
882
+ ${generateCronRequestVerificationCode({ bodyDigest: true })}
883
+
884
+ // A test event's example is a few KB; nothing the route takes is near this.
885
+ var MAX_BODY_BYTES = ${DISPATCH_MAX_BODY_BYTES};
886
+
887
+ function tooLarge() {
888
+ var error = new Error('The request body is too large');
889
+ error.status = 413;
890
+ return error;
891
+ }
892
+
893
+ // The body exactly as sent, up to MAX_BODY_BYTES: past that the route stops
894
+ // reading and refuses it.
895
+ function readBody(req) {
896
+ return new Promise(function (resolve, reject) {
897
+ if (req.body && Buffer.isBuffer(req.body)) {
898
+ if (req.body.length > MAX_BODY_BYTES) reject(tooLarge());
899
+ else resolve(req.body);
900
+ return;
901
+ }
902
+ if (Number(req.headers && req.headers['content-length']) > MAX_BODY_BYTES) {
903
+ reject(tooLarge());
904
+ return;
905
+ }
906
+ var chunks = [];
907
+ var size = 0;
908
+ var done = false;
909
+ req.on('data', function (chunk) {
910
+ if (done) return;
911
+ size += chunk.length;
912
+ if (size > MAX_BODY_BYTES) {
913
+ done = true;
914
+ reject(tooLarge());
915
+ return;
916
+ }
917
+ chunks.push(chunk);
918
+ });
919
+ req.on('end', function () {
920
+ if (done) return;
921
+ done = true;
922
+ resolve(Buffer.concat(chunks));
923
+ });
924
+ req.on('error', function (error) {
925
+ if (done) return;
926
+ done = true;
927
+ reject(error);
928
+ });
929
+ });
930
+ }
931
+
932
+ function parseBody(rawBody) {
933
+ try {
934
+ return JSON.parse(rawBody.toString('utf-8'));
935
+ } catch (_e) {
936
+ return {};
937
+ }
938
+ }
939
+
940
+ // What a caller can authenticate with: the app secret, the cron signature, or
941
+ // Vercel Cron's bearer token. One that presents none is refused unread.
942
+ function presentsCredentials(req) {
943
+ var headers = (req && req.headers) || {};
944
+ return !!(headers['x-internal-data-secret'] || headers['x-teleport-cron-signature'] || headers.authorization);
945
+ }
946
+
947
+ // Only server code can read NEXTAUTH_SECRET, so a browser cannot present it.
948
+ function presentsAppSecret(req) {
949
+ var given = req && req.headers ? req.headers['x-internal-data-secret'] : '';
950
+ var expected = process.env.NEXTAUTH_SECRET;
951
+ if (typeof given !== 'string' || !given || !expected) return false;
952
+ var a = Buffer.from(given);
953
+ var b = Buffer.from(String(expected));
954
+ return a.length === b.length && crypto.timingSafeEqual(a, b);
955
+ }
956
+
957
+ // A signature that covers this very body.
958
+ function signsBody(req, rawBody) {
959
+ return !!__cronHeader(req, '${CRON_BODY_DIGEST_HEADER}') && __verifyCronSignature(req, rawBody);
960
+ }
961
+
962
+ // A signed request is remembered for as long as its signature could verify
963
+ // (its timestamp may be that far off either way); after that it is refused
964
+ // as too old anyway.
965
+ var SIGNED_REQUEST_MEMORY_SECONDS = 2 * __CRON_SIGNATURE_TOLERANCE_SECONDS;
966
+
967
+ // What identifies a signed request: the execution it names, under its sender.
968
+ // A digest, so nothing a caller sent is stored as it was sent.
969
+ function signedRequestKey(req) {
970
+ var named = [
971
+ __cronHeader(req, 'x-teleport-project-id'),
972
+ __cronHeader(req, 'x-teleport-cron-id'),
973
+ __cronHeader(req, 'x-teleport-cron-execution-id'),
974
+ ];
975
+ return crypto.createHash('sha256').update(JSON.stringify(named)).digest('hex');
976
+ }
977
+
978
+ module.exports = async function handler(req, res) {
979
+ if (req.method !== 'POST') {
980
+ res.setHeader('Allow', 'POST');
981
+ res.status(405).json({ error: 'Method not allowed' });
982
+ return;
983
+ }
984
+ if (!presentsCredentials(req) && process.env.TELEPORT_CRON_ALLOW_UNSIGNED !== 'true') {
985
+ res.status(401).json({ error: 'Unauthorized' });
986
+ return;
987
+ }
988
+ var rawBody;
989
+ try {
990
+ rawBody = await readBody(req);
991
+ } catch (error) {
992
+ if (error && error.status === 413) {
993
+ res.status(413).json({ error: error.message });
994
+ return;
995
+ }
996
+ res.status(400).json({ error: 'The request body could not be read' });
997
+ return;
998
+ }
999
+ var signed = __verifyCronSignature(req, rawBody);
1000
+ if (!signed && !presentsAppSecret(req) && !verifyCronRequest(req, rawBody)) {
1001
+ res.status(401).json({ error: 'Unauthorized' });
1002
+ return;
1003
+ }
1004
+ if (signed) {
1005
+ var taken;
1006
+ try {
1007
+ taken = await bus.takeSignedRequest(
1008
+ signedRequestKey(req),
1009
+ Math.floor(Date.now() / 1000) + SIGNED_REQUEST_MEMORY_SECONDS
1010
+ );
1011
+ } catch (error) {
1012
+ console.error('[automations] could not check a signed request:', error);
1013
+ res.status(503).json({ error: 'The request could not be checked. Try again.' });
1014
+ return;
1015
+ }
1016
+ if (!taken) {
1017
+ res.status(409).json({ error: 'This request was already received' });
1018
+ return;
1019
+ }
1020
+ }
1021
+ var body = parseBody(rawBody);
1022
+ if (!body || typeof body !== 'object' || Array.isArray(body)) body = {};
1023
+ try {
1024
+ if (body.test === true) {
1025
+ if (!signsBody(req, rawBody)) {
1026
+ res.status(400).json({ error: 'Unsigned body' });
1027
+ return;
1028
+ }
1029
+ if (typeof body.workflowId !== 'string' || !body.workflowId) {
1030
+ res.status(400).json({ error: 'A test names the automation to run: workflowId is missing' });
1031
+ return;
1032
+ }
1033
+ if (!body.event || typeof body.event !== 'object') {
1034
+ res.status(400).json({ error: 'A test carries the event to send: event is missing' });
1035
+ return;
1036
+ }
1037
+ res.status(200).json(await bus.runTestEvent({ workflowId: body.workflowId, event: body.event }, req));
1038
+ return;
1039
+ }
1040
+ res.status(200).json(await bus.dispatch({ req: req }));
1041
+ } catch (error) {
1042
+ if (error && (error.status === 400 || error.status === 404)) {
1043
+ res.status(error.status).json({ error: error.message });
1044
+ return;
1045
+ }
1046
+ console.error('[automations] dispatch failed:', error);
1047
+ res.status(500).json({ error: 'Dispatch failed' });
1048
+ }
1049
+ };
1050
+
1051
+ // The body is read raw (see above). maxDuration is read by hosts that take a
1052
+ // function's time limit from its config (Vercel); Next.js itself reads only
1053
+ // config.api, so that key is otherwise inert.
1054
+ module.exports.config = { api: { bodyParser: false }, maxDuration: ${routeMaxDurationSeconds} };
1055
+ `
1056
+ }
1057
+
1058
+ /**
1059
+ * `pages/api/automations/dispatch.js` for a project whose automations cannot
1060
+ * run (no bus was generated, see generateAutomationFiles): every request is
1061
+ * answered 503 with the reason, so the editor's test-event proxy shows the
1062
+ * owner that sentence instead of a missing page.
1063
+ */
1064
+ export const generateAutomationsUnavailableRouteCode = (reason: string): string => `/**
1065
+ * Automations dispatch route (generated): automations do not run on this site.
1066
+ */
1067
+ var MESSAGE = ${JSON.stringify(`Automations are not set up on this site: ${reason}`)};
1068
+
1069
+ module.exports = function handler(req, res) {
1070
+ res.status(503).json({ error: MESSAGE });
1071
+ };
1072
+ `