@teleporthq/teleport-plugin-next-workflows 0.43.65 → 0.43.67

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 (305) hide show
  1. package/__tests__/_helpers/bind-workflow-utils.ts +30 -0
  2. package/__tests__/_helpers/run-generated-middleware.ts +11 -2
  3. package/__tests__/admin-form-row-hydration.test.ts +55 -0
  4. package/__tests__/cart-clear-db-mirror.test.ts +12 -0
  5. package/__tests__/cart-get-total-regional-pricing.test.ts +166 -0
  6. package/__tests__/client-config-redaction.test.ts +53 -0
  7. package/__tests__/continue-on-error.test.ts +119 -0
  8. package/__tests__/email-locale-module.test.ts +323 -0
  9. package/__tests__/email-locale-senders.test.ts +268 -0
  10. package/__tests__/invoice-delivery-fee.test.ts +104 -0
  11. package/__tests__/invoice-regional-tax.test.ts +126 -0
  12. package/__tests__/locale-aware-redirects.test.ts +355 -0
  13. package/__tests__/navigation-go-to-page.test.ts +43 -0
  14. package/__tests__/node-handler-file-inline-map.test.ts +29 -3
  15. package/__tests__/payment-redirect-and-order-notification.test.ts +6 -0
  16. package/__tests__/paypal-webhook-order-notification.test.ts +41 -0
  17. package/__tests__/resolve-config-localized-templates.test.ts +262 -0
  18. package/__tests__/sent-email-log-module.test.ts +381 -0
  19. package/__tests__/sent-email-log-wiring.test.ts +267 -0
  20. package/dist/cjs/account-delete-route-generator.d.ts +20 -0
  21. package/dist/cjs/account-delete-route-generator.d.ts.map +1 -1
  22. package/dist/cjs/account-delete-route-generator.js +29 -26
  23. package/dist/cjs/account-delete-route-generator.js.map +1 -1
  24. package/dist/cjs/api-route-generator.d.ts.map +1 -1
  25. package/dist/cjs/api-route-generator.js +57 -11
  26. package/dist/cjs/api-route-generator.js.map +1 -1
  27. package/dist/cjs/auth-generator.d.ts +2 -1
  28. package/dist/cjs/auth-generator.d.ts.map +1 -1
  29. package/dist/cjs/auth-generator.js +55 -18
  30. package/dist/cjs/auth-generator.js.map +1 -1
  31. package/dist/cjs/data-api-route-generator.d.ts.map +1 -1
  32. package/dist/cjs/data-api-route-generator.js +19 -0
  33. package/dist/cjs/data-api-route-generator.js.map +1 -1
  34. package/dist/cjs/email-locale/email-locale-code.d.ts +25 -0
  35. package/dist/cjs/email-locale/email-locale-code.d.ts.map +1 -0
  36. package/dist/cjs/email-locale/email-locale-code.js +228 -0
  37. package/dist/cjs/email-locale/email-locale-code.js.map +1 -0
  38. package/dist/cjs/email-locale/email-locale-scope.d.ts +46 -0
  39. package/dist/cjs/email-locale/email-locale-scope.d.ts.map +1 -0
  40. package/dist/cjs/email-locale/email-locale-scope.js +51 -0
  41. package/dist/cjs/email-locale/email-locale-scope.js.map +1 -0
  42. package/dist/cjs/email-locale/index.d.ts +11 -0
  43. package/dist/cjs/email-locale/index.d.ts.map +1 -0
  44. package/dist/cjs/email-locale/index.js +40 -0
  45. package/dist/cjs/email-locale/index.js.map +1 -0
  46. package/dist/cjs/executor-generator.d.ts +11 -1
  47. package/dist/cjs/executor-generator.d.ts.map +1 -1
  48. package/dist/cjs/executor-generator.js +49 -7
  49. package/dist/cjs/executor-generator.js.map +1 -1
  50. package/dist/cjs/index.d.ts +2 -0
  51. package/dist/cjs/index.d.ts.map +1 -1
  52. package/dist/cjs/index.js +9 -1
  53. package/dist/cjs/index.js.map +1 -1
  54. package/dist/cjs/invoice/api-routes-code.d.ts.map +1 -1
  55. package/dist/cjs/invoice/api-routes-code.js +55 -6
  56. package/dist/cjs/invoice/api-routes-code.js.map +1 -1
  57. package/dist/cjs/invoice/email-sender-code.d.ts.map +1 -1
  58. package/dist/cjs/invoice/email-sender-code.js +72 -31
  59. package/dist/cjs/invoice/email-sender-code.js.map +1 -1
  60. package/dist/cjs/invoice/index.d.ts +1 -4
  61. package/dist/cjs/invoice/index.d.ts.map +1 -1
  62. package/dist/cjs/invoice/index.js +8 -19
  63. package/dist/cjs/invoice/index.js.map +1 -1
  64. package/dist/cjs/invoice/invoice-html-code.d.ts.map +1 -1
  65. package/dist/cjs/invoice/invoice-html-code.js +31 -8
  66. package/dist/cjs/invoice/invoice-html-code.js.map +1 -1
  67. package/dist/cjs/invoice/regional-invoice-tax-code.d.ts +25 -0
  68. package/dist/cjs/invoice/regional-invoice-tax-code.d.ts.map +1 -0
  69. package/dist/cjs/invoice/regional-invoice-tax-code.js +116 -0
  70. package/dist/cjs/invoice/regional-invoice-tax-code.js.map +1 -0
  71. package/dist/cjs/invoice/resolve-data-source.d.ts +6 -0
  72. package/dist/cjs/invoice/resolve-data-source.d.ts.map +1 -0
  73. package/dist/cjs/invoice/resolve-data-source.js +23 -0
  74. package/dist/cjs/invoice/resolve-data-source.js.map +1 -0
  75. package/dist/cjs/nodes/account/account-delete-current.d.ts.map +1 -1
  76. package/dist/cjs/nodes/account/account-delete-current.js +10 -3
  77. package/dist/cjs/nodes/account/account-delete-current.js.map +1 -1
  78. package/dist/cjs/nodes/account/account-login.d.ts.map +1 -1
  79. package/dist/cjs/nodes/account/account-login.js +3 -1
  80. package/dist/cjs/nodes/account/account-login.js.map +1 -1
  81. package/dist/cjs/nodes/account/account-logout.d.ts.map +1 -1
  82. package/dist/cjs/nodes/account/account-logout.js +4 -2
  83. package/dist/cjs/nodes/account/account-logout.js.map +1 -1
  84. package/dist/cjs/nodes/account/account-signup.d.ts.map +1 -1
  85. package/dist/cjs/nodes/account/account-signup.js +12 -2
  86. package/dist/cjs/nodes/account/account-signup.js.map +1 -1
  87. package/dist/cjs/nodes/account/account-social-login.d.ts.map +1 -1
  88. package/dist/cjs/nodes/account/account-social-login.js +4 -2
  89. package/dist/cjs/nodes/account/account-social-login.js.map +1 -1
  90. package/dist/cjs/nodes/cart/cart-clear.d.ts.map +1 -1
  91. package/dist/cjs/nodes/cart/cart-clear.js +6 -0
  92. package/dist/cjs/nodes/cart/cart-clear.js.map +1 -1
  93. package/dist/cjs/nodes/cart/cart-get-total.d.ts.map +1 -1
  94. package/dist/cjs/nodes/cart/cart-get-total.js +81 -5
  95. package/dist/cjs/nodes/cart/cart-get-total.js.map +1 -1
  96. package/dist/cjs/nodes/data/data-create-item.d.ts.map +1 -1
  97. package/dist/cjs/nodes/data/data-create-item.js +16 -0
  98. package/dist/cjs/nodes/data/data-create-item.js.map +1 -1
  99. package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.d.ts.map +1 -1
  100. package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.js +6 -0
  101. package/dist/cjs/nodes/ecommerce/ecommerce-generate-invoice.js.map +1 -1
  102. package/dist/cjs/nodes/navigation/navigation-go-to-page.d.ts.map +1 -1
  103. package/dist/cjs/nodes/navigation/navigation-go-to-page.js +4 -1
  104. package/dist/cjs/nodes/navigation/navigation-go-to-page.js.map +1 -1
  105. package/dist/cjs/nodes/navigation/navigation-navigate-to-url.d.ts.map +1 -1
  106. package/dist/cjs/nodes/navigation/navigation-navigate-to-url.js +5 -2
  107. package/dist/cjs/nodes/navigation/navigation-navigate-to-url.js.map +1 -1
  108. package/dist/cjs/nodes/payment/payment-charge-user.d.ts.map +1 -1
  109. package/dist/cjs/nodes/payment/payment-charge-user.js +7 -2
  110. package/dist/cjs/nodes/payment/payment-charge-user.js.map +1 -1
  111. package/dist/cjs/segment-splitter.d.ts +1 -1
  112. package/dist/cjs/segment-splitter.d.ts.map +1 -1
  113. package/dist/cjs/segment-splitter.js +29 -2
  114. package/dist/cjs/segment-splitter.js.map +1 -1
  115. package/dist/cjs/sent-email-log/index.d.ts +16 -0
  116. package/dist/cjs/sent-email-log/index.d.ts.map +1 -0
  117. package/dist/cjs/sent-email-log/index.js +53 -0
  118. package/dist/cjs/sent-email-log/index.js.map +1 -0
  119. package/dist/cjs/sent-email-log/sent-email-log-code.d.ts +4 -0
  120. package/dist/cjs/sent-email-log/sent-email-log-code.d.ts.map +1 -0
  121. package/dist/cjs/sent-email-log/sent-email-log-code.js +415 -0
  122. package/dist/cjs/sent-email-log/sent-email-log-code.js.map +1 -0
  123. package/dist/cjs/sent-email-log/sent-email-log-scope.d.ts +21 -0
  124. package/dist/cjs/sent-email-log/sent-email-log-scope.d.ts.map +1 -0
  125. package/dist/cjs/sent-email-log/sent-email-log-scope.js +36 -0
  126. package/dist/cjs/sent-email-log/sent-email-log-scope.js.map +1 -0
  127. package/dist/cjs/transactional-email-code.d.ts +39 -1
  128. package/dist/cjs/transactional-email-code.d.ts.map +1 -1
  129. package/dist/cjs/transactional-email-code.js +86 -12
  130. package/dist/cjs/transactional-email-code.js.map +1 -1
  131. package/dist/cjs/tsconfig.tsbuildinfo +1 -1
  132. package/dist/cjs/webhook-generator.d.ts.map +1 -1
  133. package/dist/cjs/webhook-generator.js +9 -2
  134. package/dist/cjs/webhook-generator.js.map +1 -1
  135. package/dist/cjs/workflow-component-plugin.js +4 -3
  136. package/dist/cjs/workflow-component-plugin.js.map +1 -1
  137. package/dist/cjs/workflow-project-plugin.d.ts.map +1 -1
  138. package/dist/cjs/workflow-project-plugin.js +31 -3
  139. package/dist/cjs/workflow-project-plugin.js.map +1 -1
  140. package/dist/cjs/workflow-utils-alias.d.ts +21 -0
  141. package/dist/cjs/workflow-utils-alias.d.ts.map +1 -0
  142. package/dist/cjs/workflow-utils-alias.js +27 -0
  143. package/dist/cjs/workflow-utils-alias.js.map +1 -0
  144. package/dist/esm/account-delete-route-generator.d.ts +20 -0
  145. package/dist/esm/account-delete-route-generator.d.ts.map +1 -1
  146. package/dist/esm/account-delete-route-generator.js +30 -27
  147. package/dist/esm/account-delete-route-generator.js.map +1 -1
  148. package/dist/esm/api-route-generator.d.ts.map +1 -1
  149. package/dist/esm/api-route-generator.js +57 -11
  150. package/dist/esm/api-route-generator.js.map +1 -1
  151. package/dist/esm/auth-generator.d.ts +2 -1
  152. package/dist/esm/auth-generator.d.ts.map +1 -1
  153. package/dist/esm/auth-generator.js +56 -19
  154. package/dist/esm/auth-generator.js.map +1 -1
  155. package/dist/esm/data-api-route-generator.d.ts.map +1 -1
  156. package/dist/esm/data-api-route-generator.js +19 -0
  157. package/dist/esm/data-api-route-generator.js.map +1 -1
  158. package/dist/esm/email-locale/email-locale-code.d.ts +25 -0
  159. package/dist/esm/email-locale/email-locale-code.d.ts.map +1 -0
  160. package/dist/esm/email-locale/email-locale-code.js +222 -0
  161. package/dist/esm/email-locale/email-locale-code.js.map +1 -0
  162. package/dist/esm/email-locale/email-locale-scope.d.ts +46 -0
  163. package/dist/esm/email-locale/email-locale-scope.d.ts.map +1 -0
  164. package/dist/esm/email-locale/email-locale-scope.js +47 -0
  165. package/dist/esm/email-locale/email-locale-scope.js.map +1 -0
  166. package/dist/esm/email-locale/index.d.ts +11 -0
  167. package/dist/esm/email-locale/index.d.ts.map +1 -0
  168. package/dist/esm/email-locale/index.js +28 -0
  169. package/dist/esm/email-locale/index.js.map +1 -0
  170. package/dist/esm/executor-generator.d.ts +11 -1
  171. package/dist/esm/executor-generator.d.ts.map +1 -1
  172. package/dist/esm/executor-generator.js +49 -7
  173. package/dist/esm/executor-generator.js.map +1 -1
  174. package/dist/esm/index.d.ts +2 -0
  175. package/dist/esm/index.d.ts.map +1 -1
  176. package/dist/esm/index.js +2 -0
  177. package/dist/esm/index.js.map +1 -1
  178. package/dist/esm/invoice/api-routes-code.d.ts.map +1 -1
  179. package/dist/esm/invoice/api-routes-code.js +55 -6
  180. package/dist/esm/invoice/api-routes-code.js.map +1 -1
  181. package/dist/esm/invoice/email-sender-code.d.ts.map +1 -1
  182. package/dist/esm/invoice/email-sender-code.js +72 -31
  183. package/dist/esm/invoice/email-sender-code.js.map +1 -1
  184. package/dist/esm/invoice/index.d.ts +1 -4
  185. package/dist/esm/invoice/index.d.ts.map +1 -1
  186. package/dist/esm/invoice/index.js +7 -18
  187. package/dist/esm/invoice/index.js.map +1 -1
  188. package/dist/esm/invoice/invoice-html-code.d.ts.map +1 -1
  189. package/dist/esm/invoice/invoice-html-code.js +31 -8
  190. package/dist/esm/invoice/invoice-html-code.js.map +1 -1
  191. package/dist/esm/invoice/regional-invoice-tax-code.d.ts +25 -0
  192. package/dist/esm/invoice/regional-invoice-tax-code.d.ts.map +1 -0
  193. package/dist/esm/invoice/regional-invoice-tax-code.js +113 -0
  194. package/dist/esm/invoice/regional-invoice-tax-code.js.map +1 -0
  195. package/dist/esm/invoice/resolve-data-source.d.ts +6 -0
  196. package/dist/esm/invoice/resolve-data-source.d.ts.map +1 -0
  197. package/dist/esm/invoice/resolve-data-source.js +19 -0
  198. package/dist/esm/invoice/resolve-data-source.js.map +1 -0
  199. package/dist/esm/nodes/account/account-delete-current.d.ts.map +1 -1
  200. package/dist/esm/nodes/account/account-delete-current.js +10 -3
  201. package/dist/esm/nodes/account/account-delete-current.js.map +1 -1
  202. package/dist/esm/nodes/account/account-login.d.ts.map +1 -1
  203. package/dist/esm/nodes/account/account-login.js +3 -1
  204. package/dist/esm/nodes/account/account-login.js.map +1 -1
  205. package/dist/esm/nodes/account/account-logout.d.ts.map +1 -1
  206. package/dist/esm/nodes/account/account-logout.js +4 -2
  207. package/dist/esm/nodes/account/account-logout.js.map +1 -1
  208. package/dist/esm/nodes/account/account-signup.d.ts.map +1 -1
  209. package/dist/esm/nodes/account/account-signup.js +12 -2
  210. package/dist/esm/nodes/account/account-signup.js.map +1 -1
  211. package/dist/esm/nodes/account/account-social-login.d.ts.map +1 -1
  212. package/dist/esm/nodes/account/account-social-login.js +4 -2
  213. package/dist/esm/nodes/account/account-social-login.js.map +1 -1
  214. package/dist/esm/nodes/cart/cart-clear.d.ts.map +1 -1
  215. package/dist/esm/nodes/cart/cart-clear.js +6 -0
  216. package/dist/esm/nodes/cart/cart-clear.js.map +1 -1
  217. package/dist/esm/nodes/cart/cart-get-total.d.ts.map +1 -1
  218. package/dist/esm/nodes/cart/cart-get-total.js +81 -5
  219. package/dist/esm/nodes/cart/cart-get-total.js.map +1 -1
  220. package/dist/esm/nodes/data/data-create-item.d.ts.map +1 -1
  221. package/dist/esm/nodes/data/data-create-item.js +16 -0
  222. package/dist/esm/nodes/data/data-create-item.js.map +1 -1
  223. package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.d.ts.map +1 -1
  224. package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.js +6 -0
  225. package/dist/esm/nodes/ecommerce/ecommerce-generate-invoice.js.map +1 -1
  226. package/dist/esm/nodes/navigation/navigation-go-to-page.d.ts.map +1 -1
  227. package/dist/esm/nodes/navigation/navigation-go-to-page.js +4 -1
  228. package/dist/esm/nodes/navigation/navigation-go-to-page.js.map +1 -1
  229. package/dist/esm/nodes/navigation/navigation-navigate-to-url.d.ts.map +1 -1
  230. package/dist/esm/nodes/navigation/navigation-navigate-to-url.js +5 -2
  231. package/dist/esm/nodes/navigation/navigation-navigate-to-url.js.map +1 -1
  232. package/dist/esm/nodes/payment/payment-charge-user.d.ts.map +1 -1
  233. package/dist/esm/nodes/payment/payment-charge-user.js +7 -2
  234. package/dist/esm/nodes/payment/payment-charge-user.js.map +1 -1
  235. package/dist/esm/segment-splitter.d.ts +1 -1
  236. package/dist/esm/segment-splitter.d.ts.map +1 -1
  237. package/dist/esm/segment-splitter.js +29 -2
  238. package/dist/esm/segment-splitter.js.map +1 -1
  239. package/dist/esm/sent-email-log/index.d.ts +16 -0
  240. package/dist/esm/sent-email-log/index.d.ts.map +1 -0
  241. package/dist/esm/sent-email-log/index.js +45 -0
  242. package/dist/esm/sent-email-log/index.js.map +1 -0
  243. package/dist/esm/sent-email-log/sent-email-log-code.d.ts +4 -0
  244. package/dist/esm/sent-email-log/sent-email-log-code.d.ts.map +1 -0
  245. package/dist/esm/sent-email-log/sent-email-log-code.js +411 -0
  246. package/dist/esm/sent-email-log/sent-email-log-code.js.map +1 -0
  247. package/dist/esm/sent-email-log/sent-email-log-scope.d.ts +21 -0
  248. package/dist/esm/sent-email-log/sent-email-log-scope.d.ts.map +1 -0
  249. package/dist/esm/sent-email-log/sent-email-log-scope.js +31 -0
  250. package/dist/esm/sent-email-log/sent-email-log-scope.js.map +1 -0
  251. package/dist/esm/transactional-email-code.d.ts +39 -1
  252. package/dist/esm/transactional-email-code.d.ts.map +1 -1
  253. package/dist/esm/transactional-email-code.js +81 -10
  254. package/dist/esm/transactional-email-code.js.map +1 -1
  255. package/dist/esm/tsconfig.tsbuildinfo +1 -1
  256. package/dist/esm/webhook-generator.d.ts.map +1 -1
  257. package/dist/esm/webhook-generator.js +9 -2
  258. package/dist/esm/webhook-generator.js.map +1 -1
  259. package/dist/esm/workflow-component-plugin.js +4 -3
  260. package/dist/esm/workflow-component-plugin.js.map +1 -1
  261. package/dist/esm/workflow-project-plugin.d.ts.map +1 -1
  262. package/dist/esm/workflow-project-plugin.js +32 -4
  263. package/dist/esm/workflow-project-plugin.js.map +1 -1
  264. package/dist/esm/workflow-utils-alias.d.ts +21 -0
  265. package/dist/esm/workflow-utils-alias.d.ts.map +1 -0
  266. package/dist/esm/workflow-utils-alias.js +21 -0
  267. package/dist/esm/workflow-utils-alias.js.map +1 -0
  268. package/package.json +4 -4
  269. package/src/account-delete-route-generator.ts +36 -7
  270. package/src/api-route-generator.ts +64 -11
  271. package/src/auth-generator.ts +63 -18
  272. package/src/data-api-route-generator.ts +19 -0
  273. package/src/email-locale/email-locale-code.ts +239 -0
  274. package/src/email-locale/email-locale-scope.ts +65 -0
  275. package/src/email-locale/index.ts +46 -0
  276. package/src/executor-generator.ts +65 -7
  277. package/src/index.ts +8 -0
  278. package/src/invoice/api-routes-code.ts +65 -6
  279. package/src/invoice/email-sender-code.ts +72 -31
  280. package/src/invoice/index.ts +7 -23
  281. package/src/invoice/invoice-html-code.ts +31 -8
  282. package/src/invoice/regional-invoice-tax-code.ts +112 -0
  283. package/src/invoice/resolve-data-source.ts +25 -0
  284. package/src/nodes/account/account-delete-current.ts +10 -3
  285. package/src/nodes/account/account-login.ts +3 -1
  286. package/src/nodes/account/account-logout.ts +4 -2
  287. package/src/nodes/account/account-signup.ts +12 -2
  288. package/src/nodes/account/account-social-login.ts +7 -2
  289. package/src/nodes/cart/cart-clear.ts +6 -0
  290. package/src/nodes/cart/cart-get-total.ts +94 -5
  291. package/src/nodes/data/data-create-item.ts +16 -0
  292. package/src/nodes/ecommerce/ecommerce-generate-invoice.ts +6 -0
  293. package/src/nodes/navigation/navigation-go-to-page.ts +5 -1
  294. package/src/nodes/navigation/navigation-navigate-to-url.ts +6 -2
  295. package/src/nodes/payment/payment-charge-user.ts +13 -2
  296. package/src/nodes/workflow-utils-global.d.ts +12 -0
  297. package/src/segment-splitter.ts +33 -2
  298. package/src/sent-email-log/index.ts +57 -0
  299. package/src/sent-email-log/sent-email-log-code.ts +419 -0
  300. package/src/sent-email-log/sent-email-log-scope.ts +36 -0
  301. package/src/transactional-email-code.ts +112 -4
  302. package/src/webhook-generator.ts +11 -2
  303. package/src/workflow-component-plugin.ts +4 -3
  304. package/src/workflow-project-plugin.ts +36 -4
  305. package/src/workflow-utils-alias.ts +26 -0
@@ -4,7 +4,9 @@
4
4
  * dispatch, template filler, dependency map, and config-key list in ONE place so
5
5
  * every route stays byte-for-byte consistent.
6
6
  */
7
+ import { UIDLLocalizedEmailTemplates } from '@teleporthq/teleport-types'
7
8
  import { getEmailProviderDependencies } from './invoice/email-sender-code'
9
+ import { EMAIL_LOCALE_FILE_NAME, EMAIL_LOCALE_PATH } from './email-locale/email-locale-scope'
8
10
 
9
11
  export const SUPPORTED_EMAIL_PROVIDERS = new Set([
10
12
  'resend',
@@ -25,10 +27,67 @@ export const transactionalEmailDependencies = (
25
27
  return getEmailProviderDependencies(provider)
26
28
  }
27
29
 
28
- // Provider-specific `__sendProviderEmail({ from, to, subject, html, apiKey })`.
29
- // No attachment (unlike the invoice sender). When no provider is configured the
30
- // function is a no-op so the route stays self-contained and never throws.
31
- export const generateProviderSendFunction = (provider?: string | null): string => {
30
+ /**
31
+ * Where a transactional route's sends are recorded in the sent-email ledger:
32
+ * the purpose slug, the `source` column and the route file, plus the require
33
+ * prefix from the route's directory back to the project root.
34
+ */
35
+ export interface TransactionalEmailLedger {
36
+ emailType: string
37
+ source: string
38
+ sourceRef: string
39
+ relativePrefix: string
40
+ }
41
+
42
+ // Provider-specific `__sendProviderEmail({ from, to, subject, html, apiKey,
43
+ // tokenValues?, userId? })`. No attachment (unlike the invoice sender). When
44
+ // no provider is configured the function is a no-op so the route stays
45
+ // self-contained and never throws. With `ledger`, the provider function is
46
+ // emitted as `__sendProviderEmailRaw` and `__sendProviderEmail` records every
47
+ // attempt (success or throw) before returning / rethrowing.
48
+ export const generateProviderSendFunction = (
49
+ provider?: string | null,
50
+ ledger?: TransactionalEmailLedger
51
+ ): string => {
52
+ const raw = generateRawProviderSendFunction(provider)
53
+ if (!ledger || !provider || !SUPPORTED_EMAIL_PROVIDERS.has(provider)) {
54
+ return raw
55
+ }
56
+ return `${raw.replace(
57
+ 'async function __sendProviderEmail(',
58
+ 'async function __sendProviderEmailRaw('
59
+ )}
60
+
61
+ var __sentEmailLog = require('${ledger.relativePrefix}/utils/email/sent-email-log');
62
+
63
+ async function __sendProviderEmail(msg) {
64
+ var failure = null;
65
+ try {
66
+ await __sendProviderEmailRaw(msg);
67
+ } catch (err) {
68
+ failure = err;
69
+ }
70
+ // Recorded in the background; the route settles the ledger before it replies.
71
+ __sentEmailLog.recordSentEmail({
72
+ emailType: ${JSON.stringify(ledger.emailType)},
73
+ audience: 'customer',
74
+ to: msg.to,
75
+ from: msg.from,
76
+ subject: msg.subject,
77
+ html: msg.html,
78
+ payload: msg.tokenValues,
79
+ provider: ${JSON.stringify(provider)},
80
+ status: failure ? 'failed' : 'sent',
81
+ error: failure ? (failure.message || String(failure)) : null,
82
+ source: ${JSON.stringify(ledger.source)},
83
+ sourceRef: ${JSON.stringify(ledger.sourceRef)},
84
+ userId: msg.userId,
85
+ });
86
+ if (failure) { throw failure; }
87
+ }`
88
+ }
89
+
90
+ const generateRawProviderSendFunction = (provider?: string | null): string => {
32
91
  switch (provider) {
33
92
  case 'resend':
34
93
  return `async function __sendProviderEmail(msg) {
@@ -94,6 +153,54 @@ export const generateFillTemplateFn = (): string => `function fillTemplate(str,
94
153
  return out;
95
154
  }`
96
155
 
156
+ /**
157
+ * The per-language copies of a transactional route's email, as the UIDL mapper
158
+ * wrote them on the node config. Anything that is not a locale→copy map is
159
+ * treated as "no copies", so a hand-edited config can never break the route.
160
+ */
161
+ export const readLocalizedEmailTemplates = (value: unknown): UIDLLocalizedEmailTemplates => {
162
+ if (!value || typeof value !== 'object' || Array.isArray(value)) {
163
+ return {}
164
+ }
165
+ const copies: UIDLLocalizedEmailTemplates = {}
166
+ for (const [locale, copy] of Object.entries(value as Record<string, unknown>)) {
167
+ if (!copy || typeof copy !== 'object') {
168
+ continue
169
+ }
170
+ const { body, subject } = copy as { body?: unknown; subject?: unknown }
171
+ if (typeof body !== 'string' || !body) {
172
+ continue
173
+ }
174
+ copies[locale] = typeof subject === 'string' && subject ? { body, subject } : { body }
175
+ }
176
+ return copies
177
+ }
178
+
179
+ /** The `require` of the shared locale module from a route `relativePrefix` deep. */
180
+ export const generateEmailLocaleRequire = (relativePrefix: string): string =>
181
+ `var __emailLocale = require('${relativePrefix}/${EMAIL_LOCALE_PATH.join(
182
+ '/'
183
+ )}/${EMAIL_LOCALE_FILE_NAME}');`
184
+
185
+ /**
186
+ * Emits `function <fnName>(locale)` returning `{ subject, body, locale }` — the
187
+ * copy of the route's email for the language a request came from, read from
188
+ * the baked constants. The default language and any language without a copy
189
+ * fall back to the base subject/body.
190
+ */
191
+ export const generateLocalizedEmailCopyFn = (params: {
192
+ fnName: string
193
+ subjectConst: string
194
+ bodyConst: string
195
+ localizedConst: string
196
+ }): string => `function ${params.fnName}(locale) {
197
+ return __emailLocale.pickLocalizedTemplate(
198
+ { subject: ${params.subjectConst}, body: ${params.bodyConst} },
199
+ ${params.localizedConst},
200
+ locale
201
+ );
202
+ }`
203
+
97
204
  // The account-signup node's welcome-email config keys. They must NEVER be
98
205
  // forwarded from the client signup handler to /api/auth/signup nor inserted as
99
206
  // user columns (they'd corrupt createUser and leak into the client bundle).
@@ -109,4 +216,5 @@ export const WELCOME_EMAIL_CONFIG_KEYS = [
109
216
  'bodyComponentId',
110
217
  'bodyTemplatePurpose',
111
218
  'templateParams',
219
+ 'localizedTemplates',
112
220
  ]
@@ -572,7 +572,10 @@ module.exports = async function handler(req, res) {
572
572
  method: 'POST',
573
573
  headers: { 'Content-Type': 'application/json' },
574
574
  body: JSON.stringify({
575
- orderId: resource.id || '',
575
+ // The internal order id, so the route can load the order's own
576
+ // lines and the rates they were charged at; the capture id is
577
+ // only a fallback for a resource that carries no custom_id.
578
+ orderId: __extractInternalOrderId(resource) || resource.id || '',
576
579
  customerEmail: (resource.payer && resource.payer.email_address) || '',
577
580
  customerName: resource.payer && resource.payer.name ? ((resource.payer.name.given_name || '') + ' ' + (resource.payer.name.surname || '')).trim() : '',
578
581
  totalAmount: resource.amount ? Number(resource.amount.value) || 0 : 0,
@@ -661,7 +664,7 @@ async function verifyPaypalWebhook(headers, body, webhookId, clientId, clientSec
661
664
  }
662
665
 
663
666
  ${
664
- autoGenerateInvoice
667
+ autoGenerateInvoice || hasOrderNotifications
665
668
  ? `
666
669
  // Pull the internal teleport_orders UUID out of the PayPal resource's
667
670
  // custom_id field. Order creation embeds it as JSON
@@ -683,7 +686,13 @@ function __extractInternalOrderId(resource) {
683
686
  }
684
687
  return '';
685
688
  }
689
+ `
690
+ : ''
691
+ }
686
692
 
693
+ ${
694
+ autoGenerateInvoice
695
+ ? `
687
696
  async function handlePaypalInvoiceGeneration(resource, eventType, clientId, clientSecret, baseUrl) {
688
697
  try {
689
698
  var customerEmail = '';
@@ -1330,7 +1330,8 @@ function __normalizeAdminFormRow(row, defaults) {
1330
1330
  var camel = k.replace(/_([a-z])/g, function(_, ch) { return ch.toUpperCase() })
1331
1331
  var v = row[k]
1332
1332
  if (v === undefined) v = row[camel]
1333
- if (k === 'tags') {
1333
+ // A per-language copy (\`es_tags\`) holds the same shape as \`tags\`.
1334
+ if (k === 'tags' || /^.{2,5}_tags$/.test(k)) {
1334
1335
  v = __normalizeTagsForFormInput(v)
1335
1336
  }
1336
1337
  if (k === 'gallery_images' || k === 'additional_image_urls') {
@@ -1401,7 +1402,7 @@ function __normalizeAdminFormRow(row, defaults) {
1401
1402
  nodes: s.nodes.map((n) => ({
1402
1403
  id: n.id,
1403
1404
  type: n.type,
1404
- config: redactServerNodeConfig(n.config, s.env),
1405
+ config: redactServerNodeConfig(n.config, s.env, n.type),
1405
1406
  stepNumber: n.stepNumber,
1406
1407
  label: n.label,
1407
1408
  })),
@@ -1425,7 +1426,7 @@ function __normalizeAdminFormRow(row, defaults) {
1425
1426
  return {
1426
1427
  id: n.id,
1427
1428
  type: n.type,
1428
- config: redactServerNodeConfig(n.config, env),
1429
+ config: redactServerNodeConfig(n.config, env, n.type),
1429
1430
  stepNumber: n.stepNumber,
1430
1431
  label: n.label,
1431
1432
  executionEnv: env,
@@ -62,13 +62,19 @@ import {
62
62
  getDatabaseDriverDependencies,
63
63
  } from './auth-generator'
64
64
  import { generateInvoiceFiles, resolveInvoiceDataSource } from './invoice'
65
+ import { ensureSentEmailLogModule, hasEmailSendingNodeType } from './sent-email-log'
66
+ import { ensureEmailLocaleModule, resolveEmailLocaleConfig } from './email-locale'
67
+ import { workflowUtilsImportLine, workflowUtilsRequireLine } from './workflow-utils-alias'
65
68
  import { generateWebhookFiles } from './webhook-generator'
66
69
  import { needsDataAPIRoute, generateDataAPIRoute } from './data-api-route-generator'
67
70
  import {
68
71
  generateAccountDeleteRoute,
69
72
  accountDeleteRouteDependencies,
70
73
  } from './account-delete-route-generator'
71
- import { transactionalEmailDependencies } from './transactional-email-code'
74
+ import {
75
+ readLocalizedEmailTemplates,
76
+ transactionalEmailDependencies,
77
+ } from './transactional-email-code'
72
78
  import {
73
79
  needsRuntimeStorageRoute,
74
80
  generateRuntimeStorageUploadRoute,
@@ -347,13 +353,21 @@ export class NextWorkflowProjectPlugin implements ProjectPlugin {
347
353
  const customNodes = uidl.workflows.customNodes || {}
348
354
  const usedNodeTypes = collectUsedNodeTypes(uidl.workflows)
349
355
 
356
+ // Server routes that run a mail-sending node require the sent-email
357
+ // ledger module (see generateNodeHandlersForSegment).
358
+ if (hasEmailSendingNodeType(usedNodeTypes)) {
359
+ ensureSentEmailLogModule(structure)
360
+ }
361
+
350
362
  files.set('workflow-runtime-utils', {
351
363
  path: ['utils', 'workflows'],
352
364
  files: [
353
365
  {
354
366
  name: 'runtime-utils',
355
367
  fileType: FileType.JS,
356
- content: generateSharedRuntimeUtilsCode(),
368
+ content: generateSharedRuntimeUtilsCode({
369
+ emailLocales: resolveEmailLocaleConfig(uidl),
370
+ }),
357
371
  },
358
372
  ],
359
373
  })
@@ -655,6 +669,7 @@ export class NextWorkflowProjectPlugin implements ProjectPlugin {
655
669
  const emailSecretEnvName =
656
670
  extractSecretEnvName(deleteConfig.apiKey) || extractSecretEnvName(deleteConfig.serverToken)
657
671
 
672
+ ensureEmailLocaleModule(structure)
658
673
  files.set('account-delete-current-route', {
659
674
  path: ['pages', 'api', 'account'],
660
675
  files: [
@@ -668,6 +683,7 @@ export class NextWorkflowProjectPlugin implements ProjectPlugin {
668
683
  emailSecretEnvName,
669
684
  emailSubject: typeof deleteConfig.subject === 'string' ? deleteConfig.subject : '',
670
685
  emailBodyHtml: typeof deleteConfig.body === 'string' ? deleteConfig.body : '',
686
+ localizedTemplates: readLocalizedEmailTemplates(deleteConfig.localizedTemplates),
671
687
  siteName: uidl.name || '',
672
688
  deletedEmailPattern:
673
689
  typeof deleteConfig.deletedEmailPattern === 'string'
@@ -684,6 +700,10 @@ export class NextWorkflowProjectPlugin implements ProjectPlugin {
684
700
  dependencies[pkg] = version
685
701
  }
686
702
  }
703
+ // A configured provider means the route records its sends.
704
+ if (Object.keys(providerDeps).length > 0) {
705
+ ensureSentEmailLogModule(structure)
706
+ }
687
707
  }
688
708
 
689
709
  if (needsRuntimeStorageRoute(usedNodeTypes)) {
@@ -1175,7 +1195,10 @@ export class NextWorkflowProjectPlugin implements ProjectPlugin {
1175
1195
  })
1176
1196
  .join(',\n')
1177
1197
 
1198
+ // Bound before the map so a handler can reach the runtime's helpers by the
1199
+ // shared alias (see workflow-utils-alias.ts).
1178
1200
  return `// Auto-generated workflow node handlers (${env})
1201
+ ${workflowUtilsRequireLine('./runtime-utils')}
1179
1202
 
1180
1203
  module.exports = {
1181
1204
  ${entries}
@@ -1255,7 +1278,7 @@ ${entries}
1255
1278
  const nodesJson = JSON.stringify(
1256
1279
  (cn.nodes || []).map((n: any) => ({
1257
1280
  ...n,
1258
- config: redactServerNodeConfig(n.config, resolveNodeExecutionEnv(n)),
1281
+ config: redactServerNodeConfig(n.config, resolveNodeExecutionEnv(n), n.type),
1259
1282
  // Runtime marker consumed by clientExecutableBranchNodes (client
1260
1283
  // runtime) so streaming on-stream/on-end branches never execute
1261
1284
  // server nodes (whose config was just redacted) client-side.
@@ -1299,7 +1322,7 @@ ${entries}
1299
1322
  nodes: s.nodes.map((n) => ({
1300
1323
  id: n.id,
1301
1324
  type: n.type,
1302
- config: redactServerNodeConfig(n.config, s.env),
1325
+ config: redactServerNodeConfig(n.config, s.env, n.type),
1303
1326
  stepNumber: n.stepNumber,
1304
1327
  label: n.label,
1305
1328
  })),
@@ -1645,12 +1668,16 @@ module.exports = __customNodeRegistry;
1645
1668
  const welcomeSecretEnvName =
1646
1669
  extractSecretEnvName(signupConfig.apiKey) || extractSecretEnvName(signupConfig.serverToken)
1647
1670
 
1671
+ // The route reads the signup page's language off the request, so the
1672
+ // locale module must exist whether or not a welcome email is configured.
1673
+ ensureEmailLocaleModule(structure)
1648
1674
  const signupRouteCode = generateSignupRouteFile(auth, {
1649
1675
  emailProvider: welcomeProvider,
1650
1676
  fromEmail: typeof signupConfig.from === 'string' ? signupConfig.from : '',
1651
1677
  emailSecretEnvName: welcomeSecretEnvName,
1652
1678
  emailSubject: typeof signupConfig.subject === 'string' ? signupConfig.subject : '',
1653
1679
  emailBodyHtml: typeof signupConfig.body === 'string' ? signupConfig.body : '',
1680
+ localizedTemplates: readLocalizedEmailTemplates(signupConfig.localizedTemplates),
1654
1681
  siteName: uidl.name || '',
1655
1682
  })
1656
1683
  files.set('auth-signup-route', {
@@ -1670,6 +1697,10 @@ module.exports = __customNodeRegistry;
1670
1697
  dependencies[pkg] = version
1671
1698
  }
1672
1699
  }
1700
+ // A configured provider means the route records its sends.
1701
+ if (Object.keys(welcomeProviderDeps).length > 0) {
1702
+ ensureSentEmailLogModule(structure)
1703
+ }
1673
1704
  }
1674
1705
 
1675
1706
  const nextAuthRouteCode = generateNextAuthRouteFile()
@@ -1953,6 +1984,7 @@ module.exports = __customNodeRegistry;
1953
1984
  return `// Auto-generated global workflow hooks
1954
1985
  import { useEffect } from 'react';
1955
1986
  ${needsRouter ? `import Router from 'next/router';\n` : ''}import workflowRuntime from './runtime';
1987
+ ${workflowUtilsImportLine('./runtime-utils')}
1956
1988
  const executeWorkflowWithSegments = workflowRuntime.executeWorkflowWithSegments;
1957
1989
 
1958
1990
  export function useGlobalWorkflows() {
@@ -0,0 +1,26 @@
1
+ /**
2
+ * How a node handler reaches the shared workflow runtime (`runtime-utils.js`).
3
+ *
4
+ * Handlers are authored as plain functions and inlined by `.toString()` into
5
+ * several generated files — the client and server handler maps, the global
6
+ * workflows hook and every API route — which sit in different directories, so
7
+ * a `require` with a relative path inside a handler could not resolve from all
8
+ * of them. Instead, each of those files binds the runtime to this one
9
+ * identifier before its first handler, and a handler that needs a helper the
10
+ * runtime owns (currently the locale-aware `localizeHref`) calls it through
11
+ * the alias. `nodes/workflow-utils-global.d.ts` declares it for the handler
12
+ * sources; the tests that evaluate emitted handler code bind it themselves.
13
+ */
14
+ export const WORKFLOW_UTILS_ALIAS = '__workflowUtils'
15
+
16
+ /** The binding for a CommonJS file: `var __workflowUtils = require('<specifier>');` */
17
+ export const workflowUtilsRequireLine = (specifier: string): string =>
18
+ `var ${WORKFLOW_UTILS_ALIAS} = require('${specifier}');`
19
+
20
+ /** The binding for an ES module file: `import __workflowUtils from '<specifier>';` */
21
+ export const workflowUtilsImportLine = (specifier: string): string =>
22
+ `import ${WORKFLOW_UTILS_ALIAS} from '${specifier}';`
23
+
24
+ /** The binding for a file that already holds the runtime in `<identifier>`. */
25
+ export const workflowUtilsAliasLine = (identifier: string): string =>
26
+ `const ${WORKFLOW_UTILS_ALIAS} = ${identifier};`