@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
@@ -1,5 +1,16 @@
1
1
  import { NextWorkflowProjectPlugin } from '../src/workflow-project-plugin'
2
2
  import { nodeRegistry } from '../src/nodes'
3
+ import { workflowUtilsRequireLine } from '../src/workflow-utils-alias'
4
+
5
+ // The handler file binds the shared runtime before its map (see
6
+ // workflow-utils-alias.ts); module-eval here resolves that one require to a
7
+ // stand-in, exactly like the module-eval simulation resolves nothing else.
8
+ const requireStub = (specifier: string): Record<string, unknown> => {
9
+ if (specifier !== './runtime-utils') {
10
+ throw new Error(`unexpected require: ${specifier}`)
11
+ }
12
+ return {}
13
+ }
3
14
 
4
15
  /**
5
16
  * Regression (Vercel "ReferenceError: state_update_local_state is not defined" at
@@ -42,12 +53,19 @@ describe('generateNodeHandlerFile — inline handler map (dangling-proof)', () =
42
53
  expect(dangling).toEqual([])
43
54
  })
44
55
 
56
+ it('binds the shared runtime before the map so handlers can reach its helpers', () => {
57
+ expect(code.indexOf(workflowUtilsRequireLine('./runtime-utils'))).toBeGreaterThan(-1)
58
+ expect(code.indexOf(workflowUtilsRequireLine('./runtime-utils'))).toBeLessThan(
59
+ code.indexOf('module.exports = {')
60
+ )
61
+ })
62
+
45
63
  it('evaluates as a CommonJS module without ReferenceError and exposes callable handlers', () => {
46
64
  const moduleObj = { exports: {} as Record<string, unknown> }
47
65
  // Simulate Next.js module-eval (the "Collecting page data" require). If a map
48
66
  // value referenced an undefined identifier this would throw ReferenceError.
49
67
  // eslint-disable-next-line no-new-func
50
- new Function('module', 'exports', code)(moduleObj, moduleObj.exports)
68
+ new Function('module', 'exports', 'require', code)(moduleObj, moduleObj.exports, requireStub)
51
69
  expect(typeof moduleObj.exports['state-update-local-state']).toBe('function')
52
70
  expect(typeof moduleObj.exports['toast-show']).toBe('function')
53
71
  expect(typeof moduleObj.exports['general-extract-form-data']).toBe('function')
@@ -80,7 +98,11 @@ describe('generateNodeHandlerFile — every registry node type is eval-safe in b
80
98
  const moduleObj = { exports: {} as Record<string, unknown> }
81
99
  expect(() => {
82
100
  // eslint-disable-next-line no-new-func
83
- new Function('module', 'exports', code)(moduleObj, moduleObj.exports)
101
+ new Function('module', 'exports', 'require', code)(
102
+ moduleObj,
103
+ moduleObj.exports,
104
+ requireStub
105
+ )
84
106
  }).not.toThrow()
85
107
 
86
108
  // Each emitted map value must resolve to a callable handler (the IIFE
@@ -100,7 +122,11 @@ describe('generateNodeHandlerFile — every registry node type is eval-safe in b
100
122
  try {
101
123
  const moduleObj = { exports: {} as Record<string, unknown> }
102
124
  // eslint-disable-next-line no-new-func
103
- new Function('module', 'exports', code)(moduleObj, moduleObj.exports)
125
+ new Function('module', 'exports', 'require', code)(
126
+ moduleObj,
127
+ moduleObj.exports,
128
+ requireStub
129
+ )
104
130
  if (typeof moduleObj.exports[type] !== 'function') {
105
131
  offenders.push(`${type} (value not callable)`)
106
132
  }
@@ -93,6 +93,12 @@ describe('data-create-item auto-fires order-notification for teleport_orders ins
93
93
  expect(src).toContain('paymentMethod: item.payment_method')
94
94
  })
95
95
 
96
+ it("sends the order's tax breakdown and each line's product ids, so the route prices lines at their rate", () => {
97
+ expect(src).toContain('taxBreakdown: item.tax_breakdown || null')
98
+ expect(src).toContain("product_id: it.productId || it.product_id || ''")
99
+ expect(src).toContain("variant_id: it.variantId || it.variant_id || ''")
100
+ })
101
+
96
102
  it('fires-and-forgets — does NOT await the notification call', () => {
97
103
  // Awaiting an email provider that times out would block the
98
104
  // workflow's success response back to the buyer, leaving the
@@ -0,0 +1,41 @@
1
+ import { generatePaypalWebhookCode } from '../src/webhook-generator'
2
+ import type { UIDLEcommerceSettings, UIDLInvoiceSettings } from '@teleporthq/teleport-types'
3
+
4
+ /**
5
+ * The PayPal webhook tells the order-notification route which order was paid.
6
+ * The capture resource's own id is a PayPal id — it matches no `teleport_orders`
7
+ * row, so a notification keyed on it reached the merchant with no lines at all.
8
+ * The internal id travels in `custom_id`, and the helper that reads it must be
9
+ * emitted whenever notifications are on, not only when invoices are.
10
+ */
11
+ const ecommerce = (orderNotifications: boolean): UIDLEcommerceSettings =>
12
+ ({ orderNotifications } as unknown as UIDLEcommerceSettings)
13
+
14
+ const invoices = (enabled: boolean): UIDLInvoiceSettings =>
15
+ ({ enabled, autoGenerateOnPayment: enabled } as unknown as UIDLInvoiceSettings)
16
+
17
+ describe('PayPal webhook — order notification order id', () => {
18
+ it('sends the internal order id, falling back to the capture id', () => {
19
+ const source = generatePaypalWebhookCode(invoices(false), ecommerce(true))
20
+ expect(source).toContain("orderId: __extractInternalOrderId(resource) || resource.id || ''")
21
+ expect(source).toContain('function __extractInternalOrderId(resource)')
22
+ // Invoices are off: their handler is not emitted, only the id helper both share.
23
+ expect(source).not.toContain('async function handlePaypalInvoiceGeneration')
24
+ })
25
+
26
+ it('emits the helper for invoices alone too, and both handlers when both are on', () => {
27
+ const invoicesOnly = generatePaypalWebhookCode(invoices(true), ecommerce(false))
28
+ expect(invoicesOnly).toContain('function __extractInternalOrderId(resource)')
29
+ expect(invoicesOnly).toContain('async function handlePaypalInvoiceGeneration')
30
+ expect(invoicesOnly).not.toContain('/api/ecommerce/order-notification')
31
+
32
+ const both = generatePaypalWebhookCode(invoices(true), ecommerce(true))
33
+ expect(both.match(/function __extractInternalOrderId\(resource\)/g)).toHaveLength(1)
34
+ expect(both).toContain('/api/ecommerce/order-notification')
35
+ })
36
+
37
+ it('emits neither when neither feature is on', () => {
38
+ const source = generatePaypalWebhookCode(invoices(false), ecommerce(false))
39
+ expect(source).not.toContain('__extractInternalOrderId')
40
+ })
41
+ })
@@ -0,0 +1,262 @@
1
+ import {
2
+ generateClientRuntimeCode,
3
+ generateSharedRuntimeUtilsCode,
4
+ } from '../src/executor-generator'
5
+ import {
6
+ generateServerSegmentAPIRoute,
7
+ generateStreamingServerSegmentAPIRoute,
8
+ } from '../src/api-route-generator'
9
+ import { nodeRegistry } from '../src'
10
+ import { EMAIL_LOCALE_HEADER } from '../src/email-locale'
11
+
12
+ /**
13
+ * A customer email carries one copy per project language on its node config
14
+ * (`localizedTemplates`, written by the editor's UIDL mapper). The runtime has
15
+ * to pick the copy of the language the visitor is browsing in — or, for an
16
+ * email bound to a stored locale (an order's, a cart's), that language — and
17
+ * it has to do so in `resolveConfig`, the one function every execution path
18
+ * funnels a node config through, BEFORE the `{{token}}` fill.
19
+ *
20
+ * Executed, not grepped: what matters is which body a provider handler
21
+ * receives.
22
+ */
23
+
24
+ type ResolveConfig = (
25
+ config: Record<string, unknown>,
26
+ context: Record<string, unknown>
27
+ ) => Record<string, unknown>
28
+
29
+ interface Runtime {
30
+ resolveConfig: ResolveConfig
31
+ resolveEmailLocale: (config: Record<string, unknown>, context: Record<string, unknown>) => string
32
+ resolveWorkflowLocale: (req: unknown, incomingContext: unknown) => string
33
+ getClientLocale: () => string | null
34
+ }
35
+
36
+ function loadRuntime(emailLocales?: { locales: string[]; defaultLocale: string }): Runtime {
37
+ const code = generateSharedRuntimeUtilsCode(emailLocales ? { emailLocales } : {})
38
+ const moduleShim = { exports: {} as Runtime }
39
+ // eslint-disable-next-line no-new-func
40
+ new Function('module', 'exports', 'require', 'process', code)(
41
+ moduleShim,
42
+ moduleShim.exports,
43
+ () => ({}),
44
+ { env: {} }
45
+ )
46
+ return moduleShim.exports
47
+ }
48
+
49
+ const wfCtx = (nodeId: string, path: string[]) => ({
50
+ type: 'workflowContext',
51
+ nodeId,
52
+ path: [nodeId, ...path],
53
+ })
54
+
55
+ const emailConfig = (over: Record<string, unknown> = {}) => ({
56
+ to: 'jane@example.com',
57
+ subject: 'Your order {{orderNumber}} shipped',
58
+ body: '<p>Hi {{customerName}}, order {{orderNumber}} is on its way.</p>',
59
+ localizedTemplates: {
60
+ es: {
61
+ subject: 'Tu pedido {{orderNumber}} ha sido enviado',
62
+ body: '<p>Hola {{customerName}}, el pedido {{orderNumber}} está en camino.</p>',
63
+ },
64
+ fr: { body: '<p>Bonjour {{customerName}}, la commande {{orderNumber}} est en route.</p>' },
65
+ },
66
+ templateParams: [
67
+ { key: 'customerName', value: wfCtx('tokens', ['customerName']) },
68
+ { key: 'orderNumber', value: wfCtx('tokens', ['orderNumber']) },
69
+ ],
70
+ ...over,
71
+ })
72
+
73
+ const tokens = { customerName: 'Jane', orderNumber: 'ORD-42' }
74
+
75
+ describe('resolveConfig picks the localized email copy', () => {
76
+ const runtime = loadRuntime({ locales: ['en', 'es', 'fr'], defaultLocale: 'en' })
77
+
78
+ it('sends the copy of the language the run started in, tokens filled', () => {
79
+ const resolved = runtime.resolveConfig(emailConfig(), { tokens, __locale: 'es' })
80
+ expect(resolved.subject).toBe('Tu pedido ORD-42 ha sido enviado')
81
+ expect(resolved.body).toBe('<p>Hola Jane, el pedido ORD-42 está en camino.</p>')
82
+ })
83
+
84
+ it('keeps the main subject when the language copy has none', () => {
85
+ const resolved = runtime.resolveConfig(emailConfig(), { tokens, __locale: 'fr' })
86
+ expect(resolved.subject).toBe('Your order ORD-42 shipped')
87
+ expect(resolved.body).toBe('<p>Bonjour Jane, la commande ORD-42 est en route.</p>')
88
+ })
89
+
90
+ it('sends the main copy for the default language and for a run without a locale', () => {
91
+ for (const context of [{ tokens, __locale: 'en' }, { tokens }, { tokens, __locale: 'de' }]) {
92
+ const resolved = runtime.resolveConfig(emailConfig(), context)
93
+ expect(resolved.subject).toBe('Your order ORD-42 shipped')
94
+ expect(resolved.body).toBe('<p>Hi Jane, order ORD-42 is on its way.</p>')
95
+ }
96
+ })
97
+
98
+ it('never lets the per-language map reach the provider handler', () => {
99
+ const resolved = runtime.resolveConfig(emailConfig(), { tokens, __locale: 'es' })
100
+ expect(resolved).not.toHaveProperty('localizedTemplates')
101
+ expect(resolved).not.toHaveProperty('emailLocale')
102
+ })
103
+
104
+ it('lets a bound locale (the order’s) override the run’s language', () => {
105
+ const resolved = runtime.resolveConfig(
106
+ emailConfig({ emailLocale: wfCtx('tokens', ['locale']) }),
107
+ { tokens: { ...tokens, locale: 'es' }, __locale: 'fr' }
108
+ )
109
+ expect(resolved.body).toBe('<p>Hola Jane, el pedido ORD-42 está en camino.</p>')
110
+ expect(resolved).not.toHaveProperty('emailLocale')
111
+ })
112
+
113
+ it('treats an EMPTY bound locale as the default language, never the run’s', () => {
114
+ // An admin shipping an order from the Spanish admin is not the buyer: an
115
+ // order written before the locale column existed must not inherit the
116
+ // admin's language.
117
+ const resolved = runtime.resolveConfig(
118
+ emailConfig({ emailLocale: wfCtx('tokens', ['locale']) }),
119
+ { tokens: { ...tokens, locale: null }, __locale: 'es' }
120
+ )
121
+ expect(resolved.body).toBe('<p>Hi Jane, order ORD-42 is on its way.</p>')
122
+ })
123
+
124
+ it('resolves a bound locale case-insensitively to the canonical code', () => {
125
+ expect(runtime.resolveEmailLocale({ emailLocale: 'ES' }, { __locale: 'fr' })).toBe('es')
126
+ expect(runtime.resolveEmailLocale({}, { __locale: 'FR' })).toBe('fr')
127
+ expect(runtime.resolveEmailLocale({}, {})).toBe('en')
128
+ })
129
+
130
+ it('leaves a raw-bodied node without copies untouched', () => {
131
+ const resolved = runtime.resolveConfig(
132
+ { subject: 'Plain', body: '<p>Plain</p>', to: 'a@b.c' },
133
+ { __locale: 'es' }
134
+ )
135
+ expect(resolved).toEqual({ subject: 'Plain', body: '<p>Plain</p>', to: 'a@b.c' })
136
+ })
137
+ })
138
+
139
+ describe('resolveWorkflowLocale', () => {
140
+ const runtime = loadRuntime({ locales: ['en', 'es'], defaultLocale: 'en' })
141
+
142
+ it('trusts the (validated) locale the client context carried', () => {
143
+ expect(
144
+ runtime.resolveWorkflowLocale(
145
+ { headers: { [EMAIL_LOCALE_HEADER]: 'en' } },
146
+ { __locale: 'es' }
147
+ )
148
+ ).toBe('es')
149
+ })
150
+
151
+ it('reads the request when the context carries nothing usable', () => {
152
+ expect(
153
+ runtime.resolveWorkflowLocale(
154
+ { headers: { referer: 'https://x/es/cart' } },
155
+ { __locale: 'xx' }
156
+ )
157
+ ).toBe('es')
158
+ expect(runtime.resolveWorkflowLocale({ headers: {} }, {})).toBe('en')
159
+ })
160
+ })
161
+
162
+ describe('a project without internationalization', () => {
163
+ const runtime = loadRuntime()
164
+
165
+ it('keeps the single template even when a copy map is present', () => {
166
+ const resolved = runtime.resolveConfig(emailConfig(), { tokens, __locale: 'es' })
167
+ expect(resolved.body).toBe('<p>Hi Jane, order ORD-42 is on its way.</p>')
168
+ expect(resolved).not.toHaveProperty('localizedTemplates')
169
+ })
170
+
171
+ it('has no client locale outside a browser', () => {
172
+ expect(runtime.getClientLocale()).toBeNull()
173
+ })
174
+ })
175
+
176
+ describe('server segment routes carry the run locale', () => {
177
+ const segment = {
178
+ id: 'seg-1',
179
+ env: 'server' as const,
180
+ nodes: [
181
+ {
182
+ id: 'email-1',
183
+ type: 'email-resend',
184
+ config: { to: 'a@b.c', subject: 'S', body: 'B' },
185
+ executionEnv: 'server' as const,
186
+ stepNumber: 1,
187
+ label: 'Send',
188
+ },
189
+ ],
190
+ edges: [] as any[],
191
+ }
192
+
193
+ it('sets context.__locale from the client context or the request', () => {
194
+ const code = generateServerSegmentAPIRoute(segment as any, 'wf')
195
+ expect(code).toContain('context.__locale = utils.resolveWorkflowLocale(req, incomingContext);')
196
+ })
197
+
198
+ it('does so in the streaming route too', () => {
199
+ const code = generateStreamingServerSegmentAPIRoute(segment as any, 'wf')
200
+ expect(code).toContain('context.__locale = utils.resolveWorkflowLocale(req, body.context);')
201
+ })
202
+ })
203
+
204
+ describe('account routes receive the page language', () => {
205
+ it('signup and delete handlers send the locale header the routes read', () => {
206
+ for (const nodeType of ['account-signup', 'account-delete-current']) {
207
+ const source = nodeRegistry[nodeType].generateHandler()
208
+ expect(source).toContain(`'${EMAIL_LOCALE_HEADER}'`)
209
+ expect(source).toContain('__locale')
210
+ }
211
+ })
212
+
213
+ it('the signup handler never forwards the per-language copies as user columns', () => {
214
+ expect(nodeRegistry['account-signup'].generateHandler()).toContain('localizedTemplates: true')
215
+ })
216
+ })
217
+
218
+ describe('the client runtime stamps the page language on every run', () => {
219
+ const extractBuildContext = (): ((
220
+ config: unknown,
221
+ trigger: unknown
222
+ ) => Record<string, unknown>) => {
223
+ const src = generateClientRuntimeCode()
224
+ const match = src.match(/function buildContext\b[\s\S]*?\n\}/)
225
+ if (!match) {
226
+ throw new Error('buildContext not found in generated runtime')
227
+ }
228
+ // eslint-disable-next-line no-new-func
229
+ return new Function('utils', `${match[0]}\nreturn buildContext;`)(
230
+ loadRuntime({ locales: ['en', 'es'], defaultLocale: 'en' })
231
+ )
232
+ }
233
+
234
+ const withWindow = <T>(locale: string | undefined, run: () => T): T => {
235
+ const globalRef = globalThis as { window?: unknown; document?: unknown }
236
+ globalRef.window = { __NEXT_DATA__: { locale } }
237
+ globalRef.document = { documentElement: { lang: '' } }
238
+ try {
239
+ return run()
240
+ } finally {
241
+ delete globalRef.window
242
+ delete globalRef.document
243
+ }
244
+ }
245
+
246
+ it('reads the active Next.js locale into context.__locale', () => {
247
+ const buildContext = extractBuildContext()
248
+ const context = withWindow('es', () => buildContext({ triggerNodeId: 't' }, { clicked: true }))
249
+ expect(context.__locale).toBe('es')
250
+ expect(context.t).toEqual({ clicked: true })
251
+ })
252
+
253
+ it('leaves the context without a locale when the page has none the project knows', () => {
254
+ const buildContext = extractBuildContext()
255
+ expect(
256
+ withWindow(undefined, () => buildContext({ triggerNodeId: 't' }, {}))
257
+ ).not.toHaveProperty('__locale')
258
+ expect(withWindow('de', () => buildContext({ triggerNodeId: 't' }, {}))).not.toHaveProperty(
259
+ '__locale'
260
+ )
261
+ })
262
+ })