@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,893 @@
1
+ import * as nodeCrypto from 'crypto'
2
+ import * as net from 'net'
3
+ import * as path from 'path'
4
+ import {
5
+ RATE_LIMITS_TABLE,
6
+ SECURITY_RUNTIME_FILE_KEY,
7
+ TOO_MANY_REQUESTS_MESSAGE,
8
+ ensureSecurityRuntimeModule,
9
+ generateSecurityRuntimeCode,
10
+ securityRuntimeSpecifier,
11
+ } from '../src/security-runtime'
12
+ import { NextWorkflowProjectPlugin } from '../src/workflow-project-plugin'
13
+ import { TableAccess } from '@teleporthq/teleport-shared'
14
+
15
+ /**
16
+ * The shared security runtime (`utils/security-runtime.js`) is EXECUTED here.
17
+ * Each `loadRuntime()` is one app instance — a fresh module, as every
18
+ * serverless instance loads its own — and instances handed the same
19
+ * `FakeDatabase` share one Postgres. The database answers exactly the
20
+ * statements below and refuses any other, so they are the statements on the
21
+ * wire; it applies the counter upsert in one step, as Postgres does for
22
+ * writers of one row.
23
+ */
24
+
25
+ const CREATE_SQL =
26
+ 'CREATE TABLE IF NOT EXISTS "teleport_rate_limits" (' +
27
+ '"key" TEXT NOT NULL, "window_start" BIGINT NOT NULL, "count" INTEGER NOT NULL DEFAULT 0, ' +
28
+ '"expires_at" BIGINT NOT NULL, PRIMARY KEY ("key", "window_start"))'
29
+ const INDEX_SQL =
30
+ 'CREATE INDEX IF NOT EXISTS "teleport_rate_limits_expires_at_idx" ' +
31
+ 'ON "teleport_rate_limits" ("expires_at")'
32
+ const LOCK_SQL = 'SELECT pg_advisory_xact_lock(hashtext($1))'
33
+ const HIT_SQL =
34
+ 'INSERT INTO "teleport_rate_limits" AS r ("key", "window_start", "count", "expires_at") ' +
35
+ 'VALUES ($1, $2, 1, $3) ' +
36
+ 'ON CONFLICT ("key", "window_start") DO UPDATE SET "count" = r."count" + 1 RETURNING "count"'
37
+ const CLEANUP_SQL =
38
+ 'DELETE FROM "teleport_rate_limits" WHERE ctid IN (SELECT ctid FROM "teleport_rate_limits" ' +
39
+ 'WHERE "expires_at" < $1 LIMIT 5000)'
40
+
41
+ /** 2026-10-25 00:00:00 UTC: a multiple of every window used below. */
42
+ const MIDNIGHT = Date.UTC(2026, 9, 25)
43
+ const MIDNIGHT_SEC = MIDNIGHT / 1000
44
+
45
+ interface Query {
46
+ sql: string
47
+ values: unknown[]
48
+ }
49
+
50
+ interface Row {
51
+ count: number
52
+ expiresAt: number
53
+ }
54
+
55
+ class FakeDatabase {
56
+ readonly rows = new Map<string, Row>()
57
+ readonly queries: Query[] = []
58
+ connects = 0
59
+ destroyed = 0
60
+ outage: Error | null = null
61
+ /** `connect`: connect() never settles; `query`: no query settles; `cleanup`: the DELETE never settles. */
62
+ hang: 'connect' | 'query' | 'cleanup' | null = null
63
+ connectDelayMs = 0
64
+ tableExists = false
65
+
66
+ rowKey(key: unknown, windowStart: unknown): string {
67
+ return `${key} @ ${windowStart}`
68
+ }
69
+
70
+ /** A row as an earlier request left it. */
71
+ seed(key: string, windowStart: number, windowSeconds: number, count: number): string {
72
+ const rowKey = this.rowKey(key, windowStart)
73
+ this.rows.set(rowKey, { count, expiresAt: windowStart + windowSeconds })
74
+ return rowKey
75
+ }
76
+
77
+ dropTable(): void {
78
+ this.tableExists = false
79
+ this.rows.clear()
80
+ }
81
+
82
+ answer(
83
+ sql: string,
84
+ values: unknown[]
85
+ ): { rows: Array<Record<string, unknown>>; rowCount: number } {
86
+ this.queries.push({ sql, values })
87
+ const none = { rows: [] as Array<Record<string, unknown>>, rowCount: 0 }
88
+ if (sql === 'BEGIN' || sql === 'COMMIT') {
89
+ return none
90
+ }
91
+ if (sql === LOCK_SQL) {
92
+ expect(values).toEqual([RATE_LIMITS_TABLE])
93
+ return none
94
+ }
95
+ if (sql === CREATE_SQL) {
96
+ this.tableExists = true
97
+ return none
98
+ }
99
+ if (sql === INDEX_SQL) {
100
+ expect(this.tableExists).toBe(true)
101
+ return none
102
+ }
103
+ if (!this.tableExists) {
104
+ throw Object.assign(new Error('relation "teleport_rate_limits" does not exist'), {
105
+ code: '42P01',
106
+ })
107
+ }
108
+ if (sql === HIT_SQL) {
109
+ const rowKey = this.rowKey(values[0], values[1])
110
+ const row = this.rows.get(rowKey) || { count: 0, expiresAt: Number(values[2]) }
111
+ row.count += 1
112
+ this.rows.set(rowKey, row)
113
+ return { rows: [{ count: row.count }], rowCount: 1 }
114
+ }
115
+ if (sql === CLEANUP_SQL) {
116
+ const now = Number(values[0])
117
+ let deleted = 0
118
+ for (const [rowKey, row] of Array.from(this.rows)) {
119
+ if (deleted < 5000 && row.expiresAt < now) {
120
+ this.rows.delete(rowKey)
121
+ deleted++
122
+ }
123
+ }
124
+ return { rows: [], rowCount: deleted }
125
+ }
126
+ throw new Error('unexpected SQL: ' + sql)
127
+ }
128
+
129
+ statements(sql: string): Query[] {
130
+ return this.queries.filter((query) => query.sql === sql)
131
+ }
132
+ }
133
+
134
+ const never = (): Promise<never> => new Promise<never>(() => undefined)
135
+
136
+ /** Lets every promise chain that is ready run (with real or fake timers). */
137
+ const settle = async (): Promise<void> => {
138
+ for (let i = 0; i < 50; i++) {
139
+ await Promise.resolve()
140
+ }
141
+ }
142
+
143
+ /** A `pg` module whose clients all talk to `db`. */
144
+ const pgDriverFor = (db: FakeDatabase): { Client: unknown } => {
145
+ class Client {
146
+ connection = {
147
+ stream: {
148
+ destroy: () => {
149
+ db.destroyed++
150
+ },
151
+ },
152
+ }
153
+ on(): void {
154
+ return undefined
155
+ }
156
+ async connect(): Promise<void> {
157
+ db.connects++
158
+ if (db.connectDelayMs) {
159
+ await new Promise((resolve) => setTimeout(resolve, db.connectDelayMs))
160
+ }
161
+ if (db.hang === 'connect') {
162
+ return never()
163
+ }
164
+ if (db.outage) {
165
+ throw db.outage
166
+ }
167
+ }
168
+ async query(sql: string, values: unknown[] = []) {
169
+ if (db.hang === 'query' || (db.hang === 'cleanup' && sql === CLEANUP_SQL)) {
170
+ db.queries.push({ sql, values })
171
+ return never()
172
+ }
173
+ return db.answer(sql, values)
174
+ }
175
+ end(): Promise<void> {
176
+ // A database that hangs never acknowledges the close either.
177
+ return db.hang ? never() : Promise.resolve()
178
+ }
179
+ }
180
+ return { Client }
181
+ }
182
+
183
+ interface Clock {
184
+ now: number
185
+ }
186
+
187
+ const DB_ENV = { TELEPORT_DB_CONNECTION_STRING: 'postgresql://app:secret@db.internal:5432/app' }
188
+
189
+ const loadRuntime = (
190
+ options: {
191
+ db?: FakeDatabase
192
+ env?: Record<string, string>
193
+ pgInstalled?: boolean
194
+ clock?: Clock
195
+ } = {}
196
+ ) => {
197
+ const env = options.env || (options.db ? DB_ENV : {})
198
+ const log = { warn: jest.fn(), error: jest.fn(), log: jest.fn(), info: jest.fn() }
199
+ const timingSafeEqual = jest.fn(nodeCrypto.timingSafeEqual)
200
+ const cryptoShim = { ...nodeCrypto, timingSafeEqual }
201
+ const requireShim = (id: string): unknown => {
202
+ if (id === 'crypto') {
203
+ return cryptoShim
204
+ }
205
+ if (id === 'net') {
206
+ return net
207
+ }
208
+ if (id === 'pg') {
209
+ if (!options.db || options.pgInstalled === false) {
210
+ throw new Error("Cannot find module 'pg'")
211
+ }
212
+ return pgDriverFor(options.db)
213
+ }
214
+ throw new Error('unexpected require: ' + id)
215
+ }
216
+ const clock = options.clock
217
+ const dateShim = clock ? { now: () => clock.now } : Date
218
+ const module = { exports: {} as any }
219
+ // eslint-disable-next-line no-new-func
220
+ new Function(
221
+ 'module',
222
+ 'exports',
223
+ 'require',
224
+ 'process',
225
+ 'console',
226
+ 'Buffer',
227
+ 'Date',
228
+ generateSecurityRuntimeCode()
229
+ )(module, module.exports, requireShim, { env }, log, Buffer, dateShim)
230
+ return { runtime: module.exports, log, timingSafeEqual }
231
+ }
232
+
233
+ const request = (headers: Record<string, string> = {}, remoteAddress?: string): any => ({
234
+ headers,
235
+ socket: remoteAddress ? { remoteAddress } : undefined,
236
+ })
237
+
238
+ const fakeResponse = (): any => {
239
+ const res: any = {
240
+ statusCode: 200,
241
+ headers: {} as Record<string, string>,
242
+ body: undefined as unknown,
243
+ headersSent: false,
244
+ setHeader(name: string, value: string) {
245
+ res.headers[name.toLowerCase()] = value
246
+ },
247
+ status(code: number) {
248
+ res.statusCode = code
249
+ return res
250
+ },
251
+ json(body: unknown) {
252
+ res.body = body
253
+ res.headersSent = true
254
+ return res
255
+ },
256
+ }
257
+ return res
258
+ }
259
+
260
+ describe('rateLimit — Postgres-backed', () => {
261
+ it('counts across two instances that share one database', async () => {
262
+ const db = new FakeDatabase()
263
+ const clock = { now: MIDNIGHT + 5000 }
264
+ const a = loadRuntime({ db, clock }).runtime
265
+ const b = loadRuntime({ db, clock }).runtime
266
+ const hit = (runtime: any) =>
267
+ runtime.rateLimit({ key: 'signin|203.0.113.7|ava@example.com', limit: 3, windowSeconds: 60 })
268
+
269
+ expect(await hit(a)).toEqual({ allowed: true, retryAfter: 0 })
270
+ expect(await hit(b)).toEqual({ allowed: true, retryAfter: 0 })
271
+ expect(await hit(a)).toEqual({ allowed: true, retryAfter: 0 })
272
+ expect(await hit(b)).toEqual({ allowed: false, retryAfter: 55 })
273
+ expect(await hit(a)).toEqual({ allowed: false, retryAfter: 55 })
274
+ // Side by side, too: one counter, every request counted once.
275
+ const burst = await Promise.all([hit(a), hit(b), hit(a), hit(b)])
276
+ expect(burst.every((result: any) => result.allowed === false)).toBe(true)
277
+
278
+ const hits = db.statements(HIT_SQL)
279
+ expect(hits).toHaveLength(9)
280
+ expect(new Set(hits.map((query) => query.values[0])).size).toBe(1)
281
+ expect(hits[0].values[0]).toMatch(/^60:[0-9a-f]{64}$/)
282
+ expect(hits[0].values.slice(1)).toEqual([MIDNIGHT_SEC, MIDNIGHT_SEC + 60])
283
+ expect(Array.from(db.rows.values())).toEqual([{ count: 9, expiresAt: MIDNIGHT_SEC + 60 }])
284
+ // The visitor's address and email never reach the table.
285
+ const wire = JSON.stringify(db.queries)
286
+ expect(wire).not.toContain('ava@example.com')
287
+ expect(wire).not.toContain('203.0.113.7')
288
+ })
289
+
290
+ it('creates its table and index once per instance, under an advisory lock', async () => {
291
+ const db = new FakeDatabase()
292
+ const clock = { now: MIDNIGHT + 5000 }
293
+ const { runtime } = loadRuntime({ db, clock })
294
+ await runtime.rateLimit({ key: 'k', limit: 5, windowSeconds: 60 })
295
+ await settle()
296
+ await runtime.rateLimit({ key: 'k', limit: 5, windowSeconds: 60 })
297
+ expect(db.queries.map((query) => query.sql)).toEqual([
298
+ 'BEGIN',
299
+ LOCK_SQL,
300
+ CREATE_SQL,
301
+ INDEX_SQL,
302
+ 'COMMIT',
303
+ HIT_SQL,
304
+ CLEANUP_SQL,
305
+ HIT_SQL,
306
+ ])
307
+ // A second instance creates them again (IF NOT EXISTS), under the same lock.
308
+ await loadRuntime({ db, clock }).runtime.rateLimit({ key: 'k', limit: 5, windowSeconds: 60 })
309
+ expect(db.statements(CREATE_SQL)).toHaveLength(2)
310
+ expect(db.statements(INDEX_SQL)).toHaveLength(2)
311
+ expect(db.statements(LOCK_SQL)).toHaveLength(2)
312
+ })
313
+
314
+ it('creates the table again, within the same request, when it went missing', async () => {
315
+ const db = new FakeDatabase()
316
+ const { runtime, log } = loadRuntime({ db, clock: { now: MIDNIGHT + 5000 } })
317
+ await runtime.rateLimit({ key: 'k', limit: 5, windowSeconds: 60 })
318
+ // Dropped, or the database restored from a backup taken before it existed.
319
+ db.dropTable()
320
+ expect(await runtime.rateLimit({ key: 'k', limit: 5, windowSeconds: 60 })).toEqual({
321
+ allowed: true,
322
+ retryAfter: 0,
323
+ })
324
+ expect(db.statements(CREATE_SQL)).toHaveLength(2)
325
+ // Counted in the database, not in memory.
326
+ expect(Array.from(db.rows.values()).map((row) => row.count)).toEqual([1])
327
+ expect(log.error).not.toHaveBeenCalled()
328
+ })
329
+
330
+ it('keeps one counter per window length, so a minute and a day limit never share a row', async () => {
331
+ const db = new FakeDatabase()
332
+ const { runtime } = loadRuntime({ db, clock: { now: MIDNIGHT } })
333
+ const perMinute = { key: 'segment|203.0.113.7', limit: 1, windowSeconds: 60 }
334
+ const perDay = { key: 'segment|203.0.113.7', limit: 1, windowSeconds: 86400 }
335
+ expect((await runtime.rateLimit(perMinute)).allowed).toBe(true)
336
+ // At midnight both windows start at the same second.
337
+ expect((await runtime.rateLimit(perDay)).allowed).toBe(true)
338
+ expect((await runtime.rateLimit(perMinute)).allowed).toBe(false)
339
+ expect((await runtime.rateLimit(perDay)).retryAfter).toBe(86400)
340
+ })
341
+
342
+ it('starts a new count in the next window and tells a refused caller how long to wait', async () => {
343
+ const db = new FakeDatabase()
344
+ const clock = { now: MIDNIGHT + 50_000 }
345
+ const { runtime } = loadRuntime({ db, clock })
346
+ const once = { key: 'k', limit: 1, windowSeconds: 60 }
347
+ expect(await runtime.rateLimit(once)).toEqual({ allowed: true, retryAfter: 0 })
348
+ expect(await runtime.rateLimit(once)).toEqual({ allowed: false, retryAfter: 10 })
349
+ clock.now += 10_000
350
+ expect(await runtime.rateLimit(once)).toEqual({ allowed: true, retryAfter: 0 })
351
+ })
352
+
353
+ it('deletes windows that are over in the background, in batches, at most once per instance a minute', async () => {
354
+ const db = new FakeDatabase()
355
+ const clock = { now: MIDNIGHT + 30_000 }
356
+ const nowSec = MIDNIGHT_SEC + 30
357
+ for (let i = 0; i < 16_000; i++) {
358
+ db.seed('60:over-' + i, MIDNIGHT_SEC - 120, 60, 1)
359
+ }
360
+ const runningDay = db.seed('86400:running', MIDNIGHT_SEC - 3600, 86400, 9)
361
+ const overRows = () => Array.from(db.rows.keys()).filter((key) => key.startsWith('60:over-'))
362
+ const { runtime } = loadRuntime({ db, clock })
363
+
364
+ await runtime.rateLimit({ key: 'k', limit: 5, windowSeconds: 60 })
365
+ await settle()
366
+ // Three batches of 5,000 a pass: 1,000 of the 16,000 wait for the next one.
367
+ expect(db.statements(CLEANUP_SQL).map((query) => query.values)).toEqual([
368
+ [nowSec],
369
+ [nowSec],
370
+ [nowSec],
371
+ ])
372
+ expect(overRows()).toHaveLength(1000)
373
+ expect(db.rows.get(runningDay)!.count).toBe(9)
374
+
375
+ clock.now += 59_000
376
+ await runtime.rateLimit({ key: 'k', limit: 5, windowSeconds: 60 })
377
+ await settle()
378
+ expect(db.statements(CLEANUP_SQL)).toHaveLength(3)
379
+ clock.now += 1_000
380
+ await runtime.rateLimit({ key: 'k', limit: 5, windowSeconds: 60 })
381
+ await settle()
382
+ expect(db.statements(CLEANUP_SQL)).toHaveLength(4)
383
+ expect(overRows()).toHaveLength(0)
384
+ expect(db.rows.get(runningDay)!.count).toBe(9)
385
+ })
386
+
387
+ it('counts in memory through a database outage, logs it once, and probes one request at a time', async () => {
388
+ const db = new FakeDatabase()
389
+ const clock = { now: MIDNIGHT + 1000 }
390
+ const { runtime, log } = loadRuntime({ db, clock })
391
+ const hit = () => runtime.rateLimit({ key: 'k', limit: 2, windowSeconds: 60 })
392
+ db.outage = Object.assign(new Error('connect ECONNREFUSED 10.0.0.9:5432'), {
393
+ code: 'ECONNREFUSED',
394
+ })
395
+
396
+ expect(await hit()).toEqual({ allowed: true, retryAfter: 0 })
397
+ expect(await hit()).toEqual({ allowed: true, retryAfter: 0 })
398
+ // Still limited: in this instance's memory, never opened.
399
+ expect(await hit()).toEqual({ allowed: false, retryAfter: 59 })
400
+ // The database is not asked again for 30 seconds.
401
+ expect(db.connects).toBe(1)
402
+ expect(log.error).toHaveBeenCalledTimes(1)
403
+ expect(log.error.mock.calls[0][0]).toContain('ECONNREFUSED')
404
+
405
+ // After the back-off one request probes; the ones beside it count in memory.
406
+ clock.now += 30_000
407
+ await Promise.all([hit(), hit(), hit()])
408
+ expect(db.connects).toBe(2)
409
+
410
+ db.outage = null
411
+ clock.now += 30_000
412
+ expect(await hit()).toEqual({ allowed: true, retryAfter: 0 })
413
+ expect(db.connects).toBe(3)
414
+ expect(db.statements(HIT_SQL)).toHaveLength(1)
415
+ // Healthy again: requests side by side all count in the database.
416
+ await Promise.all([hit(), hit()])
417
+ expect(db.statements(HIT_SQL)).toHaveLength(3)
418
+
419
+ // A new outage is a new log line.
420
+ db.outage = new Error('Connection terminated unexpectedly')
421
+ clock.now += 1000
422
+ await hit()
423
+ expect(log.error).toHaveBeenCalledTimes(2)
424
+ })
425
+ })
426
+
427
+ // The runner is Jest 26, whose modern timers fake the clock too; the installed
428
+ // @types/jest predates them.
429
+ const modernTimers = jest as unknown as { useFakeTimers(implementation: 'modern'): void }
430
+
431
+ describe('rateLimit — a database that does not answer', () => {
432
+ beforeEach(() => {
433
+ modernTimers.useFakeTimers('modern')
434
+ })
435
+ afterEach(() => {
436
+ jest.useRealTimers()
437
+ })
438
+
439
+ const track = (promise: Promise<unknown>) => {
440
+ const state: { done: boolean; result: any } = { done: false, result: undefined }
441
+ promise.then((result) => {
442
+ state.done = true
443
+ state.result = result
444
+ })
445
+ return state
446
+ }
447
+
448
+ it('gives up on a connect after 1 s, never waits for the close, and backs off without new connections', async () => {
449
+ const db = new FakeDatabase()
450
+ db.hang = 'connect'
451
+ const { runtime, log } = loadRuntime({ db })
452
+ const once = { key: 'k', limit: 1, windowSeconds: 3600 }
453
+
454
+ const first = track(runtime.rateLimit(once))
455
+ await settle()
456
+ jest.advanceTimersByTime(999)
457
+ await settle()
458
+ expect(first.done).toBe(false)
459
+ jest.advanceTimersByTime(1)
460
+ await settle()
461
+ // Counted in memory; the hung socket destroyed; its end() (which never
462
+ // resolves here) not awaited.
463
+ expect(first.result).toEqual({ allowed: true, retryAfter: 0 })
464
+ expect(db.destroyed).toBe(1)
465
+ expect(log.error).toHaveBeenCalledTimes(1)
466
+
467
+ // Backing off: a burst answers at once, from memory, without a connection.
468
+ const burst = [track(runtime.rateLimit(once)), track(runtime.rateLimit(once))]
469
+ await settle()
470
+ expect(burst.map((state) => state.result && state.result.allowed)).toEqual([false, false])
471
+ expect(db.connects).toBe(1)
472
+
473
+ // After the back-off a single probe goes out; a request beside it does not wait for it.
474
+ jest.advanceTimersByTime(30_000)
475
+ const probe = track(runtime.rateLimit(once))
476
+ const beside = track(runtime.rateLimit(once))
477
+ await settle()
478
+ expect(beside.done).toBe(true)
479
+ expect(probe.done).toBe(false)
480
+ expect(db.connects).toBe(2)
481
+ jest.advanceTimersByTime(1000)
482
+ await settle()
483
+ expect(probe.done).toBe(true)
484
+ })
485
+
486
+ it('holds a request at most 1.5 s on the database in all', async () => {
487
+ const db = new FakeDatabase()
488
+ db.connectDelayMs = 900
489
+ db.hang = 'query'
490
+ const { runtime } = loadRuntime({ db })
491
+ const call = track(runtime.rateLimit({ key: 'k', limit: 5, windowSeconds: 60 }))
492
+ await settle()
493
+ jest.advanceTimersByTime(900)
494
+ await settle()
495
+ expect(call.done).toBe(false)
496
+ // The connect took 900 ms: the hung query gets the 600 ms left, not a full second.
497
+ jest.advanceTimersByTime(599)
498
+ await settle()
499
+ expect(call.done).toBe(false)
500
+ jest.advanceTimersByTime(1)
501
+ await settle()
502
+ expect(call.result).toEqual({ allowed: true, retryAfter: 0 })
503
+ expect(db.destroyed).toBe(1)
504
+ })
505
+
506
+ it('never makes a request wait for the cleanup, and cuts off a cleanup that hangs', async () => {
507
+ const db = new FakeDatabase()
508
+ db.hang = 'cleanup'
509
+ const { runtime } = loadRuntime({ db })
510
+ const call = track(runtime.rateLimit({ key: 'k', limit: 5, windowSeconds: 60 }))
511
+ await settle()
512
+ expect(call.result).toEqual({ allowed: true, retryAfter: 0 })
513
+ expect(db.statements(CLEANUP_SQL)).toHaveLength(1)
514
+ expect(db.destroyed).toBe(0)
515
+ jest.advanceTimersByTime(5000)
516
+ await settle()
517
+ expect(db.destroyed).toBe(1)
518
+ })
519
+ })
520
+
521
+ describe('rateLimit — no database', () => {
522
+ it('counts in a per-instance memory map and says so once', async () => {
523
+ const clock = { now: MIDNIGHT + 1000 }
524
+ const { runtime, log } = loadRuntime({ clock })
525
+ const hit = (target: any) => target.rateLimit({ key: 'k', limit: 2, windowSeconds: 60 })
526
+ expect((await hit(runtime)).allowed).toBe(true)
527
+ expect((await hit(runtime)).allowed).toBe(true)
528
+ expect(await hit(runtime)).toEqual({ allowed: false, retryAfter: 59 })
529
+ expect(log.warn).toHaveBeenCalledTimes(1)
530
+ expect(log.warn.mock.calls[0][0]).toContain('per server instance')
531
+ // The documented limit of the fallback: another instance counts on its own.
532
+ expect((await hit(loadRuntime({ clock }).runtime)).allowed).toBe(true)
533
+ })
534
+
535
+ it('uses memory when the database is configured but the pg driver is not installed', async () => {
536
+ const db = new FakeDatabase()
537
+ const { runtime } = loadRuntime({ db, pgInstalled: false, clock: { now: MIDNIGHT } })
538
+ await runtime.rateLimit({ key: 'k', limit: 1, windowSeconds: 60 })
539
+ expect((await runtime.rateLimit({ key: 'k', limit: 1, windowSeconds: 60 })).allowed).toBe(false)
540
+ expect(db.queries).toHaveLength(0)
541
+ })
542
+
543
+ it('holds at most 10,000 windows, dropping the oldest first', async () => {
544
+ const { runtime } = loadRuntime({ clock: { now: MIDNIGHT } })
545
+ const once = (key: string) => runtime.rateLimit({ key, limit: 1, windowSeconds: 3600 })
546
+ expect((await once('first')).allowed).toBe(true)
547
+ expect((await once('first')).allowed).toBe(false)
548
+ for (let i = 0; i < 10000; i++) {
549
+ await once('other-' + i)
550
+ }
551
+ expect((await once('first')).allowed).toBe(true)
552
+ expect((await once('other-9999')).allowed).toBe(false)
553
+ })
554
+
555
+ it('refuses to run with a key, limit or window it cannot count', async () => {
556
+ const { runtime } = loadRuntime()
557
+ for (const options of [
558
+ { key: '', limit: 1, windowSeconds: 60 },
559
+ { key: 'k', limit: 0, windowSeconds: 60 },
560
+ { key: 'k', limit: 1, windowSeconds: 0 },
561
+ { key: 'k', limit: undefined, windowSeconds: 60 },
562
+ { key: 'k', limit: 1, windowSeconds: Number.NaN },
563
+ undefined,
564
+ ]) {
565
+ await expect(runtime.rateLimit(options)).rejects.toThrow(TypeError)
566
+ }
567
+ })
568
+ })
569
+
570
+ describe('clientIp', () => {
571
+ const { runtime } = loadRuntime()
572
+ const onVercel = loadRuntime({ env: { VERCEL: '1' } }).runtime
573
+
574
+ it('on Vercel reads the address the edge set, never a hop the visitor wrote', () => {
575
+ expect(
576
+ onVercel.clientIp(
577
+ request(
578
+ {
579
+ 'x-vercel-forwarded-for': '203.0.113.7',
580
+ 'x-real-ip': '198.51.100.1',
581
+ 'x-forwarded-for': '6.6.6.6, 198.51.100.1',
582
+ },
583
+ '10.1.2.3'
584
+ )
585
+ )
586
+ ).toBe('203.0.113.7')
587
+ expect(
588
+ onVercel.clientIp(request({ 'x-real-ip': '198.51.100.1', 'x-forwarded-for': '6.6.6.6' }))
589
+ ).toBe('198.51.100.1')
590
+ // An edge that appended to a visitor's list wrote the last entry.
591
+ expect(onVercel.clientIp(request({ 'x-vercel-forwarded-for': '6.6.6.6, 203.0.113.7' }))).toBe(
592
+ '203.0.113.7'
593
+ )
594
+ })
595
+
596
+ it('elsewhere trusts X-Forwarded-For only from a proxy on a private address, and only its last hop', () => {
597
+ const spoofed = {
598
+ 'x-forwarded-for': '6.6.6.6',
599
+ 'x-real-ip': '6.6.6.6',
600
+ 'x-vercel-forwarded-for': '6.6.6.6',
601
+ }
602
+ // A visitor connecting directly: its own socket address, whatever it wrote.
603
+ expect(runtime.clientIp(request(spoofed, '203.0.113.7'))).toBe('203.0.113.7')
604
+ // Behind a proxy: the hop the proxy appended, not the one the visitor wrote.
605
+ expect(
606
+ runtime.clientIp(request({ 'x-forwarded-for': '6.6.6.6, 203.0.113.7' }, '10.0.0.5'))
607
+ ).toBe('203.0.113.7')
608
+ expect(
609
+ runtime.clientIp(request({ 'x-forwarded-for': '6.6.6.6,203.0.113.7' }, '::ffff:127.0.0.1'))
610
+ ).toBe('203.0.113.7')
611
+ expect(
612
+ runtime.clientIp(request({ 'x-forwarded-for': '6.6.6.6, 203.0.113.7' }, 'fd12::5'))
613
+ ).toBe('203.0.113.7')
614
+ // A last hop that is not an address: the proxy's own address, never an earlier hop.
615
+ expect(
616
+ runtime.clientIp(request({ 'x-forwarded-for': '203.0.113.7, not-an-ip' }, '10.0.0.5'))
617
+ ).toBe('10.0.0.5')
618
+ // `fc::1` is 00fc::1, a public address, not a proxy on a private network.
619
+ expect(runtime.clientIp(request({ 'x-forwarded-for': '6.6.6.6' }, 'fc::1'))).toBe('fc::1')
620
+ expect(runtime.clientIp(request({ 'x-forwarded-for': '6.6.6.6' }))).toBe('unknown')
621
+ expect(runtime.clientIp(undefined)).toBe('unknown')
622
+ })
623
+
624
+ it('with TQ_TRUSTED_PROXY=none reads the socket address only, even from a private peer or on Vercel', () => {
625
+ // Docker port publishing, a NodePort, any SNAT: every visitor arrives from a
626
+ // private address with no proxy in front, and writes its own X-Forwarded-For.
627
+ const direct = request(
628
+ { 'x-forwarded-for': '6.6.6.6', 'x-vercel-forwarded-for': '6.6.6.6', 'x-real-ip': '6.6.6.6' },
629
+ '172.17.0.1'
630
+ )
631
+ expect(runtime.clientIp(direct)).toBe('6.6.6.6')
632
+ const none = loadRuntime({ env: { TQ_TRUSTED_PROXY: 'none', VERCEL: '1' } }).runtime
633
+ expect(none.clientIp(direct)).toBe('172.17.0.1')
634
+ })
635
+
636
+ it('with TQ_TRUSTED_PROXY=vercel reads the Vercel edge headers only', () => {
637
+ const vercel = loadRuntime({ env: { TQ_TRUSTED_PROXY: 'vercel' } }).runtime
638
+ expect(vercel.clientIp(request({ 'x-vercel-forwarded-for': '203.0.113.7' }, '10.0.0.5'))).toBe(
639
+ '203.0.113.7'
640
+ )
641
+ expect(vercel.clientIp(request({ 'x-forwarded-for': '6.6.6.6' }, '10.0.0.5'))).toBe('10.0.0.5')
642
+ })
643
+
644
+ it('keeps the default for an unknown TQ_TRUSTED_PROXY and says so once', () => {
645
+ const odd = loadRuntime({ env: { TQ_TRUSTED_PROXY: 'cloudflare' } })
646
+ const behindProxy = request({ 'x-forwarded-for': '6.6.6.6, 203.0.113.7' }, '10.0.0.5')
647
+ expect(odd.runtime.clientIp(behindProxy)).toBe('203.0.113.7')
648
+ expect(odd.runtime.clientIp(behindProxy)).toBe('203.0.113.7')
649
+ expect(odd.log.warn).toHaveBeenCalledTimes(1)
650
+ expect(odd.log.warn.mock.calls[0][0]).toContain('TQ_TRUSTED_PROXY')
651
+ })
652
+
653
+ it('normalizes the forms an address arrives in', () => {
654
+ expect(runtime.clientIp(request({}, '::ffff:203.0.113.9'))).toBe('203.0.113.9')
655
+ expect(runtime.clientIp(request({}, '::ffff:cb00:7109'))).toBe('203.0.113.9')
656
+ expect(runtime.clientIp(request({ 'x-forwarded-for': '203.0.113.7' }, '::ffff:a00:5'))).toBe(
657
+ '203.0.113.7'
658
+ )
659
+ expect(runtime.clientIp(request({ 'x-forwarded-for': '[2001:DB8::1]:443' }, '10.0.0.5'))).toBe(
660
+ '2001:db8::1'
661
+ )
662
+ expect(
663
+ runtime.clientIp(request({ 'x-forwarded-for': '203.0.113.9:5555' }, '192.168.1.1'))
664
+ ).toBe('203.0.113.9')
665
+ })
666
+ })
667
+
668
+ describe('rateLimitRequest', () => {
669
+ const opts = { scope: 'auth-signup', limit: 2, windowSeconds: 3600 }
670
+
671
+ it('answers 429 with Retry-After and the public message, keyed by scope, client and parts', async () => {
672
+ const db = new FakeDatabase()
673
+ const { runtime } = loadRuntime({
674
+ db,
675
+ env: { ...DB_ENV, VERCEL: '1' },
676
+ clock: { now: MIDNIGHT + 20_000 },
677
+ })
678
+ const from = (ip: string) => request({ 'x-vercel-forwarded-for': ip })
679
+
680
+ const first = fakeResponse()
681
+ expect(await runtime.rateLimitRequest(from('203.0.113.7'), first, opts)).toBe(true)
682
+ expect(first.body).toBeUndefined()
683
+ expect(await runtime.rateLimitRequest(from('203.0.113.7'), fakeResponse(), opts)).toBe(true)
684
+ const refused = fakeResponse()
685
+ expect(await runtime.rateLimitRequest(from('203.0.113.7'), refused, opts)).toBe(false)
686
+ expect(refused.statusCode).toBe(429)
687
+ expect(refused.body).toEqual({ error: 'Too many requests. Try again later.' })
688
+ expect(TOO_MANY_REQUESTS_MESSAGE).toBe('Too many requests. Try again later.')
689
+ expect(refused.headers['retry-after']).toBe('3580')
690
+
691
+ // Another visitor, another route, another account: each its own counter.
692
+ expect(await runtime.rateLimitRequest(from('198.51.100.4'), fakeResponse(), opts)).toBe(true)
693
+ expect(
694
+ await runtime.rateLimitRequest(from('203.0.113.7'), fakeResponse(), {
695
+ ...opts,
696
+ scope: 'auth-signin',
697
+ })
698
+ ).toBe(true)
699
+ expect(
700
+ await runtime.rateLimitRequest(from('203.0.113.7'), fakeResponse(), {
701
+ ...opts,
702
+ keyParts: ['ava@example.com'],
703
+ })
704
+ ).toBe(true)
705
+ // Parts are kept apart, not joined: ['a|b'] is not ['a', 'b'].
706
+ const parts = async (keyParts: string[]) =>
707
+ runtime.rateLimitRequest(from('192.0.2.1'), fakeResponse(), { ...opts, limit: 1, keyParts })
708
+ expect(await parts(['a|b'])).toBe(true)
709
+ expect(await parts(['a', 'b'])).toBe(true)
710
+ })
711
+
712
+ it('counts every address of one IPv6 /64 as one visitor', async () => {
713
+ const { runtime } = loadRuntime({ env: { VERCEL: '1' }, clock: { now: MIDNIGHT } })
714
+ const from = (ip: string) => request({ 'x-vercel-forwarded-for': ip })
715
+ const once = { ...opts, limit: 1 }
716
+ expect(await runtime.rateLimitRequest(from('2001:db8:1:2::1'), fakeResponse(), once)).toBe(true)
717
+ expect(
718
+ await runtime.rateLimitRequest(from('2001:db8:1:2:ffff:0:0:9'), fakeResponse(), once)
719
+ ).toBe(false)
720
+ expect(await runtime.rateLimitRequest(from('2001:db8:1:3::1'), fakeResponse(), once)).toBe(true)
721
+ })
722
+
723
+ it('exports the visitor key every limiter of the app keys a visitor by', () => {
724
+ const { runtime } = loadRuntime({ clock: { now: MIDNIGHT } })
725
+ expect(runtime.visitorKey('203.0.113.7')).toBe('203.0.113.7')
726
+ expect(runtime.visitorKey('unknown')).toBe('unknown')
727
+ expect(runtime.visitorKey('2001:db8:1:2:ffff:0:0:9')).toBe('2001:db8:1:2::/64')
728
+ expect(runtime.visitorKey('2001:db8:1:2::9')).toBe('2001:db8:1:2::/64')
729
+ // An IPv4 tail fills two groups: 2001:db8::5:6:7:a.b.c.d is in 2001:db8:0:5::/64.
730
+ expect(runtime.visitorKey('2001:db8::5:6:7:198.51.100.7')).toBe('2001:db8:0:5::/64')
731
+ // An IPv4-mapped address is the IPv4 visitor once clientIp has read it.
732
+ expect(runtime.visitorKey(runtime.clientIp(request({}, '::ffff:198.51.100.7')))).toBe(
733
+ '198.51.100.7'
734
+ )
735
+ })
736
+
737
+ it('cannot be dodged by rotating X-Forwarded-For', async () => {
738
+ const { runtime } = loadRuntime({ clock: { now: MIDNIGHT } })
739
+ const results: boolean[] = []
740
+ for (let i = 1; i <= 3; i++) {
741
+ results.push(
742
+ await runtime.rateLimitRequest(
743
+ request({ 'x-forwarded-for': '6.6.6.' + i }, '203.0.113.7'),
744
+ fakeResponse(),
745
+ { ...opts, limit: 1 }
746
+ )
747
+ )
748
+ }
749
+ expect(results).toEqual([true, false, false])
750
+ })
751
+
752
+ it('refuses to run without a scope', async () => {
753
+ const { runtime } = loadRuntime()
754
+ await expect(
755
+ runtime.rateLimitRequest(request({}, '203.0.113.7'), fakeResponse(), { ...opts, scope: '' })
756
+ ).rejects.toThrow(TypeError)
757
+ })
758
+ })
759
+
760
+ describe('safeEqual', () => {
761
+ it('compares in constant time and is false for anything missing, mismatched or odd', () => {
762
+ const { runtime, timingSafeEqual } = loadRuntime()
763
+ expect(runtime.safeEqual('s3cret-token', 's3cret-token')).toBe(true)
764
+ expect(timingSafeEqual).toHaveBeenCalledTimes(1)
765
+ expect(runtime.safeEqual('s3cret-token', 's3cret-tokeN')).toBe(false)
766
+ expect(runtime.safeEqual('s3cret-token', 's3cret')).toBe(false)
767
+ expect(runtime.safeEqual(Buffer.from('ab'), 'ab')).toBe(true)
768
+ const odd: Array<[unknown, unknown]> = [
769
+ [undefined, 'x'],
770
+ ['x', undefined],
771
+ [null, null],
772
+ ['', ''],
773
+ [undefined, undefined],
774
+ [123, 123],
775
+ [{}, {}],
776
+ [['a'], ['a']],
777
+ [Symbol('a'), 'a'],
778
+ ]
779
+ for (const [a, b] of odd) {
780
+ expect(runtime.safeEqual(a, b)).toBe(false)
781
+ }
782
+ })
783
+ })
784
+
785
+ describe('sendClientError', () => {
786
+ it('answers a generic message and an opaque id, and logs the detail server-side only', () => {
787
+ const { runtime, log } = loadRuntime()
788
+ const err = new Error(
789
+ 'relation "orders" does not exist; Secret not found: OPENAI_API_KEY at /var/task/x.js'
790
+ )
791
+ const res = fakeResponse()
792
+ const id = runtime.sendClientError(res, 500, 'Something went wrong.', err)
793
+ expect(id).toMatch(/^[0-9a-f]{16}$/)
794
+ expect(res.statusCode).toBe(500)
795
+ expect(res.body).toEqual({ error: 'Something went wrong.', id })
796
+ expect(JSON.stringify(res.body)).not.toMatch(/orders|OPENAI_API_KEY|Secret not found|var\/task/)
797
+ expect(log.error).toHaveBeenCalledWith(expect.stringContaining(id), err)
798
+
799
+ expect(runtime.sendClientError(fakeResponse(), 400, 'Invalid request.')).not.toBe(id)
800
+ })
801
+
802
+ it('keeps a sane status, leaves a sent response alone, and answers a plain Node response', () => {
803
+ const { runtime } = loadRuntime()
804
+ const odd = fakeResponse()
805
+ runtime.sendClientError(odd, 200, 'Request failed.')
806
+ expect(odd.statusCode).toBe(500)
807
+
808
+ const sent = fakeResponse()
809
+ sent.headersSent = true
810
+ runtime.sendClientError(sent, 500, 'Something went wrong.', new Error('late'))
811
+ expect(sent.body).toBeUndefined()
812
+
813
+ const plain: any = { statusCode: 200, headers: {}, setHeader: jest.fn(), end: jest.fn() }
814
+ const id = runtime.sendClientError(plain, 503, 'Unavailable.')
815
+ expect(plain.statusCode).toBe(503)
816
+ expect(plain.setHeader).toHaveBeenCalledWith('Content-Type', 'application/json; charset=utf-8')
817
+ expect(JSON.parse(plain.end.mock.calls[0][0])).toEqual({ error: 'Unavailable.', id })
818
+ })
819
+ })
820
+
821
+ describe('the security runtime in a generated app', () => {
822
+ const structure = (extra: Record<string, unknown> = {}): any => ({
823
+ uidl: {
824
+ name: 'Site',
825
+ globals: { settings: { title: 'Site', language: 'en' }, env: {} },
826
+ root: { name: 'Root', stateDefinitions: {}, node: { type: 'element', content: {} } },
827
+ ...extra,
828
+ },
829
+ strategy: { pages: { options: {} } },
830
+ files: new Map(),
831
+ dependencies: {},
832
+ devDependencies: {},
833
+ })
834
+
835
+ it('is written at utils/security-runtime.js, with pg, for an app with a Postgres database', async () => {
836
+ for (const type of ['teleport', 'postgresql']) {
837
+ const project = structure({ dataSources: { ds1: { type, config: {} } } })
838
+ await new NextWorkflowProjectPlugin().runAfter(project)
839
+ const entry = project.files.get(SECURITY_RUNTIME_FILE_KEY)
840
+ expect(entry.path).toEqual(['utils'])
841
+ expect(entry.files).toHaveLength(1)
842
+ expect(entry.files[0].name).toBe('security-runtime')
843
+ expect(entry.files[0].fileType).toBe('js')
844
+ expect(entry.files[0].content).toBe(generateSecurityRuntimeCode())
845
+ expect(project.dependencies.pg).toBe('^8.12.0')
846
+ }
847
+ })
848
+
849
+ it('is the file the data routes require to compare the app secret', () => {
850
+ // teleport-shared's table-access guard names the same module from the root.
851
+ expect(securityRuntimeSpecifier('../..')).toBe(
852
+ '../../' + TableAccess.SECURITY_RUNTIME_MODULE_PATH
853
+ )
854
+ })
855
+
856
+ it('is written without pg for an app with server routes and no Postgres database', async () => {
857
+ const project = structure({
858
+ dataSources: { ds1: { type: 'mysql', config: {} } },
859
+ })
860
+ await new NextWorkflowProjectPlugin().runAfter(project)
861
+ expect(project.files.has(SECURITY_RUNTIME_FILE_KEY)).toBe(true)
862
+ expect(project.dependencies.pg).toBeUndefined()
863
+ })
864
+
865
+ it('is not written for a static site', async () => {
866
+ const project = structure()
867
+ await new NextWorkflowProjectPlugin().runAfter(project)
868
+ expect(project.files.has(SECURITY_RUNTIME_FILE_KEY)).toBe(false)
869
+ expect(project.dependencies).toEqual({})
870
+ })
871
+
872
+ it('is written once and keeps the pg version the project has', () => {
873
+ const project = structure({ dataSources: { ds1: { type: 'teleport', config: {} } } })
874
+ project.dependencies.pg = '^8.11.0'
875
+ ensureSecurityRuntimeModule(project)
876
+ const entry = project.files.get(SECURITY_RUNTIME_FILE_KEY)
877
+ ensureSecurityRuntimeModule(project)
878
+ expect(project.files.get(SECURITY_RUNTIME_FILE_KEY)).toBe(entry)
879
+ expect(project.dependencies.pg).toBe('^8.11.0')
880
+ })
881
+
882
+ it('is required from any generated file by its depth below the project root', () => {
883
+ for (const [file, prefix] of [
884
+ ['pages/api/auth/signup.js', '../../..'],
885
+ ['pages/api/data/[...params].js', '../../..'],
886
+ ['utils/workflows/server-runtime.js', '../..'],
887
+ ]) {
888
+ const specifier = securityRuntimeSpecifier(prefix)
889
+ expect(path.posix.join(path.posix.dirname(file), specifier)).toBe('utils/security-runtime')
890
+ }
891
+ expect(securityRuntimeSpecifier('../..')).toBe('../../utils/security-runtime')
892
+ })
893
+ })