@ripwords/myinvois-client 0.0.10 → 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 (557) 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 -103
  233. package/dist/index.d.ts +60 -5666
  234. package/dist/index.js +11 -99
  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/platformLogin.ts +6 -1
  528. package/src/types/documents/invoice-1_1.d.ts +90 -0
  529. package/src/types/msic-codes.d.ts +1 -7
  530. package/src/utils/MyInvoisClient.ts +421 -8
  531. package/src/utils/base64.ts +7 -0
  532. package/src/utils/debug/debug-document-hash.ts +249 -0
  533. package/src/utils/debug/debug-invoice-submission.ts +355 -0
  534. package/src/utils/getBaseUrl.ts +1 -1
  535. package/src/utils/invoice1-1.ts +671 -0
  536. package/src/utils/signature/canonicalize.ts +104 -0
  537. package/src/utils/signature/hashCert.ts +115 -0
  538. package/src/utils/signature/hashSignedProperties.ts +155 -0
  539. package/src/utils/signature/populateFinalDocument.ts +187 -0
  540. package/src/utils/signature/populateSignedProperties.ts +87 -0
  541. package/src/utils/signature/sign.ts +51 -0
  542. package/src/utils/signature/transform.ts +99 -0
  543. package/test/MyInvoiClientWithRealData.test.ts +2 -1
  544. package/test/MyInvoisClient.test.ts +16 -8
  545. package/test/base64.test.ts +43 -0
  546. package/test/canonicalize.test.ts +110 -0
  547. package/test/hashCert.test.ts +95 -0
  548. package/test/hashSignedProperties.test.ts +140 -0
  549. package/test/populateFinalDocument.test.ts +218 -0
  550. package/test/populateSignedProperties.test.ts +155 -0
  551. package/test/sign.test.ts +70 -0
  552. package/test/signAndSubmitInvoice.test.ts +915 -0
  553. package/test/transform.test.ts +158 -0
  554. package/tsconfig.json +7 -1
  555. package/tsdown.config.ts +31 -0
  556. package/dist/index.cjs.map +0 -1
  557. package/rolldown.config.ts +0 -26
@@ -0,0 +1,671 @@
1
+ import * as crypto from 'crypto'
2
+ import type { InvoiceV1_1 } from '../types/documents/invoice-1_1.d.ts'
3
+ import { DOMParserImpl, XMLSerializerImpl } from 'xmldom-ts'
4
+ import { canonicalizeAndHashDocumentWithC14N11Fallback } from './signature/canonicalize'
5
+ import { hashCertificate } from './signature/hashCert'
6
+ import { hashSignedPropertiesWithC14N11Fallback } from './signature/hashSignedProperties'
7
+ import {
8
+ populateFinalDocument,
9
+ type FinalDocumentData,
10
+ } from './signature/populateFinalDocument'
11
+ import {
12
+ populateSignedProperties,
13
+ type SignedPropertiesData,
14
+ } from './signature/populateSignedProperties'
15
+ import { signDocumentDigest } from './signature/sign'
16
+ import { transformXmlInvoice } from './signature/transform'
17
+ import type { SigningCredentials } from '../types/documents/invoice-1_1.d.ts'
18
+
19
+ /**
20
+ * Escapes XML special characters
21
+ */
22
+ const escapeXml = (text: string): string => {
23
+ return text
24
+ .replace(/&/g, '&')
25
+ .replace(/</g, '&lt;')
26
+ .replace(/>/g, '&gt;')
27
+ .replace(/"/g, '&quot;')
28
+ .replace(/'/g, '&apos;')
29
+ }
30
+
31
+ /**
32
+ * Minifies XML by removing unnecessary whitespace and line breaks
33
+ * As recommended by MyInvois documentation for Submit Documents API
34
+ */
35
+ const minifyXML = (xmlString: string): string => {
36
+ return xmlString
37
+ .replace(/>\s+</g, '><') // Remove whitespace between tags
38
+ .replace(/\s+/g, ' ') // Replace multiple spaces with single space
39
+ .replace(/>\s/g, '>') // Remove space after opening tags
40
+ .replace(/\s</g, '<') // Remove space before closing tags
41
+ .trim() // Remove leading/trailing whitespace
42
+ }
43
+
44
+ /**
45
+ * Generates supplier XML section
46
+ */
47
+ const generateSupplierXML = (supplier: InvoiceV1_1['supplier']): string => {
48
+ return `
49
+ <cac:AccountingSupplierParty>
50
+ <cac:Party>
51
+ ${supplier.industryClassificationCode ? `<cbc:IndustryClassificationCode>${supplier.industryClassificationCode}</cbc:IndustryClassificationCode>` : ''}
52
+ <cac:PartyIdentification>
53
+ <cbc:ID schemeID="TIN">${escapeXml(supplier.tin)}</cbc:ID>
54
+ </cac:PartyIdentification>
55
+ <cac:PartyIdentification>
56
+ <cbc:ID schemeID="${supplier.registrationType}">${escapeXml(supplier.registrationNumber)}</cbc:ID>
57
+ </cac:PartyIdentification>
58
+ <cac:PartyIdentification>
59
+ <cbc:ID schemeID="SST">${escapeXml(supplier.sstRegistrationNumber || 'NA')}</cbc:ID>
60
+ </cac:PartyIdentification>
61
+ <cac:PartyIdentification>
62
+ <cbc:ID schemeID="TTX">NA</cbc:ID>
63
+ </cac:PartyIdentification>
64
+ ${generatePostalAddressXML(supplier.address)}
65
+ <cac:PartyLegalEntity>
66
+ <cbc:RegistrationName>${escapeXml(supplier.name)}</cbc:RegistrationName>
67
+ </cac:PartyLegalEntity>
68
+ <cac:Contact>
69
+ <cbc:Telephone>${escapeXml(supplier.contactNumber)}</cbc:Telephone>
70
+ <cbc:ElectronicMail>${escapeXml(supplier.email || 'NA')}</cbc:ElectronicMail>
71
+ </cac:Contact>
72
+ </cac:Party>
73
+ </cac:AccountingSupplierParty>`
74
+ }
75
+
76
+ /**
77
+ * Generates buyer XML section
78
+ */
79
+ const generateBuyerXML = (buyer: InvoiceV1_1['buyer']): string => {
80
+ return `
81
+ <cac:AccountingCustomerParty>
82
+ <cac:Party>
83
+ <cac:PartyIdentification>
84
+ <cbc:ID schemeID="TIN">${escapeXml(buyer.tin)}</cbc:ID>
85
+ </cac:PartyIdentification>
86
+ <cac:PartyIdentification>
87
+ <cbc:ID schemeID="BRN">${escapeXml(buyer.registrationNumber || 'NA')}</cbc:ID>
88
+ </cac:PartyIdentification>
89
+ <cac:PartyIdentification>
90
+ <cbc:ID schemeID="SST">${escapeXml(buyer.sstRegistrationNumber || 'NA')}</cbc:ID>
91
+ </cac:PartyIdentification>
92
+ <cac:PartyIdentification>
93
+ <cbc:ID schemeID="TTX">NA</cbc:ID>
94
+ </cac:PartyIdentification>
95
+ ${generatePostalAddressXML(buyer.address)}
96
+ <cac:PartyLegalEntity>
97
+ <cbc:RegistrationName>${escapeXml(buyer.name)}</cbc:RegistrationName>
98
+ </cac:PartyLegalEntity>
99
+ <cac:Contact>
100
+ <cbc:Telephone>${escapeXml(buyer.contactNumber || 'NA')}</cbc:Telephone>
101
+ <cbc:ElectronicMail>${escapeXml(buyer.email || 'NA')}</cbc:ElectronicMail>
102
+ </cac:Contact>
103
+ </cac:Party>
104
+ </cac:AccountingCustomerParty>`
105
+ }
106
+
107
+ /**
108
+ * Generates postal address XML section (updated to match working example)
109
+ */
110
+ const generatePostalAddressXML = (
111
+ address: InvoiceV1_1['supplier']['address'],
112
+ ): string => {
113
+ return `
114
+ <cac:PostalAddress>
115
+ <cbc:CityName>${escapeXml(address.cityName || ' ')}</cbc:CityName>
116
+ <cbc:PostalZone>${escapeXml(address.postalZone || ' ')}</cbc:PostalZone>
117
+ <cbc:CountrySubentityCode>${escapeXml(address.state || ' ')}</cbc:CountrySubentityCode>
118
+ <cac:AddressLine>
119
+ <cbc:Line>${escapeXml(address.addressLine0 || 'NA')}</cbc:Line>
120
+ </cac:AddressLine>
121
+ <cac:AddressLine>
122
+ <cbc:Line>${escapeXml(address.addressLine1 || ' ')}</cbc:Line>
123
+ </cac:AddressLine>
124
+ <cac:AddressLine>
125
+ <cbc:Line>${escapeXml(address.addressLine2 || ' ')}</cbc:Line>
126
+ </cac:AddressLine>
127
+ <cac:Country>
128
+ <cbc:IdentificationCode listID="ISO3166-1" listAgencyID="6">${escapeXml(address.country || ' ')}</cbc:IdentificationCode>
129
+ </cac:Country>
130
+ </cac:PostalAddress>`
131
+ }
132
+
133
+ /**
134
+ * Generates delivery XML section
135
+ */
136
+ const generateDeliveryXML = (
137
+ delivery: NonNullable<InvoiceV1_1['delivery']>,
138
+ ): string => {
139
+ return `
140
+ <cac:Delivery>
141
+ ${delivery.actualDeliveryDate ? `<cbc:ActualDeliveryDate>${delivery.actualDeliveryDate}</cbc:ActualDeliveryDate>` : ''}
142
+ ${
143
+ delivery.deliveryParty
144
+ ? `
145
+ <cac:DeliveryParty>
146
+ ${
147
+ delivery.deliveryParty.name
148
+ ? `
149
+ <cac:PartyLegalEntity>
150
+ <cbc:RegistrationName>${escapeXml(delivery.deliveryParty.name)}</cbc:RegistrationName>
151
+ </cac:PartyLegalEntity>`
152
+ : ''
153
+ }
154
+ </cac:DeliveryParty>`
155
+ : ''
156
+ }
157
+ ${delivery.deliveryLocation ? generatePostalAddressXML(delivery.deliveryLocation) : ''}
158
+ </cac:Delivery>`
159
+ }
160
+
161
+ /**
162
+ * Generates payment means XML section
163
+ */
164
+ const generatePaymentMeansXML = (
165
+ paymentMeans: NonNullable<InvoiceV1_1['paymentMeans']>[0],
166
+ ): string => {
167
+ return `
168
+ <cac:PaymentMeans>
169
+ <cbc:PaymentMeansCode>${paymentMeans.paymentMeansCode}</cbc:PaymentMeansCode>
170
+ ${paymentMeans.paymentDueDate ? `<cbc:PaymentDueDate>${paymentMeans.paymentDueDate}</cbc:PaymentDueDate>` : ''}
171
+ ${
172
+ paymentMeans.payeeFinancialAccountID
173
+ ? `
174
+ <cac:PayeeFinancialAccount>
175
+ <cbc:ID>${escapeXml(paymentMeans.payeeFinancialAccountID)}</cbc:ID>
176
+ </cac:PayeeFinancialAccount>`
177
+ : ''
178
+ }
179
+ </cac:PaymentMeans>`
180
+ }
181
+
182
+ /**
183
+ * Generates allowance/charge XML section
184
+ */
185
+ const generateAllowanceChargeXML = (
186
+ allowanceCharge: NonNullable<InvoiceV1_1['allowanceCharges']>[0],
187
+ ): string => {
188
+ return `
189
+ <cac:AllowanceCharge>
190
+ <cbc:ChargeIndicator>${allowanceCharge.chargeIndicator}</cbc:ChargeIndicator>
191
+ <cbc:AllowanceChargeReason>${escapeXml(allowanceCharge.reason)}</cbc:AllowanceChargeReason>
192
+ ${allowanceCharge.multiplierFactorNumeric ? `<cbc:MultiplierFactorNumeric>${allowanceCharge.multiplierFactorNumeric}</cbc:MultiplierFactorNumeric>` : ''}
193
+ <cbc:Amount currencyID="MYR">${allowanceCharge.amount}</cbc:Amount>
194
+ ${allowanceCharge.baseAmount ? `<cbc:BaseAmount currencyID="MYR">${allowanceCharge.baseAmount}</cbc:BaseAmount>` : ''}
195
+ </cac:AllowanceCharge>`
196
+ }
197
+
198
+ /**
199
+ * Generates tax total XML section
200
+ */
201
+ const generateTaxTotalXML = (taxTotal: InvoiceV1_1['taxTotal']): string => {
202
+ return `
203
+ <cac:TaxTotal>
204
+ <cbc:TaxAmount currencyID="MYR">${taxTotal.taxAmount}</cbc:TaxAmount>
205
+ ${
206
+ taxTotal.taxSubtotals
207
+ ? taxTotal.taxSubtotals
208
+ .map(
209
+ subtotal => `
210
+ <cac:TaxSubtotal>
211
+ <cbc:TaxableAmount currencyID="MYR">${subtotal.taxableAmount}</cbc:TaxableAmount>
212
+ <cbc:TaxAmount currencyID="MYR">${subtotal.taxAmount}</cbc:TaxAmount>
213
+ ${subtotal.taxCategory.taxRate ? `<cbc:Percent>${subtotal.taxCategory.taxRate}</cbc:Percent>` : ''}
214
+ <cac:TaxCategory>
215
+ <cbc:ID>${subtotal.taxCategory.taxTypeCode}</cbc:ID>
216
+ ${subtotal.taxCategory.taxExemptionReason ? `<cbc:TaxExemptionReason>${escapeXml(subtotal.taxCategory.taxExemptionReason)}</cbc:TaxExemptionReason>` : ''}
217
+ <cac:TaxScheme>
218
+ <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">OTH</cbc:ID>
219
+ </cac:TaxScheme>
220
+ </cac:TaxCategory>
221
+ </cac:TaxSubtotal>`,
222
+ )
223
+ .join('')
224
+ : ''
225
+ }
226
+ </cac:TaxTotal>`
227
+ }
228
+
229
+ /**
230
+ * Generates legal monetary total XML section (updated to match working example)
231
+ */
232
+ const generateLegalMonetaryTotalXML = (
233
+ total: InvoiceV1_1['legalMonetaryTotal'],
234
+ ): string => {
235
+ return `
236
+ <cac:LegalMonetaryTotal>
237
+ <cbc:LineExtensionAmount currencyID="MYR">${total.taxExclusiveAmount}</cbc:LineExtensionAmount>
238
+ <cbc:TaxExclusiveAmount currencyID="MYR">${total.taxExclusiveAmount}</cbc:TaxExclusiveAmount>
239
+ <cbc:TaxInclusiveAmount currencyID="MYR">${total.taxInclusiveAmount}</cbc:TaxInclusiveAmount>
240
+ <cbc:AllowanceTotalAmount currencyID="MYR">${total.allowanceTotalAmount || '0'}</cbc:AllowanceTotalAmount>
241
+ <cbc:ChargeTotalAmount currencyID="MYR">${total.chargeTotalAmount || '0'}</cbc:ChargeTotalAmount>
242
+ ${total.prepaidAmount ? `<cbc:PrepaidAmount currencyID="MYR">${total.prepaidAmount}</cbc:PrepaidAmount>` : ''}
243
+ <cbc:PayableRoundingAmount currencyID="MYR">${total.payableRoundingAmount || '0'}</cbc:PayableRoundingAmount>
244
+ <cbc:PayableAmount currencyID="MYR">${total.payableAmount}</cbc:PayableAmount>
245
+ </cac:LegalMonetaryTotal>`
246
+ }
247
+
248
+ /**
249
+ * Generates invoice line XML section (updated to match working example)
250
+ */
251
+ const generateInvoiceLineXML = (
252
+ item: InvoiceV1_1['invoiceLineItems'][0],
253
+ lineNumber: number,
254
+ ): string => {
255
+ return `
256
+ <cac:InvoiceLine>
257
+ <cbc:ID>${lineNumber}</cbc:ID>
258
+ ${item.quantity && item.measurement ? `<cbc:InvoicedQuantity unitCode="${item.measurement}">${item.quantity}</cbc:InvoicedQuantity>` : ''}
259
+ <cbc:LineExtensionAmount currencyID="MYR">${item.totalTaxableAmountPerLine}</cbc:LineExtensionAmount>
260
+ ${
261
+ item.discountAmount
262
+ ? `
263
+ <cac:AllowanceCharge>
264
+ <cbc:ChargeIndicator>false</cbc:ChargeIndicator>
265
+ <cbc:AllowanceChargeReason>Discount</cbc:AllowanceChargeReason>
266
+ ${item.discountRate ? `<cbc:MultiplierFactorNumeric>${item.discountRate / 100}</cbc:MultiplierFactorNumeric>` : ''}
267
+ <cbc:Amount currencyID="MYR">${item.discountAmount}</cbc:Amount>
268
+ </cac:AllowanceCharge>`
269
+ : ''
270
+ }
271
+ <cac:TaxTotal>
272
+ <cbc:TaxAmount currencyID="MYR">${item.taxAmount}</cbc:TaxAmount>
273
+ <cac:TaxSubtotal>
274
+ <cbc:TaxableAmount currencyID="MYR">${item.totalTaxableAmountPerLine}</cbc:TaxableAmount>
275
+ <cbc:TaxAmount currencyID="MYR">${item.taxAmount}</cbc:TaxAmount>
276
+ ${item.taxRate ? `<cbc:Percent>${item.taxRate.toFixed(2)}</cbc:Percent>` : ''}
277
+ <cac:TaxCategory>
278
+ <cbc:ID>${item.taxType}</cbc:ID>
279
+ <cac:TaxScheme>
280
+ <cbc:ID schemeID="UN/ECE 5153" schemeAgencyID="6">OTH</cbc:ID>
281
+ </cac:TaxScheme>
282
+ </cac:TaxCategory>
283
+ </cac:TaxSubtotal>
284
+ </cac:TaxTotal>
285
+ <cac:Item>
286
+ <cbc:Description>${escapeXml(item.itemDescription)}</cbc:Description>
287
+ ${
288
+ item.countryOfOrigin
289
+ ? `
290
+ <cac:OriginCountry>
291
+ <cbc:IdentificationCode>${item.countryOfOrigin}</cbc:IdentificationCode>
292
+ </cac:OriginCountry>`
293
+ : ''
294
+ }
295
+ <cac:CommodityClassification>
296
+ <cbc:ItemClassificationCode listID="PTC">001</cbc:ItemClassificationCode>
297
+ </cac:CommodityClassification>
298
+ <cac:CommodityClassification>
299
+ <cbc:ItemClassificationCode listID="CLASS">${item.itemClassificationCode}</cbc:ItemClassificationCode>
300
+ </cac:CommodityClassification>
301
+ </cac:Item>
302
+ <cac:Price>
303
+ <cbc:PriceAmount currencyID="MYR">${item.unitPrice}</cbc:PriceAmount>
304
+ </cac:Price>
305
+ <cac:ItemPriceExtension>
306
+ <cbc:Amount currencyID="MYR">${item.totalTaxableAmountPerLine}</cbc:Amount>
307
+ </cac:ItemPriceExtension>
308
+ </cac:InvoiceLine>`
309
+ }
310
+
311
+ /**
312
+ * Generates a document hash for submission (separate from signature DocDigest)
313
+ * This is the SHA256 hash required by the Submit Documents API
314
+ *
315
+ * OFFICIAL MyInvois FAQ: "The XML/JSON document is hashed using SHA-256 to create the documentHash value"
316
+ * CRITICAL: Must hash the SAME document that gets encoded for submission (minified XML)
317
+ * Source: https://sdk.myinvois.hasil.gov.my/faq/#how-to-hash-the-documenthash-value-and-encode-the-document-value
318
+ */
319
+ export const generateDocumentHash = (xmlDocument: string): string => {
320
+ try {
321
+ console.log(
322
+ '🔧 Generating document hash using official MyInvois method (minified XML SHA256)',
323
+ )
324
+
325
+ // CRITICAL: Use the same minified XML that encodeDocumentForSubmission uses
326
+ const minifiedXML = minifyXML(xmlDocument)
327
+
328
+ const crypto = require('crypto')
329
+ const documentHash = crypto
330
+ .createHash('sha256')
331
+ .update(minifiedXML, 'utf8')
332
+ .digest('hex')
333
+
334
+ console.log('📊 Original XML length:', xmlDocument.length, 'characters')
335
+ console.log('📊 Minified XML length:', minifiedXML.length, 'characters')
336
+ console.log('📊 Document hash (SHA256 hex):', documentHash)
337
+ console.log(
338
+ '📊 Hash length:',
339
+ documentHash.length,
340
+ 'characters (should be 64)',
341
+ )
342
+
343
+ // Validate hash length
344
+ if (documentHash.length !== 64) {
345
+ console.error(
346
+ `❌ Invalid hash length: ${documentHash.length}, expected 64 characters`,
347
+ )
348
+ throw new Error(`Invalid SHA256 hash length: ${documentHash.length}`)
349
+ }
350
+
351
+ return documentHash
352
+ } catch (error) {
353
+ console.error('❌ Error generating document hash:', error)
354
+ throw new Error(`Failed to generate document hash: ${error}`)
355
+ }
356
+ }
357
+
358
+ /**
359
+ * Encodes the XML document to base64 for submission
360
+ * Includes minification as recommended by MyInvois documentation
361
+ */
362
+ export const encodeDocumentForSubmission = (xmlDocument: string): string => {
363
+ const minifiedXML = minifyXML(xmlDocument)
364
+ return Buffer.from(minifiedXML, 'utf8').toString('base64')
365
+ }
366
+
367
+ /**
368
+ * Utility functions for extracting certificate information
369
+ */
370
+
371
+ /**
372
+ * Extracts certificate information from a PEM certificate file
373
+ * @param certificatePem - The certificate in PEM format
374
+ * @returns Object containing issuer name and serial number
375
+ */
376
+ export const extractCertificateInfo = (
377
+ certificatePem: string,
378
+ ): {
379
+ issuerName: string
380
+ serialNumber: string
381
+ } => {
382
+ try {
383
+ // Create X509Certificate object (Node.js 15.6.0+)
384
+ const cert = new crypto.X509Certificate(certificatePem)
385
+
386
+ // Extract issuer name (in the format required by MyInvois)
387
+ const issuerName = cert.issuer
388
+
389
+ // Extract serial number and convert from hex to decimal as required by MyInvois
390
+ const serialNumberHex = cert.serialNumber
391
+ console.log('📋 Certificate serial number (hex):', serialNumberHex)
392
+
393
+ // Convert hex to decimal string (MyInvois requires integer format)
394
+ const serialNumberDecimal = BigInt('0x' + serialNumberHex).toString()
395
+ console.log('📋 Certificate serial number (decimal):', serialNumberDecimal)
396
+
397
+ return {
398
+ issuerName,
399
+ serialNumber: serialNumberDecimal,
400
+ }
401
+ } catch (error) {
402
+ throw new Error(`Failed to extract certificate info: ${error}`)
403
+ }
404
+ }
405
+
406
+ /**
407
+ * Validates that certificate and private key match
408
+ * @param certificatePem - The certificate in PEM format
409
+ * @param privateKeyPem - The private key in PEM format
410
+ * @returns boolean indicating if they match
411
+ */
412
+ export const validateKeyPair = (
413
+ certificatePem: string,
414
+ privateKeyPem: string,
415
+ ): boolean => {
416
+ try {
417
+ // Extract public key from certificate
418
+ const cert = new crypto.X509Certificate(certificatePem)
419
+ const publicKey = cert.publicKey
420
+
421
+ // Create a test signature with private key
422
+ const testData = 'test-validation-data'
423
+ const signer = crypto.createSign('RSA-SHA256')
424
+ signer.update(testData)
425
+ const signature = signer.sign(privateKeyPem)
426
+
427
+ // Verify signature with public key
428
+ const verifier = crypto.createVerify('RSA-SHA256')
429
+ verifier.update(testData)
430
+ return verifier.verify(publicKey, signature)
431
+ } catch (error) {
432
+ console.error('Key pair validation failed:', error)
433
+ return false
434
+ }
435
+ }
436
+
437
+ /**
438
+ * Helper function to create SigningCredentials from certificate and private key files
439
+ * @param certificatePem - The certificate in PEM format
440
+ * @param privateKeyPem - The private key in PEM format
441
+ * @returns Complete SigningCredentials object
442
+ */
443
+ export function createSigningCredentials(
444
+ certificatePem: string,
445
+ privateKeyPem: string,
446
+ ): SigningCredentials {
447
+ // Validate that the key pair matches
448
+ if (!validateKeyPair(certificatePem, privateKeyPem)) {
449
+ throw new Error('Certificate and private key do not match')
450
+ }
451
+
452
+ // Extract certificate information
453
+ const { issuerName, serialNumber } = extractCertificateInfo(certificatePem)
454
+
455
+ return {
456
+ privateKeyPem,
457
+ certificatePem,
458
+ issuerName,
459
+ serialNumber,
460
+ }
461
+ }
462
+
463
+ /**
464
+ * Generates the UBL XML template with complete signature structure
465
+ */
466
+ export function generateUBLXMLTemplate(invoiceInfo: InvoiceV1_1): string {
467
+ const { supplier, buyer, invoiceLineItems, legalMonetaryTotal, taxTotal } =
468
+ invoiceInfo
469
+
470
+ return `<?xml version="1.0" encoding="UTF-8"?>
471
+ <Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
472
+ xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
473
+ xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
474
+ xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2">
475
+ <UBLExtensions xmlns="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2">
476
+ <UBLExtension>
477
+ <ExtensionURI>urn:oasis:names:specification:ubl:dsig:enveloped:xades</ExtensionURI>
478
+ <ExtensionContent>
479
+ <sig:UBLDocumentSignatures xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2"
480
+ xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2"
481
+ xmlns:sbc="urn:oasis:names:specification:ubl:schema:xsd:SignatureBasicComponents-2">
482
+ <sac:SignatureInformation>
483
+ <cbc:ID>urn:oasis:names:specification:ubl:signature:1</cbc:ID>
484
+ <sbc:ReferencedSignatureID>urn:oasis:names:specification:ubl:signature:Invoice</sbc:ReferencedSignatureID>
485
+ <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="signature">
486
+ <ds:SignedInfo>
487
+ <ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
488
+ <ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
489
+ <ds:Reference Id="id-doc-signed-data" URI="">
490
+ <ds:Transforms>
491
+ <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
492
+ <ds:XPath>not(//ancestor-or-self::ext:UBLExtensions)</ds:XPath>
493
+ </ds:Transform>
494
+ <ds:Transform Algorithm="http://www.w3.org/TR/1999/REC-xpath-19991116">
495
+ <ds:XPath>not(//ancestor-or-self::cac:Signature)</ds:XPath>
496
+ </ds:Transform>
497
+ <ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
498
+ </ds:Transforms>
499
+ <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
500
+ <ds:DigestValue></ds:DigestValue>
501
+ </ds:Reference>
502
+ <ds:Reference Type="http://www.w3.org/2000/09/xmldsig#SignatureProperties" URI="#id-xades-signed-props">
503
+ <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
504
+ <ds:DigestValue></ds:DigestValue>
505
+ </ds:Reference>
506
+ </ds:SignedInfo>
507
+ <ds:SignatureValue></ds:SignatureValue>
508
+ <ds:KeyInfo>
509
+ <ds:X509Data>
510
+ <ds:X509Certificate></ds:X509Certificate>
511
+ </ds:X509Data>
512
+ </ds:KeyInfo>
513
+ <ds:Object>
514
+ <xades:QualifyingProperties xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" Target="signature">
515
+ <xades:SignedProperties Id="id-xades-signed-props">
516
+ <xades:SignedSignatureProperties>
517
+ <xades:SigningTime></xades:SigningTime>
518
+ <xades:SigningCertificate>
519
+ <xades:Cert>
520
+ <xades:CertDigest>
521
+ <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
522
+ <ds:DigestValue></ds:DigestValue>
523
+ </xades:CertDigest>
524
+ <xades:IssuerSerial>
525
+ <ds:X509IssuerName></ds:X509IssuerName>
526
+ <ds:X509SerialNumber></ds:X509SerialNumber>
527
+ </xades:IssuerSerial>
528
+ </xades:Cert>
529
+ </xades:SigningCertificate>
530
+ </xades:SignedSignatureProperties>
531
+ </xades:SignedProperties>
532
+ </xades:QualifyingProperties>
533
+ </ds:Object>
534
+ </ds:Signature>
535
+ </sac:SignatureInformation>
536
+ </sig:UBLDocumentSignatures>
537
+ </ExtensionContent>
538
+ </UBLExtension>
539
+ </UBLExtensions>
540
+ <cbc:ID>${escapeXml(invoiceInfo.eInvoiceCodeOrNumber)}</cbc:ID>
541
+ <cbc:IssueDate>${invoiceInfo.eInvoiceDate}</cbc:IssueDate>
542
+ <cbc:IssueTime>${invoiceInfo.eInvoiceTime}</cbc:IssueTime>
543
+ <cbc:InvoiceTypeCode listVersionID="1.1">${invoiceInfo.eInvoiceTypeCode}</cbc:InvoiceTypeCode>
544
+ <cbc:DocumentCurrencyCode>${invoiceInfo.invoiceCurrencyCode}</cbc:DocumentCurrencyCode>
545
+ <cbc:TaxCurrencyCode>${invoiceInfo.invoiceCurrencyCode}</cbc:TaxCurrencyCode>
546
+ ${
547
+ invoiceInfo.billingPeriodStartDate && invoiceInfo.billingPeriodEndDate
548
+ ? `
549
+ <cac:InvoicePeriod>
550
+ <cbc:StartDate>${invoiceInfo.billingPeriodStartDate}</cbc:StartDate>
551
+ <cbc:EndDate>${invoiceInfo.billingPeriodEndDate}</cbc:EndDate>
552
+ ${invoiceInfo.frequencyOfBilling ? `<cbc:Description>${escapeXml(invoiceInfo.frequencyOfBilling)}</cbc:Description>` : ''}
553
+ </cac:InvoicePeriod>`
554
+ : ''
555
+ }
556
+ <cac:Signature>
557
+ <cbc:ID>urn:oasis:names:specification:ubl:signature:Invoice</cbc:ID>
558
+ <cbc:SignatureMethod>urn:oasis:names:specification:ubl:dsig:enveloped:xades</cbc:SignatureMethod>
559
+ </cac:Signature>
560
+ ${generateSupplierXML(supplier)}
561
+ ${generateBuyerXML(buyer)}
562
+ ${invoiceInfo.delivery ? generateDeliveryXML(invoiceInfo.delivery) : ''}
563
+ ${invoiceInfo.paymentMeans ? invoiceInfo.paymentMeans.map(pm => generatePaymentMeansXML(pm)).join('') : ''}
564
+ ${invoiceInfo.allowanceCharges ? invoiceInfo.allowanceCharges.map(ac => generateAllowanceChargeXML(ac)).join('') : ''}
565
+ ${generateTaxTotalXML(taxTotal)}
566
+ ${generateLegalMonetaryTotalXML(legalMonetaryTotal)}
567
+ ${invoiceLineItems.map((item, index) => generateInvoiceLineXML(item, index + 1)).join('')}
568
+ </Invoice>`
569
+ }
570
+
571
+ /**
572
+ * Generates a signed UBL XML invoice document following MyInvois specifications.
573
+ *
574
+ * @param invoiceInfo - The invoice data structure
575
+ * @param signingCredentials - Digital signature credentials
576
+ * @returns Promise<string> - The complete signed XML document ready for submission
577
+ */
578
+ export const generateSignedInvoiceXML = async (
579
+ invoiceInfo: InvoiceV1_1,
580
+ signingCredentials: SigningCredentials,
581
+ ): Promise<string> => {
582
+ // Step 1: Generate the UBL XML template with signature structure
583
+ const xmlTemplate = generateUBLXMLTemplate(invoiceInfo)
584
+
585
+ // Parse the XML template
586
+ const parser = new DOMParserImpl()
587
+ const templateDoc = parser.parseFromString(xmlTemplate, 'application/xml')
588
+
589
+ // Step 2: Apply transformations to get the document for hashing
590
+ const transformedXml = transformXmlInvoice(xmlTemplate)
591
+ const transformedDoc = parser.parseFromString(
592
+ transformedXml,
593
+ 'application/xml',
594
+ )
595
+
596
+ // Step 3: Canonicalize and generate document hash (DocDigest) - try C14N 1.1 first
597
+ const docDigest =
598
+ await canonicalizeAndHashDocumentWithC14N11Fallback(transformedDoc)
599
+
600
+ // Step 4: Sign the document digest (Sig)
601
+ const signature = signDocumentDigest(
602
+ docDigest,
603
+ signingCredentials.privateKeyPem,
604
+ )
605
+
606
+ // Step 5: Generate certificate hash (CertDigest)
607
+ const certDigest = hashCertificate(signingCredentials.certificatePem)
608
+
609
+ // Step 6: Populate signed properties
610
+ const signedPropertiesData: SignedPropertiesData = {
611
+ certDigest,
612
+ signingTime: new Date().toISOString().replace(/\.\d{3}Z$/, 'Z'), // ISO format without milliseconds
613
+ issuerName: signingCredentials.issuerName,
614
+ serialNumber: signingCredentials.serialNumber,
615
+ }
616
+
617
+ populateSignedProperties(templateDoc, signedPropertiesData)
618
+
619
+ // Step 7: Generate signed properties hash (PropsDigest) - try C14N 1.1 first
620
+ const propsDigest = await hashSignedPropertiesWithC14N11Fallback(templateDoc)
621
+
622
+ // Step 8: Populate final document
623
+ const finalData: FinalDocumentData = {
624
+ signatureValue: signature,
625
+ propsDigest,
626
+ docDigest,
627
+ certificatePem: signingCredentials.certificatePem,
628
+ }
629
+
630
+ populateFinalDocument(templateDoc, finalData)
631
+
632
+ // Serialize the final signed document
633
+ const serializer = new XMLSerializerImpl()
634
+ return serializer.serializeToString(templateDoc)
635
+ }
636
+
637
+ /**
638
+ * Generates a document hash for submission using the same method as signature creation
639
+ * This ensures consistency with MyInvois validation requirements
640
+ */
641
+ export const generateDocumentHashForSubmission = async (
642
+ xmlDocument: string,
643
+ ): Promise<string> => {
644
+ try {
645
+ console.log(
646
+ '🔧 Generating document hash using signature-compatible method...',
647
+ )
648
+
649
+ // Parse the signed XML
650
+ const parser = new DOMParserImpl()
651
+
652
+ // Apply the same transformations as used in signature creation
653
+ const transformedXml = transformXmlInvoice(xmlDocument)
654
+ const transformedDoc = parser.parseFromString(
655
+ transformedXml,
656
+ 'application/xml',
657
+ )
658
+
659
+ // Use the same canonicalization as signature creation
660
+ const base64Digest =
661
+ await canonicalizeAndHashDocumentWithC14N11Fallback(transformedDoc)
662
+ const hexDigest = Buffer.from(base64Digest, 'base64').toString('hex')
663
+ console.log('📊 Canonicalized document hash (base64):', base64Digest)
664
+ console.log('📊 Canonicalized document hash (hex):', hexDigest)
665
+ console.log('📊 Hash length:', hexDigest.length, 'characters')
666
+ return hexDigest
667
+ } catch (error) {
668
+ console.error('Error generating canonicalized hash, using fallback:', error)
669
+ return generateDocumentHash(xmlDocument)
670
+ }
671
+ }