@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,960 @@
1
+ /* tslint:disable:max-classes-per-file */
2
+ import * as nodeCrypto from 'crypto'
3
+ import * as net from 'net'
4
+ import type { UIDLAuthentication } from '@teleporthq/teleport-types'
5
+ import {
6
+ generateAuthDbHealthFile,
7
+ generateAuthOptionsFile,
8
+ generateHashPasswordFile,
9
+ generateSignupRouteFile,
10
+ SignupRouteOptions,
11
+ WelcomeEmailOptions,
12
+ } from '../src/auth-generator'
13
+ import { generateResetPasswordRoute } from '../src/password-reset-route-generator'
14
+ import { generateSessionRevocationFile } from '../src/session-revocation-generator'
15
+ import { generateSecurityRuntimeCode } from '../src/security-runtime/security-runtime-code'
16
+ import { EXISTING_ACCOUNT_EMAIL, SET_PASSWORD_EMAIL } from '../src/transactional-email-code'
17
+ import { accountLogin } from '../src/nodes/account/account-login'
18
+ import { accountSignup } from '../src/nodes/account/account-signup'
19
+ import { NextWorkflowProjectPlugin } from '../src/workflow-project-plugin'
20
+
21
+ /**
22
+ * Newsletter Phase 0 (Task 0a): sign-up for people the site already knows
23
+ * without a password, and consent as the person gave it.
24
+ *
25
+ * A newsletter subscriber, a checkout or booking guest and a contact the owner
26
+ * added are `users` rows with no password. Signing up with such an address was
27
+ * answered "You already have an account" — wrong, they never had one. It must
28
+ * still never hand the row to whoever typed the address: the mailbox owner is
29
+ * sent a link to set a password (a password-reset link) instead. The page is
30
+ * answered exactly as for an account, so it never tells a subscriber or a
31
+ * guest from one, and the address is found in any letter case. Every new
32
+ * account gets `source = 'signup'` and `marketing_consent` from the box,
33
+ * never the column's TRUE default.
34
+ *
35
+ * The generated modules run against a fake Postgres that answers only the
36
+ * statements below, with the real security runtime (in-memory limits).
37
+ */
38
+
39
+ type Row = Record<string, any>
40
+
41
+ const sha256 = (value: string) => nodeCrypto.createHash('sha256').update(value).digest('hex')
42
+
43
+ // bcryptjs is not installed in the generator repo: a stand-in with its two calls.
44
+ const fakeBcrypt = {
45
+ hashSync: (value: string) => 'bcrypt:' + sha256(value),
46
+ compareSync: (value: string, hash: string) => hash === 'bcrypt:' + sha256(value),
47
+ }
48
+
49
+ interface Reset {
50
+ token_hash: string
51
+ user_id: string
52
+ expires_at: number
53
+ used_at: number | null
54
+ }
55
+
56
+ class FakePostgres {
57
+ users: Row[] = []
58
+ resets: Reset[] = []
59
+ /** Columns this users table lacks: one made before they existed. */
60
+ missingColumns: string[] = []
61
+ /** Column defaults, for the columns an INSERT leaves out. */
62
+ defaults: Row = {}
63
+ now = Date.UTC(2026, 9, 26, 12)
64
+
65
+ query(sql: string, values: any[] = []): { rows: Row[] } {
66
+ if (
67
+ /^(BEGIN|COMMIT|ROLLBACK)$/.test(sql) ||
68
+ sql.startsWith('SELECT pg_advisory_xact_lock') ||
69
+ sql.startsWith('CREATE TABLE IF NOT EXISTS teleport_password_resets') ||
70
+ sql.startsWith('CREATE INDEX IF NOT EXISTS teleport_password_resets') ||
71
+ sql.startsWith('DELETE FROM teleport_password_resets WHERE expires_at <')
72
+ ) {
73
+ return { rows: [] }
74
+ }
75
+ if (sql === 'SELECT * FROM users WHERE email = $1 LIMIT 1') {
76
+ return { rows: this.users.filter((u) => u.email === values[0]).map((u) => ({ ...u })) }
77
+ }
78
+ if (sql === 'SELECT * FROM users WHERE LOWER(email) = LOWER($1) LIMIT 2') {
79
+ const folded = String(values[0]).toLowerCase()
80
+ return {
81
+ rows: this.users
82
+ .filter((u) => String(u.email).toLowerCase() === folded)
83
+ .slice(0, 2)
84
+ .map((u) => ({ ...u })),
85
+ }
86
+ }
87
+ if (sql.startsWith('INSERT INTO users (')) {
88
+ const columns = /INSERT INTO users \(([^)]*)\)/.exec(sql)![1].split(', ')
89
+ const missing = columns.find((column) => this.missingColumns.includes(column))
90
+ if (missing) {
91
+ throw Object.assign(new Error(`column "${missing}" of relation "users" does not exist`), {
92
+ code: '42703',
93
+ })
94
+ }
95
+ const row: Row = { id: 'u' + (this.users.length + 1), ...this.defaults }
96
+ columns.forEach((column, index) => {
97
+ row[column] = values[index]
98
+ })
99
+ this.users.push(row)
100
+ return { rows: [{ ...row }] }
101
+ }
102
+ if (sql.startsWith('UPDATE teleport_password_resets SET used_at = NOW() WHERE user_id = $1')) {
103
+ for (const reset of this.resets) {
104
+ if (reset.user_id === values[0] && reset.used_at === null) {
105
+ reset.used_at = this.now
106
+ }
107
+ }
108
+ return { rows: [] }
109
+ }
110
+ if (sql.startsWith('INSERT INTO teleport_password_resets (token_hash, user_id, expires_at)')) {
111
+ this.resets.push({
112
+ token_hash: values[0],
113
+ user_id: values[1],
114
+ expires_at: this.now + Number(values[2]) * 1000,
115
+ used_at: null,
116
+ })
117
+ return { rows: [] }
118
+ }
119
+ if (sql.startsWith('WITH consumed AS ( UPDATE teleport_password_resets SET used_at = NOW()')) {
120
+ const reset = this.resets.find(
121
+ (r) => r.token_hash === values[0] && r.used_at === null && r.expires_at > this.now
122
+ )
123
+ const user = reset && this.users.find((u) => String(u.id) === reset.user_id)
124
+ if (!reset || !user) {
125
+ return { rows: [] }
126
+ }
127
+ reset.used_at = this.now
128
+ user.password = values[1]
129
+ return { rows: [{ id: user.id, email: user.email }] }
130
+ }
131
+ throw new Error('unexpected SQL: ' + sql)
132
+ }
133
+ }
134
+
135
+ const pgFor = (db: FakePostgres) => ({
136
+ Client: class {
137
+ public async connect() {
138
+ return undefined
139
+ }
140
+ public async end() {
141
+ return undefined
142
+ }
143
+ public on() {
144
+ return undefined
145
+ }
146
+ public async query(sql: string, values?: any[]) {
147
+ return db.query(sql, values)
148
+ }
149
+ },
150
+ })
151
+
152
+ const AUTH = {
153
+ enabled: true,
154
+ dataSourceId: 'ds-1',
155
+ dataSourceType: 'postgresql',
156
+ passwordAuthEnabled: true,
157
+ providers: [],
158
+ roles: ['user', 'admin'],
159
+ tables: {},
160
+ pageProtection: {},
161
+ folderProtection: {},
162
+ authPages: {},
163
+ callbackBaseUrl: '/api/auth/callback',
164
+ envKeys: {},
165
+ customUserProperties: [],
166
+ } as UIDLAuthentication
167
+
168
+ const ENV = {
169
+ NEXTAUTH_SECRET: 'app-secret',
170
+ DB_CONNECTION_STRING: 'postgres://fake',
171
+ AUTH_PEPPER: 'project-id-1',
172
+ AUTH_PEPPER_SECRET: 'per-project-random-pepper',
173
+ NEXTAUTH_URL: 'https://shop.example',
174
+ RESEND_KEY: 're_test_key',
175
+ }
176
+
177
+ const WELCOME: WelcomeEmailOptions = {
178
+ emailProvider: 'resend',
179
+ fromEmail: 'shop@brand.test',
180
+ emailSecretEnvName: 'RESEND_KEY',
181
+ emailSubject: 'Welcome',
182
+ emailBodyHtml: '<p>Welcome {{userName}}</p>',
183
+ siteName: 'Shop',
184
+ }
185
+
186
+ interface FakeResponse {
187
+ statusCode: number
188
+ body: any
189
+ status: (code: number) => FakeResponse
190
+ json: (body: unknown) => FakeResponse
191
+ setHeader: () => void
192
+ }
193
+
194
+ const fakeResponse = (): FakeResponse => {
195
+ const res: FakeResponse = {
196
+ statusCode: 0,
197
+ body: undefined,
198
+ status: (code) => {
199
+ res.statusCode = code
200
+ return res
201
+ },
202
+ json: (body) => {
203
+ res.body = body
204
+ return res
205
+ },
206
+ setHeader: () => undefined,
207
+ }
208
+ return res
209
+ }
210
+
211
+ const request = (body: Row, ip = '203.0.113.7') => ({
212
+ method: 'POST',
213
+ headers: { host: 'shop.example' },
214
+ socket: { remoteAddress: ip },
215
+ body,
216
+ query: {},
217
+ })
218
+
219
+ /** One app instance: the generated modules, required from each other as the files are. */
220
+ const loadApp = (
221
+ options: {
222
+ db?: FakePostgres
223
+ welcome?: WelcomeEmailOptions
224
+ signup?: SignupRouteOptions
225
+ env?: Record<string, string>
226
+ } = {}
227
+ ) => {
228
+ const db = options.db || new FakePostgres()
229
+ const env = options.env || ENV
230
+ const sent: Row[] = []
231
+ const ledger: Row[] = []
232
+ const delays: number[] = []
233
+ const logs: unknown[][] = []
234
+ // What bcrypt is asked to do: the cost of each hash it makes, and how many compares.
235
+ const bcryptWork = { hashCosts: [] as number[], compares: 0 }
236
+ const countingBcrypt = {
237
+ hashSync: (value: string, cost: number) => {
238
+ bcryptWork.hashCosts.push(cost)
239
+ return fakeBcrypt.hashSync(value)
240
+ },
241
+ compareSync: (value: string, hash: string) => {
242
+ bcryptWork.compares++
243
+ return fakeBcrypt.compareSync(value, hash)
244
+ },
245
+ }
246
+ const quiet = {
247
+ error: (...args: unknown[]) => logs.push(args),
248
+ warn: (...args: unknown[]) => logs.push(args),
249
+ log: () => undefined,
250
+ info: () => undefined,
251
+ }
252
+ const sources: Record<string, string> = {
253
+ runtime: generateSecurityRuntimeCode(),
254
+ hash: generateHashPasswordFile(),
255
+ health: generateAuthDbHealthFile(),
256
+ revocation: generateSessionRevocationFile(),
257
+ options: generateAuthOptionsFile(AUTH, null),
258
+ signup: generateSignupRouteFile(
259
+ AUTH,
260
+ options.welcome === undefined ? WELCOME : options.welcome,
261
+ {},
262
+ { fields: ['image'], ...(options.signup || {}) }
263
+ ),
264
+ reset: generateResetPasswordRoute(),
265
+ }
266
+ const external: Record<string, unknown> = {
267
+ crypto: nodeCrypto,
268
+ net,
269
+ pg: pgFor(db),
270
+ bcryptjs: countingBcrypt,
271
+ 'next-auth/providers/credentials': (config: unknown) => config,
272
+ resend: {
273
+ Resend: class {
274
+ public emails = {
275
+ send: async (msg: Row) => {
276
+ sent.push(msg)
277
+ return {}
278
+ },
279
+ }
280
+ },
281
+ },
282
+ '../../../utils/email/email-locale': {
283
+ resolveRequestLocale: () => '',
284
+ pickLocalizedTemplate: (base: Row) => base,
285
+ },
286
+ '../../../utils/email/sent-email-log': {
287
+ recordSentEmail: (entry: Row) => ledger.push(entry),
288
+ settleSentEmailLog: async () => undefined,
289
+ },
290
+ }
291
+ const files: Record<string, string> = {
292
+ '../security-runtime': 'runtime',
293
+ '../../../utils/security-runtime': 'runtime',
294
+ './hash-password': 'hash',
295
+ '../../../utils/auth/hash-password': 'hash',
296
+ './db-health': 'health',
297
+ './session-revocation': 'revocation',
298
+ './auth-options': 'options',
299
+ '../../../utils/auth/auth-options': 'options',
300
+ }
301
+ const cache: Record<string, { exports: any }> = {}
302
+ const load = (name: string): any => {
303
+ if (cache[name]) {
304
+ return cache[name].exports
305
+ }
306
+ const module = { exports: {} as any }
307
+ cache[name] = module
308
+ const req = (id: string): unknown => {
309
+ if (Object.prototype.hasOwnProperty.call(files, id)) {
310
+ return load(files[id])
311
+ }
312
+ if (Object.prototype.hasOwnProperty.call(external, id)) {
313
+ return external[id]
314
+ }
315
+ throw new Error(name + ' required an unexpected module: ' + id)
316
+ }
317
+ const setTimeoutShim = (fn: () => void, ms: number) => {
318
+ delays.push(ms)
319
+ fn()
320
+ return 0
321
+ }
322
+ // eslint-disable-next-line no-new-func
323
+ new Function(
324
+ 'module',
325
+ 'exports',
326
+ 'require',
327
+ 'process',
328
+ 'console',
329
+ 'Buffer',
330
+ 'setTimeout',
331
+ sources[name]
332
+ )(module, module.exports, req, { env: { ...env } }, quiet, Buffer, setTimeoutShim)
333
+ return module.exports
334
+ }
335
+ const signUp = async (body: Row, ip?: string) => {
336
+ const res = fakeResponse()
337
+ await load('signup')(request(body, ip), res)
338
+ return res
339
+ }
340
+ /** The credentials sign-in (NextAuth's authorize): its error code, or 'ok'. */
341
+ const signIn = async (email: string, password: string): Promise<string> => {
342
+ const req = request({ email, password })
343
+ try {
344
+ await load('options').providers[0].authorize({ email, password }, req)
345
+ return 'ok'
346
+ } catch (err) {
347
+ return (err as Error).message
348
+ }
349
+ }
350
+ return { db, sent, ledger, delays, logs, load, signUp, signIn, sources, bcryptWork }
351
+ }
352
+
353
+ const SUBSCRIBER = {
354
+ id: 'u-sub',
355
+ email: 'sub@site.test',
356
+ name: null,
357
+ password: null,
358
+ provider: null,
359
+ role: 'user',
360
+ source: 'newsletter',
361
+ marketing_consent: true,
362
+ }
363
+
364
+ const withSubscriber = (row: Row = SUBSCRIBER) => {
365
+ const db = new FakePostgres()
366
+ db.users.push({ ...row })
367
+ return db
368
+ }
369
+
370
+ const linkIn = (mail: Row | undefined): string => {
371
+ const match = /href="([^"]+)"/.exec(String(mail && mail.html))
372
+ return match ? match[1] : ''
373
+ }
374
+
375
+ describe('the generated sign-up route', () => {
376
+ const auth = AUTH
377
+ const welcome = WELCOME
378
+ const events = {}
379
+ const signup: SignupRouteOptions = { fields: ['image'] }
380
+
381
+ it('signup writes source=signup and explicit consent from the checkbox', () => {
382
+ const src = generateSignupRouteFile(auth, welcome, events, signup)
383
+ expect(src).toContain(`source: 'signup'`)
384
+ expect(src).toContain(`marketing_consent: body.marketing_consent === 'true'`)
385
+ })
386
+
387
+ it('signup on a password-less row sends the set-password email, never claims the row', () => {
388
+ const src = generateSignupRouteFile(auth, welcome, events, signup)
389
+ expect(src).toContain('sendSetPasswordEmail(')
390
+ expect(src).not.toContain('UPDATE users SET password')
391
+ })
392
+
393
+ it('writes no newsletter state: a ticked box subscribes through the newsletter helper', () => {
394
+ expect(generateSignupRouteFile(auth, welcome, events, signup)).not.toContain('newsletter_')
395
+ })
396
+
397
+ it('answers every address the site already knows alike, with no flag', () => {
398
+ const src = generateSignupRouteFile(auth, welcome, events, signup)
399
+ expect(src).not.toContain('setPassword')
400
+ expect(src).toContain('const existing = await findSignupUserByEmail(email);')
401
+ })
402
+ })
403
+
404
+ describe('sign-up writes where the person came from, and their consent as given', () => {
405
+ it('an unticked box, or a form without one, is an explicit no', async () => {
406
+ const app = loadApp()
407
+ expect((await app.signUp({ email: 'a@site.test', password: 'Passw0rd!' })).statusCode).toBe(201)
408
+ expect(
409
+ (
410
+ await app.signUp({
411
+ email: 'b@site.test',
412
+ password: 'Passw0rd!',
413
+ marketing_consent: 'false',
414
+ })
415
+ ).statusCode
416
+ ).toBe(201)
417
+ for (const row of app.db.users) {
418
+ expect(row).toMatchObject({ source: 'signup', marketing_consent: false, role: 'user' })
419
+ expect(row).not.toHaveProperty('newsletter_status')
420
+ }
421
+ })
422
+
423
+ it('a ticked box is consent', async () => {
424
+ const app = loadApp()
425
+ await app.signUp({ email: 'a@site.test', password: 'Passw0rd!', marketing_consent: 'true' })
426
+ expect(app.db.users[0]).toMatchObject({ source: 'signup', marketing_consent: true })
427
+ expect(app.db.users[0]).not.toHaveProperty('newsletter_status')
428
+ })
429
+
430
+ it('takes neither raw from the body, even as declared fields', async () => {
431
+ const app = loadApp({ signup: { fields: ['image', 'source', 'marketing_consent'] } })
432
+ await app.signUp({
433
+ email: 'a@site.test',
434
+ password: 'Passw0rd!',
435
+ source: 'import',
436
+ marketing_consent: 'yes',
437
+ })
438
+ expect(app.db.users[0]).toMatchObject({ source: 'signup', marketing_consent: false })
439
+ })
440
+
441
+ it('still signs the person up on a users table made before these columns', async () => {
442
+ const db = new FakePostgres()
443
+ db.missingColumns = ['source', 'marketing_consent']
444
+ const app = loadApp({ db })
445
+ const res = await app.signUp({ email: 'old@site.test', password: 'Passw0rd!' })
446
+ expect(res.statusCode).toBe(201)
447
+ expect(app.db.users).toHaveLength(1)
448
+ expect(app.db.users[0]).toMatchObject({ email: 'old@site.test', role: 'user' })
449
+ expect(app.db.users[0]).not.toHaveProperty('source')
450
+ expect(JSON.stringify(app.logs)).toContain('the account is created without it')
451
+ })
452
+
453
+ it('leaves out only the column the table lacks: a consent column defaulting to TRUE still gets the no', async () => {
454
+ const db = new FakePostgres()
455
+ db.missingColumns = ['source']
456
+ db.defaults = { marketing_consent: true }
457
+ const app = loadApp({ db })
458
+ const res = await app.signUp({ email: 'old@site.test', password: 'Passw0rd!' })
459
+ expect(res.statusCode).toBe(201)
460
+ expect(app.db.users).toHaveLength(1)
461
+ expect(app.db.users[0]).toMatchObject({ email: 'old@site.test', marketing_consent: false })
462
+ expect(app.db.users[0]).not.toHaveProperty('source')
463
+ expect(JSON.stringify(app.logs)).toContain('the users table has no source column yet')
464
+ })
465
+ })
466
+
467
+ describe('sign-up on an address the site knows without a password', () => {
468
+ it('mails its owner a link to set a password, and never takes the row', async () => {
469
+ const app = loadApp({ db: withSubscriber() })
470
+ const res = await app.signUp({ email: SUBSCRIBER.email, password: 'Passw0rd!', name: 'Eve' })
471
+
472
+ expect(res.statusCode).toBe(201)
473
+ expect(res.body).toEqual({ user: { email: SUBSCRIBER.email, name: 'Eve' } })
474
+ // The row is as it was: no password, no name, nothing the visitor typed.
475
+ expect(app.db.users).toEqual([SUBSCRIBER])
476
+
477
+ const mails = app.sent
478
+ expect(mails.map((mail) => mail.to)).toEqual([[SUBSCRIBER.email]])
479
+ expect(mails[0].subject).toBe('Set your password to finish creating your account')
480
+ const link = linkIn(mails[0])
481
+ expect(link).toMatch(/^https:\/\/shop\.example\/reset-password\?token=[0-9a-f]{64}$/)
482
+ const token = link.split('token=')[1]
483
+ expect(app.db.resets).toEqual([
484
+ expect.objectContaining({ token_hash: sha256(token), user_id: 'u-sub', used_at: null }),
485
+ ])
486
+
487
+ // The sent-email log keeps the email with the link hidden.
488
+ expect(app.ledger).toHaveLength(1)
489
+ expect(app.ledger[0]).toMatchObject({
490
+ emailType: SET_PASSWORD_EMAIL,
491
+ to: SUBSCRIBER.email,
492
+ status: 'sent',
493
+ source: 'signup',
494
+ userId: 'u-sub',
495
+ })
496
+ expect(JSON.stringify(app.ledger)).not.toContain(token)
497
+ expect(app.ledger[0].html).toContain('[hidden]')
498
+
499
+ // Like the forgot-password answer, it takes at least 1200 ms.
500
+ expect(Math.max(...app.delays)).toBeGreaterThan(1000)
501
+
502
+ // The link is a reset link: it sets the password, once.
503
+ const reset = fakeResponse()
504
+ await app.load('reset')(request({ token, password: 'Mine#Pass1' }), reset)
505
+ expect(reset.body).toEqual({ valid: true, changed: true })
506
+ expect(app.db.users[0].password).toBeTruthy()
507
+ expect(app.db.users[0].name).toBeNull()
508
+ })
509
+
510
+ it('opens the project reset page, with the token in the fragment where the page reads it there', async () => {
511
+ const app = loadApp({
512
+ db: withSubscriber(),
513
+ signup: { resetPagePath: '/account/new-password', tokenInFragment: true },
514
+ })
515
+ await app.signUp({ email: SUBSCRIBER.email, password: 'Passw0rd!' })
516
+ expect(linkIn(app.sent[0])).toMatch(
517
+ /^https:\/\/shop\.example\/account\/new-password#token=[0-9a-f]{64}$/
518
+ )
519
+ })
520
+
521
+ it('sends one address at most 3 links an hour, answering the same', async () => {
522
+ const app = loadApp({ db: withSubscriber() })
523
+ for (let i = 0; i < 5; i++) {
524
+ const res = await app.signUp(
525
+ { email: SUBSCRIBER.email, password: 'Passw0rd!' },
526
+ '198.51.100.' + (i + 30)
527
+ )
528
+ expect(res.statusCode).toBe(201)
529
+ expect(res.body).toEqual({ user: { email: SUBSCRIBER.email, name: null } })
530
+ }
531
+ expect(app.sent).toHaveLength(3)
532
+ expect(app.db.users).toEqual([SUBSCRIBER])
533
+ })
534
+
535
+ it('without an email provider sends nothing and answers the same', async () => {
536
+ const app = loadApp({ db: withSubscriber(), welcome: {} })
537
+ const res = await app.signUp({ email: SUBSCRIBER.email, password: 'Passw0rd!' })
538
+ expect(res.statusCode).toBe(201)
539
+ expect(res.body).toEqual({ user: { email: SUBSCRIBER.email, name: null } })
540
+ expect(app.sent).toEqual([])
541
+ expect(app.db.resets).toEqual([])
542
+ expect(JSON.stringify(app.logs)).toContain('set-password link not sent')
543
+ })
544
+
545
+ it('without a sign-up sender, mails through the forgot-password one', async () => {
546
+ const noticeEmail = {
547
+ emailProvider: 'resend',
548
+ fromEmail: 'reset@brand.test',
549
+ emailSecretEnvName: 'RESEND_KEY',
550
+ }
551
+ const subscriber = loadApp({ db: withSubscriber(), welcome: {}, signup: { noticeEmail } })
552
+ await subscriber.signUp({ email: SUBSCRIBER.email, password: 'Passw0rd!' })
553
+ expect(subscriber.sent.map((mail) => [mail.from, mail.to, mail.subject])).toEqual([
554
+ ['reset@brand.test', [SUBSCRIBER.email], 'Set your password to finish creating your account'],
555
+ ])
556
+ expect(subscriber.ledger).toEqual([
557
+ expect.objectContaining({ emailType: SET_PASSWORD_EMAIL, provider: 'resend' }),
558
+ ])
559
+
560
+ const account = loadApp({
561
+ db: withSubscriber({ ...SUBSCRIBER, password: 'bcrypt:x' }),
562
+ welcome: {},
563
+ signup: { noticeEmail },
564
+ })
565
+ await account.signUp({ email: SUBSCRIBER.email, password: 'Passw0rd!' })
566
+ expect(account.sent.map((mail) => [mail.from, mail.subject])).toEqual([
567
+ ['reset@brand.test', 'You already have an account'],
568
+ ])
569
+
570
+ // The welcome email keeps the sign-up node's sender: none here.
571
+ const fresh = loadApp({ welcome: {}, signup: { noticeEmail } })
572
+ await fresh.signUp({ email: 'new@site.test', password: 'Passw0rd!' })
573
+ expect(fresh.sent).toEqual([])
574
+ })
575
+
576
+ it('where reset links cannot be kept (not Postgres), tells the owner the address is known', async () => {
577
+ const app = loadApp({ db: withSubscriber() })
578
+ app.load('options').PASSWORD_RESET_SUPPORTED = false
579
+ const res = await app.signUp({ email: SUBSCRIBER.email, password: 'Passw0rd!' })
580
+ expect(res.body).toEqual({ user: { email: SUBSCRIBER.email, name: null } })
581
+ expect(app.sent.map((mail) => [mail.to, mail.subject])).toEqual([
582
+ [[SUBSCRIBER.email], 'You already have an account'],
583
+ ])
584
+ expect(app.ledger.map((entry) => entry.emailType)).toEqual([EXISTING_ACCOUNT_EMAIL])
585
+ expect(app.db.resets).toEqual([])
586
+ expect(app.db.users).toEqual([SUBSCRIBER])
587
+ })
588
+
589
+ it('an account (a password, or an OAuth sign-in) is still told it already has one, under its own purpose', async () => {
590
+ for (const row of [
591
+ { ...SUBSCRIBER, password: 'bcrypt:x' },
592
+ { ...SUBSCRIBER, provider: 'google' },
593
+ ]) {
594
+ const app = loadApp({ db: withSubscriber(row) })
595
+ const res = await app.signUp({ email: SUBSCRIBER.email, password: 'Passw0rd!', name: 'Eve' })
596
+ expect(res.statusCode).toBe(201)
597
+ expect(res.body).toEqual({ user: { email: SUBSCRIBER.email, name: 'Eve' } })
598
+ expect(app.sent.map((mail) => mail.subject)).toEqual(['You already have an account'])
599
+ expect(app.ledger).toEqual([
600
+ expect.objectContaining({
601
+ emailType: EXISTING_ACCOUNT_EMAIL,
602
+ to: SUBSCRIBER.email,
603
+ subject: 'You already have an account',
604
+ status: 'sent',
605
+ userId: 'u-sub',
606
+ }),
607
+ ])
608
+ expect(app.db.resets).toEqual([])
609
+ expect(app.db.users).toEqual([row])
610
+ }
611
+ })
612
+
613
+ it('answers a password-less row exactly as it answers an account, in the same time', async () => {
614
+ const account = loadApp({ db: withSubscriber({ ...SUBSCRIBER, password: 'bcrypt:x' }) })
615
+ const subscriber = loadApp({ db: withSubscriber() })
616
+ const body = { email: SUBSCRIBER.email, password: 'Passw0rd!', name: 'Eve' }
617
+ const toAccount = await account.signUp(body)
618
+ const toSubscriber = await subscriber.signUp(body)
619
+
620
+ expect(toSubscriber.statusCode).toBe(toAccount.statusCode)
621
+ expect(JSON.stringify(toSubscriber.body)).toBe(JSON.stringify(toAccount.body))
622
+ // Each email went out, under its own purpose.
623
+ expect(account.ledger.map((entry) => entry.emailType)).toEqual([EXISTING_ACCOUNT_EMAIL])
624
+ expect(subscriber.ledger.map((entry) => entry.emailType)).toEqual([SET_PASSWORD_EMAIL])
625
+ // Both wait out the same minimum.
626
+ expect(Math.max(...account.delays)).toBeGreaterThan(1000)
627
+ expect(Math.max(...subscriber.delays)).toBeGreaterThan(1000)
628
+ })
629
+ })
630
+
631
+ describe('sign-up finds the address in any letter case', () => {
632
+ it('reaches the row of the same address typed in another case, and never makes a second one', async () => {
633
+ const subscriber = loadApp({ db: withSubscriber() })
634
+ const res = await subscriber.signUp({ email: 'Sub@Site.TEST', password: 'Passw0rd!' })
635
+ expect(res.body).toEqual({ user: { email: 'Sub@Site.TEST', name: null } })
636
+ expect(subscriber.db.users).toEqual([SUBSCRIBER])
637
+ // The link goes to the address the row holds.
638
+ expect(subscriber.sent.map((mail) => mail.to)).toEqual([[SUBSCRIBER.email]])
639
+ expect(subscriber.sent[0].subject).toBe('Set your password to finish creating your account')
640
+
641
+ const account = loadApp({ db: withSubscriber({ ...SUBSCRIBER, password: 'bcrypt:x' }) })
642
+ await account.signUp({ email: 'SUB@site.test', password: 'Passw0rd!' })
643
+ expect(account.db.users).toHaveLength(1)
644
+ expect(account.sent.map((mail) => [mail.to, mail.subject])).toEqual([
645
+ [[SUBSCRIBER.email], 'You already have an account'],
646
+ ])
647
+ })
648
+
649
+ it('prefers the exact address, and takes no row when the case-blind match is ambiguous', async () => {
650
+ const db = new FakePostgres()
651
+ db.users.push({ ...SUBSCRIBER, id: 'u-upper', email: 'Sub@site.test', password: 'bcrypt:x' })
652
+ db.users.push({ ...SUBSCRIBER })
653
+ const exact = loadApp({ db })
654
+ await exact.signUp({ email: SUBSCRIBER.email, password: 'Passw0rd!' })
655
+ expect(exact.sent.map((mail) => mail.subject)).toEqual([
656
+ 'Set your password to finish creating your account',
657
+ ])
658
+
659
+ const ambiguous = loadApp({ db })
660
+ const res = await ambiguous.signUp({ email: 'SUB@SITE.TEST', password: 'Passw0rd!' })
661
+ expect(res.statusCode).toBe(201)
662
+ expect(db.users.map((user) => user.email)).toEqual([
663
+ 'Sub@site.test',
664
+ SUBSCRIBER.email,
665
+ 'SUB@SITE.TEST',
666
+ ])
667
+ })
668
+
669
+ it('sign-in keeps its exact lookup; stores other than Postgres keep theirs for sign-up too', () => {
670
+ const postgres = generateAuthOptionsFile(AUTH, null)
671
+ const signIn = /async function findUserByEmail\(email\) \{[\s\S]*?\n\}/.exec(postgres)![0]
672
+ expect(signIn).toContain("'SELECT * FROM users WHERE email = $1 LIMIT 1'")
673
+ expect(signIn).not.toContain('LOWER')
674
+ expect(postgres).toContain('module.exports.findSignupUserByEmail = findSignupUserByEmail;')
675
+
676
+ const mysql = generateAuthOptionsFile({ ...AUTH, dataSourceType: 'mysql' }, null)
677
+ expect(mysql).toContain(
678
+ 'async function findSignupUserByEmail(email) {\n return findUserByEmail(email);\n}'
679
+ )
680
+ expect(mysql).not.toContain('LOWER(email)')
681
+ })
682
+ })
683
+
684
+ describe('the account-signup step', () => {
685
+ it('when no session follows an answered sign-up, says one thing whatever the address was', async () => {
686
+ const source = accountSignup.generateHandler()
687
+ expect(source).not.toContain('setPassword')
688
+ const calls: string[] = []
689
+ const fakeFetch = async (url: string) => {
690
+ calls.push(url)
691
+ return url === '/api/auth/session'
692
+ ? { ok: true, json: async () => ({}) }
693
+ : { ok: true, json: async () => ({ user: { email: 'sub@site.test', name: null } }) }
694
+ }
695
+ const signInFails = {
696
+ __teleportNextAuth: { signIn: async () => ({ error: 'CredentialsSignin' }) },
697
+ }
698
+ const noSession = { __teleportNextAuth: { signIn: async () => ({ error: null }) } }
699
+ // A wrong password for an account, a row without one, no session, sign-in not loaded yet.
700
+ for (const window of [signInFails, noSession, undefined]) {
701
+ // eslint-disable-next-line no-new-func
702
+ const handler = new Function('fetch', 'window', `${source}\nreturn account_signup;`)(
703
+ fakeFetch,
704
+ window
705
+ )
706
+ await expect(handler({ email: 'sub@site.test', password: 'Passw0rd!' }, {})).rejects.toThrow(
707
+ 'Check your inbox — we sent an email about this address.'
708
+ )
709
+ }
710
+ expect(calls.filter((url) => url === '/api/auth/signup')).toHaveLength(3)
711
+ })
712
+
713
+ it('sends the consent box as the route reads it: "true" when ticked, else "false"', async () => {
714
+ const source = accountSignup.generateHandler()
715
+ const bodies: Row[] = []
716
+ const fakeFetch = async (url: string, init?: { body: string }) => {
717
+ if (url === '/api/auth/signup' && init) {
718
+ bodies.push(JSON.parse(init.body))
719
+ }
720
+ return { ok: true, json: async () => ({}) }
721
+ }
722
+ // eslint-disable-next-line no-new-func
723
+ const handler = new Function('fetch', 'window', `${source}\nreturn account_signup;`)(
724
+ fakeFetch,
725
+ undefined
726
+ )
727
+ const values: unknown[] = [true, 'true', 'on', false, 'false', 'off', '', null, 'yes']
728
+ for (const value of values) {
729
+ await handler(
730
+ { email: 'a@site.test', password: 'Passw0rd!', marketing_consent: value },
731
+ {}
732
+ ).catch(() => undefined)
733
+ }
734
+ await handler({ email: 'a@site.test', password: 'Passw0rd!' }, {}).catch(() => undefined)
735
+ expect(bodies.map((body) => body.marketing_consent)).toEqual([
736
+ 'true',
737
+ 'true',
738
+ 'true',
739
+ 'false',
740
+ 'false',
741
+ 'false',
742
+ 'false',
743
+ 'false',
744
+ 'false',
745
+ undefined,
746
+ ])
747
+ })
748
+
749
+ const loadServerSignup = (existing: Row | null) => {
750
+ const created: Row[] = []
751
+ const looked: string[] = []
752
+ const modules: Record<string, unknown> = {
753
+ '../../../utils/auth/hash-password': Object.assign((p: string) => 'hashed:' + p, {
754
+ passwordPolicyError: () => '',
755
+ }),
756
+ '../../../utils/auth/auth-options': {
757
+ findSignupUserByEmail: async (email: string) => {
758
+ looked.push(email)
759
+ return existing
760
+ },
761
+ createUser: async (data: Row) => {
762
+ created.push(data)
763
+ return { id: 'u1', ...data }
764
+ },
765
+ sanitizeUser: (user: Row) => ({ id: user.id, email: user.email }),
766
+ },
767
+ }
768
+ // eslint-disable-next-line no-new-func
769
+ const handler = new Function(
770
+ 'require',
771
+ `${accountSignup.generateServerHandler!({})}\nreturn account_signup;`
772
+ )((id: string) => modules[id])
773
+ return { handler, created, looked }
774
+ }
775
+
776
+ it('run on the server, writes where the person came from and their consent as given', async () => {
777
+ const { handler, created } = loadServerSignup(null)
778
+ await handler({ email: 'a@site.test', password: 'Passw0rd!' }, {})
779
+ await handler(
780
+ {
781
+ email: 'b@site.test',
782
+ password: 'Passw0rd!',
783
+ marketing_consent: 'true',
784
+ source: 'import',
785
+ },
786
+ {}
787
+ )
788
+ await handler({ email: 'c@site.test', password: 'Passw0rd!', marketing_consent: true }, {})
789
+ expect(created[0]).toMatchObject({ source: 'signup', marketing_consent: false })
790
+ expect(created[1]).toMatchObject({ source: 'signup', marketing_consent: true })
791
+ expect(created[2]).toMatchObject({ marketing_consent: true })
792
+ })
793
+
794
+ it('run on the server, refuses any address the site knows with one message, in any letter case', async () => {
795
+ for (const existing of [{ ...SUBSCRIBER, password: 'bcrypt:x' }, { ...SUBSCRIBER }]) {
796
+ const { handler, created, looked } = loadServerSignup(existing)
797
+ await expect(handler({ email: 'Sub@Site.test', password: 'Passw0rd!' }, {})).rejects.toThrow(
798
+ /^This email cannot be used to create an account here\.$/
799
+ )
800
+ expect(looked).toEqual(['Sub@Site.test'])
801
+ expect(created).toEqual([])
802
+ }
803
+ })
804
+ })
805
+
806
+ describe('every failed sign-in does the same bcrypt work', () => {
807
+ const ACCOUNT = { ...SUBSCRIBER, id: 'u-acc', email: 'acc@site.test', password: 'bcrypt:other' }
808
+ const attempts = [
809
+ ['an unknown address', 'nobody@site.test'],
810
+ ['a row without a password', SUBSCRIBER.email],
811
+ ['an account, with a wrong password', ACCOUNT.email],
812
+ ]
813
+
814
+ for (const [label, env] of [
815
+ ['with the project pepper', ENV],
816
+ ['on the old pepper only', { ...ENV, AUTH_PEPPER_SECRET: '' }],
817
+ ] as Array<[string, Record<string, string>]>) {
818
+ it(label, async () => {
819
+ const db = withSubscriber()
820
+ db.users.push({ ...ACCOUNT })
821
+ const app = loadApp({ db, env })
822
+ // The stand-in hash is made once per process, at the cost of a real one.
823
+ await app.signIn('warm-up@site.test', 'Wrong#Pass1')
824
+ expect(app.bcryptWork.hashCosts).toEqual([12])
825
+
826
+ const compares: Record<string, number> = {}
827
+ for (const [what, email] of attempts) {
828
+ const before = app.bcryptWork.compares
829
+ expect(await app.signIn(email, 'Wrong#Pass1')).toBe('InvalidCredentials')
830
+ compares[what] = app.bcryptWork.compares - before
831
+ }
832
+ const expected = env.AUTH_PEPPER_SECRET ? 2 : 1
833
+ expect(compares).toEqual({
834
+ 'an unknown address': expected,
835
+ 'a row without a password': expected,
836
+ 'an account, with a wrong password': expected,
837
+ })
838
+ expect(app.bcryptWork.hashCosts).toEqual([12])
839
+ })
840
+ }
841
+
842
+ it('the server-run sign-in step too', async () => {
843
+ const db = withSubscriber()
844
+ db.users.push({ ...ACCOUNT })
845
+ const app = loadApp({ db })
846
+ const modules: Record<string, unknown> = {
847
+ '../../../utils/auth/hash-password': app.load('hash'),
848
+ '../../../utils/auth/auth-options': app.load('options'),
849
+ '../../../utils/security-runtime': app.load('runtime'),
850
+ }
851
+ // eslint-disable-next-line no-new-func
852
+ const login = new Function(
853
+ 'require',
854
+ `${accountLogin.generateServerHandler!({})}\nreturn account_login;`
855
+ )((id: string) => modules[id])
856
+ const counts: number[] = []
857
+ for (const [, email] of attempts) {
858
+ const before = app.bcryptWork.compares
859
+ await expect(login({ email, password: 'Wrong#Pass1' }, {})).rejects.toThrow(
860
+ 'Invalid email or password'
861
+ )
862
+ counts.push(app.bcryptWork.compares - before)
863
+ }
864
+ expect(counts).toEqual([2, 2, 2])
865
+ })
866
+ })
867
+
868
+ describe('project wiring', () => {
869
+ const secret = { type: 'dynamic', content: { referenceType: 'secret', id: 'RESEND_KEY' } }
870
+ const SIGNUP_NODE_EMAIL = {
871
+ emailProvider: 'email-resend',
872
+ from: 'shop@brand.test',
873
+ apiKey: secret,
874
+ subject: 'Welcome',
875
+ body: '<p>Welcome</p>',
876
+ }
877
+
878
+ /** The project plugin's files for a sign-up node with `signupEmail` and a reset node with a sender. */
879
+ const runPlugin = async (signupEmail: Row) => {
880
+ const files = new Map<string, any>()
881
+ const node = (id: string, type: string, config: Row) => ({ id, type, config })
882
+ const structure = {
883
+ uidl: {
884
+ name: 'Shop',
885
+ globals: { env: {} as Record<string, string> },
886
+ authentication: AUTH,
887
+ dataSources: {},
888
+ workflows: {
889
+ workflows: {
890
+ signup: {
891
+ id: 'signup',
892
+ name: 'Sign Up Flow',
893
+ trigger: { type: 'event-element-clicked', nodeId: 't', config: {} },
894
+ nodes: [node('s1', 'account-signup', { email: 'x', password: 'y', ...signupEmail })],
895
+ edges: [],
896
+ },
897
+ forgot: {
898
+ id: 'forgot',
899
+ name: 'Forgot Password Flow',
900
+ trigger: { type: 'event-element-clicked', nodeId: 't', config: {} },
901
+ nodes: [
902
+ node('f1', 'account-request-password-reset', {
903
+ email: 'x',
904
+ emailProvider: 'email-resend',
905
+ from: 'reset@brand.test',
906
+ apiKey: secret,
907
+ resetPagePath: '/account/new-password',
908
+ }),
909
+ ],
910
+ edges: [],
911
+ },
912
+ reset: {
913
+ id: 'reset',
914
+ name: 'Reset Password Flow',
915
+ trigger: { type: 'event-page-loaded', nodeId: 'p', config: {} },
916
+ nodes: [
917
+ node('r1', 'general-custom-js', {
918
+ code: 'function customHandler() { return sessionStorage.getItem("tq-reset-token"); }',
919
+ }),
920
+ ],
921
+ edges: [],
922
+ },
923
+ },
924
+ },
925
+ },
926
+ files,
927
+ dependencies: {} as Record<string, string>,
928
+ devDependencies: {},
929
+ strategy: {},
930
+ }
931
+ await new NextWorkflowProjectPlugin().runAfter(structure as never)
932
+ return (key: string) => files.get(key)?.files?.[0]?.content as string
933
+ }
934
+
935
+ it('the set-password link opens the page the reset link opens, as the forgot route builds it', async () => {
936
+ const content = await runPlugin(SIGNUP_NODE_EMAIL)
937
+ expect(content('auth-forgot-password-route')).toContain(
938
+ 'var RESET_PAGE_PATH = "/account/new-password";'
939
+ )
940
+ expect(content('auth-forgot-password-route')).toContain('var TOKEN_LINK_PREFIX = "#token=";')
941
+ expect(content('auth-signup-route')).toContain(
942
+ 'var SET_PASSWORD_PAGE_PATH = "/account/new-password";'
943
+ )
944
+ expect(content('auth-signup-route')).toContain(
945
+ 'var SET_PASSWORD_TOKEN_LINK_PREFIX = "#token=";'
946
+ )
947
+ // The sign-up node's sender is the known-address sender.
948
+ expect(content('auth-signup-route')).toContain('const NOTICE_EMAIL_FROM = "shop@brand.test";')
949
+ })
950
+
951
+ it('without a sign-up sender, the known-address emails use the forgot-password one', async () => {
952
+ const content = await runPlugin({})
953
+ expect(content('auth-signup-route')).toContain('const WELCOME_EMAIL_PROVIDER = null;')
954
+ expect(content('auth-signup-route')).toContain('const NOTICE_EMAIL_PROVIDER = "resend";')
955
+ expect(content('auth-signup-route')).toContain('const NOTICE_EMAIL_FROM = "reset@brand.test";')
956
+ expect(content('auth-signup-route')).toContain(
957
+ 'const NOTICE_EMAIL_SECRET_ENV_NAME = "RESEND_KEY";'
958
+ )
959
+ })
960
+ })