@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
@@ -7,15 +7,28 @@ export const generateEmailSenderCode = (emailDelivery) => {
7
7
  const fromName = emailDelivery.fromName || '';
8
8
  const subjectTemplate = emailDelivery.subject || 'Invoice {{invoiceNumber}}';
9
9
  const bodyTemplate = emailDelivery.body || '<p>Please find your invoice attached.</p>';
10
+ const localizedTemplates = emailDelivery.localizedTemplates || {};
10
11
  return `/**
11
12
  * Invoice Email Sender
12
13
  * Provider: ${emailDelivery.provider}
14
+ *
15
+ * \`sendInvoiceEmail\` is the public entry: it builds the message once, hands
16
+ * it to the provider function and records the attempt in the sent-email
17
+ * ledger. The provider function never builds the message itself, so the row
18
+ * carries exactly the subject and body that went out.
13
19
  */
14
20
 
15
21
  var pdfGenerator = require('./pdf-generator');
22
+ var sentEmailLog = require('../email/sent-email-log');
23
+ var emailLocale = require('../email/email-locale');
16
24
  var replacePlaceholders = pdfGenerator.replacePlaceholders;
17
25
 
18
26
  var SECRET_KEYS = ${secretKeysJson};
27
+ var SUBJECT_TEMPLATE = ${JSON.stringify(subjectTemplate)};
28
+ var BODY_TEMPLATE = ${JSON.stringify(bodyTemplate)};
29
+ // Per-language copies of the subject/body (main language excluded), chosen by
30
+ // the locale the generate route resolved for the invoice (the order's).
31
+ var LOCALIZED_TEMPLATES = ${JSON.stringify(localizedTemplates)};
19
32
 
20
33
  function resolveSecretKey(keyName) {
21
34
  var envName = SECRET_KEYS[keyName];
@@ -26,16 +39,62 @@ function resolveSecretKey(keyName) {
26
39
 
27
40
  function buildEmailData(invoiceData) {
28
41
  var data = pdfGenerator.buildDataContext(invoiceData);
42
+ var copy = emailLocale.pickLocalizedTemplate(
43
+ { subject: SUBJECT_TEMPLATE, body: BODY_TEMPLATE },
44
+ LOCALIZED_TEMPLATES,
45
+ invoiceData.locale
46
+ );
29
47
  return {
30
- subject: replacePlaceholders(${JSON.stringify(subjectTemplate)}, data),
31
- body: replacePlaceholders(${JSON.stringify(bodyTemplate)}, data),
48
+ subject: replacePlaceholders(copy.subject, data),
49
+ body: replacePlaceholders(copy.body, data),
32
50
  to: invoiceData.customerEmail || '',
33
51
  from: ${JSON.stringify(fromName ? `${fromName} <${fromEmail}>` : fromEmail)},
52
+ templateData: data,
34
53
  };
35
54
  }
36
55
 
56
+ function attachmentName(invoiceData) {
57
+ return (invoiceData.invoiceNumber || 'invoice') + '.pdf';
58
+ }
59
+
37
60
  ${generateProviderSendFunction(emailDelivery.provider)}
38
61
 
62
+ async function sendInvoiceEmail(invoiceData, pdfBuffer) {
63
+ var emailData = buildEmailData(invoiceData);
64
+ if (!emailData.to) return { success: false, error: 'No customer email provided' };
65
+ var result;
66
+ try {
67
+ result = await sendInvoiceEmailWithProvider(emailData, invoiceData, pdfBuffer);
68
+ } catch (err) {
69
+ result = { success: false, error: err && err.message ? err.message : String(err) };
70
+ }
71
+ sentEmailLog.recordSentEmail({
72
+ emailType: 'invoice-email',
73
+ audience: 'customer',
74
+ to: emailData.to,
75
+ from: emailData.from,
76
+ subject: emailData.subject,
77
+ html: emailData.body,
78
+ payload: emailData.templateData,
79
+ attachments: [{
80
+ filename: attachmentName(invoiceData),
81
+ contentType: 'application/pdf',
82
+ sizeBytes: pdfBuffer && pdfBuffer.length ? pdfBuffer.length : null,
83
+ url: invoiceData.pdfUrl || null,
84
+ }],
85
+ provider: ${JSON.stringify(emailDelivery.provider)},
86
+ providerMessageId: result && result.messageId,
87
+ status: result && result.success ? 'sent' : 'failed',
88
+ error: result && !result.success ? result.error : null,
89
+ source: 'invoice',
90
+ sourceRef: 'api/invoices/generate',
91
+ orderId: invoiceData.orderId,
92
+ referenceType: 'invoice',
93
+ referenceId: invoiceData.id,
94
+ });
95
+ return result;
96
+ }
97
+
39
98
  module.exports = { sendInvoiceEmail };
40
99
  `;
41
100
  };
@@ -43,22 +102,19 @@ function generateProviderSendFunction(provider) {
43
102
  switch (provider) {
44
103
  case 'resend':
45
104
  return `
46
- async function sendInvoiceEmail(invoiceData, pdfBuffer) {
105
+ async function sendInvoiceEmailWithProvider(emailData, invoiceData, pdfBuffer) {
47
106
  try {
48
107
  var Resend = require('resend').Resend;
49
108
  var apiKey = resolveSecretKey('apiKey');
50
109
  if (!apiKey) return { success: false, error: 'Resend API key not configured' };
51
110
  var resend = new Resend(apiKey);
52
- var emailData = buildEmailData(invoiceData);
53
- if (!emailData.to) return { success: false, error: 'No customer email provided' };
54
-
55
111
  var payload = {
56
112
  from: emailData.from,
57
113
  to: [emailData.to],
58
114
  subject: emailData.subject,
59
115
  html: emailData.body,
60
116
  attachments: [{
61
- filename: (invoiceData.invoiceNumber || 'invoice') + '.pdf',
117
+ filename: attachmentName(invoiceData),
62
118
  content: pdfBuffer.toString('base64'),
63
119
  }],
64
120
  };
@@ -71,15 +127,12 @@ async function sendInvoiceEmail(invoiceData, pdfBuffer) {
71
127
  }`;
72
128
  case 'sendgrid':
73
129
  return `
74
- async function sendInvoiceEmail(invoiceData, pdfBuffer) {
130
+ async function sendInvoiceEmailWithProvider(emailData, invoiceData, pdfBuffer) {
75
131
  try {
76
132
  var sgMail = require('@sendgrid/mail');
77
133
  var apiKey = resolveSecretKey('apiKey');
78
134
  if (!apiKey) return { success: false, error: 'SendGrid API key not configured' };
79
135
  sgMail.setApiKey(apiKey);
80
- var emailData = buildEmailData(invoiceData);
81
- if (!emailData.to) return { success: false, error: 'No customer email provided' };
82
-
83
136
  var msg = {
84
137
  to: emailData.to,
85
138
  from: emailData.from,
@@ -87,7 +140,7 @@ async function sendInvoiceEmail(invoiceData, pdfBuffer) {
87
140
  html: emailData.body,
88
141
  attachments: [{
89
142
  content: pdfBuffer.toString('base64'),
90
- filename: (invoiceData.invoiceNumber || 'invoice') + '.pdf',
143
+ filename: attachmentName(invoiceData),
91
144
  type: 'application/pdf',
92
145
  disposition: 'attachment',
93
146
  }],
@@ -100,7 +153,7 @@ async function sendInvoiceEmail(invoiceData, pdfBuffer) {
100
153
  }`;
101
154
  case 'mailgun':
102
155
  return `
103
- async function sendInvoiceEmail(invoiceData, pdfBuffer) {
156
+ async function sendInvoiceEmailWithProvider(emailData, invoiceData, pdfBuffer) {
104
157
  try {
105
158
  var Mailgun = require('mailgun.js');
106
159
  var formData = require('form-data');
@@ -111,9 +164,6 @@ async function sendInvoiceEmail(invoiceData, pdfBuffer) {
111
164
 
112
165
  var mailgun = new Mailgun(formData);
113
166
  var mg = mailgun.client({ username: 'api', key: apiKey });
114
- var emailData = buildEmailData(invoiceData);
115
- if (!emailData.to) return { success: false, error: 'No customer email provided' };
116
-
117
167
  var msg = {
118
168
  from: emailData.from,
119
169
  to: [emailData.to],
@@ -121,7 +171,7 @@ async function sendInvoiceEmail(invoiceData, pdfBuffer) {
121
171
  html: emailData.body,
122
172
  attachment: [{
123
173
  data: pdfBuffer,
124
- filename: (invoiceData.invoiceNumber || 'invoice') + '.pdf',
174
+ filename: attachmentName(invoiceData),
125
175
  contentType: 'application/pdf',
126
176
  }],
127
177
  };
@@ -133,22 +183,19 @@ async function sendInvoiceEmail(invoiceData, pdfBuffer) {
133
183
  }`;
134
184
  case 'postmark':
135
185
  return `
136
- async function sendInvoiceEmail(invoiceData, pdfBuffer) {
186
+ async function sendInvoiceEmailWithProvider(emailData, invoiceData, pdfBuffer) {
137
187
  try {
138
188
  var postmark = require('postmark');
139
189
  var serverToken = resolveSecretKey('serverToken');
140
190
  if (!serverToken) return { success: false, error: 'Postmark server token not configured' };
141
191
  var client = new postmark.ServerClient(serverToken);
142
- var emailData = buildEmailData(invoiceData);
143
- if (!emailData.to) return { success: false, error: 'No customer email provided' };
144
-
145
192
  var msg = {
146
193
  From: emailData.from,
147
194
  To: emailData.to,
148
195
  Subject: emailData.subject,
149
196
  HtmlBody: emailData.body,
150
197
  Attachments: [{
151
- Name: (invoiceData.invoiceNumber || 'invoice') + '.pdf',
198
+ Name: attachmentName(invoiceData),
152
199
  Content: pdfBuffer.toString('base64'),
153
200
  ContentType: 'application/pdf',
154
201
  }],
@@ -181,7 +228,7 @@ function parseFromString(from) {
181
228
  return { name: '', email: str };
182
229
  }
183
230
 
184
- async function sendInvoiceEmail(invoiceData, pdfBuffer) {
231
+ async function sendInvoiceEmailWithProvider(emailData, invoiceData, pdfBuffer) {
185
232
  var invoiceNumber = invoiceData && invoiceData.invoiceNumber ? invoiceData.invoiceNumber : '(no number)';
186
233
  try {
187
234
  console.info('[invoice-email][mailersend] begin — invoice=' + invoiceNumber +
@@ -192,12 +239,6 @@ async function sendInvoiceEmail(invoiceData, pdfBuffer) {
192
239
  console.error('[invoice-email][mailersend] skip — API key not configured (set \`apiKey\` secret or INVOICE_MAILERSEND_APIKEY env)');
193
240
  return { success: false, error: 'MailerSend API key not configured' };
194
241
  }
195
- var emailData = buildEmailData(invoiceData);
196
- if (!emailData.to) {
197
- console.error('[invoice-email][mailersend] skip — invoiceData.customerEmail is empty (order hydrating yielded no billing_email; set it on the order row or pass customerEmail in the generate payload)');
198
- return { success: false, error: 'No customer email provided' };
199
- }
200
-
201
242
  var MailerSend = require('mailersend').MailerSend;
202
243
  var EmailParams = require('mailersend').EmailParams;
203
244
  var Sender = require('mailersend').Sender;
@@ -215,7 +256,7 @@ async function sendInvoiceEmail(invoiceData, pdfBuffer) {
215
256
 
216
257
  var attachment = new Attachment(
217
258
  pdfBuffer.toString('base64'),
218
- (invoiceData.invoiceNumber || 'invoice') + '.pdf',
259
+ attachmentName(invoiceData),
219
260
  'attachment'
220
261
  );
221
262
 
@@ -257,7 +298,7 @@ async function sendInvoiceEmail(invoiceData, pdfBuffer) {
257
298
  }`;
258
299
  default:
259
300
  return `
260
- async function sendInvoiceEmail() {
301
+ async function sendInvoiceEmailWithProvider() {
261
302
  return { success: false, error: 'Unsupported email provider: ${provider}' };
262
303
  }`;
263
304
  }
@@ -1 +1 @@
1
- {"version":3,"file":"email-sender-code.js","sourceRoot":"","sources":["../../../src/invoice/email-sender-code.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,aAAuC,EAAU,EAAE;IACzF,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;QACvE,OAAO,iIAAiI,CAAA;KACzI;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,IAAI,EAAE,CAAC,CAAA;IACrE,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,IAAI,EAAE,CAAA;IAC/C,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,IAAI,EAAE,CAAA;IAC7C,MAAM,eAAe,GAAG,aAAa,CAAC,OAAO,IAAI,2BAA2B,CAAA;IAC5E,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,IAAI,2CAA2C,CAAA;IAEtF,OAAO;;eAEM,aAAa,CAAC,QAAQ;;;;;;oBAMjB,cAAc;;;;;;;;;;;;mCAYC,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;gCAClC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;;YAEhD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,SAAS,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;;;;EAI7E,4BAA4B,CAAC,aAAa,CAAC,QAAQ,CAAC;;;CAGrD,CAAA;AACD,CAAC,CAAA;AAED,SAAS,4BAA4B,CAAC,QAAgB;IACpD,QAAQ,QAAQ,EAAE;QAChB,KAAK,QAAQ;YACX,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BX,CAAA;QAEE,KAAK,UAAU;YACb,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2BX,CAAA;QAEE,KAAK,SAAS;YACZ,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA+BX,CAAA;QAEE,KAAK,UAAU;YACb,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BX,CAAA;QAEE,KAAK,YAAY;YACf,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8FX,CAAA;QAEE;YACE,OAAO;;iEAEoD,QAAQ;EACvE,CAAA;KACC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,QAAuB,EAA0B,EAAE;IAC9F,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,EAAE,CAAA;KACV;IACD,QAAQ,QAAQ,EAAE;QAChB,KAAK,QAAQ;YACX,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;QAC7B,KAAK,UAAU;YACb,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAA;QACvC,KAAK,SAAS;YACZ,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAA;QAC3D,KAAK,UAAU;YACb,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;QAC/B,KAAK,YAAY;YACf,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAA;QACjC;YACE,OAAO,EAAE,CAAA;KACZ;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"email-sender-code.js","sourceRoot":"","sources":["../../../src/invoice/email-sender-code.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,aAAuC,EAAU,EAAE;IACzF,IAAI,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE;QACvE,OAAO,iIAAiI,CAAA;KACzI;IAED,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,IAAI,EAAE,CAAC,CAAA;IACrE,MAAM,SAAS,GAAG,aAAa,CAAC,SAAS,IAAI,EAAE,CAAA;IAC/C,MAAM,QAAQ,GAAG,aAAa,CAAC,QAAQ,IAAI,EAAE,CAAA;IAC7C,MAAM,eAAe,GAAG,aAAa,CAAC,OAAO,IAAI,2BAA2B,CAAA;IAC5E,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,IAAI,2CAA2C,CAAA;IACtF,MAAM,kBAAkB,GAAG,aAAa,CAAC,kBAAkB,IAAI,EAAE,CAAA;IAEjE,OAAO;;eAEM,aAAa,CAAC,QAAQ;;;;;;;;;;;;;oBAajB,cAAc;yBACT,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;sBAClC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;;;4BAGtB,IAAI,CAAC,SAAS,CAAC,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;;;YAoBlD,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,KAAK,SAAS,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;;;;;;;;;EAS7E,4BAA4B,CAAC,aAAa,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;gBAyBtC,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC;;;;;;;;;;;;;;CAcrD,CAAA;AACD,CAAC,CAAA;AAED,SAAS,4BAA4B,CAAC,QAAgB;IACpD,QAAQ,QAAQ,EAAE;QAChB,KAAK,QAAQ;YACX,OAAO;;;;;;;;;;;;;;;;;;;;;;;EAuBX,CAAA;QAEE,KAAK,UAAU;YACb,OAAO;;;;;;;;;;;;;;;;;;;;;;;;EAwBX,CAAA;QAEE,KAAK,SAAS;YACZ,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4BX,CAAA;QAEE,KAAK,UAAU;YACb,OAAO;;;;;;;;;;;;;;;;;;;;;;;EAuBX,CAAA;QAEE,KAAK,YAAY;YACf,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwFX,CAAA;QAEE;YACE,OAAO;;iEAEoD,QAAQ;EACvE,CAAA;KACC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,QAAuB,EAA0B,EAAE;IAC9F,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,EAAE,CAAA;KACV;IACD,QAAQ,QAAQ,EAAE;QAChB,KAAK,QAAQ;YACX,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAA;QAC7B,KAAK,UAAU;YACb,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAA;QACvC,KAAK,SAAS;YACZ,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAA;QAC3D,KAAK,UAAU;YACb,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;QAC/B,KAAK,YAAY;YACf,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAA;QACjC;YACE,OAAO,EAAE,CAAA;KACZ;AACH,CAAC,CAAA"}
@@ -1,7 +1,4 @@
1
1
  import { ProjectPluginStructure, UIDLInvoiceSettings, DataSourceType } from '@teleporthq/teleport-types';
2
2
  export declare const generateInvoiceFiles: (invoiceSettings: UIDLInvoiceSettings, structure: ProjectPluginStructure, dataSourceType: DataSourceType | null, dataSourceConfig: Record<string, unknown> | null) => void;
3
- export declare const resolveInvoiceDataSource: (structure: ProjectPluginStructure) => {
4
- dataSourceType: DataSourceType | null;
5
- dataSourceConfig: Record<string, unknown> | null;
6
- };
3
+ export { resolveInvoiceDataSource } from './resolve-data-source';
7
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/invoice/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EAEtB,mBAAmB,EACnB,cAAc,EACf,MAAM,4BAA4B,CAAA;AAOnC,eAAO,MAAM,oBAAoB,oBACd,mBAAmB,aACzB,sBAAsB,kBACjB,cAAc,GAAG,IAAI,oBACnB,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KAC/C,IA2IF,CAAA;AAED,eAAO,MAAM,wBAAwB,cACxB,sBAAsB,KAChC;IAAE,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IAAC,gBAAgB,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAoB3F,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/invoice/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EAEtB,mBAAmB,EACnB,cAAc,EACf,MAAM,4BAA4B,CAAA;AASnC,eAAO,MAAM,oBAAoB,oBACd,mBAAmB,aACzB,sBAAsB,kBACjB,cAAc,GAAG,IAAI,oBACnB,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,KAC/C,IA+IF,CAAA;AAED,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAA"}
@@ -4,6 +4,8 @@ import { generateEmailSenderCode, getEmailProviderDependencies } from './email-s
4
4
  import { generateDataAccessCode, getRecordMappingCode } from './data-access-code';
5
5
  import { generateInvoiceGenerateRouteCode, generateInvoicePdfRouteCode } from './api-routes-code';
6
6
  import { getDatabaseDriverDependencies } from '../auth-generator';
7
+ import { ensureSentEmailLogModule } from '../sent-email-log';
8
+ import { ensureEmailLocaleModule } from '../email-locale';
7
9
  export const generateInvoiceFiles = (invoiceSettings, structure, dataSourceType, dataSourceConfig) => {
8
10
  var _a;
9
11
  const { files, dependencies } = structure;
@@ -46,6 +48,10 @@ export const generateInvoiceFiles = (invoiceSettings, structure, dataSourceType,
46
48
  ],
47
49
  });
48
50
  if ((_a = invoiceSettings.emailDelivery) === null || _a === void 0 ? void 0 : _a.enabled) {
51
+ // The sender records every attempt in the sent-email ledger and picks the
52
+ // buyer's language through the shared locale module.
53
+ ensureSentEmailLogModule(structure);
54
+ ensureEmailLocaleModule(structure);
49
55
  const emailSenderCode = generateEmailSenderCode(invoiceSettings.emailDelivery);
50
56
  files.set('invoice-email-sender', {
51
57
  path: ['utils', 'invoices'],
@@ -130,22 +136,5 @@ export const generateInvoiceFiles = (invoiceSettings, structure, dataSourceType,
130
136
  }
131
137
  }
132
138
  };
133
- export const resolveInvoiceDataSource = (structure) => {
134
- var _a;
135
- const { uidl } = structure;
136
- if (!uidl.dataSources) {
137
- return { dataSourceType: null, dataSourceConfig: null };
138
- }
139
- if ((_a = uidl.authentication) === null || _a === void 0 ? void 0 : _a.dataSourceId) {
140
- const ds = uidl.dataSources[uidl.authentication.dataSourceId];
141
- if (ds) {
142
- return { dataSourceType: ds.type, dataSourceConfig: ds.config };
143
- }
144
- }
145
- const dsEntries = Object.values(uidl.dataSources);
146
- if (dsEntries.length > 0) {
147
- return { dataSourceType: dsEntries[0].type, dataSourceConfig: dsEntries[0].config };
148
- }
149
- return { dataSourceType: null, dataSourceConfig: null };
150
- };
139
+ export { resolveInvoiceDataSource } from './resolve-data-source';
151
140
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/invoice/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/invoice/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"invoice-html-code.d.ts","sourceRoot":"","sources":["../../../src/invoice/invoice-html-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AA4HhE,eAAO,MAAM,uBAAuB,aACxB,mBAAmB,uBACR,OAAO,iBACb,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,KACxD,MAs4BF,CAAA"}
1
+ {"version":3,"file":"invoice-html-code.d.ts","sourceRoot":"","sources":["../../../src/invoice/invoice-html-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AA4HhE,eAAO,MAAM,uBAAuB,aACxB,mBAAmB,uBACR,OAAO,iBACb,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,KACxD,MA65BF,CAAA"}
@@ -282,6 +282,7 @@ function buildInvoiceDataScope(invoiceData) {
282
282
  discountAmount: formatCurrencyValue(invoiceData.discountAmount, sym),
283
283
  shippingAmount: formatCurrencyValue(shippingAmountNumber, sym),
284
284
  hasShipping: shippingAmountNumber > 0 ? 'true' : 'false',
285
+ hasTax: Number(invoiceData.taxAmount) > 0 ? 'true' : 'false',
285
286
  total: formatCurrencyValue(invoiceData.total, sym),
286
287
  currency: invoiceData.currency || 'USD',
287
288
  currencySymbol: sym,
@@ -328,13 +329,18 @@ function buildInvoiceDataScope(invoiceData) {
328
329
  var lineStored = Number(it.totalPrice || it.total_price);
329
330
  if (!isFinite(lineStored) || lineStored === 0) lineStored = qty * unitStored;
330
331
 
331
- var unitNet = computeNetFromGrossValue(unitStored, taxRate, taxIncluded);
332
- var lineNet = computeNetFromGrossValue(lineStored, taxRate, taxIncluded);
332
+ // A line on an order priced by region carries its own rate and inclusion
333
+ // mode (a food line at 7% beside a tools line at 19%); every other line is
334
+ // taxed at the invoice's single rate.
335
+ var lineRate = typeof it.taxIncluded === 'boolean' ? Number(it.taxRate) || 0 : taxRate;
336
+ var lineIncluded = typeof it.taxIncluded === 'boolean' ? it.taxIncluded : taxIncluded;
337
+ var unitNet = computeNetFromGrossValue(unitStored, lineRate, lineIncluded);
338
+ var lineNet = computeNetFromGrossValue(lineStored, lineRate, lineIncluded);
333
339
  // Per-unit VAT mirrors the GUI helper: derived from the NET unit
334
340
  // price at the configured rate (rather than dividing line VAT by qty,
335
341
  // which yields odd values when qty is 0 or missing).
336
- var unitVat = computeLineVatAmountValue(unitStored, taxRate, taxIncluded);
337
- var lineVat = computeLineVatAmountValue(lineStored, taxRate, taxIncluded);
342
+ var unitVat = computeLineVatAmountValue(unitStored, lineRate, lineIncluded);
343
+ var lineVat = computeLineVatAmountValue(lineStored, lineRate, lineIncluded);
338
344
  var unitGross = unitNet + unitVat;
339
345
  var lineGross = lineNet + lineVat;
340
346
 
@@ -372,6 +378,9 @@ function buildInvoiceDataScope(invoiceData) {
372
378
  lineTotalNet: formatCurrencyValue(lineNet, sym),
373
379
  lineTotalGross: formatCurrencyValue(lineGross, sym),
374
380
  lineVatAmount: formatCurrencyValue(lineVat, sym),
381
+ // The rate this line was taxed at ("20%"): its own on an order priced by
382
+ // region, the invoice's single rate otherwise. Bound by the VAT % column.
383
+ lineVatRate: (lineRate > 0 ? Math.round(lineRate * 100) / 100 : 0) + '%',
375
384
  sku: it.sku || '',
376
385
  itemTaxRate: it.taxRate != null ? String(it.taxRate) : (taxRate > 0 ? String(taxRate) : ''),
377
386
  itemTaxAmount: it.taxAmount != null ? formatCurrencyValue(it.taxAmount, sym) : formatCurrencyValue(lineVat, sym),
@@ -542,13 +551,20 @@ function resolveReferenceValue(ref, scope) {
542
551
  }
543
552
 
544
553
  function matchConditionOperation(val, op, operand) {
554
+ // The editor stores every operand as a STRING ('true', '0'), while
555
+ // \`resolveReferenceValue\` hands back a typed value for \`expr\` references
556
+ // (it turns 'true' into boolean true). A strict \`===\` across those two
557
+ // shapes never matches — that is how the template's Delivery row, gated on
558
+ // \`Invoice.hasShipping = 'true'\`, stayed hidden on every invoice with a
559
+ // fee — so mixed-type equality compares the string forms instead.
560
+ var sameType = typeof val === typeof operand;
545
561
  switch (op) {
546
562
  case '=':
547
563
  case '===':
548
- return val === operand;
564
+ return sameType ? val === operand : String(val) === String(operand);
549
565
  case '!=':
550
566
  case '!==':
551
- return val !== operand;
567
+ return sameType ? val !== operand : String(val) !== String(operand);
552
568
  case '>': return Number(val) > Number(operand);
553
569
  case '<': return Number(val) < Number(operand);
554
570
  case '>=': return Number(val) >= Number(operand);
@@ -893,18 +909,25 @@ function buildFallbackInvoiceHtml(scope) {
893
909
  '<th style="text-align:left;border-bottom:2px solid #333;padding:6px;">Item</th>' +
894
910
  '<th style="text-align:right;border-bottom:2px solid #333;padding:6px;">Qty</th>' +
895
911
  '<th style="text-align:right;border-bottom:2px solid #333;padding:6px;">Unit Price</th>' +
912
+ '<th style="text-align:right;border-bottom:2px solid #333;padding:6px;">VAT %</th>' +
913
+ '<th style="text-align:right;border-bottom:2px solid #333;padding:6px;">VAT</th>' +
896
914
  '<th style="text-align:right;border-bottom:2px solid #333;padding:6px;">Total</th>' +
897
915
  '</tr></thead><tbody>');
898
916
  products.forEach(function (p) {
899
917
  parts.push('<tr>' +
900
918
  '<td style="border-bottom:1px solid #eee;padding:6px;">' + (p.variantSwatchesHtml || '') + escapeHtml(p.name) + '</td>' +
901
919
  '<td style="border-bottom:1px solid #eee;padding:6px;text-align:right;">' + escapeHtml(p.quantity) + '</td>' +
902
- '<td style="border-bottom:1px solid #eee;padding:6px;text-align:right;">' + escapeHtml(p.unitPrice) + '</td>' +
903
- '<td style="border-bottom:1px solid #eee;padding:6px;text-align:right;">' + escapeHtml(p.lineTotal) + '</td>' +
920
+ '<td style="border-bottom:1px solid #eee;padding:6px;text-align:right;">' + escapeHtml(p.unitPriceNet) + '</td>' +
921
+ '<td style="border-bottom:1px solid #eee;padding:6px;text-align:right;">' + escapeHtml(p.lineVatRate) + '</td>' +
922
+ '<td style="border-bottom:1px solid #eee;padding:6px;text-align:right;">' + escapeHtml(p.lineVatAmount) + '</td>' +
923
+ '<td style="border-bottom:1px solid #eee;padding:6px;text-align:right;">' + escapeHtml(p.lineTotalGross) + '</td>' +
904
924
  '</tr>');
905
925
  });
906
926
  parts.push('</tbody></table>');
907
927
  var totalsRows = '<div style="display:flex;justify-content:space-between;margin-bottom:4px;"><span>Subtotal</span><span>' + escapeHtml(inv.subtotal) + '</span></div>';
928
+ if (inv.hasTax === 'true') {
929
+ totalsRows += '<div style="display:flex;justify-content:space-between;margin-bottom:4px;"><span>VAT</span><span>' + escapeHtml(inv.taxAmount) + '</span></div>';
930
+ }
908
931
  if (inv.hasShipping === 'true') {
909
932
  totalsRows += '<div style="display:flex;justify-content:space-between;margin-bottom:4px;"><span>Delivery</span><span>' + escapeHtml(inv.shippingAmount) + '</span></div>';
910
933
  }
@@ -1 +1 @@
1
- {"version":3,"file":"invoice-html-code.js","sourceRoot":"","sources":["../../../src/invoice/invoice-html-code.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"invoice-html-code.js","sourceRoot":"","sources":["../../../src/invoice/invoice-html-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Invoice VAT for an order placed on a store with shipping zones and tax
3
+ * jurisdictions, as source for the generated `/api/invoices/generate` route.
4
+ *
5
+ * Such an order does not have ONE rate: a German food line at 7% can sit beside
6
+ * a tools line at 19%, a French order's prices may include VAT while the store
7
+ * default adds it on top, and the delivery fee may be taxed. The store's
8
+ * baked `DEFAULT_TAX_RATE` / `TAX_INCLUDED_IN_PRICE` describe none of that, so
9
+ * the place-order workflow records what was actually charged in
10
+ * `teleport_orders.tax_breakdown`, and this prices the invoice from it.
11
+ *
12
+ * Totals reconcile with `teleport_orders.total_amount` by construction:
13
+ * `goods (gross) + shipping_amount (gross) - discount_amount`. The discount is
14
+ * taken off the goods first and only then off the shipping, exactly as the
15
+ * payment line items split it, and each part's tax shrinks in proportion.
16
+ *
17
+ * The printed rows add up too: `subtotal` (goods, net) + `taxAmount` (goods
18
+ * AND shipping tax) + `shippingNet` = `total`. Delivery is therefore shown net
19
+ * of its tax, or its tax would be counted twice.
20
+ *
21
+ * An order without a breakdown — every order placed before regions existed —
22
+ * returns null and keeps the single-rate arithmetic it was always invoiced with.
23
+ */
24
+ export declare const REGIONAL_INVOICE_TAX_CODE = "\nfunction parseOrderTaxBreakdown(raw) {\n if (!raw) return null;\n var parsed = raw;\n if (typeof raw === 'string') {\n try {\n parsed = JSON.parse(raw);\n } catch (e) {\n return null;\n }\n }\n if (!parsed || typeof parsed !== 'object' || !Array.isArray(parsed.lines)) return null;\n return parsed;\n}\n\nfunction regionalInvoiceRound(value, decimals) {\n var factor = decimals === 0 ? 1 : 100;\n var n = Number(value);\n return Math.round((isFinite(n) ? n : 0) * factor) / factor;\n}\n\n// items: the invoice lines as the route normalised them (productId, variantId,\n// quantity, unitPrice, totalPrice \u2014 all stored, i.e. NET where tax is added on\n// top and GROSS where it is included).\nfunction resolveRegionalInvoiceTax(breakdown, items, discountAmount, shippingAmount) {\n var decimals = breakdown.taxDecimals === 0 ? 0 : 2;\n var standardRate = Number(breakdown.taxRate);\n if (!isFinite(standardRate) || standardRate < 0) standardRate = 0;\n var standardIncluded = breakdown.taxIncluded === true;\n var claimed = [];\n var itemTax = [];\n var goodsGross = 0;\n var goodsTax = 0;\n for (var i = 0; i < items.length; i++) {\n var item = items[i];\n var match = null;\n for (var l = 0; l < breakdown.lines.length; l++) {\n var line = breakdown.lines[l];\n if (!line || claimed.indexOf(l) !== -1) continue;\n if (\n String(line.productId || '') === String(item.productId || '') &&\n String(line.variantId || '') === String(item.variantId || '')\n ) {\n match = line;\n claimed.push(l);\n break;\n }\n }\n var matchedRate = match ? Number(match.taxRate) : NaN;\n var rate = isFinite(matchedRate) && matchedRate >= 0 ? matchedRate : standardRate;\n var included = match ? match.taxIncluded === true : standardIncluded;\n var quantity = Number(item.quantity) || 1;\n var stored = Number(item.totalPrice) || 0;\n var lineGross = !included && rate > 0\n ? regionalInvoiceRound(\n regionalInvoiceRound((Number(item.unitPrice) || 0) * (1 + rate / 100), decimals) * quantity,\n decimals\n )\n : stored;\n var lineTax = included\n ? (rate > 0 ? stored - stored / (1 + rate / 100) : 0)\n : lineGross - stored;\n goodsGross += lineGross;\n goodsTax += lineTax;\n itemTax.push({ rate: rate, included: included, amount: regionalInvoiceRound(lineTax, decimals) });\n }\n\n var discount = discountAmount > 0 ? discountAmount : 0;\n var shipping = shippingAmount > 0 ? shippingAmount : 0;\n var goodsAfter = Math.max(0, goodsGross - discount);\n var goodsShare = goodsGross > 0 ? goodsAfter / goodsGross : 0;\n var shippingAfter = Math.max(0, shipping - Math.max(0, discount - goodsGross));\n var shippingShare = shipping > 0 ? shippingAfter / shipping : 0;\n var shippingTax = Number(breakdown.shippingTax);\n if (!isFinite(shippingTax) || shippingTax < 0) shippingTax = 0;\n var allocatedGoodsTax = goodsTax * goodsShare;\n var allocatedShippingTax = shippingTax * shippingShare;\n\n return {\n taxRate: standardRate,\n taxIncluded: standardIncluded,\n subtotal: goodsAfter - allocatedGoodsTax,\n taxAmount: allocatedGoodsTax + allocatedShippingTax,\n shippingNet: shippingAfter - allocatedShippingTax,\n total: goodsAfter + shippingAfter,\n itemTax: itemTax,\n };\n}\n";
25
+ //# sourceMappingURL=regional-invoice-tax-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regional-invoice-tax-code.d.ts","sourceRoot":"","sources":["../../../src/invoice/regional-invoice-tax-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,yBAAyB,8zGAwFrC,CAAA"}
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Invoice VAT for an order placed on a store with shipping zones and tax
3
+ * jurisdictions, as source for the generated `/api/invoices/generate` route.
4
+ *
5
+ * Such an order does not have ONE rate: a German food line at 7% can sit beside
6
+ * a tools line at 19%, a French order's prices may include VAT while the store
7
+ * default adds it on top, and the delivery fee may be taxed. The store's
8
+ * baked `DEFAULT_TAX_RATE` / `TAX_INCLUDED_IN_PRICE` describe none of that, so
9
+ * the place-order workflow records what was actually charged in
10
+ * `teleport_orders.tax_breakdown`, and this prices the invoice from it.
11
+ *
12
+ * Totals reconcile with `teleport_orders.total_amount` by construction:
13
+ * `goods (gross) + shipping_amount (gross) - discount_amount`. The discount is
14
+ * taken off the goods first and only then off the shipping, exactly as the
15
+ * payment line items split it, and each part's tax shrinks in proportion.
16
+ *
17
+ * The printed rows add up too: `subtotal` (goods, net) + `taxAmount` (goods
18
+ * AND shipping tax) + `shippingNet` = `total`. Delivery is therefore shown net
19
+ * of its tax, or its tax would be counted twice.
20
+ *
21
+ * An order without a breakdown — every order placed before regions existed —
22
+ * returns null and keeps the single-rate arithmetic it was always invoiced with.
23
+ */
24
+ export const REGIONAL_INVOICE_TAX_CODE = `
25
+ function parseOrderTaxBreakdown(raw) {
26
+ if (!raw) return null;
27
+ var parsed = raw;
28
+ if (typeof raw === 'string') {
29
+ try {
30
+ parsed = JSON.parse(raw);
31
+ } catch (e) {
32
+ return null;
33
+ }
34
+ }
35
+ if (!parsed || typeof parsed !== 'object' || !Array.isArray(parsed.lines)) return null;
36
+ return parsed;
37
+ }
38
+
39
+ function regionalInvoiceRound(value, decimals) {
40
+ var factor = decimals === 0 ? 1 : 100;
41
+ var n = Number(value);
42
+ return Math.round((isFinite(n) ? n : 0) * factor) / factor;
43
+ }
44
+
45
+ // items: the invoice lines as the route normalised them (productId, variantId,
46
+ // quantity, unitPrice, totalPrice — all stored, i.e. NET where tax is added on
47
+ // top and GROSS where it is included).
48
+ function resolveRegionalInvoiceTax(breakdown, items, discountAmount, shippingAmount) {
49
+ var decimals = breakdown.taxDecimals === 0 ? 0 : 2;
50
+ var standardRate = Number(breakdown.taxRate);
51
+ if (!isFinite(standardRate) || standardRate < 0) standardRate = 0;
52
+ var standardIncluded = breakdown.taxIncluded === true;
53
+ var claimed = [];
54
+ var itemTax = [];
55
+ var goodsGross = 0;
56
+ var goodsTax = 0;
57
+ for (var i = 0; i < items.length; i++) {
58
+ var item = items[i];
59
+ var match = null;
60
+ for (var l = 0; l < breakdown.lines.length; l++) {
61
+ var line = breakdown.lines[l];
62
+ if (!line || claimed.indexOf(l) !== -1) continue;
63
+ if (
64
+ String(line.productId || '') === String(item.productId || '') &&
65
+ String(line.variantId || '') === String(item.variantId || '')
66
+ ) {
67
+ match = line;
68
+ claimed.push(l);
69
+ break;
70
+ }
71
+ }
72
+ var matchedRate = match ? Number(match.taxRate) : NaN;
73
+ var rate = isFinite(matchedRate) && matchedRate >= 0 ? matchedRate : standardRate;
74
+ var included = match ? match.taxIncluded === true : standardIncluded;
75
+ var quantity = Number(item.quantity) || 1;
76
+ var stored = Number(item.totalPrice) || 0;
77
+ var lineGross = !included && rate > 0
78
+ ? regionalInvoiceRound(
79
+ regionalInvoiceRound((Number(item.unitPrice) || 0) * (1 + rate / 100), decimals) * quantity,
80
+ decimals
81
+ )
82
+ : stored;
83
+ var lineTax = included
84
+ ? (rate > 0 ? stored - stored / (1 + rate / 100) : 0)
85
+ : lineGross - stored;
86
+ goodsGross += lineGross;
87
+ goodsTax += lineTax;
88
+ itemTax.push({ rate: rate, included: included, amount: regionalInvoiceRound(lineTax, decimals) });
89
+ }
90
+
91
+ var discount = discountAmount > 0 ? discountAmount : 0;
92
+ var shipping = shippingAmount > 0 ? shippingAmount : 0;
93
+ var goodsAfter = Math.max(0, goodsGross - discount);
94
+ var goodsShare = goodsGross > 0 ? goodsAfter / goodsGross : 0;
95
+ var shippingAfter = Math.max(0, shipping - Math.max(0, discount - goodsGross));
96
+ var shippingShare = shipping > 0 ? shippingAfter / shipping : 0;
97
+ var shippingTax = Number(breakdown.shippingTax);
98
+ if (!isFinite(shippingTax) || shippingTax < 0) shippingTax = 0;
99
+ var allocatedGoodsTax = goodsTax * goodsShare;
100
+ var allocatedShippingTax = shippingTax * shippingShare;
101
+
102
+ return {
103
+ taxRate: standardRate,
104
+ taxIncluded: standardIncluded,
105
+ subtotal: goodsAfter - allocatedGoodsTax,
106
+ taxAmount: allocatedGoodsTax + allocatedShippingTax,
107
+ shippingNet: shippingAfter - allocatedShippingTax,
108
+ total: goodsAfter + shippingAfter,
109
+ itemTax: itemTax,
110
+ };
111
+ }
112
+ `;
113
+ //# sourceMappingURL=regional-invoice-tax-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regional-invoice-tax-code.js","sourceRoot":"","sources":["../../../src/invoice/regional-invoice-tax-code.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwFxC,CAAA"}
@@ -0,0 +1,6 @@
1
+ import { DataSourceType, ProjectPluginStructure } from '@teleporthq/teleport-types';
2
+ export declare const resolveInvoiceDataSource: (structure: ProjectPluginStructure) => {
3
+ dataSourceType: DataSourceType | null;
4
+ dataSourceConfig: Record<string, unknown> | null;
5
+ };
6
+ //# sourceMappingURL=resolve-data-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-data-source.d.ts","sourceRoot":"","sources":["../../../src/invoice/resolve-data-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AAEnF,eAAO,MAAM,wBAAwB,cACxB,sBAAsB,KAChC;IAAE,cAAc,EAAE,cAAc,GAAG,IAAI,CAAC;IAAC,gBAAgB,EAAE,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAoB3F,CAAA"}
@@ -0,0 +1,19 @@
1
+ export const resolveInvoiceDataSource = (structure) => {
2
+ var _a;
3
+ const { uidl } = structure;
4
+ if (!uidl.dataSources) {
5
+ return { dataSourceType: null, dataSourceConfig: null };
6
+ }
7
+ if ((_a = uidl.authentication) === null || _a === void 0 ? void 0 : _a.dataSourceId) {
8
+ const ds = uidl.dataSources[uidl.authentication.dataSourceId];
9
+ if (ds) {
10
+ return { dataSourceType: ds.type, dataSourceConfig: ds.config };
11
+ }
12
+ }
13
+ const dsEntries = Object.values(uidl.dataSources);
14
+ if (dsEntries.length > 0) {
15
+ return { dataSourceType: dsEntries[0].type, dataSourceConfig: dsEntries[0].config };
16
+ }
17
+ return { dataSourceType: null, dataSourceConfig: null };
18
+ };
19
+ //# sourceMappingURL=resolve-data-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-data-source.js","sourceRoot":"","sources":["../../../src/invoice/resolve-data-source.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,wBAAwB,GAAG,CACtC,SAAiC,EAC4D,EAAE;;IAC/F,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAA;IAE1B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;QACrB,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAA;KACxD;IAED,IAAI,MAAA,IAAI,CAAC,cAAc,0CAAE,YAAY,EAAE;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,CAAC,CAAA;QAC7D,IAAI,EAAE,EAAE;YACN,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,IAAI,EAAE,gBAAgB,EAAE,EAAE,CAAC,MAAM,EAAE,CAAA;SAChE;KACF;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;IACjD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QACxB,OAAO,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAA;KACpF;IAED,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAA;AACzD,CAAC,CAAA"}