@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,915 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest'
2
+ import type { InvoiceV1_1 } from '../src/types'
3
+ import { MyInvoisClient } from '../src/utils/MyInvoisClient'
4
+ import {
5
+ encodeDocumentForSubmission,
6
+ extractCertificateInfo,
7
+ generateDocumentHash,
8
+ generateDocumentHashForSubmission,
9
+ generateSignedInvoiceXML,
10
+ } from '../src/utils/invoice1-1'
11
+ import type { SigningCredentials } from '../src/types'
12
+ import {
13
+ debugDocumentHash,
14
+ testSubmissionHashMethods,
15
+ } from '../src/utils/debug/debug-document-hash'
16
+ import {
17
+ debugSignedInvoiceXML,
18
+ testCanonicalizationAlgorithms,
19
+ validateXMLStructure,
20
+ } from '../src/utils/debug/debug-invoice-submission'
21
+
22
+ /**
23
+ * Creates test signing credentials using a predefined test certificate
24
+ * This uses the same structure as the example XML you provided, but with test values
25
+ */
26
+ function createTestSigningCredentials(): SigningCredentials {
27
+ // Test private key (THIS IS FOR TESTING ONLY - NEVER USE IN PRODUCTION)
28
+ const testPrivateKey = process.env.TEST_PRIVATE_KEY!
29
+
30
+ // Test certificate (THIS IS FOR TESTING ONLY)
31
+ const testCertificate = process.env.TEST_CERTIFICATE!
32
+
33
+ console.warn(`
34
+ โš ๏ธ WARNING: Using test credentials for development only!
35
+ These credentials will NOT work with the actual MyInvois API.
36
+ You must obtain official certificates from LHDNM for production use.
37
+ `)
38
+
39
+ const extractedCertificate = extractCertificateInfo(testCertificate)
40
+
41
+ return {
42
+ privateKeyPem: testPrivateKey,
43
+ certificatePem: testCertificate,
44
+ issuerName: extractedCertificate.issuerName,
45
+ serialNumber: extractedCertificate.serialNumber,
46
+ }
47
+ }
48
+
49
+ // Test data matching the InvoiceV1_1 interface
50
+ const createTestInvoiceData = (): InvoiceV1_1 => {
51
+ // Generate current date and time to avoid "too old" validation errors
52
+ const now = new Date()
53
+ const currentDate = now.toISOString().split('T')[0] // YYYY-MM-DD format
54
+ const currentTime = now.toISOString().split('T')[1].split('.')[0] + 'Z' // HH:MM:SSZ format (remove milliseconds)
55
+
56
+ console.log(
57
+ '๐Ÿ“… Using current date/time for invoice:',
58
+ currentDate,
59
+ currentTime,
60
+ )
61
+
62
+ return {
63
+ eInvoiceVersion: '1.1',
64
+ eInvoiceTypeCode: '01',
65
+ eInvoiceCodeOrNumber: 'XML-INV12345',
66
+ eInvoiceDate: currentDate,
67
+ eInvoiceTime: currentTime,
68
+ invoiceCurrencyCode: 'MYR',
69
+
70
+ supplier: {
71
+ name: 'Supplier Name',
72
+ tin: process.env.TIN_VALUE!,
73
+ registrationType: 'NRIC',
74
+ registrationNumber: process.env.NRIC_VALUE!,
75
+ sstRegistrationNumber: 'NA',
76
+ email: 'supplier@email.com',
77
+ contactNumber: '+60123456789',
78
+ industryClassificationCode: '46510',
79
+ address: {
80
+ addressLine0: 'Lot 66',
81
+ addressLine1: 'Bangunan Merdeka',
82
+ addressLine2: 'Persiaran Jaya',
83
+ postalZone: '50480',
84
+ cityName: 'Kuala Lumpur',
85
+ state: '14',
86
+ country: 'MYS',
87
+ },
88
+ },
89
+
90
+ buyer: {
91
+ name: 'Consolidated Buyers',
92
+ tin: 'EI00000000010',
93
+ registrationNumber: 'NA',
94
+ sstRegistrationNumber: 'NA',
95
+ email: 'NA',
96
+ contactNumber: 'NA',
97
+ address: {
98
+ addressLine0: 'NA',
99
+ addressLine1: 'NA',
100
+ addressLine2: 'NA',
101
+ cityName: 'Kuala Lumpur',
102
+ postalZone: '50000',
103
+ state: '14',
104
+ country: 'MYS',
105
+ },
106
+ },
107
+
108
+ invoiceLineItems: [
109
+ {
110
+ itemClassificationCode: '004',
111
+ itemDescription: 'Receipt 001 - 100',
112
+ unitPrice: 10000,
113
+ taxType: '01',
114
+ taxRate: 10.0,
115
+ taxAmount: 1000,
116
+ totalTaxableAmountPerLine: 10000,
117
+ totalAmountPerLine: 11000,
118
+ quantity: 1,
119
+ measurement: 'C62',
120
+ countryOfOrigin: 'MYS',
121
+ },
122
+ {
123
+ itemClassificationCode: '004',
124
+ itemDescription: 'Receipt 101 - 200',
125
+ unitPrice: 20000,
126
+ taxType: '01',
127
+ taxRate: 10.0,
128
+ taxAmount: 2000,
129
+ totalTaxableAmountPerLine: 20000,
130
+ totalAmountPerLine: 22000,
131
+ quantity: 1,
132
+ measurement: 'C62',
133
+ countryOfOrigin: 'MYS',
134
+ },
135
+ ],
136
+
137
+ legalMonetaryTotal: {
138
+ taxExclusiveAmount: 30000,
139
+ taxInclusiveAmount: 33000,
140
+ allowanceTotalAmount: 0,
141
+ chargeTotalAmount: 0,
142
+ payableRoundingAmount: 0,
143
+ payableAmount: 33000,
144
+ },
145
+
146
+ taxTotal: {
147
+ taxAmount: 3000,
148
+ taxSubtotals: [
149
+ {
150
+ taxableAmount: 30000,
151
+ taxAmount: 3000,
152
+ taxCategory: {
153
+ taxTypeCode: '01',
154
+ taxRate: 10.0,
155
+ },
156
+ },
157
+ ],
158
+ },
159
+
160
+ paymentMeans: [
161
+ {
162
+ paymentMeansCode: '01',
163
+ payeeFinancialAccountID: '1234567890',
164
+ },
165
+ ],
166
+
167
+ issuerDigitalSignature: {
168
+ Id: 'DocSig',
169
+ 'ds:SignedInfo': {
170
+ 'ds:CanonicalizationMethod': {
171
+ Algorithm: 'http://www.w3.org/2006/12/xml-c14n11',
172
+ },
173
+ 'ds:SignatureMethod': {
174
+ Algorithm: 'http://www.w3.org/2001/04/xmldsig-more#rsa-sha256',
175
+ },
176
+ 'ds:Reference': [
177
+ {
178
+ Id: 'id-doc-signed-data',
179
+ URI: '',
180
+ 'ds:DigestMethod': {
181
+ Algorithm: 'http://www.w3.org/2001/04/xmlenc#sha256',
182
+ },
183
+ 'ds:DigestValue': '',
184
+ },
185
+ {
186
+ URI: '#id-xades-signed-props',
187
+ 'ds:DigestMethod': {
188
+ Algorithm: 'http://www.w3.org/2001/04/xmlenc#sha256',
189
+ },
190
+ 'ds:DigestValue': '',
191
+ },
192
+ ],
193
+ },
194
+ 'ds:SignatureValue': '',
195
+ 'ds:KeyInfo': {
196
+ 'ds:X509Data': {
197
+ 'ds:X509Certificate': '',
198
+ },
199
+ },
200
+ 'ds:Object': {
201
+ 'xades:QualifyingProperties': {
202
+ Target: 'signature',
203
+ 'xades:SignedProperties': {
204
+ Target: 'signature',
205
+ Id: 'id-xades-signed-props',
206
+ 'xades:SignedSignatureProperties': {
207
+ 'xades:SigningTime': '',
208
+ 'xades:SigningCertificate': {
209
+ 'xades:Cert': {
210
+ 'xades:CertDigest': {
211
+ 'ds:DigestMethod': {
212
+ Algorithm: 'http://www.w3.org/2001/04/xmlenc#sha256',
213
+ },
214
+ 'ds:DigestValue': '',
215
+ },
216
+ 'xades:IssuerSerial': {
217
+ 'ds:X509IssuerName': '',
218
+ 'ds:X509SerialNumber': '',
219
+ },
220
+ },
221
+ },
222
+ },
223
+ },
224
+ },
225
+ },
226
+ },
227
+ }
228
+ }
229
+
230
+ describe('Sign and Submit Invoice', () => {
231
+ beforeEach(() => {
232
+ vi.clearAllMocks()
233
+ })
234
+
235
+ describe('Invoice Signing', () => {
236
+ it('should generate a signed invoice XML with test credentials', async () => {
237
+ // Skip if no test credentials available
238
+ if (!process.env.CERTIFICATE || !process.env.PRIVATE_KEY) {
239
+ expect
240
+ .soft(
241
+ false,
242
+ 'Skipping test: Missing CERTIFICATE or PRIVATE_KEY environment variables',
243
+ )
244
+ .toBe(true)
245
+ return
246
+ }
247
+
248
+ const invoiceData = createTestInvoiceData()
249
+ const signingCredentials = createTestSigningCredentials()
250
+
251
+ const signedXML = await generateSignedInvoiceXML(
252
+ invoiceData,
253
+ signingCredentials,
254
+ )
255
+
256
+ // Verify the XML contains expected elements
257
+ expect(signedXML).toContain(
258
+ '<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"',
259
+ )
260
+ expect(signedXML).toContain('<ds:SignatureValue>')
261
+ expect(signedXML).toContain('<ds:X509Certificate>')
262
+ expect(signedXML).toContain('<xades:SigningTime>')
263
+ expect(signedXML).toContain(invoiceData.eInvoiceCodeOrNumber)
264
+ expect(signedXML).toContain(invoiceData.supplier.name)
265
+ expect(signedXML).toContain(invoiceData.buyer.name)
266
+
267
+ // Verify signature elements are populated (not empty)
268
+ expect(signedXML).not.toContain('<ds:SignatureValue></ds:SignatureValue>')
269
+ expect(signedXML).not.toContain(
270
+ '<ds:X509Certificate></ds:X509Certificate>',
271
+ )
272
+ })
273
+
274
+ it('should generate document hash for submission', async () => {
275
+ if (!process.env.CERTIFICATE || !process.env.PRIVATE_KEY) {
276
+ expect
277
+ .soft(
278
+ false,
279
+ 'Skipping test: Missing CERTIFICATE or PRIVATE_KEY environment variables',
280
+ )
281
+ .toBe(true)
282
+ return
283
+ }
284
+
285
+ const invoiceData = createTestInvoiceData()
286
+ const signingCredentials = createTestSigningCredentials()
287
+
288
+ const signedXML = await generateSignedInvoiceXML(
289
+ invoiceData,
290
+ signingCredentials,
291
+ )
292
+
293
+ const documentHash = generateDocumentHash(signedXML)
294
+ const base64Document = encodeDocumentForSubmission(signedXML)
295
+
296
+ // Test the alternative hash method
297
+ console.log('\n๐Ÿ”ง TESTING ALTERNATIVE HASH METHOD:')
298
+ try {
299
+ const canonicalizedHash =
300
+ await generateDocumentHashForSubmission(signedXML)
301
+ console.log(`Current hash: ${documentHash}`)
302
+ console.log(`Canonicalized hash: ${canonicalizedHash}`)
303
+ console.log(
304
+ `Methods are equal: ${documentHash === canonicalizedHash ? 'โœ…' : 'โŒ'}`,
305
+ )
306
+ } catch (error) {
307
+ console.log('โŒ Error testing canonicalized hash:', error)
308
+ }
309
+
310
+ // Verify hash is a valid hex string
311
+ expect(documentHash).toMatch(/^[a-f0-9]{64}$/)
312
+
313
+ // Verify base64 encoding
314
+ expect(() => Buffer.from(base64Document, 'base64')).not.toThrow()
315
+
316
+ // CRITICAL TEST: Verify the hash is calculated from the same minified XML that gets encoded
317
+ // This ensures consistency between documentHash and document (base64) values
318
+ const minifiedXML = signedXML
319
+ .replace(/>\s+</g, '><')
320
+ .replace(/\s+/g, ' ')
321
+ .replace(/>\s/g, '>')
322
+ .replace(/\s</g, '<')
323
+ .trim()
324
+
325
+ // Calculate hash of minified XML manually to verify our generateDocumentHash function
326
+ const crypto = require('crypto')
327
+ const expectedHash = crypto
328
+ .createHash('sha256')
329
+ .update(minifiedXML, 'utf8')
330
+ .digest('hex')
331
+
332
+ // The documentHash should match the hash of the minified XML
333
+ expect(documentHash).toEqual(expectedHash)
334
+
335
+ // The base64Document should decode to the same minified XML
336
+ const decodedDocument = Buffer.from(base64Document, 'base64').toString(
337
+ 'utf8',
338
+ )
339
+ expect(decodedDocument).toEqual(minifiedXML)
340
+ })
341
+
342
+ it('should validate signing credentials properly', () => {
343
+ if (!process.env.CERTIFICATE || !process.env.PRIVATE_KEY) {
344
+ expect
345
+ .soft(
346
+ false,
347
+ 'Skipping test: Missing CERTIFICATE or PRIVATE_KEY environment variables',
348
+ )
349
+ .toBe(true)
350
+ return
351
+ }
352
+
353
+ expect(() => createTestSigningCredentials()).not.toThrow()
354
+
355
+ const credentials = createTestSigningCredentials()
356
+ expect(credentials.privateKeyPem).toBeDefined()
357
+ expect(credentials.certificatePem).toBeDefined()
358
+ expect(credentials.issuerName).toBeDefined()
359
+ expect(credentials.serialNumber).toBeDefined()
360
+ })
361
+ })
362
+
363
+ describe('Real API Integration (Optional)', () => {
364
+ it('should submit to real MyInvois API if credentials are provided', async () => {
365
+ // Skip if no real API credentials
366
+ if (
367
+ !process.env.CLIENT_ID ||
368
+ !process.env.CLIENT_SECRET ||
369
+ !process.env.CERTIFICATE ||
370
+ !process.env.PRIVATE_KEY
371
+ ) {
372
+ expect
373
+ .soft(
374
+ false,
375
+ 'Skipping real API test: Missing required environment variables (CLIENT_ID, CLIENT_SECRET, CERTIFICATE, PRIVATE_KEY)',
376
+ )
377
+ .toBe(true)
378
+ return
379
+ }
380
+
381
+ const invoiceData = createTestInvoiceData()
382
+ const signingCredentials = createTestSigningCredentials()
383
+
384
+ const signedXML = await generateSignedInvoiceXML(
385
+ invoiceData,
386
+ signingCredentials,
387
+ )
388
+ const documentHash = generateDocumentHash(signedXML)
389
+ const base64Document = encodeDocumentForSubmission(signedXML)
390
+
391
+ // Note: This test will only run if you have real credentials
392
+ // and would actually submit to the MyInvois sandbox API
393
+ console.log('Generated signed XML length:', signedXML.length)
394
+ console.log('Document hash:', documentHash)
395
+ console.log('Base64 document length:', base64Document.length)
396
+
397
+ // For safety, we'll just validate the data format without actual submission
398
+ expect(signedXML).toContain('<Invoice xmlns=')
399
+ expect(documentHash).toMatch(/^[a-f0-9]{64}$/)
400
+ expect(base64Document.length).toBeGreaterThan(0)
401
+ }, 30000) // Longer timeout for potential API calls
402
+ })
403
+
404
+ describe('Edge Cases and Error Handling', () => {
405
+ it('should handle missing required invoice fields', async () => {
406
+ const incompleteInvoice = {
407
+ eInvoiceVersion: '1.1',
408
+ eInvoiceTypeCode: '01',
409
+ // Missing required fields
410
+ } as any
411
+
412
+ // This should fail during XML generation
413
+ await expect(
414
+ generateSignedInvoiceXML(
415
+ incompleteInvoice,
416
+ createTestSigningCredentials(),
417
+ ),
418
+ ).rejects.toThrow()
419
+ })
420
+
421
+ it('should handle invalid signing credentials', async () => {
422
+ const invoiceData = createTestInvoiceData()
423
+ const invalidCredentials = {
424
+ privateKeyPem: 'invalid-private-key',
425
+ certificatePem: 'invalid-certificate',
426
+ issuerName: 'invalid-issuer',
427
+ serialNumber: 'invalid-serial',
428
+ }
429
+
430
+ await expect(
431
+ generateSignedInvoiceXML(invoiceData, invalidCredentials),
432
+ ).rejects.toThrow()
433
+ })
434
+
435
+ it('should validate document size limits', async () => {
436
+ if (!process.env.CERTIFICATE || !process.env.PRIVATE_KEY) {
437
+ expect
438
+ .soft(
439
+ false,
440
+ 'Skipping test: Missing CERTIFICATE or PRIVATE_KEY environment variables',
441
+ )
442
+ .toBe(true)
443
+ return
444
+ }
445
+
446
+ const invoiceData = createTestInvoiceData()
447
+ const signingCredentials = createTestSigningCredentials()
448
+
449
+ const signedXML = await generateSignedInvoiceXML(
450
+ invoiceData,
451
+ signingCredentials,
452
+ )
453
+ const sizeInBytes = Buffer.from(signedXML, 'utf8').length
454
+
455
+ // Verify document is under MyInvois limits (300KB per document)
456
+ expect(sizeInBytes).toBeLessThan(300 * 1024)
457
+
458
+ console.log(
459
+ `Generated document size: ${sizeInBytes} bytes (${(sizeInBytes / 1024).toFixed(2)} KB)`,
460
+ )
461
+ })
462
+ })
463
+
464
+ describe('Debugging Invalid Structure Issues', () => {
465
+ it('should debug and validate XML structure comprehensively', async () => {
466
+ if (!process.env.CERTIFICATE || !process.env.PRIVATE_KEY) {
467
+ expect
468
+ .soft(
469
+ false,
470
+ 'Skipping test: Missing CERTIFICATE or PRIVATE_KEY environment variables',
471
+ )
472
+ .toBe(true)
473
+ return
474
+ }
475
+
476
+ const invoiceData = createTestInvoiceData()
477
+ const signingCredentials = createTestSigningCredentials()
478
+
479
+ console.log('\n๐Ÿ” DEBUGGING XML STRUCTURE ISSUES')
480
+ console.log('=====================================')
481
+
482
+ // Run comprehensive debugging
483
+ const debugResults = await debugSignedInvoiceXML(
484
+ invoiceData,
485
+ signingCredentials,
486
+ )
487
+
488
+ console.log('\n๐Ÿ“Š VALIDATION RESULTS:')
489
+ console.log(
490
+ 'XML Structure Valid:',
491
+ debugResults.validationResults.xmlStructure.valid,
492
+ )
493
+ console.log(
494
+ 'Signature Elements Valid:',
495
+ debugResults.validationResults.signatureElements.valid,
496
+ )
497
+ console.log(
498
+ 'Digest Values Valid:',
499
+ debugResults.validationResults.digestValues.valid,
500
+ )
501
+ console.log(
502
+ 'Certificate Info Valid:',
503
+ debugResults.validationResults.certificateInfo.valid,
504
+ )
505
+
506
+ if (debugResults.validationResults.xmlStructure.errors.length > 0) {
507
+ console.log('\nโŒ XML Structure Errors:')
508
+ debugResults.validationResults.xmlStructure.errors.forEach(error =>
509
+ console.log(` - ${error}`),
510
+ )
511
+ }
512
+
513
+ if (debugResults.validationResults.signatureElements.errors.length > 0) {
514
+ console.log('\nโŒ Signature Element Errors:')
515
+ debugResults.validationResults.signatureElements.errors.forEach(error =>
516
+ console.log(` - ${error}`),
517
+ )
518
+ }
519
+
520
+ if (debugResults.validationResults.digestValues.errors.length > 0) {
521
+ console.log('\nโŒ Digest Value Errors:')
522
+ debugResults.validationResults.digestValues.errors.forEach(error =>
523
+ console.log(` - ${error}`),
524
+ )
525
+ }
526
+
527
+ if (debugResults.validationResults.certificateInfo.errors.length > 0) {
528
+ console.log('\nโŒ Certificate Info Errors:')
529
+ debugResults.validationResults.certificateInfo.errors.forEach(error =>
530
+ console.log(` - ${error}`),
531
+ )
532
+ }
533
+
534
+ console.log('\n๐Ÿ“‹ STEP-BY-STEP RESULTS:')
535
+ Object.entries(debugResults.stepByStepResults).forEach(
536
+ ([step, result]) => {
537
+ const status = result.success ? 'โœ…' : 'โŒ'
538
+ console.log(
539
+ `${status} ${step}: ${result.success ? 'SUCCESS' : `FAILED - ${result.error}`}`,
540
+ )
541
+ },
542
+ )
543
+
544
+ if (debugResults.validationResults.canonicalizationTest) {
545
+ console.log('\n๐Ÿ”ง CANONICALIZATION TEST:')
546
+ console.log(
547
+ 'Exclusive C14N Success:',
548
+ debugResults.validationResults.canonicalizationTest.exclusiveC14N
549
+ ?.success,
550
+ )
551
+ console.log(
552
+ 'C14N 1.1 Fallback Success:',
553
+ debugResults.validationResults.canonicalizationTest.c14n11Fallback
554
+ ?.success,
555
+ )
556
+ console.log(
557
+ 'Results Equal:',
558
+ debugResults.validationResults.canonicalizationTest.areEqual,
559
+ )
560
+ }
561
+
562
+ if (debugResults.signedXML) {
563
+ // Additional XML structure validation
564
+ const xmlValidation = validateXMLStructure(debugResults.signedXML)
565
+ console.log('\n๐Ÿ“ XML VALIDATION:')
566
+ console.log('Overall Valid:', xmlValidation.isValid)
567
+
568
+ if (xmlValidation.errors.length > 0) {
569
+ console.log('Errors:')
570
+ xmlValidation.errors.forEach(error => console.log(` - ${error}`))
571
+ }
572
+
573
+ if (xmlValidation.warnings.length > 0) {
574
+ console.log('Warnings:')
575
+ xmlValidation.warnings.forEach(warning =>
576
+ console.log(` - ${warning}`),
577
+ )
578
+ }
579
+
580
+ // Check document size
581
+ const sizeInBytes = Buffer.from(debugResults.signedXML, 'utf8').length
582
+ console.log(
583
+ `\n๐Ÿ“ Document Size: ${sizeInBytes} bytes (${(sizeInBytes / 1024).toFixed(2)} KB)`,
584
+ )
585
+
586
+ // Sample of generated XML for manual inspection
587
+ console.log('\n๐Ÿ“„ XML SAMPLE (first 500 chars):')
588
+ console.log(debugResults.signedXML.substring(0, 500) + '...')
589
+
590
+ // Check for common MyInvois issues
591
+ console.log('\n๐ŸŽฏ MYINVOIS SPECIFIC CHECKS:')
592
+ const commonIssues: string[] = []
593
+
594
+ // Check for proper namespace declarations
595
+ if (
596
+ !debugResults.signedXML.includes(
597
+ 'xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"',
598
+ )
599
+ ) {
600
+ commonIssues.push('Missing ext namespace declaration')
601
+ }
602
+
603
+ // Check for proper signature target
604
+ if (!debugResults.signedXML.includes('Target="signature"')) {
605
+ commonIssues.push('Missing or incorrect signature target')
606
+ }
607
+
608
+ // Check for proper digest algorithms
609
+ if (
610
+ !debugResults.signedXML.includes(
611
+ 'Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"',
612
+ )
613
+ ) {
614
+ commonIssues.push('Missing or incorrect SHA256 digest algorithm')
615
+ }
616
+
617
+ // Check for RSA-SHA256 signature method
618
+ if (
619
+ !debugResults.signedXML.includes(
620
+ 'Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"',
621
+ )
622
+ ) {
623
+ commonIssues.push(
624
+ 'Missing or incorrect RSA-SHA256 signature algorithm',
625
+ )
626
+ }
627
+
628
+ // Check for proper C14N algorithm in XML
629
+ if (
630
+ !debugResults.signedXML.includes(
631
+ 'Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"',
632
+ )
633
+ ) {
634
+ commonIssues.push(
635
+ 'XML declares different canonicalization algorithm than expected',
636
+ )
637
+ }
638
+
639
+ if (commonIssues.length > 0) {
640
+ console.log('โŒ Common MyInvois Issues Found:')
641
+ commonIssues.forEach(issue => console.log(` - ${issue}`))
642
+ } else {
643
+ console.log('โœ… No common MyInvois issues detected')
644
+ }
645
+ }
646
+
647
+ // This test helps with debugging but doesn't fail based on the results
648
+ // The actual validation should be done by reviewing the console output
649
+ expect(debugResults).toBeDefined()
650
+ }, 30000)
651
+
652
+ it('should test canonicalization algorithms specifically', async () => {
653
+ if (!process.env.CERTIFICATE || !process.env.PRIVATE_KEY) {
654
+ expect.soft(false, 'Skipping test: Missing credentials').toBe(true)
655
+ return
656
+ }
657
+
658
+ const invoiceData = createTestInvoiceData()
659
+ const signingCredentials = createTestSigningCredentials()
660
+
661
+ console.log('\n๐Ÿ”ง CANONICALIZATION ALGORITHM TESTING')
662
+ console.log('=====================================')
663
+
664
+ // Generate a signed XML first to get the template
665
+ const signedXML = await generateSignedInvoiceXML(
666
+ invoiceData,
667
+ signingCredentials,
668
+ )
669
+ const testResults = await testCanonicalizationAlgorithms(signedXML)
670
+
671
+ console.log('Exclusive C14N Success:', testResults.exclusiveC14N.success)
672
+ if (!testResults.exclusiveC14N.success) {
673
+ console.log('Exclusive C14N Error:', testResults.exclusiveC14N.error)
674
+ } else {
675
+ console.log('Exclusive C14N Digest:', testResults.exclusiveC14N.digest)
676
+ }
677
+
678
+ console.log(
679
+ 'C14N 1.1 Fallback Success:',
680
+ testResults.c14n11Fallback.success,
681
+ )
682
+ if (!testResults.c14n11Fallback.success) {
683
+ console.log(
684
+ 'C14N 1.1 Fallback Error:',
685
+ testResults.c14n11Fallback.error,
686
+ )
687
+ } else {
688
+ console.log(
689
+ 'C14N 1.1 Fallback Digest:',
690
+ testResults.c14n11Fallback.digest,
691
+ )
692
+ }
693
+
694
+ console.log('Algorithms produce same result:', testResults.areEqual)
695
+
696
+ if (
697
+ !testResults.areEqual &&
698
+ testResults.exclusiveC14N.success &&
699
+ testResults.c14n11Fallback.success
700
+ ) {
701
+ console.log(
702
+ '\nโš ๏ธ WARNING: Different canonicalization algorithms produce different results!',
703
+ )
704
+ console.log('This may be the cause of MyInvois validation failures.')
705
+ console.log('Exclusive C14N digest:', testResults.exclusiveC14N.digest)
706
+ console.log('C14N 1.1 digest:', testResults.c14n11Fallback.digest)
707
+ }
708
+
709
+ expect(testResults).toBeDefined()
710
+ })
711
+
712
+ it('should debug document hash calculation methods', async () => {
713
+ if (!process.env.CERTIFICATE || !process.env.PRIVATE_KEY) {
714
+ expect.soft(false, 'Skipping test: Missing credentials').toBe(true)
715
+ return
716
+ }
717
+
718
+ const invoiceData = createTestInvoiceData()
719
+ const signingCredentials = createTestSigningCredentials()
720
+
721
+ console.log('\n๐Ÿ”ง DOCUMENT HASH DEBUGGING')
722
+ console.log('===========================')
723
+
724
+ // Then debug the actual hash calculation
725
+ const debugResults = await debugDocumentHash(
726
+ invoiceData,
727
+ signingCredentials,
728
+ )
729
+
730
+ console.log('\n๐Ÿ“Š HASH ANALYSIS RESULTS:')
731
+ console.log(
732
+ `Submission Hash: ${debugResults.documentHashes.submissionHash}`,
733
+ )
734
+ console.log(
735
+ `Signature Doc Digest: ${debugResults.documentHashes.signatureDocDigest}`,
736
+ )
737
+ console.log(
738
+ `Raw Document Hash: ${debugResults.documentHashes.rawDocumentHash}`,
739
+ )
740
+ console.log(
741
+ `Minified Hash: ${debugResults.documentHashes.minifiedDocumentHash}`,
742
+ )
743
+ console.log(
744
+ `Transformed Hash: ${debugResults.documentHashes.transformedDocumentHash}`,
745
+ )
746
+
747
+ console.log('\n๐Ÿ” EQUALITY CHECKS:')
748
+ Object.entries(debugResults.areEqual).forEach(([comparison, isEqual]) => {
749
+ console.log(`${comparison}: ${isEqual ? 'โœ…' : 'โŒ'}`)
750
+ })
751
+
752
+ if (debugResults.recommendations.length > 0) {
753
+ console.log('\n๐Ÿ’ก RECOMMENDATIONS:')
754
+ debugResults.recommendations.forEach(rec => console.log(` ${rec}`))
755
+ }
756
+
757
+ // Test different submission hash methods
758
+ const methodResults = await testSubmissionHashMethods(
759
+ invoiceData,
760
+ signingCredentials,
761
+ )
762
+
763
+ console.log('\n๐Ÿงช HASH METHOD COMPARISON:')
764
+ Object.entries(methodResults.methods).forEach(([method, hash]) => {
765
+ console.log(`${method}: ${hash}`)
766
+ })
767
+
768
+ if (methodResults.recommendations.length > 0) {
769
+ console.log('\n๐Ÿ”ง METHOD RECOMMENDATIONS:')
770
+ methodResults.recommendations.forEach(rec => console.log(` ${rec}`))
771
+ }
772
+
773
+ // Key findings
774
+ console.log('\n๐ŸŽฏ KEY FINDINGS:')
775
+ if (!debugResults.areEqual.submissionVsSignature) {
776
+ console.log('โŒ CRITICAL: Submission hash โ‰  Signature digest')
777
+ console.log(
778
+ ' This is likely why MyInvois rejects "Document hash is not valid"',
779
+ )
780
+ console.log(' MyInvois probably expects these to match exactly')
781
+ }
782
+
783
+ if (debugResults.areEqual.submissionVsTransformed) {
784
+ console.log('โœ… Submission hash matches transformed document hash')
785
+ console.log(
786
+ ' This suggests the current approach is on the right track',
787
+ )
788
+ }
789
+
790
+ // Practical fix suggestions
791
+ console.log('\n๐Ÿ”ง IMMEDIATE FIXES TO TRY:')
792
+ console.log(
793
+ '1. Use signature digest as documentHash in submission payload',
794
+ )
795
+ console.log(
796
+ '2. Ensure both signature and submission use same canonicalization',
797
+ )
798
+ console.log(
799
+ '3. Use minified XML for hash calculation if sizes differ significantly',
800
+ )
801
+
802
+ expect(debugResults).toBeDefined()
803
+ expect(methodResults).toBeDefined()
804
+ }, 30000)
805
+ })
806
+ })
807
+
808
+ describe('Real API Submission with Self-Signed Certificate', () => {
809
+ it('should attempt a real submission to MyInvois API using self-signed cert and API keys', async () => {
810
+ if (!process.env.CLIENT_ID || !process.env.CLIENT_SECRET) {
811
+ console.warn(
812
+ 'Skipping real API test: Missing CLIENT_ID or CLIENT_SECRET environment variables',
813
+ )
814
+ expect
815
+ .soft(
816
+ false,
817
+ 'Skipping real API test: Missing CLIENT_ID or CLIENT_SECRET environment variables',
818
+ )
819
+ .toBe(true)
820
+ return
821
+ }
822
+
823
+ const privateKeyPem = process.env.PRIVATE_KEY
824
+ const certificatePem = process.env.CERTIFICATE
825
+
826
+ if (!privateKeyPem || !certificatePem) {
827
+ console.warn(
828
+ 'Skipping real API test: Missing PRIVATE_KEY or CERTIFICATE environment variables',
829
+ )
830
+ expect
831
+ .soft(
832
+ false,
833
+ 'Skipping real API test: Missing PRIVATE_KEY or CERTIFICATE environment variables',
834
+ )
835
+ .toBe(true)
836
+ return
837
+ }
838
+
839
+ const invoiceData = createTestInvoiceData()
840
+
841
+ const client = new MyInvoisClient(
842
+ process.env.CLIENT_ID!,
843
+ process.env.CLIENT_SECRET!,
844
+ 'sandbox',
845
+ undefined,
846
+ true,
847
+ )
848
+
849
+ // 2. Submit Document
850
+ try {
851
+ const { data: submissionResponse, status } = await client.submitDocument([
852
+ invoiceData,
853
+ ])
854
+ console.log('Real Submission API Response Status:', status)
855
+ console.log('Real Submission API Response Body:', submissionResponse)
856
+
857
+ console.log(
858
+ 'Real Submission Successful. SubmissionUid:',
859
+ submissionResponse.submissionUid,
860
+ )
861
+ if (
862
+ submissionResponse.acceptedDocuments &&
863
+ submissionResponse.acceptedDocuments.length > 0
864
+ ) {
865
+ console.log(
866
+ 'Accepted Document UUID:',
867
+ submissionResponse.acceptedDocuments[0].invoiceCodeNumber,
868
+ )
869
+ }
870
+ if (
871
+ submissionResponse.rejectedDocuments &&
872
+ submissionResponse.rejectedDocuments.length > 0
873
+ ) {
874
+ console.warn(
875
+ 'Rejected Documents:',
876
+ submissionResponse.rejectedDocuments,
877
+ )
878
+
879
+ console.warn(
880
+ 'Rejected Document Details: ',
881
+ submissionResponse.rejectedDocuments.flatMap(
882
+ doc => doc.error?.details,
883
+ ),
884
+ )
885
+ }
886
+
887
+ expect(status).toBe(202) // MyInvois typically returns 202 Accepted
888
+ expect(submissionResponse.submissionUid).toBeDefined()
889
+ expect(submissionResponse.submissionUid).not.toBeNull()
890
+
891
+ const submission = await client.getSubmissionStatus(
892
+ submissionResponse.submissionUid,
893
+ )
894
+ console.log('Submission:', submission)
895
+ expect(submission).toBeDefined()
896
+ expect(submission.status).oneOf(['Validated', 'Invalid'])
897
+ } catch (error: any) {
898
+ console.error('Error during real document submission:', error)
899
+
900
+ // Check if this is a TIN mismatch error
901
+ const errorMessage = error.message || error.toString()
902
+ if (
903
+ errorMessage.includes(
904
+ 'authenticated TIN and documents TIN is not matching',
905
+ )
906
+ ) {
907
+ console.log('\nโŒ TIN MISMATCH ERROR DETECTED!')
908
+ console.log('=====================================')
909
+ }
910
+
911
+ expect.soft(false, 'Error during real document submission.').toBe(true)
912
+ throw error
913
+ }
914
+ }, 45000) // Increased timeout for real API calls
915
+ })