@ripwords/myinvois-client 0.0.9 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (558) hide show
  1. package/bun.lock +89 -132
  2. package/dist/0X-C4IRh_fJ.d.ts +211 -0
  3. package/dist/0X-C4IRh_fJ.d.ts.map +1 -0
  4. package/dist/0X-Yw7mZEro.d.cts +211 -0
  5. package/dist/0X-Yw7mZEro.d.cts.map +1 -0
  6. package/dist/1X-Brnls9Jh.d.ts +112 -0
  7. package/dist/1X-Brnls9Jh.d.ts.map +1 -0
  8. package/dist/1X-BwpSoT3o.d.cts +20 -0
  9. package/dist/1X-BwpSoT3o.d.cts.map +1 -0
  10. package/dist/1X-C-_KHV-Q.d.ts +20 -0
  11. package/dist/1X-C-_KHV-Q.d.ts.map +1 -0
  12. package/dist/1X-D_aUVsuM.d.cts +112 -0
  13. package/dist/1X-D_aUVsuM.d.cts.map +1 -0
  14. package/dist/2X-Bb6elyzV.d.cts +40 -0
  15. package/dist/2X-Bb6elyzV.d.cts.map +1 -0
  16. package/dist/2X-DkS1BoE5.d.ts +40 -0
  17. package/dist/2X-DkS1BoE5.d.ts.map +1 -0
  18. package/dist/2X-UdQcQW24.d.ts +140 -0
  19. package/dist/2X-UdQcQW24.d.ts.map +1 -0
  20. package/dist/2X-hClUyw26.d.cts +140 -0
  21. package/dist/2X-hClUyw26.d.cts.map +1 -0
  22. package/dist/3X-C7VFD-n-.d.cts +21 -0
  23. package/dist/3X-C7VFD-n-.d.cts.map +1 -0
  24. package/dist/3X-CLMESDvz.d.cts +62 -0
  25. package/dist/3X-CLMESDvz.d.cts.map +1 -0
  26. package/dist/3X-DFI-4RQQ.d.ts +21 -0
  27. package/dist/3X-DFI-4RQQ.d.ts.map +1 -0
  28. package/dist/3X-DVDyspgb.d.ts +62 -0
  29. package/dist/3X-DVDyspgb.d.ts.map +1 -0
  30. package/dist/4X-CIJ2JJ2w.d.ts +31 -0
  31. package/dist/4X-CIJ2JJ2w.d.ts.map +1 -0
  32. package/dist/4X-CUR8jlaZ.d.ts +265 -0
  33. package/dist/4X-CUR8jlaZ.d.ts.map +1 -0
  34. package/dist/4X-CvScPJTf.d.cts +265 -0
  35. package/dist/4X-CvScPJTf.d.cts.map +1 -0
  36. package/dist/4X-DIfvpU6V.d.cts +31 -0
  37. package/dist/4X-DIfvpU6V.d.cts.map +1 -0
  38. package/dist/5X-BOUxhadJ.d.cts +22 -0
  39. package/dist/5X-BOUxhadJ.d.cts.map +1 -0
  40. package/dist/5X-C6db432h.d.ts +77 -0
  41. package/dist/5X-C6db432h.d.ts.map +1 -0
  42. package/dist/5X-COsZHUaQ.d.ts +22 -0
  43. package/dist/5X-COsZHUaQ.d.ts.map +1 -0
  44. package/dist/5X-CkLu7Vyd.d.cts +77 -0
  45. package/dist/5X-CkLu7Vyd.d.cts.map +1 -0
  46. package/dist/6X-C_fFIcJC.d.ts +105 -0
  47. package/dist/6X-C_fFIcJC.d.ts.map +1 -0
  48. package/dist/6X-ClZDKOTC.d.ts +16 -0
  49. package/dist/6X-ClZDKOTC.d.ts.map +1 -0
  50. package/dist/6X-DE7RJeV6.d.cts +16 -0
  51. package/dist/6X-DE7RJeV6.d.cts.map +1 -0
  52. package/dist/6X-Mf32k1d0.d.cts +105 -0
  53. package/dist/6X-Mf32k1d0.d.cts.map +1 -0
  54. package/dist/7X-BZyesooz.d.ts +16 -0
  55. package/dist/7X-BZyesooz.d.ts.map +1 -0
  56. package/dist/7X-Chtd6B66.d.cts +16 -0
  57. package/dist/7X-Chtd6B66.d.cts.map +1 -0
  58. package/dist/7X-DoCUcp-J.d.cts +71 -0
  59. package/dist/7X-DoCUcp-J.d.cts.map +1 -0
  60. package/dist/7X-kot_VccM.d.ts +71 -0
  61. package/dist/7X-kot_VccM.d.ts.map +1 -0
  62. package/dist/8X-Df4DOBOe.d.ts +110 -0
  63. package/dist/8X-Df4DOBOe.d.ts.map +1 -0
  64. package/dist/8X-DkuKAkHz.d.ts +19 -0
  65. package/dist/8X-DkuKAkHz.d.ts.map +1 -0
  66. package/dist/8X-DqZyMvyV.d.cts +19 -0
  67. package/dist/8X-DqZyMvyV.d.cts.map +1 -0
  68. package/dist/8X-Dr9RunRw.d.cts +110 -0
  69. package/dist/8X-Dr9RunRw.d.cts.map +1 -0
  70. package/dist/9X-BDgifncF.d.ts +15 -0
  71. package/dist/9X-BDgifncF.d.ts.map +1 -0
  72. package/dist/9X-BaoZtjWF.d.cts +98 -0
  73. package/dist/9X-BaoZtjWF.d.cts.map +1 -0
  74. package/dist/9X-BcAb6Uso.d.cts +15 -0
  75. package/dist/9X-BcAb6Uso.d.cts.map +1 -0
  76. package/dist/9X-BhBWlgxG.d.ts +98 -0
  77. package/dist/9X-BhBWlgxG.d.ts.map +1 -0
  78. package/dist/AX-BY72FohC.d.cts +111 -0
  79. package/dist/AX-BY72FohC.d.cts.map +1 -0
  80. package/dist/AX-D6XHWdrY.d.ts +111 -0
  81. package/dist/AX-D6XHWdrY.d.ts.map +1 -0
  82. package/dist/BX-CA0OmrUZ.d.cts +115 -0
  83. package/dist/BX-CA0OmrUZ.d.cts.map +1 -0
  84. package/dist/BX-D_0C8Qbd.d.ts +115 -0
  85. package/dist/BX-D_0C8Qbd.d.ts.map +1 -0
  86. package/dist/CX-HH4cSZRX.d.ts +128 -0
  87. package/dist/CX-HH4cSZRX.d.ts.map +1 -0
  88. package/dist/CX-glpQSL8x.d.cts +128 -0
  89. package/dist/CX-glpQSL8x.d.cts.map +1 -0
  90. package/dist/DX-DimL1MDM.d.cts +115 -0
  91. package/dist/DX-DimL1MDM.d.cts.map +1 -0
  92. package/dist/DX-Dx22ax_I.d.ts +115 -0
  93. package/dist/DX-Dx22ax_I.d.ts.map +1 -0
  94. package/dist/EX-BRWh1wFc.d.ts +107 -0
  95. package/dist/EX-BRWh1wFc.d.ts.map +1 -0
  96. package/dist/EX-Cx87Ruxl.d.cts +107 -0
  97. package/dist/EX-Cx87Ruxl.d.cts.map +1 -0
  98. package/dist/FX-D81UlxNN.d.cts +127 -0
  99. package/dist/FX-D81UlxNN.d.cts.map +1 -0
  100. package/dist/FX-RmjwAr40.d.ts +127 -0
  101. package/dist/FX-RmjwAr40.d.ts.map +1 -0
  102. package/dist/GX-9i7piP9G.d.cts +136 -0
  103. package/dist/GX-9i7piP9G.d.cts.map +1 -0
  104. package/dist/GX-CJyo7oDp.d.ts +136 -0
  105. package/dist/GX-CJyo7oDp.d.ts.map +1 -0
  106. package/dist/HX-20GVJAvl.d.cts +126 -0
  107. package/dist/HX-20GVJAvl.d.cts.map +1 -0
  108. package/dist/HX-XALBTdLA.d.ts +126 -0
  109. package/dist/HX-XALBTdLA.d.ts.map +1 -0
  110. package/dist/IX-6SZ55QKb.d.ts +23 -0
  111. package/dist/IX-6SZ55QKb.d.ts.map +1 -0
  112. package/dist/IX-D54NGPsc.d.cts +23 -0
  113. package/dist/IX-D54NGPsc.d.cts.map +1 -0
  114. package/dist/JX-C1RYcwQX.d.cts +104 -0
  115. package/dist/JX-C1RYcwQX.d.cts.map +1 -0
  116. package/dist/JX-hQ1XRmLp.d.ts +104 -0
  117. package/dist/JX-hQ1XRmLp.d.ts.map +1 -0
  118. package/dist/KX-BNwunEfn.d.ts +151 -0
  119. package/dist/KX-BNwunEfn.d.ts.map +1 -0
  120. package/dist/KX-gQHCIgtQ.d.cts +151 -0
  121. package/dist/KX-gQHCIgtQ.d.cts.map +1 -0
  122. package/dist/LX-CHYX3X3J.d.ts +123 -0
  123. package/dist/LX-CHYX3X3J.d.ts.map +1 -0
  124. package/dist/LX-CPurJGIh.d.cts +123 -0
  125. package/dist/LX-CPurJGIh.d.cts.map +1 -0
  126. package/dist/MX-BPGLWSUz.d.ts +153 -0
  127. package/dist/MX-BPGLWSUz.d.ts.map +1 -0
  128. package/dist/MX-BnyW5eHf.d.cts +153 -0
  129. package/dist/MX-BnyW5eHf.d.cts.map +1 -0
  130. package/dist/MyInvoisClient-BrNyMjS-.d.cts +178 -0
  131. package/dist/MyInvoisClient-BrNyMjS-.d.cts.map +1 -0
  132. package/dist/MyInvoisClient-CXu4pdl-.d.ts +178 -0
  133. package/dist/MyInvoisClient-CXu4pdl-.d.ts.map +1 -0
  134. package/dist/MyInvoisClient-Cnvb5iUC.js +299 -0
  135. package/dist/MyInvoisClient-Cnvb5iUC.js.map +1 -0
  136. package/dist/MyInvoisClient-DO1dJfQq.cjs +304 -0
  137. package/dist/MyInvoisClient-DO1dJfQq.cjs.map +1 -0
  138. package/dist/NX-B11fQuco.d.cts +122 -0
  139. package/dist/NX-B11fQuco.d.cts.map +1 -0
  140. package/dist/NX-RulN5Ml3.d.ts +122 -0
  141. package/dist/NX-RulN5Ml3.d.ts.map +1 -0
  142. package/dist/OX-DgKVSp7I.d.ts +26 -0
  143. package/dist/OX-DgKVSp7I.d.ts.map +1 -0
  144. package/dist/OX-T-ydRXQS.d.cts +26 -0
  145. package/dist/OX-T-ydRXQS.d.cts.map +1 -0
  146. package/dist/PX-DA4A2kEv.d.ts +121 -0
  147. package/dist/PX-DA4A2kEv.d.ts.map +1 -0
  148. package/dist/PX-p0n1SzvU.d.cts +121 -0
  149. package/dist/PX-p0n1SzvU.d.cts.map +1 -0
  150. package/dist/QX-CI1NccIB.d.cts +59 -0
  151. package/dist/QX-CI1NccIB.d.cts.map +1 -0
  152. package/dist/QX-DrFqsMEs.d.ts +59 -0
  153. package/dist/QX-DrFqsMEs.d.ts.map +1 -0
  154. package/dist/RX-Cm7vFcFN.d.ts +23 -0
  155. package/dist/RX-Cm7vFcFN.d.ts.map +1 -0
  156. package/dist/RX-DnNKol22.d.cts +23 -0
  157. package/dist/RX-DnNKol22.d.cts.map +1 -0
  158. package/dist/SX-BUjiWQYz.d.cts +40 -0
  159. package/dist/SX-BUjiWQYz.d.cts.map +1 -0
  160. package/dist/SX-CsPPTu-W.d.ts +40 -0
  161. package/dist/SX-CsPPTu-W.d.ts.map +1 -0
  162. package/dist/TX-DCY25MdR.d.ts +31 -0
  163. package/dist/TX-DCY25MdR.d.ts.map +1 -0
  164. package/dist/TX-DOEpsf05.d.cts +31 -0
  165. package/dist/TX-DOEpsf05.d.cts.map +1 -0
  166. package/dist/UX-DauyagHy.d.ts +18 -0
  167. package/dist/UX-DauyagHy.d.ts.map +1 -0
  168. package/dist/UX-DgUOnTFK.d.cts +18 -0
  169. package/dist/UX-DgUOnTFK.d.cts.map +1 -0
  170. package/dist/VX-DD4scgCe.d.ts +17 -0
  171. package/dist/VX-DD4scgCe.d.ts.map +1 -0
  172. package/dist/VX-kUX6LM-3.d.cts +17 -0
  173. package/dist/VX-kUX6LM-3.d.cts.map +1 -0
  174. package/dist/WX-CjkoppdY.d.ts +26 -0
  175. package/dist/WX-CjkoppdY.d.ts.map +1 -0
  176. package/dist/WX-DPfyPFFh.d.cts +26 -0
  177. package/dist/WX-DPfyPFFh.d.cts.map +1 -0
  178. package/dist/XX-C4C1gQZH.d.cts +828 -0
  179. package/dist/XX-C4C1gQZH.d.cts.map +1 -0
  180. package/dist/XX-sbsIUOnA.d.ts +828 -0
  181. package/dist/XX-sbsIUOnA.d.ts.map +1 -0
  182. package/dist/YX-BeT-LsiA.d.cts +20 -0
  183. package/dist/YX-BeT-LsiA.d.cts.map +1 -0
  184. package/dist/YX-DUdO8mRC.d.ts +20 -0
  185. package/dist/YX-DUdO8mRC.d.ts.map +1 -0
  186. package/dist/ZX-BuVTTq-D.d.cts +22 -0
  187. package/dist/ZX-BuVTTq-D.d.cts.map +1 -0
  188. package/dist/ZX-DwfcSA-D.d.ts +22 -0
  189. package/dist/ZX-DwfcSA-D.d.ts.map +1 -0
  190. package/dist/api/platform/platformLogin.d.ts +67 -0
  191. package/dist/api/platform/platformLogin.d.ts.map +1 -0
  192. package/dist/api/platform/platformLogin.js +3 -0
  193. package/dist/canonicalize-C_fNNpYr.cjs +80 -0
  194. package/dist/canonicalize-C_fNNpYr.cjs.map +1 -0
  195. package/dist/canonicalize-DNUrCGad.js +68 -0
  196. package/dist/canonicalize-DNUrCGad.js.map +1 -0
  197. package/dist/chunk-CUT6urMc.cjs +30 -0
  198. package/dist/classification-codes-B15PbWxz.d.cts +118 -0
  199. package/dist/classification-codes-B15PbWxz.d.cts.map +1 -0
  200. package/dist/classification-codes-C2X4xW5-.d.ts +118 -0
  201. package/dist/classification-codes-C2X4xW5-.d.ts.map +1 -0
  202. package/dist/country-code-DPeNFMMi.d.cts +543 -0
  203. package/dist/country-code-DPeNFMMi.d.cts.map +1 -0
  204. package/dist/country-code-DsI8Mbzx.d.ts +543 -0
  205. package/dist/country-code-DsI8Mbzx.d.ts.map +1 -0
  206. package/dist/currencies-DKuDflOO.d.ts +208 -0
  207. package/dist/currencies-DKuDflOO.d.ts.map +1 -0
  208. package/dist/currencies-S5g1gzBU.d.cts +208 -0
  209. package/dist/currencies-S5g1gzBU.d.cts.map +1 -0
  210. package/dist/e-invoice-BuwtFnlI.d.cts +44 -0
  211. package/dist/e-invoice-BuwtFnlI.d.cts.map +1 -0
  212. package/dist/e-invoice-C2TxhyrK.d.ts +44 -0
  213. package/dist/e-invoice-C2TxhyrK.d.ts.map +1 -0
  214. package/dist/getBaseUrl-CO7Jp27d.cjs +14 -0
  215. package/dist/getBaseUrl-CO7Jp27d.cjs.map +1 -0
  216. package/dist/getBaseUrl-Dx6RDC8I.js +8 -0
  217. package/dist/getBaseUrl-Dx6RDC8I.js.map +1 -0
  218. package/dist/hashCert-Bol7lIh2.js +62 -0
  219. package/dist/hashCert-Bol7lIh2.js.map +1 -0
  220. package/dist/hashCert-mlYEuYex.cjs +68 -0
  221. package/dist/hashCert-mlYEuYex.cjs.map +1 -0
  222. package/dist/hashSignedProperties-9vj5wlYR.js +83 -0
  223. package/dist/hashSignedProperties-9vj5wlYR.js.map +1 -0
  224. package/dist/hashSignedProperties-CU_ZqqmY.cjs +95 -0
  225. package/dist/hashSignedProperties-CU_ZqqmY.cjs.map +1 -0
  226. package/dist/index-B1DSs-wd.d.cts +16 -0
  227. package/dist/index-B1DSs-wd.d.cts.map +1 -0
  228. package/dist/index-CJNLQVjx.d.ts +1 -0
  229. package/dist/index-FTgB2nM6.d.ts +16 -0
  230. package/dist/index-FTgB2nM6.d.ts.map +1 -0
  231. package/dist/index-Wy1ONBjV.d.cts +1 -0
  232. package/dist/index.cjs +13 -97
  233. package/dist/index.d.ts +60 -5664
  234. package/dist/index.js +11 -93
  235. package/dist/index10.cjs +34 -0
  236. package/dist/index10.cjs.map +1 -0
  237. package/dist/index11.cjs +24 -0
  238. package/dist/index11.cjs.map +1 -0
  239. package/dist/index12.cjs +0 -0
  240. package/dist/index13.cjs +13 -0
  241. package/dist/index14.cjs +13 -0
  242. package/dist/index14.cjs.map +1 -0
  243. package/dist/index15.cjs +3 -0
  244. package/dist/index16.cjs +17 -0
  245. package/dist/index17.cjs +3 -0
  246. package/dist/index18.cjs +208 -0
  247. package/dist/index18.cjs.map +1 -0
  248. package/dist/index19.cjs +109 -0
  249. package/dist/index19.cjs.map +1 -0
  250. package/dist/index2.cjs +62 -0
  251. package/dist/index2.cjs.map +1 -0
  252. package/dist/index20.cjs +137 -0
  253. package/dist/index20.cjs.map +1 -0
  254. package/dist/index21.cjs +64 -0
  255. package/dist/index21.cjs.map +1 -0
  256. package/dist/index22.cjs +267 -0
  257. package/dist/index22.cjs.map +1 -0
  258. package/dist/index23.cjs +79 -0
  259. package/dist/index23.cjs.map +1 -0
  260. package/dist/index24.cjs +107 -0
  261. package/dist/index24.cjs.map +1 -0
  262. package/dist/index25.cjs +73 -0
  263. package/dist/index25.cjs.map +1 -0
  264. package/dist/index26.cjs +112 -0
  265. package/dist/index26.cjs.map +1 -0
  266. package/dist/index27.cjs +100 -0
  267. package/dist/index27.cjs.map +1 -0
  268. package/dist/index28.cjs +18 -0
  269. package/dist/index28.cjs.map +1 -0
  270. package/dist/index29.cjs +38 -0
  271. package/dist/index29.cjs.map +1 -0
  272. package/dist/index3.cjs +532 -0
  273. package/dist/index3.cjs.map +1 -0
  274. package/dist/index30.cjs +19 -0
  275. package/dist/index30.cjs.map +1 -0
  276. package/dist/index31.cjs +29 -0
  277. package/dist/index31.cjs.map +1 -0
  278. package/dist/index32.cjs +20 -0
  279. package/dist/index32.cjs.map +1 -0
  280. package/dist/index33.cjs +14 -0
  281. package/dist/index33.cjs.map +1 -0
  282. package/dist/index34.cjs +14 -0
  283. package/dist/index34.cjs.map +1 -0
  284. package/dist/index35.cjs +17 -0
  285. package/dist/index35.cjs.map +1 -0
  286. package/dist/index36.cjs +13 -0
  287. package/dist/index36.cjs.map +1 -0
  288. package/dist/index37.cjs +108 -0
  289. package/dist/index37.cjs.map +1 -0
  290. package/dist/index38.cjs +113 -0
  291. package/dist/index38.cjs.map +1 -0
  292. package/dist/index39.cjs +126 -0
  293. package/dist/index39.cjs.map +1 -0
  294. package/dist/index4.cjs +196 -0
  295. package/dist/index4.cjs.map +1 -0
  296. package/dist/index40.cjs +113 -0
  297. package/dist/index40.cjs.map +1 -0
  298. package/dist/index41.cjs +105 -0
  299. package/dist/index41.cjs.map +1 -0
  300. package/dist/index42.cjs +125 -0
  301. package/dist/index42.cjs.map +1 -0
  302. package/dist/index43.cjs +134 -0
  303. package/dist/index43.cjs.map +1 -0
  304. package/dist/index44.cjs +124 -0
  305. package/dist/index44.cjs.map +1 -0
  306. package/dist/index45.cjs +21 -0
  307. package/dist/index45.cjs.map +1 -0
  308. package/dist/index46.cjs +102 -0
  309. package/dist/index46.cjs.map +1 -0
  310. package/dist/index47.cjs +149 -0
  311. package/dist/index47.cjs.map +1 -0
  312. package/dist/index48.cjs +121 -0
  313. package/dist/index48.cjs.map +1 -0
  314. package/dist/index49.cjs +151 -0
  315. package/dist/index49.cjs.map +1 -0
  316. package/dist/index5.cjs +25 -0
  317. package/dist/index5.cjs.map +1 -0
  318. package/dist/index50.cjs +120 -0
  319. package/dist/index50.cjs.map +1 -0
  320. package/dist/index51.cjs +24 -0
  321. package/dist/index51.cjs.map +1 -0
  322. package/dist/index52.cjs +119 -0
  323. package/dist/index52.cjs.map +1 -0
  324. package/dist/index53.cjs +54 -0
  325. package/dist/index53.cjs.map +1 -0
  326. package/dist/index54.cjs +21 -0
  327. package/dist/index54.cjs.map +1 -0
  328. package/dist/index55.cjs +35 -0
  329. package/dist/index55.cjs.map +1 -0
  330. package/dist/index56.cjs +29 -0
  331. package/dist/index56.cjs.map +1 -0
  332. package/dist/index57.cjs +16 -0
  333. package/dist/index57.cjs.map +1 -0
  334. package/dist/index58.cjs +15 -0
  335. package/dist/index58.cjs.map +1 -0
  336. package/dist/index59.cjs +24 -0
  337. package/dist/index59.cjs.map +1 -0
  338. package/dist/index59.cts.map +1 -0
  339. package/dist/index6.cjs +0 -0
  340. package/dist/index60.cjs +419 -0
  341. package/dist/index60.cjs.map +1 -0
  342. package/dist/index61.cjs +15 -0
  343. package/dist/index61.cjs.map +1 -0
  344. package/dist/index62.cjs +16 -0
  345. package/dist/index62.cjs.map +1 -0
  346. package/dist/index62.cts.map +1 -0
  347. package/dist/index63.cjs +0 -0
  348. package/dist/index63.cts.map +1 -0
  349. package/dist/index64.cjs +0 -0
  350. package/dist/index64.cts.map +1 -0
  351. package/dist/index65.cjs +122 -0
  352. package/dist/index65.cjs.map +1 -0
  353. package/dist/index65.cts.map +1 -0
  354. package/dist/index66.cjs +229 -0
  355. package/dist/index66.cjs.map +1 -0
  356. package/dist/index66.cts.map +1 -0
  357. package/dist/index67.cjs +4 -0
  358. package/dist/index67.cts.map +1 -0
  359. package/dist/index68.cjs +3 -0
  360. package/dist/index68.cts.map +1 -0
  361. package/dist/index69.cjs +4 -0
  362. package/dist/index69.cts.map +1 -0
  363. package/dist/index7.cjs +0 -0
  364. package/dist/index70.cjs +3 -0
  365. package/dist/index70.cts.map +1 -0
  366. package/dist/index71.cjs +3 -0
  367. package/dist/index71.cts.map +1 -0
  368. package/dist/index72.cjs +3 -0
  369. package/dist/index72.cts.map +1 -0
  370. package/dist/index73.cjs +3 -0
  371. package/dist/index73.cts.map +1 -0
  372. package/dist/index8.cjs +25 -0
  373. package/dist/index8.cjs.map +1 -0
  374. package/dist/index9.cjs +0 -0
  375. package/dist/invoice-1_1-BJVcw-oE.d.ts +432 -0
  376. package/dist/invoice-1_1-BJVcw-oE.d.ts.map +1 -0
  377. package/dist/invoice-1_1-DWdNPRzr.d.cts +432 -0
  378. package/dist/invoice-1_1-DWdNPRzr.d.cts.map +1 -0
  379. package/dist/invoice1-1-8S-QQn7P.cjs +547 -0
  380. package/dist/invoice1-1-8S-QQn7P.cjs.map +1 -0
  381. package/dist/invoice1-1-CHuLpkFz.js +504 -0
  382. package/dist/invoice1-1-CHuLpkFz.js.map +1 -0
  383. package/dist/msic-codes-B_1W6lZF.d.cts +26 -0
  384. package/dist/msic-codes-B_1W6lZF.d.cts.map +1 -0
  385. package/dist/msic-codes-bs0lTfSZ.d.ts +26 -0
  386. package/dist/msic-codes-bs0lTfSZ.d.ts.map +1 -0
  387. package/dist/payment-modes-B8dNy3SM.d.ts +44 -0
  388. package/dist/payment-modes-B8dNy3SM.d.ts.map +1 -0
  389. package/dist/payment-modes-DHihrywe.d.cts +44 -0
  390. package/dist/payment-modes-DHihrywe.d.cts.map +1 -0
  391. package/dist/platformLogin-DsxWWUXr.js +31 -0
  392. package/dist/platformLogin-DsxWWUXr.js.map +1 -0
  393. package/dist/platformLogin-PGzMhw1X.cjs +37 -0
  394. package/dist/platformLogin-PGzMhw1X.cjs.map +1 -0
  395. package/dist/populateFinalDocument-BdyYzz5Y.cjs +96 -0
  396. package/dist/populateFinalDocument-BdyYzz5Y.cjs.map +1 -0
  397. package/dist/populateFinalDocument-BpLXmgLv.js +90 -0
  398. package/dist/populateFinalDocument-BpLXmgLv.js.map +1 -0
  399. package/dist/populateSignedProperties-BJMcBQ6S.cjs +58 -0
  400. package/dist/populateSignedProperties-BJMcBQ6S.cjs.map +1 -0
  401. package/dist/populateSignedProperties-BvGN-YZH.js +52 -0
  402. package/dist/populateSignedProperties-BvGN-YZH.js.map +1 -0
  403. package/dist/sign-B61Cy3gO.cjs +40 -0
  404. package/dist/sign-B61Cy3gO.cjs.map +1 -0
  405. package/dist/sign-DzHK7UhR.js +34 -0
  406. package/dist/sign-DzHK7UhR.js.map +1 -0
  407. package/dist/signatures-BKi9DP2K.d.cts +173 -0
  408. package/dist/signatures-BKi9DP2K.d.cts.map +1 -0
  409. package/dist/signatures-C9QPZTQd.d.ts +173 -0
  410. package/dist/signatures-C9QPZTQd.d.ts.map +1 -0
  411. package/dist/state-codes-CxG1S9YY.d.ts +62 -0
  412. package/dist/state-codes-CxG1S9YY.d.ts.map +1 -0
  413. package/dist/state-codes-DXSWtE6a.d.cts +62 -0
  414. package/dist/state-codes-DXSWtE6a.d.cts.map +1 -0
  415. package/dist/tax-types-CEpfSh5P.d.ts +42 -0
  416. package/dist/tax-types-CEpfSh5P.d.ts.map +1 -0
  417. package/dist/tax-types-CgwxONDS.d.cts +42 -0
  418. package/dist/tax-types-CgwxONDS.d.cts.map +1 -0
  419. package/dist/transform-BLz0S687.cjs +72 -0
  420. package/dist/transform-BLz0S687.cjs.map +1 -0
  421. package/dist/transform-D1q-U6Zj.js +66 -0
  422. package/dist/transform-D1q-U6Zj.js.map +1 -0
  423. package/dist/types/classification-codes.d.ts +2 -0
  424. package/dist/types/country-code.d.ts +2 -0
  425. package/dist/types/currencies.d.ts +2 -0
  426. package/dist/types/documents/index.d.ts +57 -0
  427. package/dist/types/documents/invoice-1_1.d.ts +56 -0
  428. package/dist/types/e-invoice.d.ts +2 -0
  429. package/dist/types/index.d.ts +59 -0
  430. package/dist/types/msic/0X.d.ts +2 -0
  431. package/dist/types/msic/1X.d.ts +2 -0
  432. package/dist/types/msic/2X.d.ts +2 -0
  433. package/dist/types/msic/3X.d.ts +2 -0
  434. package/dist/types/msic/4X.d.ts +2 -0
  435. package/dist/types/msic/5X.d.ts +2 -0
  436. package/dist/types/msic/6X.d.ts +2 -0
  437. package/dist/types/msic/7X.d.ts +2 -0
  438. package/dist/types/msic/8X.d.ts +2 -0
  439. package/dist/types/msic/9X.d.ts +2 -0
  440. package/dist/types/msic-codes.d.ts +12 -0
  441. package/dist/types/payment-modes.d.ts +2 -0
  442. package/dist/types/signatures.d.ts +2 -0
  443. package/dist/types/state-codes.d.ts +2 -0
  444. package/dist/types/tax-types.d.ts +2 -0
  445. package/dist/types/unit/1X.d.ts +2 -0
  446. package/dist/types/unit/2X.d.ts +2 -0
  447. package/dist/types/unit/3X.d.ts +2 -0
  448. package/dist/types/unit/4X.d.ts +2 -0
  449. package/dist/types/unit/5X.d.ts +2 -0
  450. package/dist/types/unit/6X.d.ts +2 -0
  451. package/dist/types/unit/7X.d.ts +2 -0
  452. package/dist/types/unit/8X.d.ts +2 -0
  453. package/dist/types/unit/9X.d.ts +2 -0
  454. package/dist/types/unit/AX.d.ts +2 -0
  455. package/dist/types/unit/BX.d.ts +2 -0
  456. package/dist/types/unit/CX.d.ts +2 -0
  457. package/dist/types/unit/DX.d.ts +2 -0
  458. package/dist/types/unit/EX.d.ts +2 -0
  459. package/dist/types/unit/FX.d.ts +2 -0
  460. package/dist/types/unit/GX.d.ts +2 -0
  461. package/dist/types/unit/HX.d.ts +2 -0
  462. package/dist/types/unit/IX.d.ts +2 -0
  463. package/dist/types/unit/JX.d.ts +2 -0
  464. package/dist/types/unit/KX.d.ts +2 -0
  465. package/dist/types/unit/LX.d.ts +2 -0
  466. package/dist/types/unit/MX.d.ts +2 -0
  467. package/dist/types/unit/NX.d.ts +2 -0
  468. package/dist/types/unit/OX.d.ts +2 -0
  469. package/dist/types/unit/PX.d.ts +2 -0
  470. package/dist/types/unit/QX.d.ts +2 -0
  471. package/dist/types/unit/RX.d.ts +2 -0
  472. package/dist/types/unit/SX.d.ts +2 -0
  473. package/dist/types/unit/TX.d.ts +2 -0
  474. package/dist/types/unit/UX.d.ts +2 -0
  475. package/dist/types/unit/VX.d.ts +2 -0
  476. package/dist/types/unit/WX.d.ts +2 -0
  477. package/dist/types/unit/XX.d.ts +2 -0
  478. package/dist/types/unit/YX.d.ts +2 -0
  479. package/dist/types/unit/ZX.d.ts +2 -0
  480. package/dist/types/unit-types.d.ts +37 -0
  481. package/dist/unit-types-1bF0KhIp.d.ts +56 -0
  482. package/dist/unit-types-1bF0KhIp.d.ts.map +1 -0
  483. package/dist/unit-types-CsrkvgfG.d.cts +56 -0
  484. package/dist/unit-types-CsrkvgfG.d.cts.map +1 -0
  485. package/dist/utils/MyInvoisClient.d.ts +60 -0
  486. package/dist/utils/MyInvoisClient.js +13 -0
  487. package/dist/utils/base64.d.ts +6 -0
  488. package/dist/utils/base64.d.ts.map +1 -0
  489. package/dist/utils/base64.js +11 -0
  490. package/dist/utils/base64.js.map +1 -0
  491. package/dist/utils/debug/debug-document-hash.d.ts +100 -0
  492. package/dist/utils/debug/debug-document-hash.d.ts.map +1 -0
  493. package/dist/utils/debug/debug-document-hash.js +120 -0
  494. package/dist/utils/debug/debug-document-hash.js.map +1 -0
  495. package/dist/utils/debug/debug-invoice-submission.d.ts +152 -0
  496. package/dist/utils/debug/debug-invoice-submission.d.ts.map +1 -0
  497. package/dist/utils/debug/debug-invoice-submission.js +226 -0
  498. package/dist/utils/debug/debug-invoice-submission.js.map +1 -0
  499. package/dist/utils/getBaseUrl.d.ts +5 -0
  500. package/dist/utils/getBaseUrl.d.ts.map +1 -0
  501. package/dist/utils/getBaseUrl.js +3 -0
  502. package/dist/utils/invoice1-1.d.ts +117 -0
  503. package/dist/utils/invoice1-1.d.ts.map +1 -0
  504. package/dist/utils/invoice1-1.js +10 -0
  505. package/dist/utils/signature/canonicalize.d.ts +26 -0
  506. package/dist/utils/signature/canonicalize.d.ts.map +1 -0
  507. package/dist/utils/signature/canonicalize.js +3 -0
  508. package/dist/utils/signature/hashCert.d.ts +15 -0
  509. package/dist/utils/signature/hashCert.d.ts.map +1 -0
  510. package/dist/utils/signature/hashCert.js +3 -0
  511. package/dist/utils/signature/hashSignedProperties.d.ts +25 -0
  512. package/dist/utils/signature/hashSignedProperties.d.ts.map +1 -0
  513. package/dist/utils/signature/hashSignedProperties.js +3 -0
  514. package/dist/utils/signature/populateFinalDocument.d.ts +23 -0
  515. package/dist/utils/signature/populateFinalDocument.d.ts.map +1 -0
  516. package/dist/utils/signature/populateFinalDocument.js +3 -0
  517. package/dist/utils/signature/populateSignedProperties.d.ts +23 -0
  518. package/dist/utils/signature/populateSignedProperties.d.ts.map +1 -0
  519. package/dist/utils/signature/populateSignedProperties.js +3 -0
  520. package/dist/utils/signature/sign.d.ts +16 -0
  521. package/dist/utils/signature/sign.d.ts.map +1 -0
  522. package/dist/utils/signature/sign.js +3 -0
  523. package/dist/utils/signature/transform.d.ts +16 -0
  524. package/dist/utils/signature/transform.d.ts.map +1 -0
  525. package/dist/utils/signature/transform.js +3 -0
  526. package/package.json +12 -5
  527. package/src/api/platform/{taxpayerLogin.ts → platformLogin.ts} +8 -2
  528. package/src/types/documents/invoice-1_1.d.ts +90 -0
  529. package/src/types/index.d.ts +1 -0
  530. package/src/types/msic-codes.d.ts +1 -7
  531. package/src/utils/MyInvoisClient.ts +428 -11
  532. package/src/utils/base64.ts +7 -0
  533. package/src/utils/debug/debug-document-hash.ts +249 -0
  534. package/src/utils/debug/debug-invoice-submission.ts +355 -0
  535. package/src/utils/getBaseUrl.ts +1 -1
  536. package/src/utils/invoice1-1.ts +671 -0
  537. package/src/utils/signature/canonicalize.ts +104 -0
  538. package/src/utils/signature/hashCert.ts +115 -0
  539. package/src/utils/signature/hashSignedProperties.ts +155 -0
  540. package/src/utils/signature/populateFinalDocument.ts +187 -0
  541. package/src/utils/signature/populateSignedProperties.ts +87 -0
  542. package/src/utils/signature/sign.ts +51 -0
  543. package/src/utils/signature/transform.ts +99 -0
  544. package/test/MyInvoiClientWithRealData.test.ts +2 -1
  545. package/test/MyInvoisClient.test.ts +16 -8
  546. package/test/base64.test.ts +43 -0
  547. package/test/canonicalize.test.ts +110 -0
  548. package/test/hashCert.test.ts +95 -0
  549. package/test/hashSignedProperties.test.ts +140 -0
  550. package/test/populateFinalDocument.test.ts +218 -0
  551. package/test/populateSignedProperties.test.ts +155 -0
  552. package/test/sign.test.ts +70 -0
  553. package/test/signAndSubmitInvoice.test.ts +915 -0
  554. package/test/transform.test.ts +158 -0
  555. package/tsconfig.json +7 -1
  556. package/tsdown.config.ts +31 -0
  557. package/dist/index.cjs.map +0 -1
  558. package/rolldown.config.ts +0 -26
@@ -0,0 +1,504 @@
1
+ import { canonicalizeAndHashDocumentWithC14N11Fallback } from "./canonicalize-DNUrCGad.js";
2
+ import { hashCertificate } from "./hashCert-Bol7lIh2.js";
3
+ import { hashSignedPropertiesWithC14N11Fallback } from "./hashSignedProperties-9vj5wlYR.js";
4
+ import { populateFinalDocument } from "./populateFinalDocument-BpLXmgLv.js";
5
+ import { populateSignedProperties } from "./populateSignedProperties-BvGN-YZH.js";
6
+ import { signDocumentDigest } from "./sign-DzHK7UhR.js";
7
+ import { transformXmlInvoice } from "./transform-D1q-U6Zj.js";
8
+ import { createRequire } from "node:module";
9
+ import * as crypto from "crypto";
10
+ import { DOMParserImpl, XMLSerializerImpl } from "xmldom-ts";
11
+
12
+ //#region rolldown:runtime
13
+ var __require = /* @__PURE__ */ createRequire(import.meta.url);
14
+
15
+ //#endregion
16
+ //#region src/utils/invoice1-1.ts
17
+ /**
18
+ * Escapes XML special characters
19
+ */
20
+ const escapeXml = (text) => {
21
+ return text.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;");
22
+ };
23
+ /**
24
+ * Minifies XML by removing unnecessary whitespace and line breaks
25
+ * As recommended by MyInvois documentation for Submit Documents API
26
+ */
27
+ const minifyXML = (xmlString) => {
28
+ return xmlString.replace(/>\s+</g, "><").replace(/\s+/g, " ").replace(/>\s/g, ">").replace(/\s</g, "<").trim();
29
+ };
30
+ /**
31
+ * Generates supplier XML section
32
+ */
33
+ const generateSupplierXML = (supplier) => {
34
+ return `
35
+ <cac:AccountingSupplierParty>
36
+ <cac:Party>
37
+ ${supplier.industryClassificationCode ? `<cbc:IndustryClassificationCode>${supplier.industryClassificationCode}</cbc:IndustryClassificationCode>` : ""}
38
+ <cac:PartyIdentification>
39
+ <cbc:ID schemeID="TIN">${escapeXml(supplier.tin)}</cbc:ID>
40
+ </cac:PartyIdentification>
41
+ <cac:PartyIdentification>
42
+ <cbc:ID schemeID="${supplier.registrationType}">${escapeXml(supplier.registrationNumber)}</cbc:ID>
43
+ </cac:PartyIdentification>
44
+ <cac:PartyIdentification>
45
+ <cbc:ID schemeID="SST">${escapeXml(supplier.sstRegistrationNumber || "NA")}</cbc:ID>
46
+ </cac:PartyIdentification>
47
+ <cac:PartyIdentification>
48
+ <cbc:ID schemeID="TTX">NA</cbc:ID>
49
+ </cac:PartyIdentification>
50
+ ${generatePostalAddressXML(supplier.address)}
51
+ <cac:PartyLegalEntity>
52
+ <cbc:RegistrationName>${escapeXml(supplier.name)}</cbc:RegistrationName>
53
+ </cac:PartyLegalEntity>
54
+ <cac:Contact>
55
+ <cbc:Telephone>${escapeXml(supplier.contactNumber)}</cbc:Telephone>
56
+ <cbc:ElectronicMail>${escapeXml(supplier.email || "NA")}</cbc:ElectronicMail>
57
+ </cac:Contact>
58
+ </cac:Party>
59
+ </cac:AccountingSupplierParty>`;
60
+ };
61
+ /**
62
+ * Generates buyer XML section
63
+ */
64
+ const generateBuyerXML = (buyer) => {
65
+ return `
66
+ <cac:AccountingCustomerParty>
67
+ <cac:Party>
68
+ <cac:PartyIdentification>
69
+ <cbc:ID schemeID="TIN">${escapeXml(buyer.tin)}</cbc:ID>
70
+ </cac:PartyIdentification>
71
+ <cac:PartyIdentification>
72
+ <cbc:ID schemeID="BRN">${escapeXml(buyer.registrationNumber || "NA")}</cbc:ID>
73
+ </cac:PartyIdentification>
74
+ <cac:PartyIdentification>
75
+ <cbc:ID schemeID="SST">${escapeXml(buyer.sstRegistrationNumber || "NA")}</cbc:ID>
76
+ </cac:PartyIdentification>
77
+ <cac:PartyIdentification>
78
+ <cbc:ID schemeID="TTX">NA</cbc:ID>
79
+ </cac:PartyIdentification>
80
+ ${generatePostalAddressXML(buyer.address)}
81
+ <cac:PartyLegalEntity>
82
+ <cbc:RegistrationName>${escapeXml(buyer.name)}</cbc:RegistrationName>
83
+ </cac:PartyLegalEntity>
84
+ <cac:Contact>
85
+ <cbc:Telephone>${escapeXml(buyer.contactNumber || "NA")}</cbc:Telephone>
86
+ <cbc:ElectronicMail>${escapeXml(buyer.email || "NA")}</cbc:ElectronicMail>
87
+ </cac:Contact>
88
+ </cac:Party>
89
+ </cac:AccountingCustomerParty>`;
90
+ };
91
+ /**
92
+ * Generates postal address XML section (updated to match working example)
93
+ */
94
+ const generatePostalAddressXML = (address) => {
95
+ return `
96
+ <cac:PostalAddress>
97
+ <cbc:CityName>${escapeXml(address.cityName || " ")}</cbc:CityName>
98
+ <cbc:PostalZone>${escapeXml(address.postalZone || " ")}</cbc:PostalZone>
99
+ <cbc:CountrySubentityCode>${escapeXml(address.state || " ")}</cbc:CountrySubentityCode>
100
+ <cac:AddressLine>
101
+ <cbc:Line>${escapeXml(address.addressLine0 || "NA")}</cbc:Line>
102
+ </cac:AddressLine>
103
+ <cac:AddressLine>
104
+ <cbc:Line>${escapeXml(address.addressLine1 || " ")}</cbc:Line>
105
+ </cac:AddressLine>
106
+ <cac:AddressLine>
107
+ <cbc:Line>${escapeXml(address.addressLine2 || " ")}</cbc:Line>
108
+ </cac:AddressLine>
109
+ <cac:Country>
110
+ <cbc:IdentificationCode listID="ISO3166-1" listAgencyID="6">${escapeXml(address.country || " ")}</cbc:IdentificationCode>
111
+ </cac:Country>
112
+ </cac:PostalAddress>`;
113
+ };
114
+ /**
115
+ * Generates delivery XML section
116
+ */
117
+ const generateDeliveryXML = (delivery) => {
118
+ return `
119
+ <cac:Delivery>
120
+ ${delivery.actualDeliveryDate ? `<cbc:ActualDeliveryDate>${delivery.actualDeliveryDate}</cbc:ActualDeliveryDate>` : ""}
121
+ ${delivery.deliveryParty ? `
122
+ <cac:DeliveryParty>
123
+ ${delivery.deliveryParty.name ? `
124
+ <cac:PartyLegalEntity>
125
+ <cbc:RegistrationName>${escapeXml(delivery.deliveryParty.name)}</cbc:RegistrationName>
126
+ </cac:PartyLegalEntity>` : ""}
127
+ </cac:DeliveryParty>` : ""}
128
+ ${delivery.deliveryLocation ? generatePostalAddressXML(delivery.deliveryLocation) : ""}
129
+ </cac:Delivery>`;
130
+ };
131
+ /**
132
+ * Generates payment means XML section
133
+ */
134
+ const generatePaymentMeansXML = (paymentMeans) => {
135
+ return `
136
+ <cac:PaymentMeans>
137
+ <cbc:PaymentMeansCode>${paymentMeans.paymentMeansCode}</cbc:PaymentMeansCode>
138
+ ${paymentMeans.paymentDueDate ? `<cbc:PaymentDueDate>${paymentMeans.paymentDueDate}</cbc:PaymentDueDate>` : ""}
139
+ ${paymentMeans.payeeFinancialAccountID ? `
140
+ <cac:PayeeFinancialAccount>
141
+ <cbc:ID>${escapeXml(paymentMeans.payeeFinancialAccountID)}</cbc:ID>
142
+ </cac:PayeeFinancialAccount>` : ""}
143
+ </cac:PaymentMeans>`;
144
+ };
145
+ /**
146
+ * Generates allowance/charge XML section
147
+ */
148
+ const generateAllowanceChargeXML = (allowanceCharge) => {
149
+ return `
150
+ <cac:AllowanceCharge>
151
+ <cbc:ChargeIndicator>${allowanceCharge.chargeIndicator}</cbc:ChargeIndicator>
152
+ <cbc:AllowanceChargeReason>${escapeXml(allowanceCharge.reason)}</cbc:AllowanceChargeReason>
153
+ ${allowanceCharge.multiplierFactorNumeric ? `<cbc:MultiplierFactorNumeric>${allowanceCharge.multiplierFactorNumeric}</cbc:MultiplierFactorNumeric>` : ""}
154
+ <cbc:Amount currencyID="MYR">${allowanceCharge.amount}</cbc:Amount>
155
+ ${allowanceCharge.baseAmount ? `<cbc:BaseAmount currencyID="MYR">${allowanceCharge.baseAmount}</cbc:BaseAmount>` : ""}
156
+ </cac:AllowanceCharge>`;
157
+ };
158
+ /**
159
+ * Generates tax total XML section
160
+ */
161
+ const generateTaxTotalXML = (taxTotal) => {
162
+ return `
163
+ <cac:TaxTotal>
164
+ <cbc:TaxAmount currencyID="MYR">${taxTotal.taxAmount}</cbc:TaxAmount>
165
+ ${taxTotal.taxSubtotals ? taxTotal.taxSubtotals.map((subtotal) => `
166
+ <cac:TaxSubtotal>
167
+ <cbc:TaxableAmount currencyID="MYR">${subtotal.taxableAmount}</cbc:TaxableAmount>
168
+ <cbc:TaxAmount currencyID="MYR">${subtotal.taxAmount}</cbc:TaxAmount>
169
+ ${subtotal.taxCategory.taxRate ? `<cbc:Percent>${subtotal.taxCategory.taxRate}</cbc:Percent>` : ""}
170
+ <cac:TaxCategory>
171
+ <cbc:ID>${subtotal.taxCategory.taxTypeCode}</cbc:ID>
172
+ ${subtotal.taxCategory.taxExemptionReason ? `<cbc:TaxExemptionReason>${escapeXml(subtotal.taxCategory.taxExemptionReason)}</cbc:TaxExemptionReason>` : ""}
173
+ <cac:TaxScheme>
174
+ <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">OTH</cbc:ID>
175
+ </cac:TaxScheme>
176
+ </cac:TaxCategory>
177
+ </cac:TaxSubtotal>`).join("") : ""}
178
+ </cac:TaxTotal>`;
179
+ };
180
+ /**
181
+ * Generates legal monetary total XML section (updated to match working example)
182
+ */
183
+ const generateLegalMonetaryTotalXML = (total) => {
184
+ return `
185
+ <cac:LegalMonetaryTotal>
186
+ <cbc:LineExtensionAmount currencyID="MYR">${total.taxExclusiveAmount}</cbc:LineExtensionAmount>
187
+ <cbc:TaxExclusiveAmount currencyID="MYR">${total.taxExclusiveAmount}</cbc:TaxExclusiveAmount>
188
+ <cbc:TaxInclusiveAmount currencyID="MYR">${total.taxInclusiveAmount}</cbc:TaxInclusiveAmount>
189
+ <cbc:AllowanceTotalAmount currencyID="MYR">${total.allowanceTotalAmount || "0"}</cbc:AllowanceTotalAmount>
190
+ <cbc:ChargeTotalAmount currencyID="MYR">${total.chargeTotalAmount || "0"}</cbc:ChargeTotalAmount>
191
+ ${total.prepaidAmount ? `<cbc:PrepaidAmount currencyID="MYR">${total.prepaidAmount}</cbc:PrepaidAmount>` : ""}
192
+ <cbc:PayableRoundingAmount currencyID="MYR">${total.payableRoundingAmount || "0"}</cbc:PayableRoundingAmount>
193
+ <cbc:PayableAmount currencyID="MYR">${total.payableAmount}</cbc:PayableAmount>
194
+ </cac:LegalMonetaryTotal>`;
195
+ };
196
+ /**
197
+ * Generates invoice line XML section (updated to match working example)
198
+ */
199
+ const generateInvoiceLineXML = (item, lineNumber) => {
200
+ return `
201
+ <cac:InvoiceLine>
202
+ <cbc:ID>${lineNumber}</cbc:ID>
203
+ ${item.quantity && item.measurement ? `<cbc:InvoicedQuantity unitCode="${item.measurement}">${item.quantity}</cbc:InvoicedQuantity>` : ""}
204
+ <cbc:LineExtensionAmount currencyID="MYR">${item.totalTaxableAmountPerLine}</cbc:LineExtensionAmount>
205
+ ${item.discountAmount ? `
206
+ <cac:AllowanceCharge>
207
+ <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
208
+ <cbc:AllowanceChargeReason>Discount</cbc:AllowanceChargeReason>
209
+ ${item.discountRate ? `<cbc:MultiplierFactorNumeric>${item.discountRate / 100}</cbc:MultiplierFactorNumeric>` : ""}
210
+ <cbc:Amount currencyID="MYR">${item.discountAmount}</cbc:Amount>
211
+ </cac:AllowanceCharge>` : ""}
212
+ <cac:TaxTotal>
213
+ <cbc:TaxAmount currencyID="MYR">${item.taxAmount}</cbc:TaxAmount>
214
+ <cac:TaxSubtotal>
215
+ <cbc:TaxableAmount currencyID="MYR">${item.totalTaxableAmountPerLine}</cbc:TaxableAmount>
216
+ <cbc:TaxAmount currencyID="MYR">${item.taxAmount}</cbc:TaxAmount>
217
+ ${item.taxRate ? `<cbc:Percent>${item.taxRate.toFixed(2)}</cbc:Percent>` : ""}
218
+ <cac:TaxCategory>
219
+ <cbc:ID>${item.taxType}</cbc:ID>
220
+ <cac:TaxScheme>
221
+ <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">OTH</cbc:ID>
222
+ </cac:TaxScheme>
223
+ </cac:TaxCategory>
224
+ </cac:TaxSubtotal>
225
+ </cac:TaxTotal>
226
+ <cac:Item>
227
+ <cbc:Description>${escapeXml(item.itemDescription)}</cbc:Description>
228
+ ${item.countryOfOrigin ? `
229
+ <cac:OriginCountry>
230
+ <cbc:IdentificationCode>${item.countryOfOrigin}</cbc:IdentificationCode>
231
+ </cac:OriginCountry>` : ""}
232
+ <cac:CommodityClassification>
233
+ <cbc:ItemClassificationCode listID="PTC">001</cbc:ItemClassificationCode>
234
+ </cac:CommodityClassification>
235
+ <cac:CommodityClassification>
236
+ <cbc:ItemClassificationCode listID="CLASS">${item.itemClassificationCode}</cbc:ItemClassificationCode>
237
+ </cac:CommodityClassification>
238
+ </cac:Item>
239
+ <cac:Price>
240
+ <cbc:PriceAmount currencyID="MYR">${item.unitPrice}</cbc:PriceAmount>
241
+ </cac:Price>
242
+ <cac:ItemPriceExtension>
243
+ <cbc:Amount currencyID="MYR">${item.totalTaxableAmountPerLine}</cbc:Amount>
244
+ </cac:ItemPriceExtension>
245
+ </cac:InvoiceLine>`;
246
+ };
247
+ /**
248
+ * Generates a document hash for submission (separate from signature DocDigest)
249
+ * This is the SHA256 hash required by the Submit Documents API
250
+ *
251
+ * OFFICIAL MyInvois FAQ: "The XML/JSON document is hashed using SHA-256 to create the documentHash value"
252
+ * CRITICAL: Must hash the SAME document that gets encoded for submission (minified XML)
253
+ * Source: https://sdk.myinvois.hasil.gov.my/faq/#how-to-hash-the-documenthash-value-and-encode-the-document-value
254
+ */
255
+ const generateDocumentHash = (xmlDocument) => {
256
+ try {
257
+ console.log("🔧 Generating document hash using official MyInvois method (minified XML SHA256)");
258
+ const minifiedXML = minifyXML(xmlDocument);
259
+ const crypto$1 = __require("crypto");
260
+ const documentHash = crypto$1.createHash("sha256").update(minifiedXML, "utf8").digest("hex");
261
+ console.log("📊 Original XML length:", xmlDocument.length, "characters");
262
+ console.log("📊 Minified XML length:", minifiedXML.length, "characters");
263
+ console.log("📊 Document hash (SHA256 hex):", documentHash);
264
+ console.log("📊 Hash length:", documentHash.length, "characters (should be 64)");
265
+ if (documentHash.length !== 64) {
266
+ console.error(`❌ Invalid hash length: ${documentHash.length}, expected 64 characters`);
267
+ throw new Error(`Invalid SHA256 hash length: ${documentHash.length}`);
268
+ }
269
+ return documentHash;
270
+ } catch (error) {
271
+ console.error("❌ Error generating document hash:", error);
272
+ throw new Error(`Failed to generate document hash: ${error}`);
273
+ }
274
+ };
275
+ /**
276
+ * Encodes the XML document to base64 for submission
277
+ * Includes minification as recommended by MyInvois documentation
278
+ */
279
+ const encodeDocumentForSubmission = (xmlDocument) => {
280
+ const minifiedXML = minifyXML(xmlDocument);
281
+ return Buffer.from(minifiedXML, "utf8").toString("base64");
282
+ };
283
+ /**
284
+ * Utility functions for extracting certificate information
285
+ */
286
+ /**
287
+ * Extracts certificate information from a PEM certificate file
288
+ * @param certificatePem - The certificate in PEM format
289
+ * @returns Object containing issuer name and serial number
290
+ */
291
+ const extractCertificateInfo = (certificatePem) => {
292
+ try {
293
+ const cert = new crypto.X509Certificate(certificatePem);
294
+ const issuerName = cert.issuer;
295
+ const serialNumberHex = cert.serialNumber;
296
+ console.log("📋 Certificate serial number (hex):", serialNumberHex);
297
+ const serialNumberDecimal = BigInt("0x" + serialNumberHex).toString();
298
+ console.log("📋 Certificate serial number (decimal):", serialNumberDecimal);
299
+ return {
300
+ issuerName,
301
+ serialNumber: serialNumberDecimal
302
+ };
303
+ } catch (error) {
304
+ throw new Error(`Failed to extract certificate info: ${error}`);
305
+ }
306
+ };
307
+ /**
308
+ * Validates that certificate and private key match
309
+ * @param certificatePem - The certificate in PEM format
310
+ * @param privateKeyPem - The private key in PEM format
311
+ * @returns boolean indicating if they match
312
+ */
313
+ const validateKeyPair = (certificatePem, privateKeyPem) => {
314
+ try {
315
+ const cert = new crypto.X509Certificate(certificatePem);
316
+ const publicKey = cert.publicKey;
317
+ const testData = "test-validation-data";
318
+ const signer = crypto.createSign("RSA-SHA256");
319
+ signer.update(testData);
320
+ const signature = signer.sign(privateKeyPem);
321
+ const verifier = crypto.createVerify("RSA-SHA256");
322
+ verifier.update(testData);
323
+ return verifier.verify(publicKey, signature);
324
+ } catch (error) {
325
+ console.error("Key pair validation failed:", error);
326
+ return false;
327
+ }
328
+ };
329
+ /**
330
+ * Helper function to create SigningCredentials from certificate and private key files
331
+ * @param certificatePem - The certificate in PEM format
332
+ * @param privateKeyPem - The private key in PEM format
333
+ * @returns Complete SigningCredentials object
334
+ */
335
+ function createSigningCredentials(certificatePem, privateKeyPem) {
336
+ if (!validateKeyPair(certificatePem, privateKeyPem)) throw new Error("Certificate and private key do not match");
337
+ const { issuerName, serialNumber } = extractCertificateInfo(certificatePem);
338
+ return {
339
+ privateKeyPem,
340
+ certificatePem,
341
+ issuerName,
342
+ serialNumber
343
+ };
344
+ }
345
+ /**
346
+ * Generates the UBL XML template with complete signature structure
347
+ */
348
+ function generateUBLXMLTemplate(invoiceInfo) {
349
+ const { supplier, buyer, invoiceLineItems, legalMonetaryTotal, taxTotal } = invoiceInfo;
350
+ return `<?xml version="1.0" encoding="UTF-8"?>
351
+ <Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
352
+ xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
353
+ xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
354
+ xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2">
355
+ <UBLExtensions xmlns="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2">
356
+ <UBLExtension>
357
+ <ExtensionURI>urn:oasis:names:specification:ubl:dsig:enveloped:xades</ExtensionURI>
358
+ <ExtensionContent>
359
+ <sig:UBLDocumentSignatures xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2"
360
+ xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2"
361
+ xmlns:sbc="urn:oasis:names:specification:ubl:schema:xsd:SignatureBasicComponents-2">
362
+ <sac:SignatureInformation>
363
+ <cbc:ID>urn:oasis:names:specification:ubl:signature:1</cbc:ID>
364
+ <sbc:ReferencedSignatureID>urn:oasis:names:specification:ubl:signature:Invoice</sbc:ReferencedSignatureID>
365
+ <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="signature">
366
+ <ds:SignedInfo>
367
+ <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
368
+ <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
369
+ <ds:Reference Id="id-doc-signed-data" URI="">
370
+ <ds:Transforms>
371
+ <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
372
+ <ds:XPath>not(//ancestor-or-self::ext:UBLExtensions)</ds:XPath>
373
+ </ds:Transform>
374
+ <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
375
+ <ds:XPath>not(//ancestor-or-self::cac:Signature)</ds:XPath>
376
+ </ds:Transform>
377
+ <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
378
+ </ds:Transforms>
379
+ <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
380
+ <ds:DigestValue></ds:DigestValue>
381
+ </ds:Reference>
382
+ <ds:Reference Type="http://www.w3.org/2000/09/xmldsig#SignatureProperties" URI="#id-xades-signed-props">
383
+ <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
384
+ <ds:DigestValue></ds:DigestValue>
385
+ </ds:Reference>
386
+ </ds:SignedInfo>
387
+ <ds:SignatureValue></ds:SignatureValue>
388
+ <ds:KeyInfo>
389
+ <ds:X509Data>
390
+ <ds:X509Certificate></ds:X509Certificate>
391
+ </ds:X509Data>
392
+ </ds:KeyInfo>
393
+ <ds:Object>
394
+ <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="signature">
395
+ <xades:SignedProperties Id="id-xades-signed-props">
396
+ <xades:SignedSignatureProperties>
397
+ <xades:SigningTime></xades:SigningTime>
398
+ <xades:SigningCertificate>
399
+ <xades:Cert>
400
+ <xades:CertDigest>
401
+ <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
402
+ <ds:DigestValue></ds:DigestValue>
403
+ </xades:CertDigest>
404
+ <xades:IssuerSerial>
405
+ <ds:X509IssuerName></ds:X509IssuerName>
406
+ <ds:X509SerialNumber></ds:X509SerialNumber>
407
+ </xades:IssuerSerial>
408
+ </xades:Cert>
409
+ </xades:SigningCertificate>
410
+ </xades:SignedSignatureProperties>
411
+ </xades:SignedProperties>
412
+ </xades:QualifyingProperties>
413
+ </ds:Object>
414
+ </ds:Signature>
415
+ </sac:SignatureInformation>
416
+ </sig:UBLDocumentSignatures>
417
+ </ExtensionContent>
418
+ </UBLExtension>
419
+ </UBLExtensions>
420
+ <cbc:ID>${escapeXml(invoiceInfo.eInvoiceCodeOrNumber)}</cbc:ID>
421
+ <cbc:IssueDate>${invoiceInfo.eInvoiceDate}</cbc:IssueDate>
422
+ <cbc:IssueTime>${invoiceInfo.eInvoiceTime}</cbc:IssueTime>
423
+ <cbc:InvoiceTypeCode listVersionID="1.1">${invoiceInfo.eInvoiceTypeCode}</cbc:InvoiceTypeCode>
424
+ <cbc:DocumentCurrencyCode>${invoiceInfo.invoiceCurrencyCode}</cbc:DocumentCurrencyCode>
425
+ <cbc:TaxCurrencyCode>${invoiceInfo.invoiceCurrencyCode}</cbc:TaxCurrencyCode>
426
+ ${invoiceInfo.billingPeriodStartDate && invoiceInfo.billingPeriodEndDate ? `
427
+ <cac:InvoicePeriod>
428
+ <cbc:StartDate>${invoiceInfo.billingPeriodStartDate}</cbc:StartDate>
429
+ <cbc:EndDate>${invoiceInfo.billingPeriodEndDate}</cbc:EndDate>
430
+ ${invoiceInfo.frequencyOfBilling ? `<cbc:Description>${escapeXml(invoiceInfo.frequencyOfBilling)}</cbc:Description>` : ""}
431
+ </cac:InvoicePeriod>` : ""}
432
+ <cac:Signature>
433
+ <cbc:ID>urn:oasis:names:specification:ubl:signature:Invoice</cbc:ID>
434
+ <cbc:SignatureMethod>urn:oasis:names:specification:ubl:dsig:enveloped:xades</cbc:SignatureMethod>
435
+ </cac:Signature>
436
+ ${generateSupplierXML(supplier)}
437
+ ${generateBuyerXML(buyer)}
438
+ ${invoiceInfo.delivery ? generateDeliveryXML(invoiceInfo.delivery) : ""}
439
+ ${invoiceInfo.paymentMeans ? invoiceInfo.paymentMeans.map((pm) => generatePaymentMeansXML(pm)).join("") : ""}
440
+ ${invoiceInfo.allowanceCharges ? invoiceInfo.allowanceCharges.map((ac) => generateAllowanceChargeXML(ac)).join("") : ""}
441
+ ${generateTaxTotalXML(taxTotal)}
442
+ ${generateLegalMonetaryTotalXML(legalMonetaryTotal)}
443
+ ${invoiceLineItems.map((item, index) => generateInvoiceLineXML(item, index + 1)).join("")}
444
+ </Invoice>`;
445
+ }
446
+ /**
447
+ * Generates a signed UBL XML invoice document following MyInvois specifications.
448
+ *
449
+ * @param invoiceInfo - The invoice data structure
450
+ * @param signingCredentials - Digital signature credentials
451
+ * @returns Promise<string> - The complete signed XML document ready for submission
452
+ */
453
+ const generateSignedInvoiceXML = async (invoiceInfo, signingCredentials) => {
454
+ const xmlTemplate = generateUBLXMLTemplate(invoiceInfo);
455
+ const parser = new DOMParserImpl();
456
+ const templateDoc = parser.parseFromString(xmlTemplate, "application/xml");
457
+ const transformedXml = transformXmlInvoice(xmlTemplate);
458
+ const transformedDoc = parser.parseFromString(transformedXml, "application/xml");
459
+ const docDigest = await canonicalizeAndHashDocumentWithC14N11Fallback(transformedDoc);
460
+ const signature = signDocumentDigest(docDigest, signingCredentials.privateKeyPem);
461
+ const certDigest = hashCertificate(signingCredentials.certificatePem);
462
+ const signedPropertiesData = {
463
+ certDigest,
464
+ signingTime: (/* @__PURE__ */ new Date()).toISOString().replace(/\.\d{3}Z$/, "Z"),
465
+ issuerName: signingCredentials.issuerName,
466
+ serialNumber: signingCredentials.serialNumber
467
+ };
468
+ populateSignedProperties(templateDoc, signedPropertiesData);
469
+ const propsDigest = await hashSignedPropertiesWithC14N11Fallback(templateDoc);
470
+ const finalData = {
471
+ signatureValue: signature,
472
+ propsDigest,
473
+ docDigest,
474
+ certificatePem: signingCredentials.certificatePem
475
+ };
476
+ populateFinalDocument(templateDoc, finalData);
477
+ const serializer = new XMLSerializerImpl();
478
+ return serializer.serializeToString(templateDoc);
479
+ };
480
+ /**
481
+ * Generates a document hash for submission using the same method as signature creation
482
+ * This ensures consistency with MyInvois validation requirements
483
+ */
484
+ const generateDocumentHashForSubmission = async (xmlDocument) => {
485
+ try {
486
+ console.log("🔧 Generating document hash using signature-compatible method...");
487
+ const parser = new DOMParserImpl();
488
+ const transformedXml = transformXmlInvoice(xmlDocument);
489
+ const transformedDoc = parser.parseFromString(transformedXml, "application/xml");
490
+ const base64Digest = await canonicalizeAndHashDocumentWithC14N11Fallback(transformedDoc);
491
+ const hexDigest = Buffer.from(base64Digest, "base64").toString("hex");
492
+ console.log("📊 Canonicalized document hash (base64):", base64Digest);
493
+ console.log("📊 Canonicalized document hash (hex):", hexDigest);
494
+ console.log("📊 Hash length:", hexDigest.length, "characters");
495
+ return hexDigest;
496
+ } catch (error) {
497
+ console.error("Error generating canonicalized hash, using fallback:", error);
498
+ return generateDocumentHash(xmlDocument);
499
+ }
500
+ };
501
+
502
+ //#endregion
503
+ export { createSigningCredentials, encodeDocumentForSubmission, extractCertificateInfo, generateDocumentHash, generateDocumentHashForSubmission, generateSignedInvoiceXML, generateUBLXMLTemplate, validateKeyPair };
504
+ //# sourceMappingURL=invoice1-1-CHuLpkFz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invoice1-1-CHuLpkFz.js","names":["text: string","xmlString: string","supplier: InvoiceV1_1['supplier']","buyer: InvoiceV1_1['buyer']","address: InvoiceV1_1['supplier']['address']","delivery: NonNullable<InvoiceV1_1['delivery']>","paymentMeans: NonNullable<InvoiceV1_1['paymentMeans']>[0]","allowanceCharge: NonNullable<InvoiceV1_1['allowanceCharges']>[0]","taxTotal: InvoiceV1_1['taxTotal']","total: InvoiceV1_1['legalMonetaryTotal']","item: InvoiceV1_1['invoiceLineItems'][0]","lineNumber: number","xmlDocument: string","crypto","certificatePem: string","privateKeyPem: string","invoiceInfo: InvoiceV1_1","signingCredentials: SigningCredentials","signedPropertiesData: SignedPropertiesData","finalData: FinalDocumentData"],"sources":["../src/utils/invoice1-1.ts"],"sourcesContent":["import * as crypto from 'crypto'\nimport type { InvoiceV1_1 } from '../types/documents/invoice-1_1.d.ts'\nimport { DOMParserImpl, XMLSerializerImpl } from 'xmldom-ts'\nimport { canonicalizeAndHashDocumentWithC14N11Fallback } from './signature/canonicalize'\nimport { hashCertificate } from './signature/hashCert'\nimport { hashSignedPropertiesWithC14N11Fallback } from './signature/hashSignedProperties'\nimport {\n populateFinalDocument,\n type FinalDocumentData,\n} from './signature/populateFinalDocument'\nimport {\n populateSignedProperties,\n type SignedPropertiesData,\n} from './signature/populateSignedProperties'\nimport { signDocumentDigest } from './signature/sign'\nimport { transformXmlInvoice } from './signature/transform'\nimport type { SigningCredentials } from '../types/documents/invoice-1_1.d.ts'\n\n/**\n * Escapes XML special characters\n */\nconst escapeXml = (text: string): string => {\n return text\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n}\n\n/**\n * Minifies XML by removing unnecessary whitespace and line breaks\n * As recommended by MyInvois documentation for Submit Documents API\n */\nconst minifyXML = (xmlString: string): string => {\n return xmlString\n .replace(/>\\s+</g, '><') // Remove whitespace between tags\n .replace(/\\s+/g, ' ') // Replace multiple spaces with single space\n .replace(/>\\s/g, '>') // Remove space after opening tags\n .replace(/\\s</g, '<') // Remove space before closing tags\n .trim() // Remove leading/trailing whitespace\n}\n\n/**\n * Generates supplier XML section\n */\nconst generateSupplierXML = (supplier: InvoiceV1_1['supplier']): string => {\n return `\n <cac:AccountingSupplierParty>\n <cac:Party>\n ${supplier.industryClassificationCode ? `<cbc:IndustryClassificationCode>${supplier.industryClassificationCode}</cbc:IndustryClassificationCode>` : ''}\n <cac:PartyIdentification>\n <cbc:ID schemeID=\"TIN\">${escapeXml(supplier.tin)}</cbc:ID>\n </cac:PartyIdentification>\n <cac:PartyIdentification>\n <cbc:ID schemeID=\"${supplier.registrationType}\">${escapeXml(supplier.registrationNumber)}</cbc:ID>\n </cac:PartyIdentification>\n <cac:PartyIdentification>\n <cbc:ID schemeID=\"SST\">${escapeXml(supplier.sstRegistrationNumber || 'NA')}</cbc:ID>\n </cac:PartyIdentification>\n <cac:PartyIdentification>\n <cbc:ID schemeID=\"TTX\">NA</cbc:ID>\n </cac:PartyIdentification>\n ${generatePostalAddressXML(supplier.address)}\n <cac:PartyLegalEntity>\n <cbc:RegistrationName>${escapeXml(supplier.name)}</cbc:RegistrationName>\n </cac:PartyLegalEntity>\n <cac:Contact>\n <cbc:Telephone>${escapeXml(supplier.contactNumber)}</cbc:Telephone>\n <cbc:ElectronicMail>${escapeXml(supplier.email || 'NA')}</cbc:ElectronicMail>\n </cac:Contact>\n </cac:Party>\n </cac:AccountingSupplierParty>`\n}\n\n/**\n * Generates buyer XML section\n */\nconst generateBuyerXML = (buyer: InvoiceV1_1['buyer']): string => {\n return `\n <cac:AccountingCustomerParty>\n <cac:Party>\n <cac:PartyIdentification>\n <cbc:ID schemeID=\"TIN\">${escapeXml(buyer.tin)}</cbc:ID>\n </cac:PartyIdentification>\n <cac:PartyIdentification>\n <cbc:ID schemeID=\"BRN\">${escapeXml(buyer.registrationNumber || 'NA')}</cbc:ID>\n </cac:PartyIdentification>\n <cac:PartyIdentification>\n <cbc:ID schemeID=\"SST\">${escapeXml(buyer.sstRegistrationNumber || 'NA')}</cbc:ID>\n </cac:PartyIdentification>\n <cac:PartyIdentification>\n <cbc:ID schemeID=\"TTX\">NA</cbc:ID>\n </cac:PartyIdentification>\n ${generatePostalAddressXML(buyer.address)}\n <cac:PartyLegalEntity>\n <cbc:RegistrationName>${escapeXml(buyer.name)}</cbc:RegistrationName>\n </cac:PartyLegalEntity>\n <cac:Contact>\n <cbc:Telephone>${escapeXml(buyer.contactNumber || 'NA')}</cbc:Telephone>\n <cbc:ElectronicMail>${escapeXml(buyer.email || 'NA')}</cbc:ElectronicMail>\n </cac:Contact>\n </cac:Party>\n </cac:AccountingCustomerParty>`\n}\n\n/**\n * Generates postal address XML section (updated to match working example)\n */\nconst generatePostalAddressXML = (\n address: InvoiceV1_1['supplier']['address'],\n): string => {\n return `\n <cac:PostalAddress>\n <cbc:CityName>${escapeXml(address.cityName || ' ')}</cbc:CityName>\n <cbc:PostalZone>${escapeXml(address.postalZone || ' ')}</cbc:PostalZone>\n <cbc:CountrySubentityCode>${escapeXml(address.state || ' ')}</cbc:CountrySubentityCode>\n <cac:AddressLine>\n <cbc:Line>${escapeXml(address.addressLine0 || 'NA')}</cbc:Line>\n </cac:AddressLine>\n <cac:AddressLine>\n <cbc:Line>${escapeXml(address.addressLine1 || ' ')}</cbc:Line>\n </cac:AddressLine>\n <cac:AddressLine>\n <cbc:Line>${escapeXml(address.addressLine2 || ' ')}</cbc:Line>\n </cac:AddressLine>\n <cac:Country>\n <cbc:IdentificationCode listID=\"ISO3166-1\" listAgencyID=\"6\">${escapeXml(address.country || ' ')}</cbc:IdentificationCode>\n </cac:Country>\n </cac:PostalAddress>`\n}\n\n/**\n * Generates delivery XML section\n */\nconst generateDeliveryXML = (\n delivery: NonNullable<InvoiceV1_1['delivery']>,\n): string => {\n return `\n <cac:Delivery>\n ${delivery.actualDeliveryDate ? `<cbc:ActualDeliveryDate>${delivery.actualDeliveryDate}</cbc:ActualDeliveryDate>` : ''}\n ${\n delivery.deliveryParty\n ? `\n <cac:DeliveryParty>\n ${\n delivery.deliveryParty.name\n ? `\n <cac:PartyLegalEntity>\n <cbc:RegistrationName>${escapeXml(delivery.deliveryParty.name)}</cbc:RegistrationName>\n </cac:PartyLegalEntity>`\n : ''\n }\n </cac:DeliveryParty>`\n : ''\n }\n ${delivery.deliveryLocation ? generatePostalAddressXML(delivery.deliveryLocation) : ''}\n </cac:Delivery>`\n}\n\n/**\n * Generates payment means XML section\n */\nconst generatePaymentMeansXML = (\n paymentMeans: NonNullable<InvoiceV1_1['paymentMeans']>[0],\n): string => {\n return `\n <cac:PaymentMeans>\n <cbc:PaymentMeansCode>${paymentMeans.paymentMeansCode}</cbc:PaymentMeansCode>\n ${paymentMeans.paymentDueDate ? `<cbc:PaymentDueDate>${paymentMeans.paymentDueDate}</cbc:PaymentDueDate>` : ''}\n ${\n paymentMeans.payeeFinancialAccountID\n ? `\n <cac:PayeeFinancialAccount>\n <cbc:ID>${escapeXml(paymentMeans.payeeFinancialAccountID)}</cbc:ID>\n </cac:PayeeFinancialAccount>`\n : ''\n }\n </cac:PaymentMeans>`\n}\n\n/**\n * Generates allowance/charge XML section\n */\nconst generateAllowanceChargeXML = (\n allowanceCharge: NonNullable<InvoiceV1_1['allowanceCharges']>[0],\n): string => {\n return `\n <cac:AllowanceCharge>\n <cbc:ChargeIndicator>${allowanceCharge.chargeIndicator}</cbc:ChargeIndicator>\n <cbc:AllowanceChargeReason>${escapeXml(allowanceCharge.reason)}</cbc:AllowanceChargeReason>\n ${allowanceCharge.multiplierFactorNumeric ? `<cbc:MultiplierFactorNumeric>${allowanceCharge.multiplierFactorNumeric}</cbc:MultiplierFactorNumeric>` : ''}\n <cbc:Amount currencyID=\"MYR\">${allowanceCharge.amount}</cbc:Amount>\n ${allowanceCharge.baseAmount ? `<cbc:BaseAmount currencyID=\"MYR\">${allowanceCharge.baseAmount}</cbc:BaseAmount>` : ''}\n </cac:AllowanceCharge>`\n}\n\n/**\n * Generates tax total XML section\n */\nconst generateTaxTotalXML = (taxTotal: InvoiceV1_1['taxTotal']): string => {\n return `\n <cac:TaxTotal>\n <cbc:TaxAmount currencyID=\"MYR\">${taxTotal.taxAmount}</cbc:TaxAmount>\n ${\n taxTotal.taxSubtotals\n ? taxTotal.taxSubtotals\n .map(\n subtotal => `\n <cac:TaxSubtotal>\n <cbc:TaxableAmount currencyID=\"MYR\">${subtotal.taxableAmount}</cbc:TaxableAmount>\n <cbc:TaxAmount currencyID=\"MYR\">${subtotal.taxAmount}</cbc:TaxAmount>\n ${subtotal.taxCategory.taxRate ? `<cbc:Percent>${subtotal.taxCategory.taxRate}</cbc:Percent>` : ''}\n <cac:TaxCategory>\n <cbc:ID>${subtotal.taxCategory.taxTypeCode}</cbc:ID>\n ${subtotal.taxCategory.taxExemptionReason ? `<cbc:TaxExemptionReason>${escapeXml(subtotal.taxCategory.taxExemptionReason)}</cbc:TaxExemptionReason>` : ''}\n <cac:TaxScheme>\n <cbc:ID schemeID=\"UN/ECE 5153\" schemeAgencyID=\"6\">OTH</cbc:ID>\n </cac:TaxScheme>\n </cac:TaxCategory>\n </cac:TaxSubtotal>`,\n )\n .join('')\n : ''\n }\n </cac:TaxTotal>`\n}\n\n/**\n * Generates legal monetary total XML section (updated to match working example)\n */\nconst generateLegalMonetaryTotalXML = (\n total: InvoiceV1_1['legalMonetaryTotal'],\n): string => {\n return `\n <cac:LegalMonetaryTotal>\n <cbc:LineExtensionAmount currencyID=\"MYR\">${total.taxExclusiveAmount}</cbc:LineExtensionAmount>\n <cbc:TaxExclusiveAmount currencyID=\"MYR\">${total.taxExclusiveAmount}</cbc:TaxExclusiveAmount>\n <cbc:TaxInclusiveAmount currencyID=\"MYR\">${total.taxInclusiveAmount}</cbc:TaxInclusiveAmount>\n <cbc:AllowanceTotalAmount currencyID=\"MYR\">${total.allowanceTotalAmount || '0'}</cbc:AllowanceTotalAmount>\n <cbc:ChargeTotalAmount currencyID=\"MYR\">${total.chargeTotalAmount || '0'}</cbc:ChargeTotalAmount>\n ${total.prepaidAmount ? `<cbc:PrepaidAmount currencyID=\"MYR\">${total.prepaidAmount}</cbc:PrepaidAmount>` : ''}\n <cbc:PayableRoundingAmount currencyID=\"MYR\">${total.payableRoundingAmount || '0'}</cbc:PayableRoundingAmount>\n <cbc:PayableAmount currencyID=\"MYR\">${total.payableAmount}</cbc:PayableAmount>\n </cac:LegalMonetaryTotal>`\n}\n\n/**\n * Generates invoice line XML section (updated to match working example)\n */\nconst generateInvoiceLineXML = (\n item: InvoiceV1_1['invoiceLineItems'][0],\n lineNumber: number,\n): string => {\n return `\n <cac:InvoiceLine>\n <cbc:ID>${lineNumber}</cbc:ID>\n ${item.quantity && item.measurement ? `<cbc:InvoicedQuantity unitCode=\"${item.measurement}\">${item.quantity}</cbc:InvoicedQuantity>` : ''}\n <cbc:LineExtensionAmount currencyID=\"MYR\">${item.totalTaxableAmountPerLine}</cbc:LineExtensionAmount>\n ${\n item.discountAmount\n ? `\n <cac:AllowanceCharge>\n <cbc:ChargeIndicator>false</cbc:ChargeIndicator>\n <cbc:AllowanceChargeReason>Discount</cbc:AllowanceChargeReason>\n ${item.discountRate ? `<cbc:MultiplierFactorNumeric>${item.discountRate / 100}</cbc:MultiplierFactorNumeric>` : ''}\n <cbc:Amount currencyID=\"MYR\">${item.discountAmount}</cbc:Amount>\n </cac:AllowanceCharge>`\n : ''\n }\n <cac:TaxTotal>\n <cbc:TaxAmount currencyID=\"MYR\">${item.taxAmount}</cbc:TaxAmount>\n <cac:TaxSubtotal>\n <cbc:TaxableAmount currencyID=\"MYR\">${item.totalTaxableAmountPerLine}</cbc:TaxableAmount>\n <cbc:TaxAmount currencyID=\"MYR\">${item.taxAmount}</cbc:TaxAmount>\n ${item.taxRate ? `<cbc:Percent>${item.taxRate.toFixed(2)}</cbc:Percent>` : ''}\n <cac:TaxCategory>\n <cbc:ID>${item.taxType}</cbc:ID>\n <cac:TaxScheme>\n <cbc:ID schemeID=\"UN/ECE 5153\" schemeAgencyID=\"6\">OTH</cbc:ID>\n </cac:TaxScheme>\n </cac:TaxCategory>\n </cac:TaxSubtotal>\n </cac:TaxTotal>\n <cac:Item>\n <cbc:Description>${escapeXml(item.itemDescription)}</cbc:Description>\n ${\n item.countryOfOrigin\n ? `\n <cac:OriginCountry>\n <cbc:IdentificationCode>${item.countryOfOrigin}</cbc:IdentificationCode>\n </cac:OriginCountry>`\n : ''\n }\n <cac:CommodityClassification>\n <cbc:ItemClassificationCode listID=\"PTC\">001</cbc:ItemClassificationCode>\n </cac:CommodityClassification>\n <cac:CommodityClassification>\n <cbc:ItemClassificationCode listID=\"CLASS\">${item.itemClassificationCode}</cbc:ItemClassificationCode>\n </cac:CommodityClassification>\n </cac:Item>\n <cac:Price>\n <cbc:PriceAmount currencyID=\"MYR\">${item.unitPrice}</cbc:PriceAmount>\n </cac:Price>\n <cac:ItemPriceExtension>\n <cbc:Amount currencyID=\"MYR\">${item.totalTaxableAmountPerLine}</cbc:Amount>\n </cac:ItemPriceExtension>\n </cac:InvoiceLine>`\n}\n\n/**\n * Generates a document hash for submission (separate from signature DocDigest)\n * This is the SHA256 hash required by the Submit Documents API\n *\n * OFFICIAL MyInvois FAQ: \"The XML/JSON document is hashed using SHA-256 to create the documentHash value\"\n * CRITICAL: Must hash the SAME document that gets encoded for submission (minified XML)\n * Source: https://sdk.myinvois.hasil.gov.my/faq/#how-to-hash-the-documenthash-value-and-encode-the-document-value\n */\nexport const generateDocumentHash = (xmlDocument: string): string => {\n try {\n console.log(\n '🔧 Generating document hash using official MyInvois method (minified XML SHA256)',\n )\n\n // CRITICAL: Use the same minified XML that encodeDocumentForSubmission uses\n const minifiedXML = minifyXML(xmlDocument)\n\n const crypto = require('crypto')\n const documentHash = crypto\n .createHash('sha256')\n .update(minifiedXML, 'utf8')\n .digest('hex')\n\n console.log('📊 Original XML length:', xmlDocument.length, 'characters')\n console.log('📊 Minified XML length:', minifiedXML.length, 'characters')\n console.log('📊 Document hash (SHA256 hex):', documentHash)\n console.log(\n '📊 Hash length:',\n documentHash.length,\n 'characters (should be 64)',\n )\n\n // Validate hash length\n if (documentHash.length !== 64) {\n console.error(\n `❌ Invalid hash length: ${documentHash.length}, expected 64 characters`,\n )\n throw new Error(`Invalid SHA256 hash length: ${documentHash.length}`)\n }\n\n return documentHash\n } catch (error) {\n console.error('❌ Error generating document hash:', error)\n throw new Error(`Failed to generate document hash: ${error}`)\n }\n}\n\n/**\n * Encodes the XML document to base64 for submission\n * Includes minification as recommended by MyInvois documentation\n */\nexport const encodeDocumentForSubmission = (xmlDocument: string): string => {\n const minifiedXML = minifyXML(xmlDocument)\n return Buffer.from(minifiedXML, 'utf8').toString('base64')\n}\n\n/**\n * Utility functions for extracting certificate information\n */\n\n/**\n * Extracts certificate information from a PEM certificate file\n * @param certificatePem - The certificate in PEM format\n * @returns Object containing issuer name and serial number\n */\nexport const extractCertificateInfo = (\n certificatePem: string,\n): {\n issuerName: string\n serialNumber: string\n} => {\n try {\n // Create X509Certificate object (Node.js 15.6.0+)\n const cert = new crypto.X509Certificate(certificatePem)\n\n // Extract issuer name (in the format required by MyInvois)\n const issuerName = cert.issuer\n\n // Extract serial number and convert from hex to decimal as required by MyInvois\n const serialNumberHex = cert.serialNumber\n console.log('📋 Certificate serial number (hex):', serialNumberHex)\n\n // Convert hex to decimal string (MyInvois requires integer format)\n const serialNumberDecimal = BigInt('0x' + serialNumberHex).toString()\n console.log('📋 Certificate serial number (decimal):', serialNumberDecimal)\n\n return {\n issuerName,\n serialNumber: serialNumberDecimal,\n }\n } catch (error) {\n throw new Error(`Failed to extract certificate info: ${error}`)\n }\n}\n\n/**\n * Validates that certificate and private key match\n * @param certificatePem - The certificate in PEM format\n * @param privateKeyPem - The private key in PEM format\n * @returns boolean indicating if they match\n */\nexport const validateKeyPair = (\n certificatePem: string,\n privateKeyPem: string,\n): boolean => {\n try {\n // Extract public key from certificate\n const cert = new crypto.X509Certificate(certificatePem)\n const publicKey = cert.publicKey\n\n // Create a test signature with private key\n const testData = 'test-validation-data'\n const signer = crypto.createSign('RSA-SHA256')\n signer.update(testData)\n const signature = signer.sign(privateKeyPem)\n\n // Verify signature with public key\n const verifier = crypto.createVerify('RSA-SHA256')\n verifier.update(testData)\n return verifier.verify(publicKey, signature)\n } catch (error) {\n console.error('Key pair validation failed:', error)\n return false\n }\n}\n\n/**\n * Helper function to create SigningCredentials from certificate and private key files\n * @param certificatePem - The certificate in PEM format\n * @param privateKeyPem - The private key in PEM format\n * @returns Complete SigningCredentials object\n */\nexport function createSigningCredentials(\n certificatePem: string,\n privateKeyPem: string,\n): SigningCredentials {\n // Validate that the key pair matches\n if (!validateKeyPair(certificatePem, privateKeyPem)) {\n throw new Error('Certificate and private key do not match')\n }\n\n // Extract certificate information\n const { issuerName, serialNumber } = extractCertificateInfo(certificatePem)\n\n return {\n privateKeyPem,\n certificatePem,\n issuerName,\n serialNumber,\n }\n}\n\n/**\n * Generates the UBL XML template with complete signature structure\n */\nexport function generateUBLXMLTemplate(invoiceInfo: InvoiceV1_1): string {\n const { supplier, buyer, invoiceLineItems, legalMonetaryTotal, taxTotal } =\n invoiceInfo\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\" \n xmlns:cac=\"urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2\" \n xmlns:cbc=\"urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2\"\n xmlns:ext=\"urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2\">\n <UBLExtensions xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2\">\n <UBLExtension>\n <ExtensionURI>urn:oasis:names:specification:ubl:dsig:enveloped:xades</ExtensionURI>\n <ExtensionContent>\n <sig:UBLDocumentSignatures xmlns:sig=\"urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2\" \n xmlns:sac=\"urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2\" \n xmlns:sbc=\"urn:oasis:names:specification:ubl:schema:xsd:SignatureBasicComponents-2\">\n <sac:SignatureInformation>\n <cbc:ID>urn:oasis:names:specification:ubl:signature:1</cbc:ID>\n <sbc:ReferencedSignatureID>urn:oasis:names:specification:ubl:signature:Invoice</sbc:ReferencedSignatureID>\n <ds:Signature xmlns:ds=\"http://www.w3.org/2000/09/xmldsig#\" Id=\"signature\">\n <ds:SignedInfo>\n <ds:CanonicalizationMethod Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/>\n <ds:SignatureMethod Algorithm=\"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256\"/>\n <ds:Reference Id=\"id-doc-signed-data\" URI=\"\">\n <ds:Transforms>\n <ds:Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xpath-19991116\">\n <ds:XPath>not(//ancestor-or-self::ext:UBLExtensions)</ds:XPath>\n </ds:Transform>\n <ds:Transform Algorithm=\"http://www.w3.org/TR/1999/REC-xpath-19991116\">\n <ds:XPath>not(//ancestor-or-self::cac:Signature)</ds:XPath>\n </ds:Transform>\n <ds:Transform Algorithm=\"http://www.w3.org/TR/2001/REC-xml-c14n-20010315\"/>\n </ds:Transforms>\n <ds:DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#sha256\"/>\n <ds:DigestValue></ds:DigestValue>\n </ds:Reference>\n <ds:Reference Type=\"http://www.w3.org/2000/09/xmldsig#SignatureProperties\" URI=\"#id-xades-signed-props\">\n <ds:DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#sha256\"/>\n <ds:DigestValue></ds:DigestValue>\n </ds:Reference>\n </ds:SignedInfo>\n <ds:SignatureValue></ds:SignatureValue>\n <ds:KeyInfo>\n <ds:X509Data>\n <ds:X509Certificate></ds:X509Certificate>\n </ds:X509Data>\n </ds:KeyInfo>\n <ds:Object>\n <xades:QualifyingProperties xmlns:xades=\"http://uri.etsi.org/01903/v1.3.2#\" Target=\"signature\">\n <xades:SignedProperties Id=\"id-xades-signed-props\">\n <xades:SignedSignatureProperties>\n <xades:SigningTime></xades:SigningTime>\n <xades:SigningCertificate>\n <xades:Cert>\n <xades:CertDigest>\n <ds:DigestMethod Algorithm=\"http://www.w3.org/2001/04/xmlenc#sha256\"/>\n <ds:DigestValue></ds:DigestValue>\n </xades:CertDigest>\n <xades:IssuerSerial>\n <ds:X509IssuerName></ds:X509IssuerName>\n <ds:X509SerialNumber></ds:X509SerialNumber>\n </xades:IssuerSerial>\n </xades:Cert>\n </xades:SigningCertificate>\n </xades:SignedSignatureProperties>\n </xades:SignedProperties>\n </xades:QualifyingProperties>\n </ds:Object>\n </ds:Signature>\n </sac:SignatureInformation>\n </sig:UBLDocumentSignatures>\n </ExtensionContent>\n </UBLExtension>\n </UBLExtensions>\n <cbc:ID>${escapeXml(invoiceInfo.eInvoiceCodeOrNumber)}</cbc:ID>\n <cbc:IssueDate>${invoiceInfo.eInvoiceDate}</cbc:IssueDate>\n <cbc:IssueTime>${invoiceInfo.eInvoiceTime}</cbc:IssueTime>\n <cbc:InvoiceTypeCode listVersionID=\"1.1\">${invoiceInfo.eInvoiceTypeCode}</cbc:InvoiceTypeCode>\n <cbc:DocumentCurrencyCode>${invoiceInfo.invoiceCurrencyCode}</cbc:DocumentCurrencyCode>\n <cbc:TaxCurrencyCode>${invoiceInfo.invoiceCurrencyCode}</cbc:TaxCurrencyCode>\n ${\n invoiceInfo.billingPeriodStartDate && invoiceInfo.billingPeriodEndDate\n ? `\n <cac:InvoicePeriod>\n <cbc:StartDate>${invoiceInfo.billingPeriodStartDate}</cbc:StartDate>\n <cbc:EndDate>${invoiceInfo.billingPeriodEndDate}</cbc:EndDate>\n ${invoiceInfo.frequencyOfBilling ? `<cbc:Description>${escapeXml(invoiceInfo.frequencyOfBilling)}</cbc:Description>` : ''}\n </cac:InvoicePeriod>`\n : ''\n }\n <cac:Signature>\n <cbc:ID>urn:oasis:names:specification:ubl:signature:Invoice</cbc:ID>\n <cbc:SignatureMethod>urn:oasis:names:specification:ubl:dsig:enveloped:xades</cbc:SignatureMethod>\n </cac:Signature>\n ${generateSupplierXML(supplier)}\n ${generateBuyerXML(buyer)}\n ${invoiceInfo.delivery ? generateDeliveryXML(invoiceInfo.delivery) : ''}\n ${invoiceInfo.paymentMeans ? invoiceInfo.paymentMeans.map(pm => generatePaymentMeansXML(pm)).join('') : ''}\n ${invoiceInfo.allowanceCharges ? invoiceInfo.allowanceCharges.map(ac => generateAllowanceChargeXML(ac)).join('') : ''}\n ${generateTaxTotalXML(taxTotal)}\n ${generateLegalMonetaryTotalXML(legalMonetaryTotal)}\n ${invoiceLineItems.map((item, index) => generateInvoiceLineXML(item, index + 1)).join('')}\n</Invoice>`\n}\n\n/**\n * Generates a signed UBL XML invoice document following MyInvois specifications.\n *\n * @param invoiceInfo - The invoice data structure\n * @param signingCredentials - Digital signature credentials\n * @returns Promise<string> - The complete signed XML document ready for submission\n */\nexport const generateSignedInvoiceXML = async (\n invoiceInfo: InvoiceV1_1,\n signingCredentials: SigningCredentials,\n): Promise<string> => {\n // Step 1: Generate the UBL XML template with signature structure\n const xmlTemplate = generateUBLXMLTemplate(invoiceInfo)\n\n // Parse the XML template\n const parser = new DOMParserImpl()\n const templateDoc = parser.parseFromString(xmlTemplate, 'application/xml')\n\n // Step 2: Apply transformations to get the document for hashing\n const transformedXml = transformXmlInvoice(xmlTemplate)\n const transformedDoc = parser.parseFromString(\n transformedXml,\n 'application/xml',\n )\n\n // Step 3: Canonicalize and generate document hash (DocDigest) - try C14N 1.1 first\n const docDigest =\n await canonicalizeAndHashDocumentWithC14N11Fallback(transformedDoc)\n\n // Step 4: Sign the document digest (Sig)\n const signature = signDocumentDigest(\n docDigest,\n signingCredentials.privateKeyPem,\n )\n\n // Step 5: Generate certificate hash (CertDigest)\n const certDigest = hashCertificate(signingCredentials.certificatePem)\n\n // Step 6: Populate signed properties\n const signedPropertiesData: SignedPropertiesData = {\n certDigest,\n signingTime: new Date().toISOString().replace(/\\.\\d{3}Z$/, 'Z'), // ISO format without milliseconds\n issuerName: signingCredentials.issuerName,\n serialNumber: signingCredentials.serialNumber,\n }\n\n populateSignedProperties(templateDoc, signedPropertiesData)\n\n // Step 7: Generate signed properties hash (PropsDigest) - try C14N 1.1 first\n const propsDigest = await hashSignedPropertiesWithC14N11Fallback(templateDoc)\n\n // Step 8: Populate final document\n const finalData: FinalDocumentData = {\n signatureValue: signature,\n propsDigest,\n docDigest,\n certificatePem: signingCredentials.certificatePem,\n }\n\n populateFinalDocument(templateDoc, finalData)\n\n // Serialize the final signed document\n const serializer = new XMLSerializerImpl()\n return serializer.serializeToString(templateDoc)\n}\n\n/**\n * Generates a document hash for submission using the same method as signature creation\n * This ensures consistency with MyInvois validation requirements\n */\nexport const generateDocumentHashForSubmission = async (\n xmlDocument: string,\n): Promise<string> => {\n try {\n console.log(\n '🔧 Generating document hash using signature-compatible method...',\n )\n\n // Parse the signed XML\n const parser = new DOMParserImpl()\n\n // Apply the same transformations as used in signature creation\n const transformedXml = transformXmlInvoice(xmlDocument)\n const transformedDoc = parser.parseFromString(\n transformedXml,\n 'application/xml',\n )\n\n // Use the same canonicalization as signature creation\n const base64Digest =\n await canonicalizeAndHashDocumentWithC14N11Fallback(transformedDoc)\n const hexDigest = Buffer.from(base64Digest, 'base64').toString('hex')\n console.log('📊 Canonicalized document hash (base64):', base64Digest)\n console.log('📊 Canonicalized document hash (hex):', hexDigest)\n console.log('📊 Hash length:', hexDigest.length, 'characters')\n return hexDigest\n } catch (error) {\n console.error('Error generating canonicalized hash, using fallback:', error)\n return generateDocumentHash(xmlDocument)\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { MSIC_0X_CODE } from "./0X-Yw7mZEro.cjs";
2
+ import { MSIC_1X_CODE } from "./1X-D_aUVsuM.cjs";
3
+ import { MSIC_2X_CODE } from "./2X-hClUyw26.cjs";
4
+ import { MSIC_3X_CODE } from "./3X-CLMESDvz.cjs";
5
+ import { MSIC_4X_CODE } from "./4X-CvScPJTf.cjs";
6
+ import { MSIC_5X_CODE } from "./5X-CkLu7Vyd.cjs";
7
+ import { MSIC_6X_CODE } from "./6X-Mf32k1d0.cjs";
8
+ import { MSIC_7X_CODE } from "./7X-DoCUcp-J.cjs";
9
+ import { MSIC_8X_CODE } from "./8X-Dr9RunRw.cjs";
10
+ import { MSIC_9X_CODE } from "./9X-BaoZtjWF.cjs";
11
+
12
+ //#region src/types/msic-codes.d.ts
13
+
14
+ /**
15
+ * Represents the allowed 5-digit Malaysia Standard Industrial Classification (MSIC) codes.
16
+ * Based on the documentation: https://sdk.myinvois.hasil.gov.my/codes/msic-codes/
17
+ * Interface representing an MSIC code entry.
18
+ * Contains the 5-digit code and its description.
19
+ */
20
+ interface MSICCode {
21
+ code: MSIC_0X_CODE | MSIC_1X_CODE | MSIC_2X_CODE | MSIC_3X_CODE | MSIC_4X_CODE | MSIC_5X_CODE | MSIC_6X_CODE | MSIC_7X_CODE | MSIC_8X_CODE | MSIC_9X_CODE;
22
+ description: string;
23
+ }
24
+ //#endregion
25
+ export { MSICCode };
26
+ //# sourceMappingURL=msic-codes-B_1W6lZF.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"msic-codes-B_1W6lZF.d.cts","names":["MSIC_0X_CODE","MSIC_1X_CODE","MSIC_2X_CODE","MSIC_3X_CODE","MSIC_4X_CODE","MSIC_5X_CODE","MSIC_6X_CODE","MSIC_7X_CODE","MSIC_8X_CODE","MSIC_9X_CODE","MSICCode"],"sources":["../src/types/msic-codes.d.ts"],"sourcesContent":["import type { MSIC_0X_CODE } from './msic/0X.d.ts'\nimport type { MSIC_1X_CODE } from './msic/1X.d.ts'\nimport type { MSIC_2X_CODE } from './msic/2X.d.ts'\nimport type { MSIC_3X_CODE } from './msic/3X.d.ts'\nimport type { MSIC_4X_CODE } from './msic/4X.d.ts'\nimport type { MSIC_5X_CODE } from './msic/5X.d.ts'\nimport type { MSIC_6X_CODE } from './msic/6X.d.ts'\nimport type { MSIC_7X_CODE } from './msic/7X.d.ts'\nimport type { MSIC_8X_CODE } from './msic/8X.d.ts'\nimport type { MSIC_9X_CODE } from './msic/9X.d.ts'\n\n/**\n * Represents the allowed 5-digit Malaysia Standard Industrial Classification (MSIC) codes.\n * Based on the documentation: https://sdk.myinvois.hasil.gov.my/codes/msic-codes/\n * Interface representing an MSIC code entry.\n * Contains the 5-digit code and its description.\n */\nexport interface MSICCode {\n code:\n | MSIC_0X_CODE\n | MSIC_1X_CODE\n | MSIC_2X_CODE\n | MSIC_3X_CODE\n | MSIC_4X_CODE\n | MSIC_5X_CODE\n | MSIC_6X_CODE\n | MSIC_7X_CODE\n | MSIC_8X_CODE\n | MSIC_9X_CODE\n description: string\n}\n"],"mappings":";;;;;;;;;;;;;;AAiBA;;;;;AAKMG,UALWO,QAAAA,CAKXP;EAAY,IAAA,EAHZH,YAKAK,GAJAJ,YAKAK,GAJAJ,YAKAK,GAJAJ,YAKAK,GAJAJ,YAKAK,GAJAJ,YAIY,GAHZC,eACAC,eACAC,eACAC"}