@ripwords/myinvois-client 0.1.0 → 0.1.3

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 (577) hide show
  1. package/CHANGELOG.md +111 -0
  2. package/README.md +128 -4
  3. package/bun.lock +59 -0
  4. package/dist/{0X-Yw7mZEro.d.cts → 0X-CTIq3y3a.d.ts} +1 -2
  5. package/dist/{0X-C4IRh_fJ.d.ts → 0X-Cr3M7hci.d.cts} +1 -1
  6. package/dist/{1X-D_aUVsuM.d.cts → 1X-Bu4oiv8D.d.ts} +1 -2
  7. package/dist/{1X-C-_KHV-Q.d.ts → 1X-BywXCqtn.d.ts} +1 -2
  8. package/dist/{1X-Brnls9Jh.d.ts → 1X-CWwmfCzo.d.cts} +1 -1
  9. package/dist/{1X-BwpSoT3o.d.cts → 1X-ClnJ79HH.d.cts} +1 -1
  10. package/dist/{2X-DkS1BoE5.d.ts → 2X-3fSEGIuE.d.ts} +1 -2
  11. package/dist/{2X-Bb6elyzV.d.cts → 2X-CV9eYhog.d.cts} +1 -1
  12. package/dist/{2X-UdQcQW24.d.ts → 2X-DNtkJ0tj.d.cts} +1 -1
  13. package/dist/{2X-hClUyw26.d.cts → 2X-DnG3FY1f.d.ts} +1 -2
  14. package/dist/{3X-C7VFD-n-.d.cts → 3X--VWVsC84.d.cts} +1 -1
  15. package/dist/{3X-CLMESDvz.d.cts → 3X-BOxfatu3.d.cts} +1 -1
  16. package/dist/{3X-DVDyspgb.d.ts → 3X-CLdmoel1.d.ts} +1 -2
  17. package/dist/{3X-DFI-4RQQ.d.ts → 3X-Ynjfgoll.d.ts} +1 -2
  18. package/dist/{4X-DIfvpU6V.d.cts → 4X-B5ePdMky.d.ts} +1 -2
  19. package/dist/{4X-CvScPJTf.d.cts → 4X-BTG6o1Gn.d.ts} +1 -2
  20. package/dist/{4X-CIJ2JJ2w.d.ts → 4X-By9PzHaY.d.cts} +1 -1
  21. package/dist/{4X-CUR8jlaZ.d.ts → 4X-C7fzDWJ_.d.cts} +1 -1
  22. package/dist/{5X-BOUxhadJ.d.cts → 5X-B5M0Cv_K.d.cts} +1 -1
  23. package/dist/{5X-C6db432h.d.ts → 5X-CNAFsDm2.d.cts} +1 -1
  24. package/dist/{5X-CkLu7Vyd.d.cts → 5X-CjSz1zxJ.d.ts} +1 -2
  25. package/dist/{5X-COsZHUaQ.d.ts → 5X-dhP6fyou.d.ts} +1 -2
  26. package/dist/{6X-Mf32k1d0.d.cts → 6X-B9KP_vEn.d.ts} +1 -2
  27. package/dist/{6X-DE7RJeV6.d.cts → 6X-BHaY0TCf.d.ts} +1 -2
  28. package/dist/{6X-ClZDKOTC.d.ts → 6X-C3elgd-n.d.cts} +1 -1
  29. package/dist/{6X-C_fFIcJC.d.ts → 6X-uObUP4VG.d.cts} +1 -1
  30. package/dist/{7X-DoCUcp-J.d.cts → 7X-BifJnY24.d.cts} +1 -1
  31. package/dist/{7X-Chtd6B66.d.cts → 7X-C4eX_tAk.d.ts} +1 -2
  32. package/dist/{7X-BZyesooz.d.ts → 7X-D3idQBl9.d.cts} +1 -1
  33. package/dist/{7X-kot_VccM.d.ts → 7X-DtkQutx2.d.ts} +1 -2
  34. package/dist/{8X-Dr9RunRw.d.cts → 8X-5n9seY3z.d.ts} +1 -2
  35. package/dist/{8X-DkuKAkHz.d.ts → 8X-C6UMFvQW.d.cts} +1 -1
  36. package/dist/{8X-DqZyMvyV.d.cts → 8X-D6HTLShY.d.ts} +1 -2
  37. package/dist/{8X-Df4DOBOe.d.ts → 8X-DioBXCJ0.d.cts} +1 -1
  38. package/dist/{9X-BaoZtjWF.d.cts → 9X-BjffnXuq.d.cts} +1 -1
  39. package/dist/{9X-BDgifncF.d.ts → 9X-CHZKsIdD.d.ts} +1 -2
  40. package/dist/{9X-BcAb6Uso.d.cts → 9X-CJjPJgIG.d.cts} +1 -1
  41. package/dist/{9X-BhBWlgxG.d.ts → 9X-Cpb6V4JC.d.ts} +1 -2
  42. package/dist/{AX-D6XHWdrY.d.ts → AX-C0w_r3PA.d.ts} +1 -2
  43. package/dist/{AX-BY72FohC.d.cts → AX-DrEd2Ov6.d.cts} +1 -1
  44. package/dist/{BX-D_0C8Qbd.d.ts → BX-C5jc6myN.d.cts} +1 -1
  45. package/dist/{BX-CA0OmrUZ.d.cts → BX-RadlZ-6m.d.ts} +1 -2
  46. package/dist/{CX-glpQSL8x.d.cts → CX-CT1Zzb9D.d.ts} +1 -2
  47. package/dist/{CX-HH4cSZRX.d.ts → CX-oSgvmn3h.d.cts} +1 -1
  48. package/dist/{DX-Dx22ax_I.d.ts → DX-CtUeTKMM.d.ts} +1 -2
  49. package/dist/{DX-DimL1MDM.d.cts → DX-ZIG0enmK.d.cts} +1 -1
  50. package/dist/{EX-BRWh1wFc.d.ts → EX-084Yu7Wt.d.ts} +1 -2
  51. package/dist/{EX-Cx87Ruxl.d.cts → EX-BpWZ5ADq.d.cts} +1 -1
  52. package/dist/{FX-RmjwAr40.d.ts → FX-BrbQM0CW.d.ts} +1 -2
  53. package/dist/{FX-D81UlxNN.d.cts → FX-CvYBEc51.d.cts} +1 -1
  54. package/dist/{GX-CJyo7oDp.d.ts → GX-CU8PZy0G.d.cts} +1 -1
  55. package/dist/{GX-9i7piP9G.d.cts → GX-gKj8iAAh.d.ts} +1 -2
  56. package/dist/{HX-XALBTdLA.d.ts → HX-9D-ZXTy5.d.ts} +1 -2
  57. package/dist/{HX-20GVJAvl.d.cts → HX-DoEErDeE.d.cts} +1 -1
  58. package/dist/{IX-D54NGPsc.d.cts → IX-DR4Fc92A.d.ts} +1 -2
  59. package/dist/{IX-6SZ55QKb.d.ts → IX-jLAUHe8i.d.cts} +1 -1
  60. package/dist/{JX-hQ1XRmLp.d.ts → JX-DIKa9ma-.d.ts} +1 -2
  61. package/dist/{JX-C1RYcwQX.d.cts → JX-DX8BjYQC.d.cts} +1 -1
  62. package/dist/{KX-BNwunEfn.d.ts → KX-DpsJ_unT.d.ts} +1 -2
  63. package/dist/{KX-gQHCIgtQ.d.cts → KX-fZb4_vhw.d.cts} +1 -1
  64. package/dist/{LX-CHYX3X3J.d.ts → LX-D_mI1bk-.d.cts} +1 -1
  65. package/dist/{LX-CPurJGIh.d.cts → LX-DeXPPWUX.d.ts} +1 -2
  66. package/dist/{MX-BnyW5eHf.d.cts → MX-CKMjg_zK.d.ts} +1 -2
  67. package/dist/{MX-BPGLWSUz.d.ts → MX-DlYZhpkT.d.cts} +1 -1
  68. package/dist/{NX-B11fQuco.d.cts → NX-DELEEbad.d.cts} +1 -1
  69. package/dist/{NX-RulN5Ml3.d.ts → NX-oYdb4NDo.d.ts} +1 -2
  70. package/dist/{OX-T-ydRXQS.d.cts → OX-Bid9es3D.d.ts} +1 -2
  71. package/dist/{OX-DgKVSp7I.d.ts → OX-CKPyrIFf.d.cts} +1 -1
  72. package/dist/{PX-DA4A2kEv.d.ts → PX-D7jy9CFk.d.ts} +1 -2
  73. package/dist/{PX-p0n1SzvU.d.cts → PX-SP6NxBtG.d.cts} +1 -1
  74. package/dist/{QX-DrFqsMEs.d.ts → QX-BFWOR4g3.d.ts} +1 -2
  75. package/dist/{QX-CI1NccIB.d.cts → QX-QZA7E2O-.d.cts} +1 -1
  76. package/dist/{RX-Cm7vFcFN.d.ts → RX-DBcgbdeE.d.cts} +1 -1
  77. package/dist/{RX-DnNKol22.d.cts → RX-XHgCyMV1.d.ts} +1 -2
  78. package/dist/{SX-CsPPTu-W.d.ts → SX-Cl8RN8oH.d.ts} +1 -2
  79. package/dist/{SX-BUjiWQYz.d.cts → SX-DmiJeCMN.d.cts} +1 -1
  80. package/dist/{TX-DCY25MdR.d.ts → TX-C1SoDobK.d.cts} +1 -1
  81. package/dist/{TX-DOEpsf05.d.cts → TX-ZymoIbtr.d.ts} +1 -2
  82. package/dist/{UX-DgUOnTFK.d.cts → UX-D-Ndd1ov.d.ts} +1 -2
  83. package/dist/{UX-DauyagHy.d.ts → UX-DFVynFhQ.d.cts} +1 -1
  84. package/dist/{VX-kUX6LM-3.d.cts → VX-B-1b34r7.d.ts} +1 -2
  85. package/dist/{VX-DD4scgCe.d.ts → VX-DsRum5k3.d.cts} +1 -1
  86. package/dist/{WX-DPfyPFFh.d.cts → WX-0GuMjPNZ.d.ts} +1 -2
  87. package/dist/{WX-CjkoppdY.d.ts → WX-VReU5R5M.d.cts} +1 -1
  88. package/dist/{XX-C4C1gQZH.d.cts → XX-CF2NANsy.d.ts} +1 -2
  89. package/dist/{XX-sbsIUOnA.d.ts → XX-ChAviUMj.d.cts} +1 -1
  90. package/dist/{YX-DUdO8mRC.d.ts → YX-B51BbNSg.d.ts} +1 -2
  91. package/dist/{YX-BeT-LsiA.d.cts → YX-QfzeMEKx.d.cts} +1 -1
  92. package/dist/{ZX-DwfcSA-D.d.ts → ZX-BMJS1iAv.d.ts} +1 -2
  93. package/dist/{ZX-BuVTTq-D.d.cts → ZX-Ca2E726a.d.cts} +1 -1
  94. package/dist/api/platform/platformLogin.d.ts +58 -60
  95. package/dist/api/platform/platformLogin.js +1 -1
  96. package/dist/certificate-DFK-788s.cjs +62 -0
  97. package/dist/certificate-DFK-788s.cjs.map +1 -0
  98. package/dist/certificate-aooIRf9A.js +49 -0
  99. package/dist/{classification-codes-C2X4xW5-.d.ts → classification-codes-BKxV-rO9.d.ts} +1 -2
  100. package/dist/{country-code-DsI8Mbzx.d.ts → country-code-CQuaiQm2.d.ts} +1 -2
  101. package/dist/{currencies-DKuDflOO.d.ts → currencies-BYJK-m6v.d.ts} +1 -2
  102. package/dist/document-CARHiGdp.cjs +472 -0
  103. package/dist/document-CARHiGdp.cjs.map +1 -0
  104. package/dist/document-D6VKMAtx.js +405 -0
  105. package/dist/documents-CJ8hqIGH.d.ts +858 -0
  106. package/dist/documents-MGs0EvXh.d.cts +859 -0
  107. package/dist/{e-invoice-C2TxhyrK.d.ts → e-invoice-CmbLQkHw.d.ts} +1 -2
  108. package/dist/{getBaseUrl-Dx6RDC8I.js → getBaseUrl-R3IdgCu3.js} +1 -2
  109. package/dist/{index-B1DSs-wd.d.cts → index-0-EvC6Nv.d.ts} +1 -2
  110. package/dist/{index-FTgB2nM6.d.ts → index-D2_HVwCz.d.cts} +1 -1
  111. package/dist/index.cjs +308 -12
  112. package/dist/index.cjs.map +1 -0
  113. package/dist/index.d.ts +233 -60
  114. package/dist/index.js +306 -11
  115. package/dist/index10.cjs +0 -34
  116. package/dist/index11.cjs +25 -15
  117. package/dist/index11.cjs.map +1 -1
  118. package/dist/index12.cjs +24 -0
  119. package/dist/index12.cjs.map +1 -0
  120. package/dist/index13.cjs +0 -13
  121. package/dist/index15.cjs +3 -2
  122. package/dist/index16.cjs +12 -16
  123. package/dist/index17.cjs +2 -2
  124. package/dist/index18.cjs +336 -204
  125. package/dist/index18.cjs.map +1 -1
  126. package/dist/index19.cjs +325 -105
  127. package/dist/index19.cjs.map +1 -1
  128. package/dist/index20.cjs +136 -133
  129. package/dist/index20.cjs.map +1 -1
  130. package/dist/index21.cjs +203 -59
  131. package/dist/index21.cjs.map +1 -1
  132. package/dist/index22.cjs +104 -262
  133. package/dist/index22.cjs.map +1 -1
  134. package/dist/index23.cjs +132 -74
  135. package/dist/index23.cjs.map +1 -1
  136. package/dist/index24.cjs +59 -102
  137. package/dist/index24.cjs.map +1 -1
  138. package/dist/index25.cjs +262 -68
  139. package/dist/index25.cjs.map +1 -1
  140. package/dist/index26.cjs +74 -107
  141. package/dist/index26.cjs.map +1 -1
  142. package/dist/index27.cjs +102 -95
  143. package/dist/index27.cjs.map +1 -1
  144. package/dist/index28.cjs +68 -13
  145. package/dist/index28.cjs.map +1 -1
  146. package/dist/index29.cjs +107 -33
  147. package/dist/index29.cjs.map +1 -1
  148. package/dist/index30.cjs +95 -14
  149. package/dist/index30.cjs.map +1 -1
  150. package/dist/index31.cjs +11 -22
  151. package/dist/index31.cjs.map +1 -1
  152. package/dist/index32.cjs +31 -13
  153. package/dist/index32.cjs.map +1 -1
  154. package/dist/index33.cjs +12 -7
  155. package/dist/index33.cjs.map +1 -1
  156. package/dist/index34.cjs +22 -7
  157. package/dist/index34.cjs.map +1 -1
  158. package/dist/index35.cjs +13 -10
  159. package/dist/index35.cjs.map +1 -1
  160. package/dist/index36.cjs +7 -6
  161. package/dist/index36.cjs.map +1 -1
  162. package/dist/index37.cjs +7 -101
  163. package/dist/index37.cjs.map +1 -1
  164. package/dist/index38.cjs +10 -106
  165. package/dist/index38.cjs.map +1 -1
  166. package/dist/index39.cjs +6 -119
  167. package/dist/index39.cjs.map +1 -1
  168. package/dist/index40.cjs +101 -106
  169. package/dist/index40.cjs.map +1 -1
  170. package/dist/index41.cjs +106 -98
  171. package/dist/index41.cjs.map +1 -1
  172. package/dist/index42.cjs +119 -118
  173. package/dist/index42.cjs.map +1 -1
  174. package/dist/index43.cjs +106 -127
  175. package/dist/index43.cjs.map +1 -1
  176. package/dist/index44.cjs +98 -117
  177. package/dist/index44.cjs.map +1 -1
  178. package/dist/index45.cjs +118 -14
  179. package/dist/index45.cjs.map +1 -1
  180. package/dist/index46.cjs +127 -95
  181. package/dist/index46.cjs.map +1 -1
  182. package/dist/index47.cjs +117 -142
  183. package/dist/index47.cjs.map +1 -1
  184. package/dist/index48.cjs +14 -114
  185. package/dist/index48.cjs.map +1 -1
  186. package/dist/index49.cjs +95 -144
  187. package/dist/index49.cjs.map +1 -1
  188. package/dist/index5.cjs +0 -25
  189. package/dist/index50.cjs +142 -113
  190. package/dist/index50.cjs.map +1 -1
  191. package/dist/index51.cjs +114 -17
  192. package/dist/index51.cjs.map +1 -1
  193. package/dist/index52.cjs +144 -112
  194. package/dist/index52.cjs.map +1 -1
  195. package/dist/index53.cjs +113 -47
  196. package/dist/index53.cjs.map +1 -1
  197. package/dist/index54.cjs +17 -14
  198. package/dist/index54.cjs.map +1 -1
  199. package/dist/index55.cjs +112 -28
  200. package/dist/index55.cjs.map +1 -1
  201. package/dist/index56.cjs +47 -22
  202. package/dist/index56.cjs.map +1 -1
  203. package/dist/index57.cjs +14 -9
  204. package/dist/index57.cjs.map +1 -1
  205. package/dist/index58.cjs +28 -8
  206. package/dist/index58.cjs.map +1 -1
  207. package/dist/index58.cts.map +1 -0
  208. package/dist/index59.cjs +22 -17
  209. package/dist/index59.cjs.map +1 -1
  210. package/dist/index59.cts.map +1 -1
  211. package/dist/index6.cjs +25 -0
  212. package/dist/{index5.cjs.map → index6.cjs.map} +1 -1
  213. package/dist/index60.cjs +9 -412
  214. package/dist/index60.cjs.map +1 -1
  215. package/dist/index60.cts.map +1 -0
  216. package/dist/index61.cjs +8 -8
  217. package/dist/index61.cjs.map +1 -1
  218. package/dist/index61.cts.map +1 -0
  219. package/dist/index62.cjs +17 -9
  220. package/dist/index62.cjs.map +1 -1
  221. package/dist/index62.cts.map +1 -1
  222. package/dist/index63.cjs +419 -0
  223. package/dist/index63.cjs.map +1 -0
  224. package/dist/index63.cts.map +1 -1
  225. package/dist/index64.cjs +15 -0
  226. package/dist/index64.cjs.map +1 -0
  227. package/dist/index64.cts.map +1 -1
  228. package/dist/index65.cjs +10 -116
  229. package/dist/index65.cjs.map +1 -1
  230. package/dist/index65.cts.map +1 -1
  231. package/dist/index66.cjs +2 -228
  232. package/dist/index66.cts.map +1 -1
  233. package/dist/index8.cjs +0 -25
  234. package/dist/index9.cjs +25 -0
  235. package/dist/{index8.cjs.map → index9.cjs.map} +1 -1
  236. package/dist/msic-codes-C8PJVOaA.d.ts +25 -0
  237. package/dist/{msic-codes-B_1W6lZF.d.cts → msic-codes-CIKdPqag.d.cts} +11 -11
  238. package/dist/{payment-modes-DHihrywe.d.cts → payment-modes-BOTSRC_X.d.ts} +1 -2
  239. package/dist/{payment-modes-B8dNy3SM.d.ts → payment-modes-ghFEXnUl.d.cts} +1 -1
  240. package/dist/platformLogin-PGzMhw1X.cjs.map +1 -1
  241. package/dist/{platformLogin-DsxWWUXr.js → platformLogin-f0bNAoZI.js} +1 -2
  242. package/dist/{signatures-C9QPZTQd.d.ts → signatures-W-_brwdb.d.ts} +1 -2
  243. package/dist/{signatures-BKi9DP2K.d.cts → signatures-hFbt_std.d.cts} +1 -1
  244. package/dist/{state-codes-DXSWtE6a.d.cts → state-codes-BlILGZ9d.d.cts} +1 -1
  245. package/dist/{state-codes-CxG1S9YY.d.ts → state-codes-oeFKlwXZ.d.ts} +1 -2
  246. package/dist/{tax-types-CgwxONDS.d.cts → tax-types-B5sQ8UyN.d.cts} +1 -1
  247. package/dist/{tax-types-CEpfSh5P.d.ts → tax-types-CsQ76JMf.d.ts} +1 -2
  248. package/dist/types/classification-codes.d.ts +1 -1
  249. package/dist/types/country-code.d.ts +1 -1
  250. package/dist/types/currencies.d.ts +1 -1
  251. package/dist/types/documents.d.ts +18 -0
  252. package/dist/types/e-invoice.d.ts +1 -1
  253. package/dist/types/index.d.ts +58 -59
  254. package/dist/types/msic/0X.d.ts +1 -1
  255. package/dist/types/msic/1X.d.ts +1 -1
  256. package/dist/types/msic/2X.d.ts +1 -1
  257. package/dist/types/msic/3X.d.ts +1 -1
  258. package/dist/types/msic/4X.d.ts +1 -1
  259. package/dist/types/msic/5X.d.ts +1 -1
  260. package/dist/types/msic/6X.d.ts +1 -1
  261. package/dist/types/msic/7X.d.ts +1 -1
  262. package/dist/types/msic/8X.d.ts +1 -1
  263. package/dist/types/msic/9X.d.ts +1 -1
  264. package/dist/types/msic-codes.d.ts +11 -11
  265. package/dist/types/payment-modes.d.ts +1 -1
  266. package/dist/types/signatures.d.ts +1 -1
  267. package/dist/types/state-codes.d.ts +1 -1
  268. package/dist/types/tax-types.d.ts +1 -1
  269. package/dist/types/unit/1X.d.ts +1 -1
  270. package/dist/types/unit/2X.d.ts +1 -1
  271. package/dist/types/unit/3X.d.ts +1 -1
  272. package/dist/types/unit/4X.d.ts +1 -1
  273. package/dist/types/unit/5X.d.ts +1 -1
  274. package/dist/types/unit/6X.d.ts +1 -1
  275. package/dist/types/unit/7X.d.ts +1 -1
  276. package/dist/types/unit/8X.d.ts +1 -1
  277. package/dist/types/unit/9X.d.ts +1 -1
  278. package/dist/types/unit/AX.d.ts +1 -1
  279. package/dist/types/unit/BX.d.ts +1 -1
  280. package/dist/types/unit/CX.d.ts +1 -1
  281. package/dist/types/unit/DX.d.ts +1 -1
  282. package/dist/types/unit/EX.d.ts +1 -1
  283. package/dist/types/unit/FX.d.ts +1 -1
  284. package/dist/types/unit/GX.d.ts +1 -1
  285. package/dist/types/unit/HX.d.ts +1 -1
  286. package/dist/types/unit/IX.d.ts +1 -1
  287. package/dist/types/unit/JX.d.ts +1 -1
  288. package/dist/types/unit/KX.d.ts +1 -1
  289. package/dist/types/unit/LX.d.ts +1 -1
  290. package/dist/types/unit/MX.d.ts +1 -1
  291. package/dist/types/unit/NX.d.ts +1 -1
  292. package/dist/types/unit/OX.d.ts +1 -1
  293. package/dist/types/unit/PX.d.ts +1 -1
  294. package/dist/types/unit/QX.d.ts +1 -1
  295. package/dist/types/unit/RX.d.ts +1 -1
  296. package/dist/types/unit/SX.d.ts +1 -1
  297. package/dist/types/unit/TX.d.ts +1 -1
  298. package/dist/types/unit/UX.d.ts +1 -1
  299. package/dist/types/unit/VX.d.ts +1 -1
  300. package/dist/types/unit/WX.d.ts +1 -1
  301. package/dist/types/unit/XX.d.ts +1 -1
  302. package/dist/types/unit/YX.d.ts +1 -1
  303. package/dist/types/unit/ZX.d.ts +1 -1
  304. package/dist/types/unit-types.d.ts +36 -36
  305. package/dist/unit-types-B41YFOLT.d.ts +55 -0
  306. package/dist/unit-types-CjWNk2wS.d.cts +56 -0
  307. package/dist/utils/base64.d.ts +1 -2
  308. package/dist/utils/base64.js +1 -2
  309. package/dist/utils/certificate.d.ts +22 -0
  310. package/dist/utils/certificate.js +3 -0
  311. package/dist/utils/document.d.ts +135 -0
  312. package/dist/utils/document.js +3 -0
  313. package/dist/utils/getBaseUrl.d.ts +1 -2
  314. package/dist/utils/getBaseUrl.js +1 -1
  315. package/dist/utils/helpers.d.ts +271 -0
  316. package/dist/utils/helpers.js +330 -0
  317. package/dist/utils/signature-diagnostics.d.ts +93 -0
  318. package/dist/utils/signature-diagnostics.js +326 -0
  319. package/dist/utils/validation.d.ts +46 -0
  320. package/dist/utils/validation.js +134 -0
  321. package/myinvois-cert.conf.template +23 -0
  322. package/package.json +9 -3
  323. package/scripts/gen-cert.sh +159 -0
  324. package/src/api/platform/platformLogin.ts +1 -1
  325. package/src/index.ts +528 -1
  326. package/src/types/documents.d.ts +870 -0
  327. package/src/types/index.d.ts +1 -1
  328. package/src/utils/certificate.ts +60 -0
  329. package/src/utils/document.ts +852 -0
  330. package/src/utils/helpers.ts +552 -0
  331. package/src/utils/signature-diagnostics.ts +583 -0
  332. package/src/utils/validation.ts +268 -0
  333. package/test/MyInvoiClientWithRealData.test.ts +9 -1
  334. package/test/MyInvoisClient.test.ts +7 -1
  335. package/test/dynamicInvoiceFeatures.test.ts +451 -0
  336. package/test/signAndSubmitInvoice.test.ts +271 -734
  337. package/test/signature-diagnostics.test.ts +130 -0
  338. package/tsconfig.json +0 -3
  339. package/dist/0X-C4IRh_fJ.d.ts.map +0 -1
  340. package/dist/0X-Yw7mZEro.d.cts.map +0 -1
  341. package/dist/1X-Brnls9Jh.d.ts.map +0 -1
  342. package/dist/1X-BwpSoT3o.d.cts.map +0 -1
  343. package/dist/1X-C-_KHV-Q.d.ts.map +0 -1
  344. package/dist/1X-D_aUVsuM.d.cts.map +0 -1
  345. package/dist/2X-Bb6elyzV.d.cts.map +0 -1
  346. package/dist/2X-DkS1BoE5.d.ts.map +0 -1
  347. package/dist/2X-UdQcQW24.d.ts.map +0 -1
  348. package/dist/2X-hClUyw26.d.cts.map +0 -1
  349. package/dist/3X-C7VFD-n-.d.cts.map +0 -1
  350. package/dist/3X-CLMESDvz.d.cts.map +0 -1
  351. package/dist/3X-DFI-4RQQ.d.ts.map +0 -1
  352. package/dist/3X-DVDyspgb.d.ts.map +0 -1
  353. package/dist/4X-CIJ2JJ2w.d.ts.map +0 -1
  354. package/dist/4X-CUR8jlaZ.d.ts.map +0 -1
  355. package/dist/4X-CvScPJTf.d.cts.map +0 -1
  356. package/dist/4X-DIfvpU6V.d.cts.map +0 -1
  357. package/dist/5X-BOUxhadJ.d.cts.map +0 -1
  358. package/dist/5X-C6db432h.d.ts.map +0 -1
  359. package/dist/5X-COsZHUaQ.d.ts.map +0 -1
  360. package/dist/5X-CkLu7Vyd.d.cts.map +0 -1
  361. package/dist/6X-C_fFIcJC.d.ts.map +0 -1
  362. package/dist/6X-ClZDKOTC.d.ts.map +0 -1
  363. package/dist/6X-DE7RJeV6.d.cts.map +0 -1
  364. package/dist/6X-Mf32k1d0.d.cts.map +0 -1
  365. package/dist/7X-BZyesooz.d.ts.map +0 -1
  366. package/dist/7X-Chtd6B66.d.cts.map +0 -1
  367. package/dist/7X-DoCUcp-J.d.cts.map +0 -1
  368. package/dist/7X-kot_VccM.d.ts.map +0 -1
  369. package/dist/8X-Df4DOBOe.d.ts.map +0 -1
  370. package/dist/8X-DkuKAkHz.d.ts.map +0 -1
  371. package/dist/8X-DqZyMvyV.d.cts.map +0 -1
  372. package/dist/8X-Dr9RunRw.d.cts.map +0 -1
  373. package/dist/9X-BDgifncF.d.ts.map +0 -1
  374. package/dist/9X-BaoZtjWF.d.cts.map +0 -1
  375. package/dist/9X-BcAb6Uso.d.cts.map +0 -1
  376. package/dist/9X-BhBWlgxG.d.ts.map +0 -1
  377. package/dist/AX-BY72FohC.d.cts.map +0 -1
  378. package/dist/AX-D6XHWdrY.d.ts.map +0 -1
  379. package/dist/BX-CA0OmrUZ.d.cts.map +0 -1
  380. package/dist/BX-D_0C8Qbd.d.ts.map +0 -1
  381. package/dist/CX-HH4cSZRX.d.ts.map +0 -1
  382. package/dist/CX-glpQSL8x.d.cts.map +0 -1
  383. package/dist/DX-DimL1MDM.d.cts.map +0 -1
  384. package/dist/DX-Dx22ax_I.d.ts.map +0 -1
  385. package/dist/EX-BRWh1wFc.d.ts.map +0 -1
  386. package/dist/EX-Cx87Ruxl.d.cts.map +0 -1
  387. package/dist/FX-D81UlxNN.d.cts.map +0 -1
  388. package/dist/FX-RmjwAr40.d.ts.map +0 -1
  389. package/dist/GX-9i7piP9G.d.cts.map +0 -1
  390. package/dist/GX-CJyo7oDp.d.ts.map +0 -1
  391. package/dist/HX-20GVJAvl.d.cts.map +0 -1
  392. package/dist/HX-XALBTdLA.d.ts.map +0 -1
  393. package/dist/IX-6SZ55QKb.d.ts.map +0 -1
  394. package/dist/IX-D54NGPsc.d.cts.map +0 -1
  395. package/dist/JX-C1RYcwQX.d.cts.map +0 -1
  396. package/dist/JX-hQ1XRmLp.d.ts.map +0 -1
  397. package/dist/KX-BNwunEfn.d.ts.map +0 -1
  398. package/dist/KX-gQHCIgtQ.d.cts.map +0 -1
  399. package/dist/LX-CHYX3X3J.d.ts.map +0 -1
  400. package/dist/LX-CPurJGIh.d.cts.map +0 -1
  401. package/dist/MX-BPGLWSUz.d.ts.map +0 -1
  402. package/dist/MX-BnyW5eHf.d.cts.map +0 -1
  403. package/dist/MyInvoisClient-BrNyMjS-.d.cts +0 -178
  404. package/dist/MyInvoisClient-BrNyMjS-.d.cts.map +0 -1
  405. package/dist/MyInvoisClient-CXu4pdl-.d.ts +0 -178
  406. package/dist/MyInvoisClient-CXu4pdl-.d.ts.map +0 -1
  407. package/dist/MyInvoisClient-Cnvb5iUC.js +0 -299
  408. package/dist/MyInvoisClient-Cnvb5iUC.js.map +0 -1
  409. package/dist/MyInvoisClient-DO1dJfQq.cjs +0 -304
  410. package/dist/MyInvoisClient-DO1dJfQq.cjs.map +0 -1
  411. package/dist/NX-B11fQuco.d.cts.map +0 -1
  412. package/dist/NX-RulN5Ml3.d.ts.map +0 -1
  413. package/dist/OX-DgKVSp7I.d.ts.map +0 -1
  414. package/dist/OX-T-ydRXQS.d.cts.map +0 -1
  415. package/dist/PX-DA4A2kEv.d.ts.map +0 -1
  416. package/dist/PX-p0n1SzvU.d.cts.map +0 -1
  417. package/dist/QX-CI1NccIB.d.cts.map +0 -1
  418. package/dist/QX-DrFqsMEs.d.ts.map +0 -1
  419. package/dist/RX-Cm7vFcFN.d.ts.map +0 -1
  420. package/dist/RX-DnNKol22.d.cts.map +0 -1
  421. package/dist/SX-BUjiWQYz.d.cts.map +0 -1
  422. package/dist/SX-CsPPTu-W.d.ts.map +0 -1
  423. package/dist/TX-DCY25MdR.d.ts.map +0 -1
  424. package/dist/TX-DOEpsf05.d.cts.map +0 -1
  425. package/dist/UX-DauyagHy.d.ts.map +0 -1
  426. package/dist/UX-DgUOnTFK.d.cts.map +0 -1
  427. package/dist/VX-DD4scgCe.d.ts.map +0 -1
  428. package/dist/VX-kUX6LM-3.d.cts.map +0 -1
  429. package/dist/WX-CjkoppdY.d.ts.map +0 -1
  430. package/dist/WX-DPfyPFFh.d.cts.map +0 -1
  431. package/dist/XX-C4C1gQZH.d.cts.map +0 -1
  432. package/dist/XX-sbsIUOnA.d.ts.map +0 -1
  433. package/dist/YX-BeT-LsiA.d.cts.map +0 -1
  434. package/dist/YX-DUdO8mRC.d.ts.map +0 -1
  435. package/dist/ZX-BuVTTq-D.d.cts.map +0 -1
  436. package/dist/ZX-DwfcSA-D.d.ts.map +0 -1
  437. package/dist/api/platform/platformLogin.d.ts.map +0 -1
  438. package/dist/canonicalize-C_fNNpYr.cjs +0 -80
  439. package/dist/canonicalize-C_fNNpYr.cjs.map +0 -1
  440. package/dist/canonicalize-DNUrCGad.js +0 -68
  441. package/dist/canonicalize-DNUrCGad.js.map +0 -1
  442. package/dist/classification-codes-B15PbWxz.d.cts.map +0 -1
  443. package/dist/classification-codes-C2X4xW5-.d.ts.map +0 -1
  444. package/dist/country-code-DPeNFMMi.d.cts.map +0 -1
  445. package/dist/country-code-DsI8Mbzx.d.ts.map +0 -1
  446. package/dist/currencies-DKuDflOO.d.ts.map +0 -1
  447. package/dist/currencies-S5g1gzBU.d.cts.map +0 -1
  448. package/dist/e-invoice-BuwtFnlI.d.cts.map +0 -1
  449. package/dist/e-invoice-C2TxhyrK.d.ts.map +0 -1
  450. package/dist/getBaseUrl-Dx6RDC8I.js.map +0 -1
  451. package/dist/hashCert-Bol7lIh2.js +0 -62
  452. package/dist/hashCert-Bol7lIh2.js.map +0 -1
  453. package/dist/hashCert-mlYEuYex.cjs +0 -68
  454. package/dist/hashCert-mlYEuYex.cjs.map +0 -1
  455. package/dist/hashSignedProperties-9vj5wlYR.js +0 -83
  456. package/dist/hashSignedProperties-9vj5wlYR.js.map +0 -1
  457. package/dist/hashSignedProperties-CU_ZqqmY.cjs +0 -95
  458. package/dist/hashSignedProperties-CU_ZqqmY.cjs.map +0 -1
  459. package/dist/index-B1DSs-wd.d.cts.map +0 -1
  460. package/dist/index-CJNLQVjx.d.ts +0 -1
  461. package/dist/index-FTgB2nM6.d.ts.map +0 -1
  462. package/dist/index-Wy1ONBjV.d.cts +0 -1
  463. package/dist/index10.cjs.map +0 -1
  464. package/dist/index66.cjs.map +0 -1
  465. package/dist/index67.cjs +0 -4
  466. package/dist/index67.cts.map +0 -1
  467. package/dist/index68.cjs +0 -3
  468. package/dist/index68.cts.map +0 -1
  469. package/dist/index69.cjs +0 -4
  470. package/dist/index69.cts.map +0 -1
  471. package/dist/index70.cjs +0 -3
  472. package/dist/index70.cts.map +0 -1
  473. package/dist/index71.cjs +0 -3
  474. package/dist/index71.cts.map +0 -1
  475. package/dist/index72.cjs +0 -3
  476. package/dist/index72.cts.map +0 -1
  477. package/dist/index73.cjs +0 -3
  478. package/dist/index73.cts.map +0 -1
  479. package/dist/invoice-1_1-BJVcw-oE.d.ts +0 -432
  480. package/dist/invoice-1_1-BJVcw-oE.d.ts.map +0 -1
  481. package/dist/invoice-1_1-DWdNPRzr.d.cts +0 -432
  482. package/dist/invoice-1_1-DWdNPRzr.d.cts.map +0 -1
  483. package/dist/invoice1-1-8S-QQn7P.cjs +0 -547
  484. package/dist/invoice1-1-8S-QQn7P.cjs.map +0 -1
  485. package/dist/invoice1-1-CHuLpkFz.js +0 -504
  486. package/dist/invoice1-1-CHuLpkFz.js.map +0 -1
  487. package/dist/msic-codes-B_1W6lZF.d.cts.map +0 -1
  488. package/dist/msic-codes-bs0lTfSZ.d.ts +0 -26
  489. package/dist/msic-codes-bs0lTfSZ.d.ts.map +0 -1
  490. package/dist/payment-modes-B8dNy3SM.d.ts.map +0 -1
  491. package/dist/payment-modes-DHihrywe.d.cts.map +0 -1
  492. package/dist/platformLogin-DsxWWUXr.js.map +0 -1
  493. package/dist/populateFinalDocument-BdyYzz5Y.cjs +0 -96
  494. package/dist/populateFinalDocument-BdyYzz5Y.cjs.map +0 -1
  495. package/dist/populateFinalDocument-BpLXmgLv.js +0 -90
  496. package/dist/populateFinalDocument-BpLXmgLv.js.map +0 -1
  497. package/dist/populateSignedProperties-BJMcBQ6S.cjs +0 -58
  498. package/dist/populateSignedProperties-BJMcBQ6S.cjs.map +0 -1
  499. package/dist/populateSignedProperties-BvGN-YZH.js +0 -52
  500. package/dist/populateSignedProperties-BvGN-YZH.js.map +0 -1
  501. package/dist/sign-B61Cy3gO.cjs +0 -40
  502. package/dist/sign-B61Cy3gO.cjs.map +0 -1
  503. package/dist/sign-DzHK7UhR.js +0 -34
  504. package/dist/sign-DzHK7UhR.js.map +0 -1
  505. package/dist/signatures-BKi9DP2K.d.cts.map +0 -1
  506. package/dist/signatures-C9QPZTQd.d.ts.map +0 -1
  507. package/dist/state-codes-CxG1S9YY.d.ts.map +0 -1
  508. package/dist/state-codes-DXSWtE6a.d.cts.map +0 -1
  509. package/dist/tax-types-CEpfSh5P.d.ts.map +0 -1
  510. package/dist/tax-types-CgwxONDS.d.cts.map +0 -1
  511. package/dist/transform-BLz0S687.cjs +0 -72
  512. package/dist/transform-BLz0S687.cjs.map +0 -1
  513. package/dist/transform-D1q-U6Zj.js +0 -66
  514. package/dist/transform-D1q-U6Zj.js.map +0 -1
  515. package/dist/types/documents/index.d.ts +0 -57
  516. package/dist/types/documents/invoice-1_1.d.ts +0 -56
  517. package/dist/unit-types-1bF0KhIp.d.ts +0 -56
  518. package/dist/unit-types-1bF0KhIp.d.ts.map +0 -1
  519. package/dist/unit-types-CsrkvgfG.d.cts +0 -56
  520. package/dist/unit-types-CsrkvgfG.d.cts.map +0 -1
  521. package/dist/utils/MyInvoisClient.d.ts +0 -60
  522. package/dist/utils/MyInvoisClient.js +0 -13
  523. package/dist/utils/base64.d.ts.map +0 -1
  524. package/dist/utils/base64.js.map +0 -1
  525. package/dist/utils/debug/debug-document-hash.d.ts +0 -100
  526. package/dist/utils/debug/debug-document-hash.d.ts.map +0 -1
  527. package/dist/utils/debug/debug-document-hash.js +0 -120
  528. package/dist/utils/debug/debug-document-hash.js.map +0 -1
  529. package/dist/utils/debug/debug-invoice-submission.d.ts +0 -152
  530. package/dist/utils/debug/debug-invoice-submission.d.ts.map +0 -1
  531. package/dist/utils/debug/debug-invoice-submission.js +0 -226
  532. package/dist/utils/debug/debug-invoice-submission.js.map +0 -1
  533. package/dist/utils/getBaseUrl.d.ts.map +0 -1
  534. package/dist/utils/invoice1-1.d.ts +0 -117
  535. package/dist/utils/invoice1-1.d.ts.map +0 -1
  536. package/dist/utils/invoice1-1.js +0 -10
  537. package/dist/utils/signature/canonicalize.d.ts +0 -26
  538. package/dist/utils/signature/canonicalize.d.ts.map +0 -1
  539. package/dist/utils/signature/canonicalize.js +0 -3
  540. package/dist/utils/signature/hashCert.d.ts +0 -15
  541. package/dist/utils/signature/hashCert.d.ts.map +0 -1
  542. package/dist/utils/signature/hashCert.js +0 -3
  543. package/dist/utils/signature/hashSignedProperties.d.ts +0 -25
  544. package/dist/utils/signature/hashSignedProperties.d.ts.map +0 -1
  545. package/dist/utils/signature/hashSignedProperties.js +0 -3
  546. package/dist/utils/signature/populateFinalDocument.d.ts +0 -23
  547. package/dist/utils/signature/populateFinalDocument.d.ts.map +0 -1
  548. package/dist/utils/signature/populateFinalDocument.js +0 -3
  549. package/dist/utils/signature/populateSignedProperties.d.ts +0 -23
  550. package/dist/utils/signature/populateSignedProperties.d.ts.map +0 -1
  551. package/dist/utils/signature/populateSignedProperties.js +0 -3
  552. package/dist/utils/signature/sign.d.ts +0 -16
  553. package/dist/utils/signature/sign.d.ts.map +0 -1
  554. package/dist/utils/signature/sign.js +0 -3
  555. package/dist/utils/signature/transform.d.ts +0 -16
  556. package/dist/utils/signature/transform.d.ts.map +0 -1
  557. package/dist/utils/signature/transform.js +0 -3
  558. package/src/types/documents/index.d.ts +0 -1
  559. package/src/types/documents/invoice-1_1.d.ts +0 -439
  560. package/src/utils/MyInvoisClient.ts +0 -501
  561. package/src/utils/debug/debug-document-hash.ts +0 -249
  562. package/src/utils/debug/debug-invoice-submission.ts +0 -355
  563. package/src/utils/invoice1-1.ts +0 -671
  564. package/src/utils/signature/canonicalize.ts +0 -104
  565. package/src/utils/signature/hashCert.ts +0 -115
  566. package/src/utils/signature/hashSignedProperties.ts +0 -155
  567. package/src/utils/signature/populateFinalDocument.ts +0 -187
  568. package/src/utils/signature/populateSignedProperties.ts +0 -87
  569. package/src/utils/signature/sign.ts +0 -51
  570. package/src/utils/signature/transform.ts +0 -99
  571. package/test/canonicalize.test.ts +0 -110
  572. package/test/hashCert.test.ts +0 -95
  573. package/test/hashSignedProperties.test.ts +0 -140
  574. package/test/populateFinalDocument.test.ts +0 -218
  575. package/test/populateSignedProperties.test.ts +0 -155
  576. package/test/sign.test.ts +0 -70
  577. package/test/transform.test.ts +0 -158
@@ -1,51 +0,0 @@
1
- import * as crypto from 'crypto'
2
-
3
- /**
4
- * Signs the document hash digest using RSA-SHA256 and a private key.
5
- *
6
- * Corresponds to Step 4 in the MyInvois Signature Creation guide:
7
- * https://sdk.myinvois.hasil.gov.my/signature-creation/#step-4-sign-the-document-digest
8
- *
9
- * @param base64DocDigest The Base64 encoded SHA-256 hash of the canonicalized document (DocDigest from Step 3).
10
- * @param privateKeyPem The private key in PEM format (string or Buffer).
11
- * @returns The Base64 encoded RSA-SHA256 signature (Sig).
12
- * @throws {Error} If signing fails.
13
- */
14
- export function signDocumentDigest(
15
- base64DocDigest: string,
16
- privateKeyPem: string | Buffer,
17
- ): string {
18
- try {
19
- // Add stricter validation: Check if the input string contains only valid Base64 characters.
20
- const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/
21
- if (base64DocDigest.length > 0 && !base64Regex.test(base64DocDigest)) {
22
- throw new Error('Invalid Base64 characters detected in document digest.')
23
- }
24
-
25
- // 1. Decode the Base64 document digest back to a raw buffer
26
- // The signature is calculated over the raw hash bytes, not the Base64 string.
27
- const rawDocDigest = Buffer.from(base64DocDigest, 'base64')
28
-
29
- // Add check: If input Base64 string was not empty, but decoded buffer is,
30
- // it implies invalid Base64 characters were likely ignored instead of throwing.
31
- if (base64DocDigest.length > 0 && rawDocDigest.length === 0) {
32
- throw new Error('Invalid Base64 content for document digest.')
33
- }
34
-
35
- // 2. Create a signer instance with RSA-SHA256
36
- const signer = crypto.createSign('RSA-SHA256')
37
-
38
- // 3. Update the signer with the raw hash digest
39
- // Note: We sign the HASH itself, not the original data.
40
- signer.update(rawDocDigest)
41
- signer.end()
42
-
43
- // 4. Sign using the private key and get the signature in Base64 format
44
- const base64Signature = signer.sign(privateKeyPem, 'base64')
45
-
46
- return base64Signature
47
- } catch (error: any) {
48
- console.error('Error during signing:', error)
49
- throw new Error(`Failed to sign document digest: ${error.message || error}`)
50
- }
51
- }
@@ -1,99 +0,0 @@
1
- // Import necessary components from xmldom-ts and xpath-ts
2
- import { DOMParserImpl, XMLSerializerImpl } from 'xmldom-ts'
3
- import * as xpath from 'xpath-ts'
4
- // Assuming Node and Document types are correctly exposed by xmldom-ts/xpath-ts globally or via import
5
-
6
- /**
7
- * Transforms an XML invoice string according to specific rules using xmldom-ts and xpath-ts:
8
- * - Removes the XML declaration.
9
- * - Removes UBLExtensions and Signature elements within the Invoice element.
10
- * Assumes the input XML is UTF-8 encoded.
11
- *
12
- * @param xmlString The raw XML invoice string.
13
- * @returns The transformed XML string.
14
- * @throws {Error} If parsing fails.
15
- */
16
- export function transformXmlInvoice(xmlString: string): string {
17
- let doc: Document // Use the standard Document type, assuming compatibility
18
- const errors: string[] = []
19
-
20
- // Define separate handlers for each error level as likely expected by xmldom-ts
21
- const handleError = (msg: string) => {
22
- errors.push(`ERROR: ${msg}`)
23
- }
24
- const handleFatalError = (msg: string) => {
25
- errors.push(`FATALERROR: ${msg}`)
26
- }
27
- const handleWarning = (msg: string) => {
28
- console.warn(`WARNING: ${msg}`)
29
- }
30
-
31
- // Use DOMParserImpl from xmldom-ts with the specific error handler structure
32
- const parser = new DOMParserImpl({
33
- locator: {}, // Keep locator, might be useful for error context
34
- errorHandler: {
35
- error: handleError,
36
- fatalError: handleFatalError,
37
- warning: handleWarning,
38
- },
39
- })
40
-
41
- try {
42
- // Use the standard mime type string directly
43
- doc = parser.parseFromString(xmlString, 'application/xml') // Or 'text/xml'
44
- } catch (e: any) {
45
- throw new Error(`XML Parsing Initialization Error: ${e.message || e}`)
46
- }
47
-
48
- // Check for parsererror element
49
- const parserErrors = doc.getElementsByTagName('parsererror')
50
- if (parserErrors.length > 0) {
51
- const errorElement = parserErrors[0]
52
- if (errorElement) {
53
- const errorContent = errorElement.textContent
54
- ? errorElement.textContent.trim()
55
- : 'Unknown parsing error reported by parsererror tag.'
56
- throw new Error(`XML Parsing Error: ${errorContent}`)
57
- } else {
58
- throw new Error('XML Parsing Error: Malformed parsererror tag found.')
59
- }
60
- }
61
-
62
- // If the errorHandler collected errors, throw the first one.
63
- if (errors.length > 0) {
64
- throw new Error(errors[0])
65
- }
66
-
67
- // Use xpath.select from xpath-ts
68
- const select = xpath.select
69
-
70
- // Helper function to remove nodes found by XPath
71
- const removeNodesByXPath = (path: string) => {
72
- const nodesToRemove = select(path, doc) as Node[]
73
-
74
- if (nodesToRemove && nodesToRemove instanceof Array) {
75
- nodesToRemove.forEach(node => {
76
- if (node && node.parentNode) {
77
- node.parentNode.removeChild(node)
78
- }
79
- })
80
- }
81
- }
82
-
83
- // 2. Find and remove UBLExtensions elements
84
- removeNodesByXPath(
85
- "//*[local-name()='Invoice']//*[local-name()='UBLExtensions']",
86
- )
87
-
88
- // 3. Find and remove Signature elements
89
- removeNodesByXPath("//*[local-name()='Invoice']//*[local-name()='Signature']")
90
-
91
- // 4. Serialize the modified DOM back to string using XMLSerializerImpl
92
- const serializer = new XMLSerializerImpl()
93
- let transformedXml = serializer.serializeToString(doc)
94
-
95
- // 5. Remove the XML declaration (if present)
96
- transformedXml = transformedXml.replace(/^<\?xml [^>]*\?>\s*/i, '')
97
-
98
- return transformedXml
99
- }
@@ -1,110 +0,0 @@
1
- import { describe, it, expect } from 'vitest'
2
- import * as crypto from 'crypto'
3
- import { DOMParserImpl } from 'xmldom-ts' // To create Document objects for testing
4
- import { canonicalizeAndHashDocument } from '../src/utils/signature/canonicalize'
5
-
6
- // Helper to calculate expected hash for comparison
7
- const calculateExpectedHash = (canonicalXml: string): string => {
8
- const hash = crypto.createHash('sha256')
9
- hash.update(canonicalXml, 'utf8')
10
- return hash.digest('base64')
11
- }
12
-
13
- describe('canonicalizeAndHashDocument', () => {
14
- const parser = new DOMParserImpl()
15
-
16
- it('should correctly canonicalize (ExcC14N) and hash a simple XML document', async () => {
17
- const inputXml = `<doc att2="val2" att1="val1"><child> Data </child></doc>`
18
- const doc = parser.parseFromString(inputXml, 'application/xml')
19
-
20
- // Expected canonical form (Exclusive C14N, no comments, attributes sorted)
21
- const expectedCanonical = `<doc att1="val1" att2="val2"><child> Data </child></doc>`
22
- const expectedHash = calculateExpectedHash(expectedCanonical)
23
-
24
- await expect(canonicalizeAndHashDocument(doc)).resolves.toEqual(
25
- expectedHash,
26
- )
27
- })
28
-
29
- it('should handle default namespaces correctly during canonicalization', async () => {
30
- const inputXml = `<doc xmlns="http://example.com"><child>Data</child></doc>`
31
- const doc = parser.parseFromString(inputXml, 'application/xml')
32
-
33
- // Expected canonical form (xmlns attribute added)
34
- const expectedCanonical = `<doc xmlns="http://example.com"><child>Data</child></doc>`
35
- const expectedHash = calculateExpectedHash(expectedCanonical)
36
-
37
- await expect(canonicalizeAndHashDocument(doc)).resolves.toEqual(
38
- expectedHash,
39
- )
40
- })
41
-
42
- it('should handle prefixed namespaces correctly and sort attributes', async () => {
43
- const inputXml = `<p:doc xmlns:p="http://example.com" att2="v2" p:att1="v1"></p:doc>`
44
- const doc = parser.parseFromString(inputXml, 'application/xml')
45
-
46
- // Note: The canonical form produced by the library might differ slightly from
47
- // strict spec examples regarding attribute order.
48
- // We are now using the hash actually produced by the library for this input as the expected value.
49
- const expectedHash = 'N8sCdTHmSlLndeR32fPyaep7goI/D9ndkgvQV72a/Is=' // Updated based on test run
50
-
51
- // We no longer need to calculate the hash from an assumed canonical string in the test
52
- // const expectedCanonical = `<p:doc xmlns:p="http://example.com" p:att1="v1" att2="v2"></p:doc>`;
53
- // const expectedHash = calculateExpectedHash(expectedCanonical);
54
-
55
- await expect(canonicalizeAndHashDocument(doc)).resolves.toEqual(
56
- expectedHash,
57
- )
58
- })
59
-
60
- it('should handle self-closing tags correctly', async () => {
61
- const inputXml = `<doc><empty att="val"/></doc>`
62
- const doc = parser.parseFromString(inputXml, 'application/xml')
63
-
64
- // Expected canonical form (self-closing tag expanded)
65
- const expectedCanonical = `<doc><empty att="val"></empty></doc>`
66
- const expectedHash = calculateExpectedHash(expectedCanonical)
67
-
68
- await expect(canonicalizeAndHashDocument(doc)).resolves.toEqual(
69
- expectedHash,
70
- )
71
- })
72
-
73
- it('should handle character references correctly', async () => {
74
- const inputXml = `<doc>&lt; &amp; &gt; &apos; &quot;</doc>`
75
- const doc = parser.parseFromString(inputXml, 'application/xml')
76
-
77
- // Expected canonical form (special characters escaped)
78
- const expectedCanonical = `<doc>&lt; &amp; &gt; ' "</doc>`
79
- const expectedHash = calculateExpectedHash(expectedCanonical)
80
-
81
- await expect(canonicalizeAndHashDocument(doc)).resolves.toEqual(
82
- expectedHash,
83
- )
84
- })
85
-
86
- it('should handle potential canonicalization failures gracefully', async () => {
87
- // This test checks if the function either resolves to a string (graceful handling)
88
- // or rejects with a specific error pattern if canonicalization truly fails.
89
- // Testing actual canonicalization failure usually requires mocking the underlying library.
90
- const potentiallyProblematicXml = `<doc><unusual /></doc>` // Example input
91
- const doc = parser.parseFromString(
92
- potentiallyProblematicXml,
93
- 'application/xml',
94
- )
95
-
96
- try {
97
- const result = await canonicalizeAndHashDocument(doc)
98
- // If it resolves, check the type
99
- expect(result).toEqual(expect.any(String))
100
- // console.warn("Test Warning: Canonicalization succeeded for potentially problematic XML.");
101
- } catch (error: any) {
102
- // If it rejects, check the error
103
- expect(error).toBeInstanceOf(Error)
104
- // Check if the error message starts with the expected text
105
- expect(error.message).toMatch(/^Canonicalization failed/)
106
- }
107
- })
108
-
109
- // Add more tests for edge cases like comments (if using #WithComments algorithm), PIs, etc.
110
- })
@@ -1,95 +0,0 @@
1
- import { describe, it, expect } from 'vitest'
2
- import * as crypto from 'crypto'
3
- import { hashCertificate } from '../src/utils/signature/hashCert'
4
-
5
- // Use a more structured, plausible (but still generated) PEM certificate for testing the process.
6
- // NOTE: To test against a *known external hash value*, replace this with a real
7
- // certificate PEM and its pre-calculated SHA-256 Base64 hash.
8
- const sampleValidPem = `
9
- -----BEGIN CERTIFICATE-----
10
- MIIDBjCCAe6gAwIBAgIQCisE3VSEefMG1/VZf0J4IzANBgkqhkiG9w0BAQsF
11
- ADBFMQswCQYDVQQGEwJNWTEUMBIGA1UEChMLVGVzdCBDQSBQS0kxGDAWBgNV
12
- BAMTD1Rlc3QgUm9vdCBDQSBLSzAeFw0yNDAxMDEwMDAwMDBaFw0zNDAxMDEw
13
- MDAwMDBaMD8xCzAJBgNVBAYTAk1ZMRMwEQYDVQQKEwpUZXN0IFN1YkNBMRsw
14
- GQYDVQQDExJUZXN0IENlcnRpZmljYXRlMIIBIjANBgkqhkiG9w0BAQEFAAOC
15
- AQ8AMIIBCgKCAQEAs/dKx0mC4c7k/w==
16
- -----END CERTIFICATE-----
17
- `
18
-
19
- const sampleInvalidPemNoContent = `
20
- -----BEGIN CERTIFICATE-----
21
- -----END CERTIFICATE-----
22
- `
23
-
24
- const sampleInvalidPemBadFormat = `This is not a PEM certificate`
25
-
26
- const samplePemWithInvalidBase64 = `
27
- -----BEGIN CERTIFICATE-----
28
- MIIDBjCCAe6gAwIBAgIQCisE3VSEefMG1/VZf0J4IzANBgkqhkiG9w0BAQsF
29
- ADBFMQswCQYDVQQGEwJNWTEUMBIGA1UEChMLVGVzdCBDQSBQS0kxGDAWBgNV
30
- ***INVALID CHARACTERS HERE !@#$%^&*()***
31
- BAMTD1Rlc3QgUm9vdCBDQSBLSzAeFw0yNDAxMDEwMDAwMDBaFw0zNDAxMDEw
32
- MDAwMDBaMD8xCzAJBgNVBAYTAk1ZMRMwEQYDVQQKEwpUZXN0IFN1YkNBMRsw
33
- AQ8AMIIBCgKCAQEAs/dKx0mC4c7k/w==
34
- -----END CERTIFICATE-----
35
- `
36
-
37
- // Helper to calculate expected hash by extracting/cleaning/hashing PEM
38
- // Mimics the core logic of hashCertificate for comparison
39
- const calculateExpectedCertHash = (pemCert: string): string => {
40
- const beginMarker = '-----BEGIN CERTIFICATE-----'
41
- const endMarker = '-----END CERTIFICATE-----'
42
- let base64Der = ''
43
-
44
- const startIndex = pemCert.indexOf(beginMarker)
45
- const endIndex = pemCert.indexOf(endMarker)
46
-
47
- if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {
48
- const content = pemCert.substring(startIndex + beginMarker.length, endIndex)
49
- base64Der = content.replace(/[^A-Za-z0-9+/=]/g, '')
50
- } else {
51
- throw new Error('Helper could not find certificate markers')
52
- }
53
-
54
- if (base64Der.length === 0) {
55
- throw new Error('Helper found no Base64 content')
56
- }
57
-
58
- const rawDer = Buffer.from(base64Der, 'base64')
59
- const hash = crypto.createHash('sha256')
60
- hash.update(rawDer)
61
- return hash.digest('base64')
62
- }
63
-
64
- describe('hashCertificate', () => {
65
- it('should correctly hash a valid PEM certificate (testing process)', () => {
66
- const expectedHash = calculateExpectedCertHash(sampleValidPem)
67
- const actualHash = hashCertificate(sampleValidPem)
68
- expect(actualHash).toEqual(expectedHash)
69
- expect(() => Buffer.from(actualHash, 'base64')).not.toThrow()
70
- })
71
-
72
- it('should throw an error for PEM with no content', () => {
73
- expect(() => hashCertificate(sampleInvalidPemNoContent)).toThrow(
74
- 'Failed to hash certificate: Invalid PEM format: No Base64 content found between markers after cleaning.',
75
- )
76
- })
77
-
78
- it('should throw an error for non-PEM input (missing markers)', () => {
79
- expect(() => hashCertificate(sampleInvalidPemBadFormat)).toThrow(
80
- /^Failed to hash certificate: Invalid PEM format: Missing or misplaced BEGIN\/END markers/,
81
- )
82
- })
83
-
84
- it('should throw an error for empty string input', () => {
85
- expect(() => hashCertificate('')).toThrow(
86
- /^Failed to hash certificate: Invalid PEM format: Missing or misplaced BEGIN\/END markers/,
87
- )
88
- })
89
-
90
- it('should throw an error for invalid Base64 characters within valid markers', () => {
91
- expect(() => hashCertificate(samplePemWithInvalidBase64)).toThrow(
92
- /^Failed to hash certificate: Invalid non-Base64, non-whitespace characters detected/,
93
- )
94
- })
95
- })
@@ -1,140 +0,0 @@
1
- import { describe, it, expect } from 'vitest'
2
- import { DOMParserImpl } from 'xmldom-ts'
3
- import * as xpath from 'xpath-ts'
4
- import * as crypto from 'crypto'
5
- import c14nFactory from 'xml-c14n'
6
- import { hashSignedProperties } from '../src/utils/signature/hashSignedProperties'
7
-
8
- // Define namespaces matching those in the function
9
- const ns = {
10
- inv: 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2',
11
- ext: 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2',
12
- sig: 'urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2',
13
- sac: 'urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2',
14
- ds: 'http://www.w3.org/2000/09/xmldsig#',
15
- xades: 'http://uri.etsi.org/01903/v1.3.2#',
16
- }
17
- const select = xpath.useNamespaces(ns)
18
-
19
- // Sample XML with a populated SignedProperties section
20
- const sampleXmlWithSignedProps = `
21
- <inv:Invoice xmlns:inv="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
22
- xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
23
- xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2"
24
- xmlns:sac="urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2"
25
- xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
26
- xmlns:xades="http://uri.etsi.org/01903/v1.3.2#">
27
- <ext:UBLExtensions>
28
- <ext:UBLExtension>
29
- <ext:ExtensionContent>
30
- <sig:UBLDocumentSignatures>
31
- <sac:SignatureInformation>
32
- <ds:Signature>
33
- <ds:Object>
34
- <xades:QualifyingProperties>
35
- <xades:SignedProperties>
36
- <xades:SignedSignatureProperties>
37
- <xades:SigningTime>2024-01-01T12:00:00Z</xades:SigningTime>
38
- <xades:SigningCertificate>
39
- <xades:Cert>
40
- <xades:CertDigest>
41
- <ds:DigestValue>TEST_CERT_DIGEST==</ds:DigestValue>
42
- </xades:CertDigest>
43
- <xades:IssuerSerial>
44
- <ds:X509IssuerName>CN=Test Issuer, O=Test Org</ds:X509IssuerName>
45
- <ds:X509SerialNumber>1234567890</ds:X509SerialNumber>
46
- </xades:IssuerSerial>
47
- </xades:Cert>
48
- </xades:SigningCertificate>
49
- </xades:SignedSignatureProperties>
50
- </xades:SignedProperties>
51
- </xades:QualifyingProperties>
52
- </ds:Object>
53
- </ds:Signature>
54
- </sac:SignatureInformation>
55
- </sig:UBLDocumentSignatures>
56
- </ext:ExtensionContent>
57
- </ext:UBLExtension>
58
- </ext:UBLExtensions>
59
- </inv:Invoice>
60
- `
61
-
62
- // Helper to canonicalize and hash a given node (for comparison)
63
- const calculateExpectedPropsHash = (node: Node): Promise<string> => {
64
- return new Promise((resolve, reject) => {
65
- try {
66
- const c14n = c14nFactory()
67
- const algorithmUri = 'http://www.w3.org/2001/10/xml-exc-c14n#'
68
- const canonicaliser = c14n.createCanonicaliser(algorithmUri)
69
-
70
- canonicaliser.canonicalise(node, (error, canonicalXml) => {
71
- if (error) return reject(error)
72
- if (typeof canonicalXml !== 'string')
73
- return reject(new Error('Canonicalization failed in helper'))
74
-
75
- const hash = crypto.createHash('sha256')
76
- hash.update(canonicalXml, 'utf8')
77
- resolve(hash.digest('base64'))
78
- })
79
- } catch (e) {
80
- reject(e)
81
- }
82
- })
83
- }
84
-
85
- describe('hashSignedProperties', () => {
86
- const parser = new DOMParserImpl()
87
-
88
- it('should correctly hash the SignedProperties element', async () => {
89
- const doc = parser.parseFromString(
90
- sampleXmlWithSignedProps,
91
- 'application/xml',
92
- )
93
-
94
- // Find the node in the test to calculate the expected hash
95
- const signedPropertiesXPath = '//xades:SignedProperties' // Simplified XPath for test verification
96
- const nodes = select(signedPropertiesXPath, doc)
97
- expect(nodes).toBeInstanceOf(Array)
98
- expect(nodes).toHaveLength(1)
99
- const signedPropsNode = nodes[0] as Node
100
-
101
- const expectedHash = await calculateExpectedPropsHash(signedPropsNode)
102
- const actualHash = await hashSignedProperties(doc)
103
-
104
- expect(actualHash).toEqual(expectedHash)
105
- // Check if the output is a valid Base64 string
106
- expect(() => Buffer.from(actualHash, 'base64')).not.toThrow()
107
- })
108
-
109
- it('should throw error if SignedProperties element is missing', async () => {
110
- // Create XML missing the target element
111
- const modifiedXml = sampleXmlWithSignedProps.replace(
112
- /<xades:SignedProperties>.*<\/xades:SignedProperties>/s,
113
- '',
114
- )
115
- const doc = parser.parseFromString(modifiedXml, 'application/xml')
116
-
117
- await expect(hashSignedProperties(doc)).rejects.toThrow(
118
- /^SignedProperties processing setup failed: SignedProperties element not found/,
119
- )
120
- })
121
-
122
- it('should throw error if multiple SignedProperties elements are found', async () => {
123
- // Create XML with duplicate target elements
124
- const signedPropsBlock =
125
- sampleXmlWithSignedProps.match(
126
- /<xades:SignedProperties>.*<\/xades:SignedProperties>/s,
127
- )?.[0] || ''
128
- const modifiedXml = sampleXmlWithSignedProps.replace(
129
- signedPropsBlock,
130
- `${signedPropsBlock}${signedPropsBlock}`, // Duplicate the block
131
- )
132
- const doc = parser.parseFromString(modifiedXml, 'application/xml')
133
-
134
- await expect(hashSignedProperties(doc)).rejects.toThrow(
135
- /^SignedProperties processing setup failed: Multiple SignedProperties elements found/,
136
- )
137
- })
138
-
139
- // Add test for canonicalization failure if possible (requires mocking c14n)
140
- })