@ripwords/myinvois-client 0.1.0 → 0.1.2

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 (575) hide show
  1. package/CHANGELOG.md +99 -0
  2. package/README.md +128 -4
  3. package/bun.lock +59 -0
  4. package/dist/{0X-Yw7mZEro.d.cts → 0X-CG1S1WKn.d.ts} +1 -2
  5. package/dist/{0X-C4IRh_fJ.d.ts → 0X-ChfmeAYF.d.cts} +1 -1
  6. package/dist/{1X-D_aUVsuM.d.cts → 1X-CmlbG02M.d.ts} +1 -2
  7. package/dist/{1X-BwpSoT3o.d.cts → 1X-DFikQbP0.d.cts} +1 -1
  8. package/dist/{1X-C-_KHV-Q.d.ts → 1X-DbFshzup.d.ts} +1 -2
  9. package/dist/{1X-Brnls9Jh.d.ts → 1X-jFrFCOs0.d.cts} +1 -1
  10. package/dist/{2X-UdQcQW24.d.ts → 2X-5cE4ojEX.d.cts} +1 -1
  11. package/dist/{2X-hClUyw26.d.cts → 2X-DA6J6Wd7.d.ts} +1 -2
  12. package/dist/{2X-Bb6elyzV.d.cts → 2X-FWZ1rYVt.d.cts} +1 -1
  13. package/dist/{2X-DkS1BoE5.d.ts → 2X-eC_p0QJf.d.ts} +1 -2
  14. package/dist/{3X-C7VFD-n-.d.cts → 3X-D9duw0Ro.d.cts} +1 -1
  15. package/dist/{3X-DFI-4RQQ.d.ts → 3X-DbfkwdkO.d.ts} +1 -2
  16. package/dist/{3X-DVDyspgb.d.ts → 3X-GxuN79Ax.d.ts} +1 -2
  17. package/dist/{3X-CLMESDvz.d.cts → 3X-r9xbWJ2l.d.cts} +1 -1
  18. package/dist/{4X-CIJ2JJ2w.d.ts → 4X-1ZkK-uH5.d.cts} +1 -1
  19. package/dist/{4X-CUR8jlaZ.d.ts → 4X-CLO9OuKa.d.cts} +1 -1
  20. package/dist/{4X-DIfvpU6V.d.cts → 4X-CnHtgO6u.d.ts} +1 -2
  21. package/dist/{4X-CvScPJTf.d.cts → 4X-DYz_nYSD.d.ts} +1 -2
  22. package/dist/{5X-COsZHUaQ.d.ts → 5X-BzPEdkbC.d.ts} +1 -2
  23. package/dist/{5X-C6db432h.d.ts → 5X-BziH0a09.d.cts} +1 -1
  24. package/dist/{5X-BOUxhadJ.d.cts → 5X-Cfe39fFc.d.cts} +1 -1
  25. package/dist/{5X-CkLu7Vyd.d.cts → 5X-kBF74qx1.d.ts} +1 -2
  26. package/dist/{6X-C_fFIcJC.d.ts → 6X-BceErbps.d.cts} +1 -1
  27. package/dist/{6X-DE7RJeV6.d.cts → 6X-C_xpeu6J.d.ts} +1 -2
  28. package/dist/{6X-ClZDKOTC.d.ts → 6X-DLWEe1bP.d.cts} +1 -1
  29. package/dist/{6X-Mf32k1d0.d.cts → 6X-sQZfT0ZK.d.ts} +1 -2
  30. package/dist/{7X-Chtd6B66.d.cts → 7X-Bet2agJ6.d.ts} +1 -2
  31. package/dist/{7X-kot_VccM.d.ts → 7X-BoKQxMoO.d.ts} +1 -2
  32. package/dist/{7X-BZyesooz.d.ts → 7X-CucHYQsA.d.cts} +1 -1
  33. package/dist/{7X-DoCUcp-J.d.cts → 7X-CwPAqozm.d.cts} +1 -1
  34. package/dist/{8X-Df4DOBOe.d.ts → 8X-BIjJ9kaV.d.cts} +1 -1
  35. package/dist/{8X-Dr9RunRw.d.cts → 8X-BOEWATU3.d.ts} +1 -2
  36. package/dist/{8X-DkuKAkHz.d.ts → 8X-CJpqd5xp.d.cts} +1 -1
  37. package/dist/{8X-DqZyMvyV.d.cts → 8X-s5AzkHR-.d.ts} +1 -2
  38. package/dist/{9X-BDgifncF.d.ts → 9X-BBDP1gZ6.d.ts} +1 -2
  39. package/dist/{9X-BaoZtjWF.d.cts → 9X-CP5Xp6bE.d.cts} +1 -1
  40. package/dist/{9X-BcAb6Uso.d.cts → 9X-D3aOVCnz.d.cts} +1 -1
  41. package/dist/{9X-BhBWlgxG.d.ts → 9X-DAAZV4sr.d.ts} +1 -2
  42. package/dist/{AX-D6XHWdrY.d.ts → AX-CmpMMhII.d.ts} +1 -2
  43. package/dist/{AX-BY72FohC.d.cts → AX-DFzpxGOT.d.cts} +1 -1
  44. package/dist/{BX-D_0C8Qbd.d.ts → BX-CyiqNE6b.d.cts} +1 -1
  45. package/dist/{BX-CA0OmrUZ.d.cts → BX-j78z_ju_.d.ts} +1 -2
  46. package/dist/{CX-glpQSL8x.d.cts → CX-B6rEhQx7.d.ts} +1 -2
  47. package/dist/{CX-HH4cSZRX.d.ts → CX-BTPvC3Dv.d.cts} +1 -1
  48. package/dist/{DX-DimL1MDM.d.cts → DX-BD4-hTCh.d.cts} +1 -1
  49. package/dist/{DX-Dx22ax_I.d.ts → DX-CAmMnx5a.d.ts} +1 -2
  50. package/dist/{EX-BRWh1wFc.d.ts → EX-CXhSC85J.d.ts} +1 -2
  51. package/dist/{EX-Cx87Ruxl.d.cts → EX-mTHCH0Yk.d.cts} +1 -1
  52. package/dist/{FX-D81UlxNN.d.cts → FX-DOOMoQl2.d.cts} +1 -1
  53. package/dist/{FX-RmjwAr40.d.ts → FX-DYVIJ3l0.d.ts} +1 -2
  54. package/dist/{GX-CJyo7oDp.d.ts → GX-8URJ7WHz.d.cts} +1 -1
  55. package/dist/{GX-9i7piP9G.d.cts → GX-eBOVHqi6.d.ts} +1 -2
  56. package/dist/{HX-20GVJAvl.d.cts → HX-49z8CzsE.d.cts} +1 -1
  57. package/dist/{HX-XALBTdLA.d.ts → HX-Dz5T0xXI.d.ts} +1 -2
  58. package/dist/{IX-6SZ55QKb.d.ts → IX-B6kblmBs.d.cts} +1 -1
  59. package/dist/{IX-D54NGPsc.d.cts → IX-PiKYro5a.d.ts} +1 -2
  60. package/dist/{JX-C1RYcwQX.d.cts → JX-DMwHLGEE.d.cts} +1 -1
  61. package/dist/{JX-hQ1XRmLp.d.ts → JX-Dvnt0mSK.d.ts} +1 -2
  62. package/dist/{KX-BNwunEfn.d.ts → KX-BUb8e0yg.d.ts} +1 -2
  63. package/dist/{KX-gQHCIgtQ.d.cts → KX-DaJPkefl.d.cts} +1 -1
  64. package/dist/{LX-CHYX3X3J.d.ts → LX-BnILxjdS.d.cts} +1 -1
  65. package/dist/{LX-CPurJGIh.d.cts → LX-l5ZBaGov.d.ts} +1 -2
  66. package/dist/{MX-BPGLWSUz.d.ts → MX-BbPO8mTj.d.cts} +1 -1
  67. package/dist/{MX-BnyW5eHf.d.cts → MX-C7C15AWi.d.ts} +1 -2
  68. package/dist/{NX-RulN5Ml3.d.ts → NX-C7nFVC-D.d.ts} +1 -2
  69. package/dist/{NX-B11fQuco.d.cts → NX-xy5uw7H3.d.cts} +1 -1
  70. package/dist/{OX-DgKVSp7I.d.ts → OX-CIzARbON.d.cts} +1 -1
  71. package/dist/{OX-T-ydRXQS.d.cts → OX-Dmkvcaij.d.ts} +1 -2
  72. package/dist/{PX-DA4A2kEv.d.ts → PX-BKZ14N7N.d.ts} +1 -2
  73. package/dist/{PX-p0n1SzvU.d.cts → PX-CL8waFgx.d.cts} +1 -1
  74. package/dist/{QX-DrFqsMEs.d.ts → QX-6xdSNtxZ.d.ts} +1 -2
  75. package/dist/{QX-CI1NccIB.d.cts → QX-BowAYqZb.d.cts} +1 -1
  76. package/dist/{RX-DnNKol22.d.cts → RX-DFoiOK5q.d.ts} +1 -2
  77. package/dist/{RX-Cm7vFcFN.d.ts → RX-fWoWcHTG.d.cts} +1 -1
  78. package/dist/{SX-BUjiWQYz.d.cts → SX-CZ3e31OT.d.cts} +1 -1
  79. package/dist/{SX-CsPPTu-W.d.ts → SX-D-Szi9wa.d.ts} +1 -2
  80. package/dist/{TX-DCY25MdR.d.ts → TX-CJhJ-HYX.d.cts} +1 -1
  81. package/dist/{TX-DOEpsf05.d.cts → TX-DTfkGsqn.d.ts} +1 -2
  82. package/dist/{UX-DgUOnTFK.d.cts → UX-Bw4HHAj4.d.ts} +1 -2
  83. package/dist/{UX-DauyagHy.d.ts → UX-P7-u2y70.d.cts} +1 -1
  84. package/dist/{VX-DD4scgCe.d.ts → VX-C8Eu5gQf.d.cts} +1 -1
  85. package/dist/{VX-kUX6LM-3.d.cts → VX-DCv5x_hi.d.ts} +1 -2
  86. package/dist/{WX-DPfyPFFh.d.cts → WX-BYtJ5_if.d.ts} +1 -2
  87. package/dist/{WX-CjkoppdY.d.ts → WX-DkiaqB2V.d.cts} +1 -1
  88. package/dist/{XX-sbsIUOnA.d.ts → XX-D4p4iK-a.d.cts} +1 -1
  89. package/dist/{XX-C4C1gQZH.d.cts → XX-Jo1yJO3A.d.ts} +1 -2
  90. package/dist/{YX-DUdO8mRC.d.ts → YX-BvGmEsVG.d.ts} +1 -2
  91. package/dist/{YX-BeT-LsiA.d.cts → YX-Du8zv9qz.d.cts} +1 -1
  92. package/dist/{ZX-BuVTTq-D.d.cts → ZX-B4jFD-21.d.cts} +1 -1
  93. package/dist/{ZX-DwfcSA-D.d.ts → ZX-B59AJcBY.d.ts} +1 -2
  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-DMIMRJV0.cjs +472 -0
  103. package/dist/document-DMIMRJV0.cjs.map +1 -0
  104. package/dist/document-NQos5fSr.js +405 -0
  105. package/dist/documents-BVG7KIKY.d.ts +847 -0
  106. package/dist/documents-C066EC9m.d.cts +848 -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 +2 -63
  131. package/dist/index22.cjs +203 -262
  132. package/dist/index22.cjs.map +1 -1
  133. package/dist/index23.cjs +104 -74
  134. package/dist/index23.cjs.map +1 -1
  135. package/dist/index24.cjs +132 -102
  136. package/dist/index24.cjs.map +1 -1
  137. package/dist/index25.cjs +59 -68
  138. package/dist/index25.cjs.map +1 -1
  139. package/dist/index26.cjs +262 -107
  140. package/dist/index26.cjs.map +1 -1
  141. package/dist/index27.cjs +74 -95
  142. package/dist/index27.cjs.map +1 -1
  143. package/dist/index28.cjs +102 -13
  144. package/dist/index28.cjs.map +1 -1
  145. package/dist/index29.cjs +68 -33
  146. package/dist/index29.cjs.map +1 -1
  147. package/dist/index30.cjs +107 -14
  148. package/dist/index30.cjs.map +1 -1
  149. package/dist/index31.cjs +95 -24
  150. package/dist/index31.cjs.map +1 -1
  151. package/dist/index32.cjs +11 -13
  152. package/dist/index32.cjs.map +1 -1
  153. package/dist/index33.cjs +31 -7
  154. package/dist/index33.cjs.map +1 -1
  155. package/dist/index34.cjs +12 -7
  156. package/dist/index34.cjs.map +1 -1
  157. package/dist/index35.cjs +22 -10
  158. package/dist/index35.cjs.map +1 -1
  159. package/dist/index36.cjs +13 -6
  160. package/dist/index36.cjs.map +1 -1
  161. package/dist/index37.cjs +7 -101
  162. package/dist/index37.cjs.map +1 -1
  163. package/dist/index38.cjs +7 -106
  164. package/dist/index38.cjs.map +1 -1
  165. package/dist/index39.cjs +10 -119
  166. package/dist/index39.cjs.map +1 -1
  167. package/dist/index40.cjs +6 -106
  168. package/dist/index40.cjs.map +1 -1
  169. package/dist/index41.cjs +101 -98
  170. package/dist/index41.cjs.map +1 -1
  171. package/dist/index42.cjs +106 -118
  172. package/dist/index42.cjs.map +1 -1
  173. package/dist/index43.cjs +119 -127
  174. package/dist/index43.cjs.map +1 -1
  175. package/dist/index44.cjs +106 -117
  176. package/dist/index44.cjs.map +1 -1
  177. package/dist/index45.cjs +98 -14
  178. package/dist/index45.cjs.map +1 -1
  179. package/dist/index46.cjs +118 -95
  180. package/dist/index46.cjs.map +1 -1
  181. package/dist/index47.cjs +127 -142
  182. package/dist/index47.cjs.map +1 -1
  183. package/dist/index48.cjs +117 -114
  184. package/dist/index48.cjs.map +1 -1
  185. package/dist/index49.cjs +14 -144
  186. package/dist/index49.cjs.map +1 -1
  187. package/dist/index5.cjs +0 -25
  188. package/dist/index50.cjs +95 -113
  189. package/dist/index50.cjs.map +1 -1
  190. package/dist/index51.cjs +142 -17
  191. package/dist/index51.cjs.map +1 -1
  192. package/dist/index52.cjs +114 -112
  193. package/dist/index52.cjs.map +1 -1
  194. package/dist/index53.cjs +144 -47
  195. package/dist/index53.cjs.map +1 -1
  196. package/dist/index54.cjs +113 -14
  197. package/dist/index54.cjs.map +1 -1
  198. package/dist/index55.cjs +17 -28
  199. package/dist/index55.cjs.map +1 -1
  200. package/dist/index56.cjs +112 -22
  201. package/dist/index56.cjs.map +1 -1
  202. package/dist/index57.cjs +47 -9
  203. package/dist/index57.cjs.map +1 -1
  204. package/dist/index58.cjs +14 -8
  205. package/dist/index58.cjs.map +1 -1
  206. package/dist/index58.cts.map +1 -0
  207. package/dist/index59.cjs +28 -17
  208. package/dist/index59.cjs.map +1 -1
  209. package/dist/index59.cts.map +1 -1
  210. package/dist/index6.cjs +25 -0
  211. package/dist/{index5.cjs.map → index6.cjs.map} +1 -1
  212. package/dist/index60.cjs +22 -412
  213. package/dist/index60.cjs.map +1 -1
  214. package/dist/index60.cts.map +1 -0
  215. package/dist/index61.cjs +9 -8
  216. package/dist/index61.cjs.map +1 -1
  217. package/dist/index61.cts.map +1 -0
  218. package/dist/index62.cjs +8 -9
  219. package/dist/index62.cjs.map +1 -1
  220. package/dist/index62.cts.map +1 -1
  221. package/dist/index63.cjs +24 -0
  222. package/dist/index63.cjs.map +1 -0
  223. package/dist/index63.cts.map +1 -1
  224. package/dist/index64.cjs +419 -0
  225. package/dist/index64.cjs.map +1 -0
  226. package/dist/index64.cts.map +1 -1
  227. package/dist/index65.cjs +9 -116
  228. package/dist/index65.cjs.map +1 -1
  229. package/dist/index65.cts.map +1 -1
  230. package/dist/index66.cjs +10 -223
  231. package/dist/index66.cjs.map +1 -1
  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-B_1W6lZF.d.cts → msic-codes-CPWVNnpq.d.cts} +11 -11
  237. package/dist/msic-codes-DToUqTI6.d.ts +25 -0
  238. package/dist/{payment-modes-DHihrywe.d.cts → payment-modes-DA7uBIGb.d.ts} +1 -2
  239. package/dist/{payment-modes-B8dNy3SM.d.ts → payment-modes-FX88uyhP.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-CG175mpg.d.ts} +1 -2
  243. package/dist/{state-codes-DXSWtE6a.d.cts → state-codes-CNp_6051.d.cts} +1 -1
  244. package/dist/{state-codes-CxG1S9YY.d.ts → state-codes-dvoTe5pC.d.ts} +1 -2
  245. package/dist/{tax-types-CEpfSh5P.d.ts → tax-types-tosH5I0q.d.ts} +1 -2
  246. package/dist/types/classification-codes.d.ts +1 -1
  247. package/dist/types/country-code.d.ts +1 -1
  248. package/dist/types/currencies.d.ts +1 -1
  249. package/dist/types/documents.d.ts +7 -0
  250. package/dist/types/e-invoice.d.ts +1 -1
  251. package/dist/types/index.d.ts +58 -59
  252. package/dist/types/msic/0X.d.ts +1 -1
  253. package/dist/types/msic/1X.d.ts +1 -1
  254. package/dist/types/msic/2X.d.ts +1 -1
  255. package/dist/types/msic/3X.d.ts +1 -1
  256. package/dist/types/msic/4X.d.ts +1 -1
  257. package/dist/types/msic/5X.d.ts +1 -1
  258. package/dist/types/msic/6X.d.ts +1 -1
  259. package/dist/types/msic/7X.d.ts +1 -1
  260. package/dist/types/msic/8X.d.ts +1 -1
  261. package/dist/types/msic/9X.d.ts +1 -1
  262. package/dist/types/msic-codes.d.ts +11 -11
  263. package/dist/types/payment-modes.d.ts +1 -1
  264. package/dist/types/signatures.d.ts +1 -1
  265. package/dist/types/state-codes.d.ts +1 -1
  266. package/dist/types/tax-types.d.ts +1 -1
  267. package/dist/types/unit/1X.d.ts +1 -1
  268. package/dist/types/unit/2X.d.ts +1 -1
  269. package/dist/types/unit/3X.d.ts +1 -1
  270. package/dist/types/unit/4X.d.ts +1 -1
  271. package/dist/types/unit/5X.d.ts +1 -1
  272. package/dist/types/unit/6X.d.ts +1 -1
  273. package/dist/types/unit/7X.d.ts +1 -1
  274. package/dist/types/unit/8X.d.ts +1 -1
  275. package/dist/types/unit/9X.d.ts +1 -1
  276. package/dist/types/unit/AX.d.ts +1 -1
  277. package/dist/types/unit/BX.d.ts +1 -1
  278. package/dist/types/unit/CX.d.ts +1 -1
  279. package/dist/types/unit/DX.d.ts +1 -1
  280. package/dist/types/unit/EX.d.ts +1 -1
  281. package/dist/types/unit/FX.d.ts +1 -1
  282. package/dist/types/unit/GX.d.ts +1 -1
  283. package/dist/types/unit/HX.d.ts +1 -1
  284. package/dist/types/unit/IX.d.ts +1 -1
  285. package/dist/types/unit/JX.d.ts +1 -1
  286. package/dist/types/unit/KX.d.ts +1 -1
  287. package/dist/types/unit/LX.d.ts +1 -1
  288. package/dist/types/unit/MX.d.ts +1 -1
  289. package/dist/types/unit/NX.d.ts +1 -1
  290. package/dist/types/unit/OX.d.ts +1 -1
  291. package/dist/types/unit/PX.d.ts +1 -1
  292. package/dist/types/unit/QX.d.ts +1 -1
  293. package/dist/types/unit/RX.d.ts +1 -1
  294. package/dist/types/unit/SX.d.ts +1 -1
  295. package/dist/types/unit/TX.d.ts +1 -1
  296. package/dist/types/unit/UX.d.ts +1 -1
  297. package/dist/types/unit/VX.d.ts +1 -1
  298. package/dist/types/unit/WX.d.ts +1 -1
  299. package/dist/types/unit/XX.d.ts +1 -1
  300. package/dist/types/unit/YX.d.ts +1 -1
  301. package/dist/types/unit/ZX.d.ts +1 -1
  302. package/dist/types/unit-types.d.ts +36 -36
  303. package/dist/unit-types-BKZxwVYQ.d.ts +55 -0
  304. package/dist/unit-types-CaOA5ZDG.d.cts +56 -0
  305. package/dist/utils/base64.d.ts +1 -2
  306. package/dist/utils/base64.js +1 -2
  307. package/dist/utils/certificate.d.ts +22 -0
  308. package/dist/utils/certificate.js +3 -0
  309. package/dist/utils/document.d.ts +135 -0
  310. package/dist/utils/document.js +3 -0
  311. package/dist/utils/getBaseUrl.d.ts +1 -2
  312. package/dist/utils/getBaseUrl.js +1 -1
  313. package/dist/utils/helpers.d.ts +271 -0
  314. package/dist/utils/helpers.js +330 -0
  315. package/dist/utils/signature-diagnostics.d.ts +93 -0
  316. package/dist/utils/signature-diagnostics.js +326 -0
  317. package/dist/utils/validation.d.ts +46 -0
  318. package/dist/utils/validation.js +134 -0
  319. package/myinvois-cert.conf.template +23 -0
  320. package/package.json +9 -3
  321. package/scripts/gen-cert.sh +159 -0
  322. package/src/api/platform/platformLogin.ts +1 -1
  323. package/src/index.ts +528 -1
  324. package/src/types/documents.d.ts +862 -0
  325. package/src/types/index.d.ts +1 -1
  326. package/src/utils/certificate.ts +60 -0
  327. package/src/utils/document.ts +852 -0
  328. package/src/utils/helpers.ts +552 -0
  329. package/src/utils/signature-diagnostics.ts +583 -0
  330. package/src/utils/validation.ts +268 -0
  331. package/test/MyInvoiClientWithRealData.test.ts +9 -1
  332. package/test/MyInvoisClient.test.ts +7 -1
  333. package/test/dynamicInvoiceFeatures.test.ts +449 -0
  334. package/test/signAndSubmitInvoice.test.ts +269 -734
  335. package/test/signature-diagnostics.test.ts +128 -0
  336. package/tsconfig.json +0 -3
  337. package/dist/0X-C4IRh_fJ.d.ts.map +0 -1
  338. package/dist/0X-Yw7mZEro.d.cts.map +0 -1
  339. package/dist/1X-Brnls9Jh.d.ts.map +0 -1
  340. package/dist/1X-BwpSoT3o.d.cts.map +0 -1
  341. package/dist/1X-C-_KHV-Q.d.ts.map +0 -1
  342. package/dist/1X-D_aUVsuM.d.cts.map +0 -1
  343. package/dist/2X-Bb6elyzV.d.cts.map +0 -1
  344. package/dist/2X-DkS1BoE5.d.ts.map +0 -1
  345. package/dist/2X-UdQcQW24.d.ts.map +0 -1
  346. package/dist/2X-hClUyw26.d.cts.map +0 -1
  347. package/dist/3X-C7VFD-n-.d.cts.map +0 -1
  348. package/dist/3X-CLMESDvz.d.cts.map +0 -1
  349. package/dist/3X-DFI-4RQQ.d.ts.map +0 -1
  350. package/dist/3X-DVDyspgb.d.ts.map +0 -1
  351. package/dist/4X-CIJ2JJ2w.d.ts.map +0 -1
  352. package/dist/4X-CUR8jlaZ.d.ts.map +0 -1
  353. package/dist/4X-CvScPJTf.d.cts.map +0 -1
  354. package/dist/4X-DIfvpU6V.d.cts.map +0 -1
  355. package/dist/5X-BOUxhadJ.d.cts.map +0 -1
  356. package/dist/5X-C6db432h.d.ts.map +0 -1
  357. package/dist/5X-COsZHUaQ.d.ts.map +0 -1
  358. package/dist/5X-CkLu7Vyd.d.cts.map +0 -1
  359. package/dist/6X-C_fFIcJC.d.ts.map +0 -1
  360. package/dist/6X-ClZDKOTC.d.ts.map +0 -1
  361. package/dist/6X-DE7RJeV6.d.cts.map +0 -1
  362. package/dist/6X-Mf32k1d0.d.cts.map +0 -1
  363. package/dist/7X-BZyesooz.d.ts.map +0 -1
  364. package/dist/7X-Chtd6B66.d.cts.map +0 -1
  365. package/dist/7X-DoCUcp-J.d.cts.map +0 -1
  366. package/dist/7X-kot_VccM.d.ts.map +0 -1
  367. package/dist/8X-Df4DOBOe.d.ts.map +0 -1
  368. package/dist/8X-DkuKAkHz.d.ts.map +0 -1
  369. package/dist/8X-DqZyMvyV.d.cts.map +0 -1
  370. package/dist/8X-Dr9RunRw.d.cts.map +0 -1
  371. package/dist/9X-BDgifncF.d.ts.map +0 -1
  372. package/dist/9X-BaoZtjWF.d.cts.map +0 -1
  373. package/dist/9X-BcAb6Uso.d.cts.map +0 -1
  374. package/dist/9X-BhBWlgxG.d.ts.map +0 -1
  375. package/dist/AX-BY72FohC.d.cts.map +0 -1
  376. package/dist/AX-D6XHWdrY.d.ts.map +0 -1
  377. package/dist/BX-CA0OmrUZ.d.cts.map +0 -1
  378. package/dist/BX-D_0C8Qbd.d.ts.map +0 -1
  379. package/dist/CX-HH4cSZRX.d.ts.map +0 -1
  380. package/dist/CX-glpQSL8x.d.cts.map +0 -1
  381. package/dist/DX-DimL1MDM.d.cts.map +0 -1
  382. package/dist/DX-Dx22ax_I.d.ts.map +0 -1
  383. package/dist/EX-BRWh1wFc.d.ts.map +0 -1
  384. package/dist/EX-Cx87Ruxl.d.cts.map +0 -1
  385. package/dist/FX-D81UlxNN.d.cts.map +0 -1
  386. package/dist/FX-RmjwAr40.d.ts.map +0 -1
  387. package/dist/GX-9i7piP9G.d.cts.map +0 -1
  388. package/dist/GX-CJyo7oDp.d.ts.map +0 -1
  389. package/dist/HX-20GVJAvl.d.cts.map +0 -1
  390. package/dist/HX-XALBTdLA.d.ts.map +0 -1
  391. package/dist/IX-6SZ55QKb.d.ts.map +0 -1
  392. package/dist/IX-D54NGPsc.d.cts.map +0 -1
  393. package/dist/JX-C1RYcwQX.d.cts.map +0 -1
  394. package/dist/JX-hQ1XRmLp.d.ts.map +0 -1
  395. package/dist/KX-BNwunEfn.d.ts.map +0 -1
  396. package/dist/KX-gQHCIgtQ.d.cts.map +0 -1
  397. package/dist/LX-CHYX3X3J.d.ts.map +0 -1
  398. package/dist/LX-CPurJGIh.d.cts.map +0 -1
  399. package/dist/MX-BPGLWSUz.d.ts.map +0 -1
  400. package/dist/MX-BnyW5eHf.d.cts.map +0 -1
  401. package/dist/MyInvoisClient-BrNyMjS-.d.cts +0 -178
  402. package/dist/MyInvoisClient-BrNyMjS-.d.cts.map +0 -1
  403. package/dist/MyInvoisClient-CXu4pdl-.d.ts +0 -178
  404. package/dist/MyInvoisClient-CXu4pdl-.d.ts.map +0 -1
  405. package/dist/MyInvoisClient-Cnvb5iUC.js +0 -299
  406. package/dist/MyInvoisClient-Cnvb5iUC.js.map +0 -1
  407. package/dist/MyInvoisClient-DO1dJfQq.cjs +0 -304
  408. package/dist/MyInvoisClient-DO1dJfQq.cjs.map +0 -1
  409. package/dist/NX-B11fQuco.d.cts.map +0 -1
  410. package/dist/NX-RulN5Ml3.d.ts.map +0 -1
  411. package/dist/OX-DgKVSp7I.d.ts.map +0 -1
  412. package/dist/OX-T-ydRXQS.d.cts.map +0 -1
  413. package/dist/PX-DA4A2kEv.d.ts.map +0 -1
  414. package/dist/PX-p0n1SzvU.d.cts.map +0 -1
  415. package/dist/QX-CI1NccIB.d.cts.map +0 -1
  416. package/dist/QX-DrFqsMEs.d.ts.map +0 -1
  417. package/dist/RX-Cm7vFcFN.d.ts.map +0 -1
  418. package/dist/RX-DnNKol22.d.cts.map +0 -1
  419. package/dist/SX-BUjiWQYz.d.cts.map +0 -1
  420. package/dist/SX-CsPPTu-W.d.ts.map +0 -1
  421. package/dist/TX-DCY25MdR.d.ts.map +0 -1
  422. package/dist/TX-DOEpsf05.d.cts.map +0 -1
  423. package/dist/UX-DauyagHy.d.ts.map +0 -1
  424. package/dist/UX-DgUOnTFK.d.cts.map +0 -1
  425. package/dist/VX-DD4scgCe.d.ts.map +0 -1
  426. package/dist/VX-kUX6LM-3.d.cts.map +0 -1
  427. package/dist/WX-CjkoppdY.d.ts.map +0 -1
  428. package/dist/WX-DPfyPFFh.d.cts.map +0 -1
  429. package/dist/XX-C4C1gQZH.d.cts.map +0 -1
  430. package/dist/XX-sbsIUOnA.d.ts.map +0 -1
  431. package/dist/YX-BeT-LsiA.d.cts.map +0 -1
  432. package/dist/YX-DUdO8mRC.d.ts.map +0 -1
  433. package/dist/ZX-BuVTTq-D.d.cts.map +0 -1
  434. package/dist/ZX-DwfcSA-D.d.ts.map +0 -1
  435. package/dist/api/platform/platformLogin.d.ts.map +0 -1
  436. package/dist/canonicalize-C_fNNpYr.cjs +0 -80
  437. package/dist/canonicalize-C_fNNpYr.cjs.map +0 -1
  438. package/dist/canonicalize-DNUrCGad.js +0 -68
  439. package/dist/canonicalize-DNUrCGad.js.map +0 -1
  440. package/dist/classification-codes-B15PbWxz.d.cts.map +0 -1
  441. package/dist/classification-codes-C2X4xW5-.d.ts.map +0 -1
  442. package/dist/country-code-DPeNFMMi.d.cts.map +0 -1
  443. package/dist/country-code-DsI8Mbzx.d.ts.map +0 -1
  444. package/dist/currencies-DKuDflOO.d.ts.map +0 -1
  445. package/dist/currencies-S5g1gzBU.d.cts.map +0 -1
  446. package/dist/e-invoice-BuwtFnlI.d.cts.map +0 -1
  447. package/dist/e-invoice-C2TxhyrK.d.ts.map +0 -1
  448. package/dist/getBaseUrl-Dx6RDC8I.js.map +0 -1
  449. package/dist/hashCert-Bol7lIh2.js +0 -62
  450. package/dist/hashCert-Bol7lIh2.js.map +0 -1
  451. package/dist/hashCert-mlYEuYex.cjs +0 -68
  452. package/dist/hashCert-mlYEuYex.cjs.map +0 -1
  453. package/dist/hashSignedProperties-9vj5wlYR.js +0 -83
  454. package/dist/hashSignedProperties-9vj5wlYR.js.map +0 -1
  455. package/dist/hashSignedProperties-CU_ZqqmY.cjs +0 -95
  456. package/dist/hashSignedProperties-CU_ZqqmY.cjs.map +0 -1
  457. package/dist/index-B1DSs-wd.d.cts.map +0 -1
  458. package/dist/index-CJNLQVjx.d.ts +0 -1
  459. package/dist/index-FTgB2nM6.d.ts.map +0 -1
  460. package/dist/index-Wy1ONBjV.d.cts +0 -1
  461. package/dist/index10.cjs.map +0 -1
  462. package/dist/index21.cjs.map +0 -1
  463. package/dist/index67.cjs +0 -4
  464. package/dist/index67.cts.map +0 -1
  465. package/dist/index68.cjs +0 -3
  466. package/dist/index68.cts.map +0 -1
  467. package/dist/index69.cjs +0 -4
  468. package/dist/index69.cts.map +0 -1
  469. package/dist/index70.cjs +0 -3
  470. package/dist/index70.cts.map +0 -1
  471. package/dist/index71.cjs +0 -3
  472. package/dist/index71.cts.map +0 -1
  473. package/dist/index72.cjs +0 -3
  474. package/dist/index72.cts.map +0 -1
  475. package/dist/index73.cjs +0 -3
  476. package/dist/index73.cts.map +0 -1
  477. package/dist/invoice-1_1-BJVcw-oE.d.ts +0 -432
  478. package/dist/invoice-1_1-BJVcw-oE.d.ts.map +0 -1
  479. package/dist/invoice-1_1-DWdNPRzr.d.cts +0 -432
  480. package/dist/invoice-1_1-DWdNPRzr.d.cts.map +0 -1
  481. package/dist/invoice1-1-8S-QQn7P.cjs +0 -547
  482. package/dist/invoice1-1-8S-QQn7P.cjs.map +0 -1
  483. package/dist/invoice1-1-CHuLpkFz.js +0 -504
  484. package/dist/invoice1-1-CHuLpkFz.js.map +0 -1
  485. package/dist/msic-codes-B_1W6lZF.d.cts.map +0 -1
  486. package/dist/msic-codes-bs0lTfSZ.d.ts +0 -26
  487. package/dist/msic-codes-bs0lTfSZ.d.ts.map +0 -1
  488. package/dist/payment-modes-B8dNy3SM.d.ts.map +0 -1
  489. package/dist/payment-modes-DHihrywe.d.cts.map +0 -1
  490. package/dist/platformLogin-DsxWWUXr.js.map +0 -1
  491. package/dist/populateFinalDocument-BdyYzz5Y.cjs +0 -96
  492. package/dist/populateFinalDocument-BdyYzz5Y.cjs.map +0 -1
  493. package/dist/populateFinalDocument-BpLXmgLv.js +0 -90
  494. package/dist/populateFinalDocument-BpLXmgLv.js.map +0 -1
  495. package/dist/populateSignedProperties-BJMcBQ6S.cjs +0 -58
  496. package/dist/populateSignedProperties-BJMcBQ6S.cjs.map +0 -1
  497. package/dist/populateSignedProperties-BvGN-YZH.js +0 -52
  498. package/dist/populateSignedProperties-BvGN-YZH.js.map +0 -1
  499. package/dist/sign-B61Cy3gO.cjs +0 -40
  500. package/dist/sign-B61Cy3gO.cjs.map +0 -1
  501. package/dist/sign-DzHK7UhR.js +0 -34
  502. package/dist/sign-DzHK7UhR.js.map +0 -1
  503. package/dist/signatures-BKi9DP2K.d.cts.map +0 -1
  504. package/dist/signatures-C9QPZTQd.d.ts.map +0 -1
  505. package/dist/state-codes-CxG1S9YY.d.ts.map +0 -1
  506. package/dist/state-codes-DXSWtE6a.d.cts.map +0 -1
  507. package/dist/tax-types-CEpfSh5P.d.ts.map +0 -1
  508. package/dist/tax-types-CgwxONDS.d.cts.map +0 -1
  509. package/dist/transform-BLz0S687.cjs +0 -72
  510. package/dist/transform-BLz0S687.cjs.map +0 -1
  511. package/dist/transform-D1q-U6Zj.js +0 -66
  512. package/dist/transform-D1q-U6Zj.js.map +0 -1
  513. package/dist/types/documents/index.d.ts +0 -57
  514. package/dist/types/documents/invoice-1_1.d.ts +0 -56
  515. package/dist/unit-types-1bF0KhIp.d.ts +0 -56
  516. package/dist/unit-types-1bF0KhIp.d.ts.map +0 -1
  517. package/dist/unit-types-CsrkvgfG.d.cts +0 -56
  518. package/dist/unit-types-CsrkvgfG.d.cts.map +0 -1
  519. package/dist/utils/MyInvoisClient.d.ts +0 -60
  520. package/dist/utils/MyInvoisClient.js +0 -13
  521. package/dist/utils/base64.d.ts.map +0 -1
  522. package/dist/utils/base64.js.map +0 -1
  523. package/dist/utils/debug/debug-document-hash.d.ts +0 -100
  524. package/dist/utils/debug/debug-document-hash.d.ts.map +0 -1
  525. package/dist/utils/debug/debug-document-hash.js +0 -120
  526. package/dist/utils/debug/debug-document-hash.js.map +0 -1
  527. package/dist/utils/debug/debug-invoice-submission.d.ts +0 -152
  528. package/dist/utils/debug/debug-invoice-submission.d.ts.map +0 -1
  529. package/dist/utils/debug/debug-invoice-submission.js +0 -226
  530. package/dist/utils/debug/debug-invoice-submission.js.map +0 -1
  531. package/dist/utils/getBaseUrl.d.ts.map +0 -1
  532. package/dist/utils/invoice1-1.d.ts +0 -117
  533. package/dist/utils/invoice1-1.d.ts.map +0 -1
  534. package/dist/utils/invoice1-1.js +0 -10
  535. package/dist/utils/signature/canonicalize.d.ts +0 -26
  536. package/dist/utils/signature/canonicalize.d.ts.map +0 -1
  537. package/dist/utils/signature/canonicalize.js +0 -3
  538. package/dist/utils/signature/hashCert.d.ts +0 -15
  539. package/dist/utils/signature/hashCert.d.ts.map +0 -1
  540. package/dist/utils/signature/hashCert.js +0 -3
  541. package/dist/utils/signature/hashSignedProperties.d.ts +0 -25
  542. package/dist/utils/signature/hashSignedProperties.d.ts.map +0 -1
  543. package/dist/utils/signature/hashSignedProperties.js +0 -3
  544. package/dist/utils/signature/populateFinalDocument.d.ts +0 -23
  545. package/dist/utils/signature/populateFinalDocument.d.ts.map +0 -1
  546. package/dist/utils/signature/populateFinalDocument.js +0 -3
  547. package/dist/utils/signature/populateSignedProperties.d.ts +0 -23
  548. package/dist/utils/signature/populateSignedProperties.d.ts.map +0 -1
  549. package/dist/utils/signature/populateSignedProperties.js +0 -3
  550. package/dist/utils/signature/sign.d.ts +0 -16
  551. package/dist/utils/signature/sign.d.ts.map +0 -1
  552. package/dist/utils/signature/sign.js +0 -3
  553. package/dist/utils/signature/transform.d.ts +0 -16
  554. package/dist/utils/signature/transform.d.ts.map +0 -1
  555. package/dist/utils/signature/transform.js +0 -3
  556. package/src/types/documents/index.d.ts +0 -1
  557. package/src/types/documents/invoice-1_1.d.ts +0 -439
  558. package/src/utils/MyInvoisClient.ts +0 -501
  559. package/src/utils/debug/debug-document-hash.ts +0 -249
  560. package/src/utils/debug/debug-invoice-submission.ts +0 -355
  561. package/src/utils/invoice1-1.ts +0 -671
  562. package/src/utils/signature/canonicalize.ts +0 -104
  563. package/src/utils/signature/hashCert.ts +0 -115
  564. package/src/utils/signature/hashSignedProperties.ts +0 -155
  565. package/src/utils/signature/populateFinalDocument.ts +0 -187
  566. package/src/utils/signature/populateSignedProperties.ts +0 -87
  567. package/src/utils/signature/sign.ts +0 -51
  568. package/src/utils/signature/transform.ts +0 -99
  569. package/test/canonicalize.test.ts +0 -110
  570. package/test/hashCert.test.ts +0 -95
  571. package/test/hashSignedProperties.test.ts +0 -140
  572. package/test/populateFinalDocument.test.ts +0 -218
  573. package/test/populateSignedProperties.test.ts +0 -155
  574. package/test/sign.test.ts +0 -70
  575. package/test/transform.test.ts +0 -158
@@ -0,0 +1,159 @@
1
+ #!/bin/bash
2
+
3
+ # MyInvois Test Certificate Generator
4
+ # Generates self-signed certificates with required MyInvois fields for testing
5
+
6
+ set -e # Exit on any error
7
+
8
+ echo "🔐 MyInvois Test Certificate Generator"
9
+ echo "======================================"
10
+ echo ""
11
+
12
+ # Check if OpenSSL is available
13
+ if ! command -v openssl &> /dev/null; then
14
+ echo "❌ Error: OpenSSL is not installed or not in PATH"
15
+ echo "Please install OpenSSL first."
16
+ exit 1
17
+ fi
18
+
19
+ echo "✅ OpenSSL found: $(openssl version)"
20
+ echo ""
21
+
22
+ # Get user input
23
+ echo "📝 Please provide your certificate details:"
24
+ echo ""
25
+
26
+ read -p "Company Name (e.g., 'My Company Sdn Bhd'): " COMPANY_NAME
27
+ read -p "State/Province (e.g., 'Kuala Lumpur'): " STATE
28
+ read -p "City (e.g., 'Kuala Lumpur'): " CITY
29
+ read -p "Email Address: " EMAIL
30
+ read -p "Domain (optional, e.g., 'mycompany.com'): " DOMAIN
31
+ read -p "Business Registration Number (e.g., '202301234567'): " BUSINESS_REG
32
+ read -p "MyInvois TIN (e.g., 'IG12345678901'): " TIN
33
+
34
+ echo ""
35
+
36
+ # Validate required fields
37
+ if [[ -z "$COMPANY_NAME" || -z "$STATE" || -z "$CITY" || -z "$EMAIL" || -z "$BUSINESS_REG" || -z "$TIN" ]]; then
38
+ echo "❌ Error: All fields except domain are required"
39
+ exit 1
40
+ fi
41
+
42
+ # Set default domain if not provided
43
+ if [[ -z "$DOMAIN" ]]; then
44
+ DOMAIN="localhost"
45
+ fi
46
+
47
+ echo "📋 Certificate Details:"
48
+ echo " Company: $COMPANY_NAME"
49
+ echo " State: $STATE"
50
+ echo " City: $CITY"
51
+ echo " Email: $EMAIL"
52
+ echo " Domain: $DOMAIN"
53
+ echo " Business Reg: $BUSINESS_REG"
54
+ echo " TIN: $TIN"
55
+ echo ""
56
+
57
+ read -p "Continue with these details? (y/N): " CONFIRM
58
+ if [[ ! "$CONFIRM" =~ ^[Yy]$ ]]; then
59
+ echo "❌ Cancelled by user"
60
+ exit 0
61
+ fi
62
+
63
+ echo ""
64
+ echo "🔧 Generating certificate files..."
65
+
66
+ # Create temporary config file
67
+ CONFIG_FILE="myinvois-cert-temp.conf"
68
+ cat > "$CONFIG_FILE" << EOF
69
+ [req]
70
+ distinguished_name = req_distinguished_name
71
+ req_extensions = v3_req
72
+ prompt = no
73
+
74
+ [req_distinguished_name]
75
+ C = MY
76
+ ST = $STATE
77
+ L = $CITY
78
+ O = $COMPANY_NAME
79
+ CN = $COMPANY_NAME
80
+ emailAddress = $EMAIL
81
+ serialNumber = $BUSINESS_REG
82
+
83
+ [v3_req]
84
+ keyUsage = keyEncipherment, dataEncipherment, digitalSignature, nonRepudiation
85
+ extendedKeyUsage = clientAuth, emailProtection
86
+ subjectAltName = @alt_names
87
+
88
+ [alt_names]
89
+ email.1 = $EMAIL
90
+ DNS.1 = $DOMAIN
91
+ EOF
92
+
93
+ # Generate private key
94
+ echo "🔑 Generating private key..."
95
+ if openssl genrsa -out myinvois-test-key.pem 2048; then
96
+ chmod 600 myinvois-test-key.pem
97
+ echo "✅ Private key saved: myinvois-test-key.pem"
98
+ else
99
+ echo "❌ Failed to generate private key"
100
+ exit 1
101
+ fi
102
+
103
+ # Generate basic certificate
104
+ echo "📜 Generating basic certificate..."
105
+ if openssl req -new -x509 -key myinvois-test-key.pem -out myinvois-test-cert.pem -days 365 -config "$CONFIG_FILE"; then
106
+ echo "✅ Basic certificate saved: myinvois-test-cert.pem"
107
+ else
108
+ echo "❌ Failed to generate basic certificate"
109
+ exit 1
110
+ fi
111
+
112
+ # Generate enhanced certificate with organizationIdentifier
113
+ echo "🚀 Generating enhanced certificate with organizationIdentifier..."
114
+ if openssl req -new -x509 -key myinvois-test-key.pem -out myinvois-enhanced-cert.pem -days 365 \
115
+ -subj "/C=MY/ST=$STATE/L=$CITY/O=$COMPANY_NAME/CN=$COMPANY_NAME/serialNumber=$BUSINESS_REG/2.5.4.97=$TIN/emailAddress=$EMAIL"; then
116
+ echo "✅ Enhanced certificate saved: myinvois-enhanced-cert.pem"
117
+ else
118
+ echo "❌ Failed to generate enhanced certificate"
119
+ exit 1
120
+ fi
121
+
122
+ # Clean up temporary config
123
+ rm "$CONFIG_FILE"
124
+
125
+ echo ""
126
+ echo "🔍 Verifying enhanced certificate..."
127
+
128
+ # Verify the enhanced certificate has required fields
129
+ if openssl x509 -in myinvois-enhanced-cert.pem -text -noout | grep -q "organizationIdentifier"; then
130
+ echo "✅ organizationIdentifier field: Found"
131
+ else
132
+ echo "❌ organizationIdentifier field: Missing"
133
+ fi
134
+
135
+ if openssl x509 -in myinvois-enhanced-cert.pem -text -noout | grep -q "serialNumber"; then
136
+ echo "✅ SERIALNUMBER field: Found"
137
+ else
138
+ echo "❌ SERIALNUMBER field: Missing"
139
+ fi
140
+
141
+ echo ""
142
+ echo "📋 Certificate subject:"
143
+ openssl x509 -in myinvois-enhanced-cert.pem -noout -subject | sed 's/subject=/ /'
144
+
145
+ echo ""
146
+ echo "🎉 Certificate generation complete!"
147
+ echo ""
148
+ echo "📁 Generated files:"
149
+ echo " • myinvois-test-key.pem (private key - keep secure!)"
150
+ echo " • myinvois-test-cert.pem (basic certificate)"
151
+ echo " • myinvois-enhanced-cert.pem (with organizationIdentifier - recommended)"
152
+ echo ""
153
+ echo "💡 Next steps:"
154
+ echo " 1. Use 'myinvois-enhanced-cert.pem' for testing MyInvois integration"
155
+ echo " 2. Update your environment variables to use these files"
156
+ echo " 3. For production, obtain official certificate from MyInvois-approved CA"
157
+ echo ""
158
+ echo "⚠️ Note: These are self-signed certificates for testing only!"
159
+ echo " They will resolve DS306, DS307, DS309 errors but not CA trust issues."
@@ -1,4 +1,4 @@
1
- import type { ClientCredentials, TokenResponse } from 'src/types'
1
+ import type { ClientCredentials, TokenResponse } from '../../types'
2
2
 
3
3
  export const platformLogin = async (
4
4
  client: ClientCredentials,
package/src/index.ts CHANGED
@@ -1,2 +1,529 @@
1
+ import { EInvoiceTypeCode } from './types'
2
+ import { platformLogin } from './api/platform/platformLogin'
3
+ import type {
4
+ DocumentStatus,
5
+ InvoiceV1_1,
6
+ SigningCredentials,
7
+ } from './types/documents'
8
+ import { getBaseUrl } from './utils/getBaseUrl'
9
+ import { extractCertificateInfo, validateKeyPair } from './utils/certificate'
10
+
11
+ import type {
12
+ DocumentSummary,
13
+ DocumentValidationResult,
14
+ DocumentValidationStepResult,
15
+ GetSubmissionResponse,
16
+ SubmissionResponse,
17
+ SubmissionStatus,
18
+ } from './types/documents'
19
+ import { generateCompleteDocument } from './utils/document'
20
+
21
+ export class MyInvoisClient {
22
+ private readonly baseUrl: string
23
+ private readonly clientId: string
24
+ private readonly clientSecret: string
25
+ private readonly onBehalfOf?: string
26
+ private readonly signingCredentials: SigningCredentials
27
+ private readonly debug: boolean
28
+ private token = ''
29
+ private tokenExpiration: Date | undefined = undefined
30
+
31
+ constructor(
32
+ clientId: string,
33
+ clientSecret: string,
34
+ environment: 'sandbox' | 'production',
35
+ certificatePem: string,
36
+ privateKeyPem: string,
37
+ onBehalfOf?: string,
38
+ debug?: boolean,
39
+ ) {
40
+ // Check if basic signing credentials are available
41
+ if (!privateKeyPem || !certificatePem) {
42
+ throw new Error(
43
+ 'Missing required environment variables: PRIVATE_KEY and CERTIFICATE',
44
+ )
45
+ }
46
+
47
+ // Validate that the key pair matches
48
+ if (!validateKeyPair(certificatePem, privateKeyPem)) {
49
+ throw new Error('Certificate and private key do not match')
50
+ }
51
+
52
+ this.clientId = clientId
53
+ this.clientSecret = clientSecret
54
+ this.baseUrl = getBaseUrl(environment)
55
+ this.onBehalfOf = onBehalfOf
56
+ this.debug = (debug ?? process.env.MYINVOIS_DEBUG === 'true') ? true : false
57
+
58
+ // Extract certificate information
59
+ const { issuerName, serialNumber } = extractCertificateInfo(certificatePem)
60
+
61
+ this.signingCredentials = {
62
+ privateKeyPem,
63
+ certificatePem,
64
+ issuerName,
65
+ serialNumber,
66
+ }
67
+ }
68
+
69
+ private async refreshToken() {
70
+ const tokenResponse = await platformLogin({
71
+ clientId: this.clientId,
72
+ clientSecret: this.clientSecret,
73
+ baseUrl: this.baseUrl,
74
+ onBehalfOf: this.onBehalfOf,
75
+ debug: this.debug,
76
+ })
77
+
78
+ this.token = tokenResponse.token
79
+ this.tokenExpiration = tokenResponse.tokenExpiration
80
+ }
81
+
82
+ private async getToken() {
83
+ if (
84
+ !this.tokenExpiration ||
85
+ this.tokenExpiration < new Date() ||
86
+ isNaN(this.tokenExpiration.getTime())
87
+ ) {
88
+ if (this.debug) {
89
+ console.log('Token expired')
90
+ console.log('Refreshing token')
91
+ }
92
+ await this.refreshToken()
93
+ }
94
+
95
+ return this.token
96
+ }
97
+
98
+ private async fetch(path: string, options: Parameters<typeof fetch>[1] = {}) {
99
+ const token = await this.getToken()
100
+
101
+ return fetch(`${this.baseUrl}${path}`, {
102
+ ...options,
103
+ headers: { ...options.headers, Authorization: `Bearer ${token}` },
104
+ })
105
+ }
106
+
107
+ /**
108
+ * Validates a TIN against a NRIC/ARMY/PASSPORT/BRN (Business Registration Number)
109
+ *
110
+ * @param tin - The TIN to validate
111
+ * @param idType - The type of ID to validate against
112
+ * @param idValue - The value of the ID to validate against
113
+ * @returns true if the TIN is valid, false otherwise
114
+ */
115
+ async verifyTin(
116
+ tin: string,
117
+ idType: 'NRIC' | 'ARMY' | 'PASSPORT' | 'BRN',
118
+ idValue: string,
119
+ ): Promise<boolean> {
120
+ try {
121
+ const response = await this.fetch(
122
+ `/api/v1.0/taxpayer/validate/${tin}?idType=${idType}&idValue=${idValue}`,
123
+ {
124
+ method: 'GET',
125
+ },
126
+ )
127
+
128
+ if (response.status === 200) {
129
+ return true
130
+ }
131
+
132
+ return false
133
+ } catch (error) {
134
+ if (this.debug) {
135
+ console.error(error)
136
+ }
137
+ return false
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Submits one or more e-invoice documents to the MyInvois platform for processing.
143
+ *
144
+ * This method digitally signs each document using the provided certificate and private key,
145
+ * generates document hashes, encodes them for submission, and sends them to the platform.
146
+ * The method includes comprehensive validation warnings for document size and count limits.
147
+ *
148
+ * @param documents - Array of InvoiceV1_1 documents to be submitted
149
+ * @returns Promise resolving to submission response containing the submission data and HTTP status
150
+ * @throws {Error} If PRIVATE_KEY or CERTIFICATE environment variables are missing
151
+ * @throws {Error} If document signing, encoding, or API submission fails
152
+ *
153
+ * @example
154
+ * ```typescript
155
+ * // Submit a single invoice
156
+ * const result = await client.submitDocument([invoiceData]);
157
+ * console.log(result.data.submissionUid); // Track submission with this UID
158
+ *
159
+ * // Submit multiple invoices
160
+ * const result = await client.submitDocument([invoice1, invoice2, invoice3]);
161
+ * if (result.status === 202) {
162
+ * console.log('Documents submitted successfully');
163
+ * }
164
+ * ```
165
+ *
166
+ * @remarks
167
+ * - Requires PRIVATE_KEY and CERTIFICATE environment variables for document signing
168
+ * - Each document is digitally signed with XML-DSIG before submission
169
+ * - Documents are base64-encoded for transmission
170
+ * - API limits: Max 100 documents per submission, 5MB total payload, 300KB per document
171
+ * - Debug mode provides detailed logging of payload sizes and validation warnings
172
+ * - Returns HTTP 202 for successful submissions that require processing
173
+ */
174
+ async submitDocument(documents: InvoiceV1_1[]): Promise<{
175
+ data: SubmissionResponse
176
+ status: number
177
+ }> {
178
+ if (this.debug) {
179
+ console.log(`📦 Preparing to submit ${documents.length} document(s)...`)
180
+ }
181
+
182
+ // Generate the complete signed document structure first
183
+ const completeDocument = generateCompleteDocument(
184
+ documents,
185
+ this.signingCredentials,
186
+ )
187
+
188
+ if (this.debug) {
189
+ console.log('✅ Documents signed successfully')
190
+ console.log('📄 Document structure keys:', Object.keys(completeDocument))
191
+ console.log('📊 Number of invoices:', completeDocument.Invoice.length)
192
+ }
193
+
194
+ // Convert the complete document to JSON string
195
+ const documentJson = JSON.stringify(completeDocument)
196
+
197
+ if (this.debug) {
198
+ console.log(`📏 Document JSON size: ${documentJson.length} bytes`)
199
+ }
200
+
201
+ // Generate SHA256 hash of the JSON document
202
+ const crypto = await import('crypto')
203
+ const documentHash = crypto
204
+ .createHash('sha256')
205
+ .update(documentJson, 'utf8')
206
+ .digest('hex')
207
+
208
+ // Base64 encode the JSON document
209
+ const documentBase64 = Buffer.from(documentJson, 'utf8').toString('base64')
210
+
211
+ if (this.debug) {
212
+ console.log(`🔒 Document hash: ${documentHash.substring(0, 16)}...`)
213
+ console.log(`📦 Base64 size: ${documentBase64.length} bytes`)
214
+ }
215
+
216
+ // Build the submission payload according to MyInvois API format
217
+ const submissionPayload = {
218
+ documents: documents.map(doc => ({
219
+ format: 'JSON', // We're submitting JSON format
220
+ document: documentBase64, // Base64 encoded complete document
221
+ documentHash: documentHash, // SHA256 hash of the JSON
222
+ codeNumber: doc.eInvoiceCodeOrNumber, // Document reference number
223
+ })),
224
+ }
225
+
226
+ if (this.debug) {
227
+ console.log('🚀 Submission payload structure:')
228
+ console.log('- Format: JSON')
229
+ console.log('- Documents count:', submissionPayload.documents.length)
230
+ console.log(
231
+ '- Total payload size:',
232
+ JSON.stringify(submissionPayload).length,
233
+ 'bytes',
234
+ )
235
+
236
+ // Validate submission constraints
237
+ const payloadSize = JSON.stringify(submissionPayload).length
238
+ if (payloadSize > 5 * 1024 * 1024) {
239
+ // 5MB
240
+ console.warn('⚠️ WARNING: Payload size exceeds 5MB limit')
241
+ }
242
+
243
+ if (documents.length > 100) {
244
+ console.warn('⚠️ WARNING: Document count exceeds 100 document limit')
245
+ }
246
+
247
+ if (documentJson.length > 300 * 1024) {
248
+ // 300KB per document
249
+ console.warn('⚠️ WARNING: Document size exceeds 300KB limit')
250
+ }
251
+ }
252
+
253
+ // Submit to MyInvois API with proper headers
254
+ const response = await this.fetch('/api/v1.0/documentsubmissions', {
255
+ method: 'POST',
256
+ headers: {
257
+ 'Content-Type': 'application/json',
258
+ },
259
+ body: JSON.stringify(submissionPayload),
260
+ })
261
+
262
+ if (this.debug) {
263
+ console.log(`📡 API Response status: ${response.status}`)
264
+ }
265
+
266
+ const data = (await response.json()) as SubmissionResponse
267
+
268
+ if (this.debug) {
269
+ if (response.status !== 202) {
270
+ console.error('❌ Submission failed with status:', response.status)
271
+ console.error('❌ Response data:', data)
272
+ } else {
273
+ console.log('✅ Submission successful!')
274
+ console.log(`📋 Submission UID: ${data.submissionUid}`)
275
+ console.log(
276
+ `✅ Accepted documents: ${data.acceptedDocuments?.length || 0}`,
277
+ )
278
+ console.log(
279
+ `❌ Rejected documents: ${data.rejectedDocuments?.length || 0}`,
280
+ )
281
+ }
282
+ }
283
+
284
+ return {
285
+ data,
286
+ status: response.status,
287
+ }
288
+ }
289
+
290
+ async getSubmissionStatus(
291
+ submissionUid: string,
292
+ pollInterval: number = 1000,
293
+ maxRetries: number = 10,
294
+ ): Promise<{
295
+ status: SubmissionStatus
296
+ documentSummary?: DocumentSummary[]
297
+ error?: {
298
+ code: string
299
+ message: string | null
300
+ target: string
301
+ details: {
302
+ code: string
303
+ message: string
304
+ target: string
305
+ }[]
306
+ }
307
+ }> {
308
+ try {
309
+ const response = await this.fetch(
310
+ `/api/v1.0/documentsubmissions/${submissionUid}`,
311
+ )
312
+
313
+ const data = (await response.json()) as GetSubmissionResponse
314
+
315
+ if (this.debug) {
316
+ console.log('Submission:', data)
317
+ if (data.error) {
318
+ console.log('Submission error details:', data.error.details)
319
+ }
320
+ }
321
+
322
+ // If we have a successful response and status is completed, return success
323
+ if (data.overallStatus === 'Valid') {
324
+ return {
325
+ status: data.overallStatus,
326
+ documentSummary: data.documentSummary,
327
+ }
328
+ }
329
+ if (data.overallStatus === 'Invalid') {
330
+ return {
331
+ status: 'Invalid',
332
+ documentSummary: data.documentSummary,
333
+ }
334
+ }
335
+
336
+ // If we have retries left, continue polling for any non-completed status or errors
337
+ if (maxRetries > 0) {
338
+ await new Promise(resolve => setTimeout(resolve, pollInterval))
339
+ return await this.getSubmissionStatus(
340
+ submissionUid,
341
+ pollInterval,
342
+ maxRetries - 1,
343
+ )
344
+ }
345
+
346
+ // No retries left - return timeout
347
+ return {
348
+ status: 'Invalid',
349
+ error: {
350
+ code: 'Timeout',
351
+ message: 'Submission timed out',
352
+ target: 'submission',
353
+ details: [],
354
+ },
355
+ }
356
+ } catch (error) {
357
+ // Handle any request errors by retrying if we have retries left
358
+ if (maxRetries > 0) {
359
+ if (this.debug) {
360
+ console.log('Request error, retrying...', error)
361
+ }
362
+ await new Promise(resolve => setTimeout(resolve, pollInterval))
363
+ return await this.getSubmissionStatus(
364
+ submissionUid,
365
+ pollInterval,
366
+ maxRetries - 1,
367
+ )
368
+ }
369
+
370
+ // No retries left - return timeout
371
+ return {
372
+ status: 'Invalid',
373
+ error: {
374
+ code: 'Timeout',
375
+ message: 'Submission timed out after request errors',
376
+ target: 'submission',
377
+ details: [],
378
+ },
379
+ }
380
+ }
381
+ }
382
+
383
+ /**
384
+ * Retrieves a document by its unique identifier with the raw document content.
385
+ *
386
+ * @param documentUid - The unique identifier of the document to retrieve
387
+ * @returns Promise resolving to document summary with raw document content as a string
388
+ * @throws {Error} If the document is not found or request fails
389
+ *
390
+ * @example
391
+ * ```typescript
392
+ * const document = await client.getDocument('doc-uuid-123');
393
+ * console.log(document.document); // Raw XML/JSON content
394
+ * console.log(document.uuid); // Document UUID
395
+ * ```
396
+ */
397
+ async getDocument(
398
+ documentUid: string,
399
+ ): Promise<DocumentSummary & { document: string }> {
400
+ const response = await this.fetch(`/api/v1.0/documents/${documentUid}/raw`)
401
+
402
+ const data = await response.json()
403
+
404
+ return data as DocumentSummary & { document: string }
405
+ }
406
+
407
+ /**
408
+ * Retrieves detailed information about a document including validation results.
409
+ *
410
+ * @param documentUid - The unique identifier of the document to get details for
411
+ * @returns Promise resolving to document summary with detailed validation results
412
+ * @throws {Error} If the document is not found or request fails
413
+ *
414
+ * @example
415
+ * ```typescript
416
+ * const details = await client.getDocumentDetails('doc-uuid-123');
417
+ * console.log(details.validationResults.status); // 'Valid' | 'Invalid' | 'Processing'
418
+ * console.log(details.validationResults.validationSteps); // Array of validation step results
419
+ * ```
420
+ */
421
+ async getDocumentDetails(documentUid: string): Promise<
422
+ DocumentSummary & {
423
+ validationResults: {
424
+ status: DocumentValidationResult
425
+ validationSteps: DocumentValidationStepResult[]
426
+ }
427
+ }
428
+ > {
429
+ const response = await this.fetch(
430
+ `/api/v1.0/documents/${documentUid}/details`,
431
+ )
432
+
433
+ const data = (await response.json()) as DocumentSummary & {
434
+ validationResults: {
435
+ status: DocumentValidationResult
436
+ validationSteps: DocumentValidationStepResult[]
437
+ }
438
+ }
439
+
440
+ return data
441
+ }
442
+
443
+ /**
444
+ * Searches for documents based on various filter criteria.
445
+ *
446
+ * @param params - Search parameters object
447
+ * @param params.uuid - Optional specific document UUID to search for
448
+ * @param params.submissionDateFrom - Required start date for submission date range (ISO date string)
449
+ * @param params.submissionDateTo - Optional end date for submission date range (ISO date string)
450
+ * @param params.pageSize - Optional number of results per page (default handled by API)
451
+ * @param params.pageNo - Optional page number for pagination (0-based)
452
+ * @param params.issueDateFrom - Optional start date for issue date range (ISO date string)
453
+ * @param params.issueDateTo - Optional end date for issue date range (ISO date string)
454
+ * @param params.invoiceDirection - Optional filter by invoice direction ('Sent' or 'Received')
455
+ * @param params.status - Optional filter by document status
456
+ * @param params.documentType - Optional filter by e-invoice type code
457
+ * @param params.searchQuery - Optional text search across uuid, buyerTIN, supplierTIN, buyerName, supplierName, internalID, total
458
+ * @returns Promise resolving to array of document summaries matching the search criteria
459
+ * @throws {Error} If the search request fails
460
+ *
461
+ * @example
462
+ * ```typescript
463
+ * // Search for documents submitted in the last 30 days
464
+ * const documents = await client.searchDocuments({
465
+ * submissionDateFrom: '2024-01-01',
466
+ * submissionDateTo: '2024-01-31',
467
+ * status: 'Valid',
468
+ * pageSize: 10
469
+ * });
470
+ *
471
+ * // Search by supplier name
472
+ * const supplierDocs = await client.searchDocuments({
473
+ * submissionDateFrom: '2024-01-01',
474
+ * searchQuery: 'ACME Corp',
475
+ * invoiceDirection: 'Received'
476
+ * });
477
+ * ```
478
+ */
479
+ async searchDocuments({
480
+ uuid,
481
+ submissionDateFrom,
482
+ submissionDateTo,
483
+ pageSize,
484
+ pageNo,
485
+ issueDateFrom,
486
+ issueDateTo,
487
+ invoiceDirection,
488
+ status,
489
+ documentType,
490
+ searchQuery,
491
+ }: {
492
+ uuid?: string
493
+ submissionDateFrom: string
494
+ submissionDateTo?: string
495
+ pageSize?: number
496
+ pageNo?: number
497
+ issueDateFrom?: string
498
+ issueDateTo?: string
499
+ invoiceDirection?: 'Sent' | 'Received'
500
+ status?: DocumentStatus
501
+ documentType?: EInvoiceTypeCode
502
+ searchQuery?: string // Search by uuid, buyerTIN, supplierTIN, buyerName, supplierName, internalID, total
503
+ }): Promise<DocumentSummary[]> {
504
+ const queryParams = new URLSearchParams()
505
+
506
+ if (uuid) queryParams.set('uuid', uuid)
507
+ if (submissionDateFrom)
508
+ queryParams.set('submissionDateFrom', submissionDateFrom)
509
+ if (submissionDateTo) queryParams.set('submissionDateTo', submissionDateTo)
510
+ if (pageSize) queryParams.set('pageSize', pageSize.toString())
511
+ if (pageNo) queryParams.set('pageNo', pageNo.toString())
512
+ if (issueDateFrom) queryParams.set('issueDateFrom', issueDateFrom)
513
+ if (issueDateTo) queryParams.set('issueDateTo', issueDateTo)
514
+ if (invoiceDirection) queryParams.set('invoiceDirection', invoiceDirection)
515
+ if (status) queryParams.set('status', status)
516
+ if (documentType) queryParams.set('documentType', documentType)
517
+ if (searchQuery) queryParams.set('searchQuery', searchQuery)
518
+
519
+ const response = await this.fetch(
520
+ `/api/v1.0/documents/search?${queryParams.toString()}`,
521
+ )
522
+
523
+ const data = (await response.json()) as DocumentSummary[]
524
+
525
+ return data
526
+ }
527
+ }
528
+
1
529
  export type * from './types/index.d.ts'
2
- export * from './utils/MyInvoisClient'