@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.
- package/CHANGELOG.md +111 -0
- package/README.md +128 -4
- package/bun.lock +59 -0
- package/dist/{0X-Yw7mZEro.d.cts → 0X-CTIq3y3a.d.ts} +1 -2
- package/dist/{0X-C4IRh_fJ.d.ts → 0X-Cr3M7hci.d.cts} +1 -1
- package/dist/{1X-D_aUVsuM.d.cts → 1X-Bu4oiv8D.d.ts} +1 -2
- package/dist/{1X-C-_KHV-Q.d.ts → 1X-BywXCqtn.d.ts} +1 -2
- package/dist/{1X-Brnls9Jh.d.ts → 1X-CWwmfCzo.d.cts} +1 -1
- package/dist/{1X-BwpSoT3o.d.cts → 1X-ClnJ79HH.d.cts} +1 -1
- package/dist/{2X-DkS1BoE5.d.ts → 2X-3fSEGIuE.d.ts} +1 -2
- package/dist/{2X-Bb6elyzV.d.cts → 2X-CV9eYhog.d.cts} +1 -1
- package/dist/{2X-UdQcQW24.d.ts → 2X-DNtkJ0tj.d.cts} +1 -1
- package/dist/{2X-hClUyw26.d.cts → 2X-DnG3FY1f.d.ts} +1 -2
- package/dist/{3X-C7VFD-n-.d.cts → 3X--VWVsC84.d.cts} +1 -1
- package/dist/{3X-CLMESDvz.d.cts → 3X-BOxfatu3.d.cts} +1 -1
- package/dist/{3X-DVDyspgb.d.ts → 3X-CLdmoel1.d.ts} +1 -2
- package/dist/{3X-DFI-4RQQ.d.ts → 3X-Ynjfgoll.d.ts} +1 -2
- package/dist/{4X-DIfvpU6V.d.cts → 4X-B5ePdMky.d.ts} +1 -2
- package/dist/{4X-CvScPJTf.d.cts → 4X-BTG6o1Gn.d.ts} +1 -2
- package/dist/{4X-CIJ2JJ2w.d.ts → 4X-By9PzHaY.d.cts} +1 -1
- package/dist/{4X-CUR8jlaZ.d.ts → 4X-C7fzDWJ_.d.cts} +1 -1
- package/dist/{5X-BOUxhadJ.d.cts → 5X-B5M0Cv_K.d.cts} +1 -1
- package/dist/{5X-C6db432h.d.ts → 5X-CNAFsDm2.d.cts} +1 -1
- package/dist/{5X-CkLu7Vyd.d.cts → 5X-CjSz1zxJ.d.ts} +1 -2
- package/dist/{5X-COsZHUaQ.d.ts → 5X-dhP6fyou.d.ts} +1 -2
- package/dist/{6X-Mf32k1d0.d.cts → 6X-B9KP_vEn.d.ts} +1 -2
- package/dist/{6X-DE7RJeV6.d.cts → 6X-BHaY0TCf.d.ts} +1 -2
- package/dist/{6X-ClZDKOTC.d.ts → 6X-C3elgd-n.d.cts} +1 -1
- package/dist/{6X-C_fFIcJC.d.ts → 6X-uObUP4VG.d.cts} +1 -1
- package/dist/{7X-DoCUcp-J.d.cts → 7X-BifJnY24.d.cts} +1 -1
- package/dist/{7X-Chtd6B66.d.cts → 7X-C4eX_tAk.d.ts} +1 -2
- package/dist/{7X-BZyesooz.d.ts → 7X-D3idQBl9.d.cts} +1 -1
- package/dist/{7X-kot_VccM.d.ts → 7X-DtkQutx2.d.ts} +1 -2
- package/dist/{8X-Dr9RunRw.d.cts → 8X-5n9seY3z.d.ts} +1 -2
- package/dist/{8X-DkuKAkHz.d.ts → 8X-C6UMFvQW.d.cts} +1 -1
- package/dist/{8X-DqZyMvyV.d.cts → 8X-D6HTLShY.d.ts} +1 -2
- package/dist/{8X-Df4DOBOe.d.ts → 8X-DioBXCJ0.d.cts} +1 -1
- package/dist/{9X-BaoZtjWF.d.cts → 9X-BjffnXuq.d.cts} +1 -1
- package/dist/{9X-BDgifncF.d.ts → 9X-CHZKsIdD.d.ts} +1 -2
- package/dist/{9X-BcAb6Uso.d.cts → 9X-CJjPJgIG.d.cts} +1 -1
- package/dist/{9X-BhBWlgxG.d.ts → 9X-Cpb6V4JC.d.ts} +1 -2
- package/dist/{AX-D6XHWdrY.d.ts → AX-C0w_r3PA.d.ts} +1 -2
- package/dist/{AX-BY72FohC.d.cts → AX-DrEd2Ov6.d.cts} +1 -1
- package/dist/{BX-D_0C8Qbd.d.ts → BX-C5jc6myN.d.cts} +1 -1
- package/dist/{BX-CA0OmrUZ.d.cts → BX-RadlZ-6m.d.ts} +1 -2
- package/dist/{CX-glpQSL8x.d.cts → CX-CT1Zzb9D.d.ts} +1 -2
- package/dist/{CX-HH4cSZRX.d.ts → CX-oSgvmn3h.d.cts} +1 -1
- package/dist/{DX-Dx22ax_I.d.ts → DX-CtUeTKMM.d.ts} +1 -2
- package/dist/{DX-DimL1MDM.d.cts → DX-ZIG0enmK.d.cts} +1 -1
- package/dist/{EX-BRWh1wFc.d.ts → EX-084Yu7Wt.d.ts} +1 -2
- package/dist/{EX-Cx87Ruxl.d.cts → EX-BpWZ5ADq.d.cts} +1 -1
- package/dist/{FX-RmjwAr40.d.ts → FX-BrbQM0CW.d.ts} +1 -2
- package/dist/{FX-D81UlxNN.d.cts → FX-CvYBEc51.d.cts} +1 -1
- package/dist/{GX-CJyo7oDp.d.ts → GX-CU8PZy0G.d.cts} +1 -1
- package/dist/{GX-9i7piP9G.d.cts → GX-gKj8iAAh.d.ts} +1 -2
- package/dist/{HX-XALBTdLA.d.ts → HX-9D-ZXTy5.d.ts} +1 -2
- package/dist/{HX-20GVJAvl.d.cts → HX-DoEErDeE.d.cts} +1 -1
- package/dist/{IX-D54NGPsc.d.cts → IX-DR4Fc92A.d.ts} +1 -2
- package/dist/{IX-6SZ55QKb.d.ts → IX-jLAUHe8i.d.cts} +1 -1
- package/dist/{JX-hQ1XRmLp.d.ts → JX-DIKa9ma-.d.ts} +1 -2
- package/dist/{JX-C1RYcwQX.d.cts → JX-DX8BjYQC.d.cts} +1 -1
- package/dist/{KX-BNwunEfn.d.ts → KX-DpsJ_unT.d.ts} +1 -2
- package/dist/{KX-gQHCIgtQ.d.cts → KX-fZb4_vhw.d.cts} +1 -1
- package/dist/{LX-CHYX3X3J.d.ts → LX-D_mI1bk-.d.cts} +1 -1
- package/dist/{LX-CPurJGIh.d.cts → LX-DeXPPWUX.d.ts} +1 -2
- package/dist/{MX-BnyW5eHf.d.cts → MX-CKMjg_zK.d.ts} +1 -2
- package/dist/{MX-BPGLWSUz.d.ts → MX-DlYZhpkT.d.cts} +1 -1
- package/dist/{NX-B11fQuco.d.cts → NX-DELEEbad.d.cts} +1 -1
- package/dist/{NX-RulN5Ml3.d.ts → NX-oYdb4NDo.d.ts} +1 -2
- package/dist/{OX-T-ydRXQS.d.cts → OX-Bid9es3D.d.ts} +1 -2
- package/dist/{OX-DgKVSp7I.d.ts → OX-CKPyrIFf.d.cts} +1 -1
- package/dist/{PX-DA4A2kEv.d.ts → PX-D7jy9CFk.d.ts} +1 -2
- package/dist/{PX-p0n1SzvU.d.cts → PX-SP6NxBtG.d.cts} +1 -1
- package/dist/{QX-DrFqsMEs.d.ts → QX-BFWOR4g3.d.ts} +1 -2
- package/dist/{QX-CI1NccIB.d.cts → QX-QZA7E2O-.d.cts} +1 -1
- package/dist/{RX-Cm7vFcFN.d.ts → RX-DBcgbdeE.d.cts} +1 -1
- package/dist/{RX-DnNKol22.d.cts → RX-XHgCyMV1.d.ts} +1 -2
- package/dist/{SX-CsPPTu-W.d.ts → SX-Cl8RN8oH.d.ts} +1 -2
- package/dist/{SX-BUjiWQYz.d.cts → SX-DmiJeCMN.d.cts} +1 -1
- package/dist/{TX-DCY25MdR.d.ts → TX-C1SoDobK.d.cts} +1 -1
- package/dist/{TX-DOEpsf05.d.cts → TX-ZymoIbtr.d.ts} +1 -2
- package/dist/{UX-DgUOnTFK.d.cts → UX-D-Ndd1ov.d.ts} +1 -2
- package/dist/{UX-DauyagHy.d.ts → UX-DFVynFhQ.d.cts} +1 -1
- package/dist/{VX-kUX6LM-3.d.cts → VX-B-1b34r7.d.ts} +1 -2
- package/dist/{VX-DD4scgCe.d.ts → VX-DsRum5k3.d.cts} +1 -1
- package/dist/{WX-DPfyPFFh.d.cts → WX-0GuMjPNZ.d.ts} +1 -2
- package/dist/{WX-CjkoppdY.d.ts → WX-VReU5R5M.d.cts} +1 -1
- package/dist/{XX-C4C1gQZH.d.cts → XX-CF2NANsy.d.ts} +1 -2
- package/dist/{XX-sbsIUOnA.d.ts → XX-ChAviUMj.d.cts} +1 -1
- package/dist/{YX-DUdO8mRC.d.ts → YX-B51BbNSg.d.ts} +1 -2
- package/dist/{YX-BeT-LsiA.d.cts → YX-QfzeMEKx.d.cts} +1 -1
- package/dist/{ZX-DwfcSA-D.d.ts → ZX-BMJS1iAv.d.ts} +1 -2
- package/dist/{ZX-BuVTTq-D.d.cts → ZX-Ca2E726a.d.cts} +1 -1
- package/dist/api/platform/platformLogin.d.ts +58 -60
- package/dist/api/platform/platformLogin.js +1 -1
- package/dist/certificate-DFK-788s.cjs +62 -0
- package/dist/certificate-DFK-788s.cjs.map +1 -0
- package/dist/certificate-aooIRf9A.js +49 -0
- package/dist/{classification-codes-C2X4xW5-.d.ts → classification-codes-BKxV-rO9.d.ts} +1 -2
- package/dist/{country-code-DsI8Mbzx.d.ts → country-code-CQuaiQm2.d.ts} +1 -2
- package/dist/{currencies-DKuDflOO.d.ts → currencies-BYJK-m6v.d.ts} +1 -2
- package/dist/document-CARHiGdp.cjs +472 -0
- package/dist/document-CARHiGdp.cjs.map +1 -0
- package/dist/document-D6VKMAtx.js +405 -0
- package/dist/documents-CJ8hqIGH.d.ts +858 -0
- package/dist/documents-MGs0EvXh.d.cts +859 -0
- package/dist/{e-invoice-C2TxhyrK.d.ts → e-invoice-CmbLQkHw.d.ts} +1 -2
- package/dist/{getBaseUrl-Dx6RDC8I.js → getBaseUrl-R3IdgCu3.js} +1 -2
- package/dist/{index-B1DSs-wd.d.cts → index-0-EvC6Nv.d.ts} +1 -2
- package/dist/{index-FTgB2nM6.d.ts → index-D2_HVwCz.d.cts} +1 -1
- package/dist/index.cjs +308 -12
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +233 -60
- package/dist/index.js +306 -11
- package/dist/index10.cjs +0 -34
- package/dist/index11.cjs +25 -15
- package/dist/index11.cjs.map +1 -1
- package/dist/index12.cjs +24 -0
- package/dist/index12.cjs.map +1 -0
- package/dist/index13.cjs +0 -13
- package/dist/index15.cjs +3 -2
- package/dist/index16.cjs +12 -16
- package/dist/index17.cjs +2 -2
- package/dist/index18.cjs +336 -204
- package/dist/index18.cjs.map +1 -1
- package/dist/index19.cjs +325 -105
- package/dist/index19.cjs.map +1 -1
- package/dist/index20.cjs +136 -133
- package/dist/index20.cjs.map +1 -1
- package/dist/index21.cjs +203 -59
- package/dist/index21.cjs.map +1 -1
- package/dist/index22.cjs +104 -262
- package/dist/index22.cjs.map +1 -1
- package/dist/index23.cjs +132 -74
- package/dist/index23.cjs.map +1 -1
- package/dist/index24.cjs +59 -102
- package/dist/index24.cjs.map +1 -1
- package/dist/index25.cjs +262 -68
- package/dist/index25.cjs.map +1 -1
- package/dist/index26.cjs +74 -107
- package/dist/index26.cjs.map +1 -1
- package/dist/index27.cjs +102 -95
- package/dist/index27.cjs.map +1 -1
- package/dist/index28.cjs +68 -13
- package/dist/index28.cjs.map +1 -1
- package/dist/index29.cjs +107 -33
- package/dist/index29.cjs.map +1 -1
- package/dist/index30.cjs +95 -14
- package/dist/index30.cjs.map +1 -1
- package/dist/index31.cjs +11 -22
- package/dist/index31.cjs.map +1 -1
- package/dist/index32.cjs +31 -13
- package/dist/index32.cjs.map +1 -1
- package/dist/index33.cjs +12 -7
- package/dist/index33.cjs.map +1 -1
- package/dist/index34.cjs +22 -7
- package/dist/index34.cjs.map +1 -1
- package/dist/index35.cjs +13 -10
- package/dist/index35.cjs.map +1 -1
- package/dist/index36.cjs +7 -6
- package/dist/index36.cjs.map +1 -1
- package/dist/index37.cjs +7 -101
- package/dist/index37.cjs.map +1 -1
- package/dist/index38.cjs +10 -106
- package/dist/index38.cjs.map +1 -1
- package/dist/index39.cjs +6 -119
- package/dist/index39.cjs.map +1 -1
- package/dist/index40.cjs +101 -106
- package/dist/index40.cjs.map +1 -1
- package/dist/index41.cjs +106 -98
- package/dist/index41.cjs.map +1 -1
- package/dist/index42.cjs +119 -118
- package/dist/index42.cjs.map +1 -1
- package/dist/index43.cjs +106 -127
- package/dist/index43.cjs.map +1 -1
- package/dist/index44.cjs +98 -117
- package/dist/index44.cjs.map +1 -1
- package/dist/index45.cjs +118 -14
- package/dist/index45.cjs.map +1 -1
- package/dist/index46.cjs +127 -95
- package/dist/index46.cjs.map +1 -1
- package/dist/index47.cjs +117 -142
- package/dist/index47.cjs.map +1 -1
- package/dist/index48.cjs +14 -114
- package/dist/index48.cjs.map +1 -1
- package/dist/index49.cjs +95 -144
- package/dist/index49.cjs.map +1 -1
- package/dist/index5.cjs +0 -25
- package/dist/index50.cjs +142 -113
- package/dist/index50.cjs.map +1 -1
- package/dist/index51.cjs +114 -17
- package/dist/index51.cjs.map +1 -1
- package/dist/index52.cjs +144 -112
- package/dist/index52.cjs.map +1 -1
- package/dist/index53.cjs +113 -47
- package/dist/index53.cjs.map +1 -1
- package/dist/index54.cjs +17 -14
- package/dist/index54.cjs.map +1 -1
- package/dist/index55.cjs +112 -28
- package/dist/index55.cjs.map +1 -1
- package/dist/index56.cjs +47 -22
- package/dist/index56.cjs.map +1 -1
- package/dist/index57.cjs +14 -9
- package/dist/index57.cjs.map +1 -1
- package/dist/index58.cjs +28 -8
- package/dist/index58.cjs.map +1 -1
- package/dist/index58.cts.map +1 -0
- package/dist/index59.cjs +22 -17
- package/dist/index59.cjs.map +1 -1
- package/dist/index59.cts.map +1 -1
- package/dist/index6.cjs +25 -0
- package/dist/{index5.cjs.map → index6.cjs.map} +1 -1
- package/dist/index60.cjs +9 -412
- package/dist/index60.cjs.map +1 -1
- package/dist/index60.cts.map +1 -0
- package/dist/index61.cjs +8 -8
- package/dist/index61.cjs.map +1 -1
- package/dist/index61.cts.map +1 -0
- package/dist/index62.cjs +17 -9
- package/dist/index62.cjs.map +1 -1
- package/dist/index62.cts.map +1 -1
- package/dist/index63.cjs +419 -0
- package/dist/index63.cjs.map +1 -0
- package/dist/index63.cts.map +1 -1
- package/dist/index64.cjs +15 -0
- package/dist/index64.cjs.map +1 -0
- package/dist/index64.cts.map +1 -1
- package/dist/index65.cjs +10 -116
- package/dist/index65.cjs.map +1 -1
- package/dist/index65.cts.map +1 -1
- package/dist/index66.cjs +2 -228
- package/dist/index66.cts.map +1 -1
- package/dist/index8.cjs +0 -25
- package/dist/index9.cjs +25 -0
- package/dist/{index8.cjs.map → index9.cjs.map} +1 -1
- package/dist/msic-codes-C8PJVOaA.d.ts +25 -0
- package/dist/{msic-codes-B_1W6lZF.d.cts → msic-codes-CIKdPqag.d.cts} +11 -11
- package/dist/{payment-modes-DHihrywe.d.cts → payment-modes-BOTSRC_X.d.ts} +1 -2
- package/dist/{payment-modes-B8dNy3SM.d.ts → payment-modes-ghFEXnUl.d.cts} +1 -1
- package/dist/platformLogin-PGzMhw1X.cjs.map +1 -1
- package/dist/{platformLogin-DsxWWUXr.js → platformLogin-f0bNAoZI.js} +1 -2
- package/dist/{signatures-C9QPZTQd.d.ts → signatures-W-_brwdb.d.ts} +1 -2
- package/dist/{signatures-BKi9DP2K.d.cts → signatures-hFbt_std.d.cts} +1 -1
- package/dist/{state-codes-DXSWtE6a.d.cts → state-codes-BlILGZ9d.d.cts} +1 -1
- package/dist/{state-codes-CxG1S9YY.d.ts → state-codes-oeFKlwXZ.d.ts} +1 -2
- package/dist/{tax-types-CgwxONDS.d.cts → tax-types-B5sQ8UyN.d.cts} +1 -1
- package/dist/{tax-types-CEpfSh5P.d.ts → tax-types-CsQ76JMf.d.ts} +1 -2
- package/dist/types/classification-codes.d.ts +1 -1
- package/dist/types/country-code.d.ts +1 -1
- package/dist/types/currencies.d.ts +1 -1
- package/dist/types/documents.d.ts +18 -0
- package/dist/types/e-invoice.d.ts +1 -1
- package/dist/types/index.d.ts +58 -59
- package/dist/types/msic/0X.d.ts +1 -1
- package/dist/types/msic/1X.d.ts +1 -1
- package/dist/types/msic/2X.d.ts +1 -1
- package/dist/types/msic/3X.d.ts +1 -1
- package/dist/types/msic/4X.d.ts +1 -1
- package/dist/types/msic/5X.d.ts +1 -1
- package/dist/types/msic/6X.d.ts +1 -1
- package/dist/types/msic/7X.d.ts +1 -1
- package/dist/types/msic/8X.d.ts +1 -1
- package/dist/types/msic/9X.d.ts +1 -1
- package/dist/types/msic-codes.d.ts +11 -11
- package/dist/types/payment-modes.d.ts +1 -1
- package/dist/types/signatures.d.ts +1 -1
- package/dist/types/state-codes.d.ts +1 -1
- package/dist/types/tax-types.d.ts +1 -1
- package/dist/types/unit/1X.d.ts +1 -1
- package/dist/types/unit/2X.d.ts +1 -1
- package/dist/types/unit/3X.d.ts +1 -1
- package/dist/types/unit/4X.d.ts +1 -1
- package/dist/types/unit/5X.d.ts +1 -1
- package/dist/types/unit/6X.d.ts +1 -1
- package/dist/types/unit/7X.d.ts +1 -1
- package/dist/types/unit/8X.d.ts +1 -1
- package/dist/types/unit/9X.d.ts +1 -1
- package/dist/types/unit/AX.d.ts +1 -1
- package/dist/types/unit/BX.d.ts +1 -1
- package/dist/types/unit/CX.d.ts +1 -1
- package/dist/types/unit/DX.d.ts +1 -1
- package/dist/types/unit/EX.d.ts +1 -1
- package/dist/types/unit/FX.d.ts +1 -1
- package/dist/types/unit/GX.d.ts +1 -1
- package/dist/types/unit/HX.d.ts +1 -1
- package/dist/types/unit/IX.d.ts +1 -1
- package/dist/types/unit/JX.d.ts +1 -1
- package/dist/types/unit/KX.d.ts +1 -1
- package/dist/types/unit/LX.d.ts +1 -1
- package/dist/types/unit/MX.d.ts +1 -1
- package/dist/types/unit/NX.d.ts +1 -1
- package/dist/types/unit/OX.d.ts +1 -1
- package/dist/types/unit/PX.d.ts +1 -1
- package/dist/types/unit/QX.d.ts +1 -1
- package/dist/types/unit/RX.d.ts +1 -1
- package/dist/types/unit/SX.d.ts +1 -1
- package/dist/types/unit/TX.d.ts +1 -1
- package/dist/types/unit/UX.d.ts +1 -1
- package/dist/types/unit/VX.d.ts +1 -1
- package/dist/types/unit/WX.d.ts +1 -1
- package/dist/types/unit/XX.d.ts +1 -1
- package/dist/types/unit/YX.d.ts +1 -1
- package/dist/types/unit/ZX.d.ts +1 -1
- package/dist/types/unit-types.d.ts +36 -36
- package/dist/unit-types-B41YFOLT.d.ts +55 -0
- package/dist/unit-types-CjWNk2wS.d.cts +56 -0
- package/dist/utils/base64.d.ts +1 -2
- package/dist/utils/base64.js +1 -2
- package/dist/utils/certificate.d.ts +22 -0
- package/dist/utils/certificate.js +3 -0
- package/dist/utils/document.d.ts +135 -0
- package/dist/utils/document.js +3 -0
- package/dist/utils/getBaseUrl.d.ts +1 -2
- package/dist/utils/getBaseUrl.js +1 -1
- package/dist/utils/helpers.d.ts +271 -0
- package/dist/utils/helpers.js +330 -0
- package/dist/utils/signature-diagnostics.d.ts +93 -0
- package/dist/utils/signature-diagnostics.js +326 -0
- package/dist/utils/validation.d.ts +46 -0
- package/dist/utils/validation.js +134 -0
- package/myinvois-cert.conf.template +23 -0
- package/package.json +9 -3
- package/scripts/gen-cert.sh +159 -0
- package/src/api/platform/platformLogin.ts +1 -1
- package/src/index.ts +528 -1
- package/src/types/documents.d.ts +870 -0
- package/src/types/index.d.ts +1 -1
- package/src/utils/certificate.ts +60 -0
- package/src/utils/document.ts +852 -0
- package/src/utils/helpers.ts +552 -0
- package/src/utils/signature-diagnostics.ts +583 -0
- package/src/utils/validation.ts +268 -0
- package/test/MyInvoiClientWithRealData.test.ts +9 -1
- package/test/MyInvoisClient.test.ts +7 -1
- package/test/dynamicInvoiceFeatures.test.ts +451 -0
- package/test/signAndSubmitInvoice.test.ts +271 -734
- package/test/signature-diagnostics.test.ts +130 -0
- package/tsconfig.json +0 -3
- package/dist/0X-C4IRh_fJ.d.ts.map +0 -1
- package/dist/0X-Yw7mZEro.d.cts.map +0 -1
- package/dist/1X-Brnls9Jh.d.ts.map +0 -1
- package/dist/1X-BwpSoT3o.d.cts.map +0 -1
- package/dist/1X-C-_KHV-Q.d.ts.map +0 -1
- package/dist/1X-D_aUVsuM.d.cts.map +0 -1
- package/dist/2X-Bb6elyzV.d.cts.map +0 -1
- package/dist/2X-DkS1BoE5.d.ts.map +0 -1
- package/dist/2X-UdQcQW24.d.ts.map +0 -1
- package/dist/2X-hClUyw26.d.cts.map +0 -1
- package/dist/3X-C7VFD-n-.d.cts.map +0 -1
- package/dist/3X-CLMESDvz.d.cts.map +0 -1
- package/dist/3X-DFI-4RQQ.d.ts.map +0 -1
- package/dist/3X-DVDyspgb.d.ts.map +0 -1
- package/dist/4X-CIJ2JJ2w.d.ts.map +0 -1
- package/dist/4X-CUR8jlaZ.d.ts.map +0 -1
- package/dist/4X-CvScPJTf.d.cts.map +0 -1
- package/dist/4X-DIfvpU6V.d.cts.map +0 -1
- package/dist/5X-BOUxhadJ.d.cts.map +0 -1
- package/dist/5X-C6db432h.d.ts.map +0 -1
- package/dist/5X-COsZHUaQ.d.ts.map +0 -1
- package/dist/5X-CkLu7Vyd.d.cts.map +0 -1
- package/dist/6X-C_fFIcJC.d.ts.map +0 -1
- package/dist/6X-ClZDKOTC.d.ts.map +0 -1
- package/dist/6X-DE7RJeV6.d.cts.map +0 -1
- package/dist/6X-Mf32k1d0.d.cts.map +0 -1
- package/dist/7X-BZyesooz.d.ts.map +0 -1
- package/dist/7X-Chtd6B66.d.cts.map +0 -1
- package/dist/7X-DoCUcp-J.d.cts.map +0 -1
- package/dist/7X-kot_VccM.d.ts.map +0 -1
- package/dist/8X-Df4DOBOe.d.ts.map +0 -1
- package/dist/8X-DkuKAkHz.d.ts.map +0 -1
- package/dist/8X-DqZyMvyV.d.cts.map +0 -1
- package/dist/8X-Dr9RunRw.d.cts.map +0 -1
- package/dist/9X-BDgifncF.d.ts.map +0 -1
- package/dist/9X-BaoZtjWF.d.cts.map +0 -1
- package/dist/9X-BcAb6Uso.d.cts.map +0 -1
- package/dist/9X-BhBWlgxG.d.ts.map +0 -1
- package/dist/AX-BY72FohC.d.cts.map +0 -1
- package/dist/AX-D6XHWdrY.d.ts.map +0 -1
- package/dist/BX-CA0OmrUZ.d.cts.map +0 -1
- package/dist/BX-D_0C8Qbd.d.ts.map +0 -1
- package/dist/CX-HH4cSZRX.d.ts.map +0 -1
- package/dist/CX-glpQSL8x.d.cts.map +0 -1
- package/dist/DX-DimL1MDM.d.cts.map +0 -1
- package/dist/DX-Dx22ax_I.d.ts.map +0 -1
- package/dist/EX-BRWh1wFc.d.ts.map +0 -1
- package/dist/EX-Cx87Ruxl.d.cts.map +0 -1
- package/dist/FX-D81UlxNN.d.cts.map +0 -1
- package/dist/FX-RmjwAr40.d.ts.map +0 -1
- package/dist/GX-9i7piP9G.d.cts.map +0 -1
- package/dist/GX-CJyo7oDp.d.ts.map +0 -1
- package/dist/HX-20GVJAvl.d.cts.map +0 -1
- package/dist/HX-XALBTdLA.d.ts.map +0 -1
- package/dist/IX-6SZ55QKb.d.ts.map +0 -1
- package/dist/IX-D54NGPsc.d.cts.map +0 -1
- package/dist/JX-C1RYcwQX.d.cts.map +0 -1
- package/dist/JX-hQ1XRmLp.d.ts.map +0 -1
- package/dist/KX-BNwunEfn.d.ts.map +0 -1
- package/dist/KX-gQHCIgtQ.d.cts.map +0 -1
- package/dist/LX-CHYX3X3J.d.ts.map +0 -1
- package/dist/LX-CPurJGIh.d.cts.map +0 -1
- package/dist/MX-BPGLWSUz.d.ts.map +0 -1
- package/dist/MX-BnyW5eHf.d.cts.map +0 -1
- package/dist/MyInvoisClient-BrNyMjS-.d.cts +0 -178
- package/dist/MyInvoisClient-BrNyMjS-.d.cts.map +0 -1
- package/dist/MyInvoisClient-CXu4pdl-.d.ts +0 -178
- package/dist/MyInvoisClient-CXu4pdl-.d.ts.map +0 -1
- package/dist/MyInvoisClient-Cnvb5iUC.js +0 -299
- package/dist/MyInvoisClient-Cnvb5iUC.js.map +0 -1
- package/dist/MyInvoisClient-DO1dJfQq.cjs +0 -304
- package/dist/MyInvoisClient-DO1dJfQq.cjs.map +0 -1
- package/dist/NX-B11fQuco.d.cts.map +0 -1
- package/dist/NX-RulN5Ml3.d.ts.map +0 -1
- package/dist/OX-DgKVSp7I.d.ts.map +0 -1
- package/dist/OX-T-ydRXQS.d.cts.map +0 -1
- package/dist/PX-DA4A2kEv.d.ts.map +0 -1
- package/dist/PX-p0n1SzvU.d.cts.map +0 -1
- package/dist/QX-CI1NccIB.d.cts.map +0 -1
- package/dist/QX-DrFqsMEs.d.ts.map +0 -1
- package/dist/RX-Cm7vFcFN.d.ts.map +0 -1
- package/dist/RX-DnNKol22.d.cts.map +0 -1
- package/dist/SX-BUjiWQYz.d.cts.map +0 -1
- package/dist/SX-CsPPTu-W.d.ts.map +0 -1
- package/dist/TX-DCY25MdR.d.ts.map +0 -1
- package/dist/TX-DOEpsf05.d.cts.map +0 -1
- package/dist/UX-DauyagHy.d.ts.map +0 -1
- package/dist/UX-DgUOnTFK.d.cts.map +0 -1
- package/dist/VX-DD4scgCe.d.ts.map +0 -1
- package/dist/VX-kUX6LM-3.d.cts.map +0 -1
- package/dist/WX-CjkoppdY.d.ts.map +0 -1
- package/dist/WX-DPfyPFFh.d.cts.map +0 -1
- package/dist/XX-C4C1gQZH.d.cts.map +0 -1
- package/dist/XX-sbsIUOnA.d.ts.map +0 -1
- package/dist/YX-BeT-LsiA.d.cts.map +0 -1
- package/dist/YX-DUdO8mRC.d.ts.map +0 -1
- package/dist/ZX-BuVTTq-D.d.cts.map +0 -1
- package/dist/ZX-DwfcSA-D.d.ts.map +0 -1
- package/dist/api/platform/platformLogin.d.ts.map +0 -1
- package/dist/canonicalize-C_fNNpYr.cjs +0 -80
- package/dist/canonicalize-C_fNNpYr.cjs.map +0 -1
- package/dist/canonicalize-DNUrCGad.js +0 -68
- package/dist/canonicalize-DNUrCGad.js.map +0 -1
- package/dist/classification-codes-B15PbWxz.d.cts.map +0 -1
- package/dist/classification-codes-C2X4xW5-.d.ts.map +0 -1
- package/dist/country-code-DPeNFMMi.d.cts.map +0 -1
- package/dist/country-code-DsI8Mbzx.d.ts.map +0 -1
- package/dist/currencies-DKuDflOO.d.ts.map +0 -1
- package/dist/currencies-S5g1gzBU.d.cts.map +0 -1
- package/dist/e-invoice-BuwtFnlI.d.cts.map +0 -1
- package/dist/e-invoice-C2TxhyrK.d.ts.map +0 -1
- package/dist/getBaseUrl-Dx6RDC8I.js.map +0 -1
- package/dist/hashCert-Bol7lIh2.js +0 -62
- package/dist/hashCert-Bol7lIh2.js.map +0 -1
- package/dist/hashCert-mlYEuYex.cjs +0 -68
- package/dist/hashCert-mlYEuYex.cjs.map +0 -1
- package/dist/hashSignedProperties-9vj5wlYR.js +0 -83
- package/dist/hashSignedProperties-9vj5wlYR.js.map +0 -1
- package/dist/hashSignedProperties-CU_ZqqmY.cjs +0 -95
- package/dist/hashSignedProperties-CU_ZqqmY.cjs.map +0 -1
- package/dist/index-B1DSs-wd.d.cts.map +0 -1
- package/dist/index-CJNLQVjx.d.ts +0 -1
- package/dist/index-FTgB2nM6.d.ts.map +0 -1
- package/dist/index-Wy1ONBjV.d.cts +0 -1
- package/dist/index10.cjs.map +0 -1
- package/dist/index66.cjs.map +0 -1
- package/dist/index67.cjs +0 -4
- package/dist/index67.cts.map +0 -1
- package/dist/index68.cjs +0 -3
- package/dist/index68.cts.map +0 -1
- package/dist/index69.cjs +0 -4
- package/dist/index69.cts.map +0 -1
- package/dist/index70.cjs +0 -3
- package/dist/index70.cts.map +0 -1
- package/dist/index71.cjs +0 -3
- package/dist/index71.cts.map +0 -1
- package/dist/index72.cjs +0 -3
- package/dist/index72.cts.map +0 -1
- package/dist/index73.cjs +0 -3
- package/dist/index73.cts.map +0 -1
- package/dist/invoice-1_1-BJVcw-oE.d.ts +0 -432
- package/dist/invoice-1_1-BJVcw-oE.d.ts.map +0 -1
- package/dist/invoice-1_1-DWdNPRzr.d.cts +0 -432
- package/dist/invoice-1_1-DWdNPRzr.d.cts.map +0 -1
- package/dist/invoice1-1-8S-QQn7P.cjs +0 -547
- package/dist/invoice1-1-8S-QQn7P.cjs.map +0 -1
- package/dist/invoice1-1-CHuLpkFz.js +0 -504
- package/dist/invoice1-1-CHuLpkFz.js.map +0 -1
- package/dist/msic-codes-B_1W6lZF.d.cts.map +0 -1
- package/dist/msic-codes-bs0lTfSZ.d.ts +0 -26
- package/dist/msic-codes-bs0lTfSZ.d.ts.map +0 -1
- package/dist/payment-modes-B8dNy3SM.d.ts.map +0 -1
- package/dist/payment-modes-DHihrywe.d.cts.map +0 -1
- package/dist/platformLogin-DsxWWUXr.js.map +0 -1
- package/dist/populateFinalDocument-BdyYzz5Y.cjs +0 -96
- package/dist/populateFinalDocument-BdyYzz5Y.cjs.map +0 -1
- package/dist/populateFinalDocument-BpLXmgLv.js +0 -90
- package/dist/populateFinalDocument-BpLXmgLv.js.map +0 -1
- package/dist/populateSignedProperties-BJMcBQ6S.cjs +0 -58
- package/dist/populateSignedProperties-BJMcBQ6S.cjs.map +0 -1
- package/dist/populateSignedProperties-BvGN-YZH.js +0 -52
- package/dist/populateSignedProperties-BvGN-YZH.js.map +0 -1
- package/dist/sign-B61Cy3gO.cjs +0 -40
- package/dist/sign-B61Cy3gO.cjs.map +0 -1
- package/dist/sign-DzHK7UhR.js +0 -34
- package/dist/sign-DzHK7UhR.js.map +0 -1
- package/dist/signatures-BKi9DP2K.d.cts.map +0 -1
- package/dist/signatures-C9QPZTQd.d.ts.map +0 -1
- package/dist/state-codes-CxG1S9YY.d.ts.map +0 -1
- package/dist/state-codes-DXSWtE6a.d.cts.map +0 -1
- package/dist/tax-types-CEpfSh5P.d.ts.map +0 -1
- package/dist/tax-types-CgwxONDS.d.cts.map +0 -1
- package/dist/transform-BLz0S687.cjs +0 -72
- package/dist/transform-BLz0S687.cjs.map +0 -1
- package/dist/transform-D1q-U6Zj.js +0 -66
- package/dist/transform-D1q-U6Zj.js.map +0 -1
- package/dist/types/documents/index.d.ts +0 -57
- package/dist/types/documents/invoice-1_1.d.ts +0 -56
- package/dist/unit-types-1bF0KhIp.d.ts +0 -56
- package/dist/unit-types-1bF0KhIp.d.ts.map +0 -1
- package/dist/unit-types-CsrkvgfG.d.cts +0 -56
- package/dist/unit-types-CsrkvgfG.d.cts.map +0 -1
- package/dist/utils/MyInvoisClient.d.ts +0 -60
- package/dist/utils/MyInvoisClient.js +0 -13
- package/dist/utils/base64.d.ts.map +0 -1
- package/dist/utils/base64.js.map +0 -1
- package/dist/utils/debug/debug-document-hash.d.ts +0 -100
- package/dist/utils/debug/debug-document-hash.d.ts.map +0 -1
- package/dist/utils/debug/debug-document-hash.js +0 -120
- package/dist/utils/debug/debug-document-hash.js.map +0 -1
- package/dist/utils/debug/debug-invoice-submission.d.ts +0 -152
- package/dist/utils/debug/debug-invoice-submission.d.ts.map +0 -1
- package/dist/utils/debug/debug-invoice-submission.js +0 -226
- package/dist/utils/debug/debug-invoice-submission.js.map +0 -1
- package/dist/utils/getBaseUrl.d.ts.map +0 -1
- package/dist/utils/invoice1-1.d.ts +0 -117
- package/dist/utils/invoice1-1.d.ts.map +0 -1
- package/dist/utils/invoice1-1.js +0 -10
- package/dist/utils/signature/canonicalize.d.ts +0 -26
- package/dist/utils/signature/canonicalize.d.ts.map +0 -1
- package/dist/utils/signature/canonicalize.js +0 -3
- package/dist/utils/signature/hashCert.d.ts +0 -15
- package/dist/utils/signature/hashCert.d.ts.map +0 -1
- package/dist/utils/signature/hashCert.js +0 -3
- package/dist/utils/signature/hashSignedProperties.d.ts +0 -25
- package/dist/utils/signature/hashSignedProperties.d.ts.map +0 -1
- package/dist/utils/signature/hashSignedProperties.js +0 -3
- package/dist/utils/signature/populateFinalDocument.d.ts +0 -23
- package/dist/utils/signature/populateFinalDocument.d.ts.map +0 -1
- package/dist/utils/signature/populateFinalDocument.js +0 -3
- package/dist/utils/signature/populateSignedProperties.d.ts +0 -23
- package/dist/utils/signature/populateSignedProperties.d.ts.map +0 -1
- package/dist/utils/signature/populateSignedProperties.js +0 -3
- package/dist/utils/signature/sign.d.ts +0 -16
- package/dist/utils/signature/sign.d.ts.map +0 -1
- package/dist/utils/signature/sign.js +0 -3
- package/dist/utils/signature/transform.d.ts +0 -16
- package/dist/utils/signature/transform.d.ts.map +0 -1
- package/dist/utils/signature/transform.js +0 -3
- package/src/types/documents/index.d.ts +0 -1
- package/src/types/documents/invoice-1_1.d.ts +0 -439
- package/src/utils/MyInvoisClient.ts +0 -501
- package/src/utils/debug/debug-document-hash.ts +0 -249
- package/src/utils/debug/debug-invoice-submission.ts +0 -355
- package/src/utils/invoice1-1.ts +0 -671
- package/src/utils/signature/canonicalize.ts +0 -104
- package/src/utils/signature/hashCert.ts +0 -115
- package/src/utils/signature/hashSignedProperties.ts +0 -155
- package/src/utils/signature/populateFinalDocument.ts +0 -187
- package/src/utils/signature/populateSignedProperties.ts +0 -87
- package/src/utils/signature/sign.ts +0 -51
- package/src/utils/signature/transform.ts +0 -99
- package/test/canonicalize.test.ts +0 -110
- package/test/hashCert.test.ts +0 -95
- package/test/hashSignedProperties.test.ts +0 -140
- package/test/populateFinalDocument.test.ts +0 -218
- package/test/populateSignedProperties.test.ts +0 -155
- package/test/sign.test.ts +0 -70
- package/test/transform.test.ts +0 -158
|
@@ -1,218 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { DOMParserImpl } from 'xmldom-ts'
|
|
3
|
-
import * as xpath from 'xpath-ts'
|
|
4
|
-
import { populateFinalDocument } from '../src/utils/signature/populateFinalDocument'
|
|
5
|
-
import type { FinalDocumentData } from '../src/utils/signature/populateFinalDocument'
|
|
6
|
-
|
|
7
|
-
// Define namespaces matching those in the function
|
|
8
|
-
const ns = {
|
|
9
|
-
inv: 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2',
|
|
10
|
-
ext: 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2',
|
|
11
|
-
sig: 'urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2',
|
|
12
|
-
sac: 'urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2',
|
|
13
|
-
ds: 'http://www.w3.org/2000/09/xmldsig#',
|
|
14
|
-
}
|
|
15
|
-
const select = xpath.useNamespaces(ns)
|
|
16
|
-
|
|
17
|
-
// Sample XML structure mimicking the final signature part
|
|
18
|
-
const sampleXmlTemplate = `
|
|
19
|
-
<inv:Invoice xmlns:inv="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
|
|
20
|
-
xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2"
|
|
21
|
-
xmlns:sig="urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2"
|
|
22
|
-
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
|
|
23
|
-
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-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:SignedInfo>
|
|
34
|
-
<ds:Reference URI="#id-xades-signed-props">
|
|
35
|
-
<ds:DigestValue></ds:DigestValue>
|
|
36
|
-
</ds:Reference>
|
|
37
|
-
<ds:Reference Id="id-doc-signed-data">
|
|
38
|
-
<ds:DigestValue></ds:DigestValue>
|
|
39
|
-
</ds:Reference>
|
|
40
|
-
</ds:SignedInfo>
|
|
41
|
-
<ds:SignatureValue></ds:SignatureValue>
|
|
42
|
-
<ds:KeyInfo>
|
|
43
|
-
<ds:X509Data>
|
|
44
|
-
<ds:X509Certificate></ds:X509Certificate>
|
|
45
|
-
</ds:X509Data>
|
|
46
|
-
</ds:KeyInfo>
|
|
47
|
-
<!-- ds:Object containing xades:QualifyingProperties would normally be here -->
|
|
48
|
-
</ds:Signature>
|
|
49
|
-
</sac:SignatureInformation>
|
|
50
|
-
</sig:UBLDocumentSignatures>
|
|
51
|
-
</ext:ExtensionContent>
|
|
52
|
-
</ext:UBLExtension>
|
|
53
|
-
</ext:UBLExtensions>
|
|
54
|
-
<!-- Required cac:Signature element that populateFinalDocument populates -->
|
|
55
|
-
<cac:Signature>
|
|
56
|
-
<cbc:ID></cbc:ID>
|
|
57
|
-
<cbc:SignatureMethod></cbc:SignatureMethod>
|
|
58
|
-
</cac:Signature>
|
|
59
|
-
</inv:Invoice>
|
|
60
|
-
`
|
|
61
|
-
|
|
62
|
-
// Sample PEM for testing cleaning
|
|
63
|
-
const sampleCertificatePem = `
|
|
64
|
-
-----BEGIN CERTIFICATE-----
|
|
65
|
-
SAMPLEBASE64DATA
|
|
66
|
-
LINE2OFDATA
|
|
67
|
-
-----END CERTIFICATE-----
|
|
68
|
-
`
|
|
69
|
-
const expectedCleanedCertificate = 'SAMPLEBASE64DATALINE2OFDATA'
|
|
70
|
-
|
|
71
|
-
describe('populateFinalDocument', () => {
|
|
72
|
-
const parser = new DOMParserImpl()
|
|
73
|
-
|
|
74
|
-
it('should populate all final signature fields correctly', () => {
|
|
75
|
-
const doc = parser.parseFromString(sampleXmlTemplate, 'application/xml')
|
|
76
|
-
const testData: FinalDocumentData = {
|
|
77
|
-
signatureValue: 'TEST_SIGNATURE_VALUE==',
|
|
78
|
-
propsDigest: 'TEST_PROPS_DIGEST==',
|
|
79
|
-
docDigest: 'TEST_DOC_DIGEST==',
|
|
80
|
-
certificatePem: sampleCertificatePem,
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
populateFinalDocument(doc, testData)
|
|
84
|
-
|
|
85
|
-
// Verify each populated value using XPath
|
|
86
|
-
const signatureValueNodes = select('//ds:SignatureValue', doc) as Node[]
|
|
87
|
-
expect(signatureValueNodes).toHaveLength(1)
|
|
88
|
-
expect(signatureValueNodes[0].textContent).toBe(testData.signatureValue)
|
|
89
|
-
|
|
90
|
-
const x509CertNodes = select('//ds:X509Certificate', doc) as Node[]
|
|
91
|
-
expect(x509CertNodes).toHaveLength(1)
|
|
92
|
-
expect(x509CertNodes[0].textContent).toBe(expectedCleanedCertificate) // Verify cleaned cert
|
|
93
|
-
|
|
94
|
-
const propsDigestNodes = select(
|
|
95
|
-
"//ds:Reference[@URI='#id-xades-signed-props']/ds:DigestValue",
|
|
96
|
-
doc,
|
|
97
|
-
) as Node[]
|
|
98
|
-
expect(propsDigestNodes).toHaveLength(1)
|
|
99
|
-
expect(propsDigestNodes[0].textContent).toBe(testData.propsDigest)
|
|
100
|
-
|
|
101
|
-
const docDigestNodes = select(
|
|
102
|
-
"//ds:Reference[@Id='id-doc-signed-data']/ds:DigestValue",
|
|
103
|
-
doc,
|
|
104
|
-
) as Node[]
|
|
105
|
-
expect(docDigestNodes).toHaveLength(1)
|
|
106
|
-
expect(docDigestNodes[0].textContent).toBe(testData.docDigest)
|
|
107
|
-
})
|
|
108
|
-
|
|
109
|
-
it('should throw error if SignatureValue element is missing', () => {
|
|
110
|
-
const modifiedXml = sampleXmlTemplate.replace(
|
|
111
|
-
'<ds:SignatureValue></ds:SignatureValue>',
|
|
112
|
-
'',
|
|
113
|
-
)
|
|
114
|
-
const doc = parser.parseFromString(modifiedXml, 'application/xml')
|
|
115
|
-
const testData: FinalDocumentData = {
|
|
116
|
-
signatureValue: 's',
|
|
117
|
-
propsDigest: 'p',
|
|
118
|
-
docDigest: 'd',
|
|
119
|
-
certificatePem: 'c',
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
expect(() => populateFinalDocument(doc, testData)).toThrow(
|
|
123
|
-
/^Failed to set value for XPath .*ds:SignatureValue: Element not found/,
|
|
124
|
-
)
|
|
125
|
-
})
|
|
126
|
-
|
|
127
|
-
it('should throw error if X509Certificate element is missing', () => {
|
|
128
|
-
const modifiedXml = sampleXmlTemplate.replace(
|
|
129
|
-
'<ds:X509Certificate></ds:X509Certificate>',
|
|
130
|
-
'',
|
|
131
|
-
)
|
|
132
|
-
const doc = parser.parseFromString(modifiedXml, 'application/xml')
|
|
133
|
-
const testData: FinalDocumentData = {
|
|
134
|
-
signatureValue: 's',
|
|
135
|
-
propsDigest: 'p',
|
|
136
|
-
docDigest: 'd',
|
|
137
|
-
certificatePem: 'c',
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
expect(() => populateFinalDocument(doc, testData)).toThrow(
|
|
141
|
-
/^Failed to set value for XPath .*ds:X509Certificate: Element not found/,
|
|
142
|
-
)
|
|
143
|
-
})
|
|
144
|
-
|
|
145
|
-
it('should throw error if propsDigest Reference element is missing', () => {
|
|
146
|
-
// Parse the original XML
|
|
147
|
-
const doc = parser.parseFromString(sampleXmlTemplate, 'application/xml')
|
|
148
|
-
|
|
149
|
-
// Find and remove the target node using DOM manipulation
|
|
150
|
-
const propsRefXPath = "//ds:Reference[@URI='#id-xades-signed-props']"
|
|
151
|
-
const nodesToRemove = select(propsRefXPath, doc) as any[]
|
|
152
|
-
expect(nodesToRemove).toHaveLength(1) // Ensure we found the node to remove
|
|
153
|
-
const nodeToRemove = nodesToRemove[0]
|
|
154
|
-
if (nodeToRemove.parentNode) {
|
|
155
|
-
nodeToRemove.parentNode.removeChild(nodeToRemove)
|
|
156
|
-
} else {
|
|
157
|
-
throw new Error('Failed to find parent node for removal in test setup')
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
const testData: FinalDocumentData = {
|
|
161
|
-
signatureValue: 's',
|
|
162
|
-
propsDigest: 'p',
|
|
163
|
-
docDigest: 'd',
|
|
164
|
-
certificatePem: 'c',
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Regex adjusted slightly for flexibility (kept from previous step)
|
|
168
|
-
expect(() => populateFinalDocument(doc, testData)).toThrow(
|
|
169
|
-
/^Failed to set value for XPath .*@URI='#id-xades-signed-props'.*\/ds:DigestValue: Element not found for XPath: .*@URI='#id-xades-signed-props'.*\/ds:DigestValue$/,
|
|
170
|
-
)
|
|
171
|
-
})
|
|
172
|
-
|
|
173
|
-
it('should throw error if docDigest Reference element is missing', () => {
|
|
174
|
-
// Parse the original XML
|
|
175
|
-
const doc = parser.parseFromString(sampleXmlTemplate, 'application/xml')
|
|
176
|
-
|
|
177
|
-
// Find and remove the target node using DOM manipulation
|
|
178
|
-
const docRefXPath = "//ds:Reference[@Id='id-doc-signed-data']"
|
|
179
|
-
const nodesToRemove = select(docRefXPath, doc) as any[]
|
|
180
|
-
expect(nodesToRemove).toHaveLength(1) // Ensure we found the node to remove
|
|
181
|
-
const nodeToRemove = nodesToRemove[0]
|
|
182
|
-
if (nodeToRemove.parentNode) {
|
|
183
|
-
nodeToRemove.parentNode.removeChild(nodeToRemove)
|
|
184
|
-
} else {
|
|
185
|
-
throw new Error('Failed to find parent node for removal in test setup')
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const testData: FinalDocumentData = {
|
|
189
|
-
signatureValue: 's',
|
|
190
|
-
propsDigest: 'p',
|
|
191
|
-
docDigest: 'd',
|
|
192
|
-
certificatePem: 'c',
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
// Regex adjusted slightly for flexibility (kept from previous step)
|
|
196
|
-
expect(() => populateFinalDocument(doc, testData)).toThrow(
|
|
197
|
-
/^Failed to set value for XPath .*@Id='id-doc-signed-data'.*\/ds:DigestValue: Element not found for XPath: .*@Id='id-doc-signed-data'.*\/ds:DigestValue$/,
|
|
198
|
-
)
|
|
199
|
-
})
|
|
200
|
-
|
|
201
|
-
it('should throw error if multiple SignatureValue elements are found', () => {
|
|
202
|
-
const modifiedXml = sampleXmlTemplate.replace(
|
|
203
|
-
'<ds:SignatureValue></ds:SignatureValue>',
|
|
204
|
-
'<ds:SignatureValue>1</ds:SignatureValue><ds:SignatureValue>2</ds:SignatureValue>',
|
|
205
|
-
)
|
|
206
|
-
const doc = parser.parseFromString(modifiedXml, 'application/xml')
|
|
207
|
-
const testData: FinalDocumentData = {
|
|
208
|
-
signatureValue: 's',
|
|
209
|
-
propsDigest: 'p',
|
|
210
|
-
docDigest: 'd',
|
|
211
|
-
certificatePem: 'c',
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
expect(() => populateFinalDocument(doc, testData)).toThrow(
|
|
215
|
-
/^Failed to set value for XPath .*ds:SignatureValue: Multiple elements found/,
|
|
216
|
-
)
|
|
217
|
-
})
|
|
218
|
-
})
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { DOMParserImpl } from 'xmldom-ts'
|
|
3
|
-
import * as xpath from 'xpath-ts'
|
|
4
|
-
import { populateSignedProperties } from '../src/utils/signature/populateSignedProperties'
|
|
5
|
-
import type { SignedPropertiesData } from '../src/utils/signature/populateSignedProperties'
|
|
6
|
-
|
|
7
|
-
// Define namespaces matching those in the function
|
|
8
|
-
const ns = {
|
|
9
|
-
inv: 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2',
|
|
10
|
-
ext: 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2',
|
|
11
|
-
sig: 'urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2',
|
|
12
|
-
sac: 'urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2',
|
|
13
|
-
ds: 'http://www.w3.org/2000/09/xmldsig#',
|
|
14
|
-
xades: 'http://uri.etsi.org/01903/v1.3.2#',
|
|
15
|
-
}
|
|
16
|
-
const select = xpath.useNamespaces(ns)
|
|
17
|
-
|
|
18
|
-
// Sample XML structure mimicking the UBL signature part
|
|
19
|
-
// Needs to include the full path for the properties to be populated.
|
|
20
|
-
const sampleXmlTemplate = `
|
|
21
|
-
<Invoice xmlns="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></xades:SigningTime>
|
|
38
|
-
<xades:SigningCertificate>
|
|
39
|
-
<xades:Cert>
|
|
40
|
-
<xades:CertDigest>
|
|
41
|
-
<ds:DigestValue></ds:DigestValue>
|
|
42
|
-
</xades:CertDigest>
|
|
43
|
-
<xades:IssuerSerial>
|
|
44
|
-
<ds:X509IssuerName></ds:X509IssuerName>
|
|
45
|
-
<ds:X509SerialNumber></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
|
-
<!-- Other Invoice Content -->
|
|
60
|
-
</Invoice>
|
|
61
|
-
`
|
|
62
|
-
|
|
63
|
-
describe('populateSignedProperties', () => {
|
|
64
|
-
const parser = new DOMParserImpl()
|
|
65
|
-
|
|
66
|
-
it('should populate all specified properties correctly', () => {
|
|
67
|
-
const doc = parser.parseFromString(sampleXmlTemplate, 'application/xml')
|
|
68
|
-
const testData: SignedPropertiesData = {
|
|
69
|
-
certDigest: 'TEST_CERT_DIGEST==',
|
|
70
|
-
signingTime: '2024-01-01T12:00:00Z',
|
|
71
|
-
issuerName: 'CN=Test Issuer, O=Test Org',
|
|
72
|
-
serialNumber: '1234567890',
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
populateSignedProperties(doc, testData)
|
|
76
|
-
|
|
77
|
-
// Verify each populated value using XPath
|
|
78
|
-
const certDigestNodes = select(
|
|
79
|
-
'//ds:DigestValue[ancestor::xades:CertDigest]',
|
|
80
|
-
doc,
|
|
81
|
-
) as Node[]
|
|
82
|
-
expect(certDigestNodes).toHaveLength(1)
|
|
83
|
-
expect(certDigestNodes[0].textContent).toBe(testData.certDigest)
|
|
84
|
-
|
|
85
|
-
const signingTimeNodes = select('//xades:SigningTime', doc) as Node[]
|
|
86
|
-
expect(signingTimeNodes).toHaveLength(1)
|
|
87
|
-
expect(signingTimeNodes[0].textContent).toBe(testData.signingTime)
|
|
88
|
-
|
|
89
|
-
const issuerNameNodes = select('//ds:X509IssuerName', doc) as Node[]
|
|
90
|
-
expect(issuerNameNodes).toHaveLength(1)
|
|
91
|
-
expect(issuerNameNodes[0].textContent).toBe(testData.issuerName)
|
|
92
|
-
|
|
93
|
-
const serialNumberNodes = select('//ds:X509SerialNumber', doc) as Node[]
|
|
94
|
-
expect(serialNumberNodes).toHaveLength(1)
|
|
95
|
-
expect(serialNumberNodes[0].textContent).toBe(testData.serialNumber)
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
it('should throw error if CertDigest element is missing', () => {
|
|
99
|
-
// Create XML missing the target element
|
|
100
|
-
const modifiedXml = sampleXmlTemplate.replace(
|
|
101
|
-
'<ds:DigestValue></ds:DigestValue>',
|
|
102
|
-
'',
|
|
103
|
-
)
|
|
104
|
-
const doc = parser.parseFromString(modifiedXml, 'application/xml')
|
|
105
|
-
const testData: SignedPropertiesData = {
|
|
106
|
-
certDigest: 'd',
|
|
107
|
-
signingTime: 't',
|
|
108
|
-
issuerName: 'i',
|
|
109
|
-
serialNumber: 's',
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
expect(() => populateSignedProperties(doc, testData)).toThrow(
|
|
113
|
-
/^Failed to set value for XPath .*ds:DigestValue: Element not found/,
|
|
114
|
-
)
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
it('should throw error if SigningTime element is missing', () => {
|
|
118
|
-
const modifiedXml = sampleXmlTemplate.replace(
|
|
119
|
-
'<xades:SigningTime></xades:SigningTime>',
|
|
120
|
-
'',
|
|
121
|
-
)
|
|
122
|
-
const doc = parser.parseFromString(modifiedXml, 'application/xml')
|
|
123
|
-
const testData: SignedPropertiesData = {
|
|
124
|
-
certDigest: 'd',
|
|
125
|
-
signingTime: 't',
|
|
126
|
-
issuerName: 'i',
|
|
127
|
-
serialNumber: 's',
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
expect(() => populateSignedProperties(doc, testData)).toThrow(
|
|
131
|
-
/^Failed to set value for XPath .*xades:SigningTime: Element not found/,
|
|
132
|
-
)
|
|
133
|
-
})
|
|
134
|
-
|
|
135
|
-
// Add similar tests for missing IssuerName and SerialNumber if desired
|
|
136
|
-
|
|
137
|
-
it('should throw error if multiple CertDigest elements are found', () => {
|
|
138
|
-
// Create XML with duplicate target elements
|
|
139
|
-
const modifiedXml = sampleXmlTemplate.replace(
|
|
140
|
-
'<ds:DigestValue></ds:DigestValue>',
|
|
141
|
-
'<ds:DigestValue>1</ds:DigestValue><ds:DigestValue>2</ds:DigestValue>',
|
|
142
|
-
)
|
|
143
|
-
const doc = parser.parseFromString(modifiedXml, 'application/xml')
|
|
144
|
-
const testData: SignedPropertiesData = {
|
|
145
|
-
certDigest: 'd',
|
|
146
|
-
signingTime: 't',
|
|
147
|
-
issuerName: 'i',
|
|
148
|
-
serialNumber: 's',
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
expect(() => populateSignedProperties(doc, testData)).toThrow(
|
|
152
|
-
/^Failed to set value for XPath .*ds:DigestValue: Multiple elements found/,
|
|
153
|
-
)
|
|
154
|
-
})
|
|
155
|
-
})
|
package/test/sign.test.ts
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import * as crypto from 'crypto'
|
|
3
|
-
import { signDocumentDigest } from '../src/utils/signature/sign'
|
|
4
|
-
|
|
5
|
-
// Generate a test RSA key pair for signing/verifying
|
|
6
|
-
const { privateKey, publicKey } = crypto.generateKeyPairSync('rsa', {
|
|
7
|
-
modulusLength: 2048, // Standard length
|
|
8
|
-
publicKeyEncoding: {
|
|
9
|
-
type: 'spki',
|
|
10
|
-
format: 'pem',
|
|
11
|
-
},
|
|
12
|
-
privateKeyEncoding: {
|
|
13
|
-
type: 'pkcs8',
|
|
14
|
-
format: 'pem',
|
|
15
|
-
},
|
|
16
|
-
})
|
|
17
|
-
|
|
18
|
-
describe('signDocumentDigest', () => {
|
|
19
|
-
const sampleDocDigestBase64 = 'SampleDigestValueAsBase64=='
|
|
20
|
-
const sampleDocDigestRaw = Buffer.from(sampleDocDigestBase64, 'base64')
|
|
21
|
-
|
|
22
|
-
it('should generate a valid RSA-SHA256 signature in Base64 format', () => {
|
|
23
|
-
const signatureBase64 = signDocumentDigest(
|
|
24
|
-
sampleDocDigestBase64,
|
|
25
|
-
privateKey,
|
|
26
|
-
)
|
|
27
|
-
|
|
28
|
-
// Verify the signature using the public key
|
|
29
|
-
const verifier = crypto.createVerify('RSA-SHA256')
|
|
30
|
-
verifier.update(sampleDocDigestRaw)
|
|
31
|
-
verifier.end()
|
|
32
|
-
|
|
33
|
-
const isValid = verifier.verify(publicKey, signatureBase64, 'base64')
|
|
34
|
-
|
|
35
|
-
expect(isValid).toBe(true)
|
|
36
|
-
// Check if the output is a valid Base64 string
|
|
37
|
-
expect(() => Buffer.from(signatureBase64, 'base64')).not.toThrow()
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
it('should throw an error if the private key is invalid', () => {
|
|
41
|
-
const invalidPrivateKey =
|
|
42
|
-
'-----BEGIN INVALID KEY-----\nINVALID\n-----END INVALID KEY-----'
|
|
43
|
-
expect(() =>
|
|
44
|
-
signDocumentDigest(sampleDocDigestBase64, invalidPrivateKey),
|
|
45
|
-
).toThrow(/Failed to sign document digest/)
|
|
46
|
-
// The specific internal crypto error message might vary, so we match our wrapper message
|
|
47
|
-
})
|
|
48
|
-
|
|
49
|
-
it('should handle Buffer as private key input', () => {
|
|
50
|
-
const privateKeyBuffer = Buffer.from(privateKey)
|
|
51
|
-
const signatureBase64 = signDocumentDigest(
|
|
52
|
-
sampleDocDigestBase64,
|
|
53
|
-
privateKeyBuffer,
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
const verifier = crypto.createVerify('RSA-SHA256')
|
|
57
|
-
verifier.update(sampleDocDigestRaw)
|
|
58
|
-
verifier.end()
|
|
59
|
-
const isValid = verifier.verify(publicKey, signatureBase64, 'base64')
|
|
60
|
-
expect(isValid).toBe(true)
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
it('should throw an error if the digest is not valid Base64', () => {
|
|
64
|
-
const invalidBase64Digest = 'This is not base64'
|
|
65
|
-
expect(() => signDocumentDigest(invalidBase64Digest, privateKey)).toThrow(
|
|
66
|
-
'Invalid Base64 characters detected in document digest.',
|
|
67
|
-
)
|
|
68
|
-
// Error likely occurs during Buffer.from() or the preceding regex check
|
|
69
|
-
})
|
|
70
|
-
})
|
package/test/transform.test.ts
DELETED
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest'
|
|
2
|
-
import { transformXmlInvoice } from '../src/utils/signature/transform'
|
|
3
|
-
|
|
4
|
-
// Helper function to normalize whitespace for comparisons
|
|
5
|
-
const normalize = (str: string) => str.replace(/\s+/g, ' ').trim()
|
|
6
|
-
|
|
7
|
-
describe('transformXmlInvoice', () => {
|
|
8
|
-
it('should remove XML declaration, UBLExtensions, and Signature', () => {
|
|
9
|
-
// Note: Backticks used for multi-line strings
|
|
10
|
-
const inputXml = `<?xml version="1.0" encoding="UTF-8"?>
|
|
11
|
-
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
|
|
12
|
-
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
|
|
13
|
-
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
|
|
14
|
-
xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2">
|
|
15
|
-
<ext:UBLExtensions>
|
|
16
|
-
<ext:UBLExtension>
|
|
17
|
-
<ext:ExtensionContent>
|
|
18
|
-
<!-- Signature Block -->
|
|
19
|
-
</ext:ExtensionContent>
|
|
20
|
-
</ext:UBLExtension>
|
|
21
|
-
</ext:UBLExtensions>
|
|
22
|
-
<cac:Signature>
|
|
23
|
-
<cbc:ID>urn:oasis:names:specification:ubl:signature:Invoice</cbc:ID>
|
|
24
|
-
<cac:SignatoryParty>
|
|
25
|
-
<cac:PartyIdentification>
|
|
26
|
-
<cbc:ID>SignerID</cbc:ID>
|
|
27
|
-
</cac:PartyIdentification>
|
|
28
|
-
</cac:SignatoryParty>
|
|
29
|
-
<cac:DigitalSignatureAttachment>
|
|
30
|
-
<cac:ExternalReference>
|
|
31
|
-
<cbc:URI>#SignatureID</cbc:URI>
|
|
32
|
-
</cac:ExternalReference>
|
|
33
|
-
</cac:DigitalSignatureAttachment>
|
|
34
|
-
</cac:Signature>
|
|
35
|
-
<cbc:ID>INV123</cbc:ID>
|
|
36
|
-
<cac:AccountingSupplierParty>
|
|
37
|
-
<cac:Party>
|
|
38
|
-
<cac:PartyName>
|
|
39
|
-
<cbc:Name>Supplier Inc.</cbc:Name>
|
|
40
|
-
</cac:PartyName>
|
|
41
|
-
</cac:Party>
|
|
42
|
-
</cac:AccountingSupplierParty>
|
|
43
|
-
</Invoice>`
|
|
44
|
-
|
|
45
|
-
const expectedXml = `
|
|
46
|
-
<Invoice xmlns="urn:oasis:names:specification:ubl:schema:xsd:Invoice-2"
|
|
47
|
-
xmlns:cac="urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2"
|
|
48
|
-
xmlns:cbc="urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
|
|
49
|
-
xmlns:ext="urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2">
|
|
50
|
-
|
|
51
|
-
<cbc:ID>INV123</cbc:ID>
|
|
52
|
-
<cac:AccountingSupplierParty>
|
|
53
|
-
<cac:Party>
|
|
54
|
-
<cac:PartyName>
|
|
55
|
-
<cbc:Name>Supplier Inc.</cbc:Name>
|
|
56
|
-
</cac:PartyName>
|
|
57
|
-
</cac:Party>
|
|
58
|
-
</cac:AccountingSupplierParty>
|
|
59
|
-
</Invoice>`
|
|
60
|
-
|
|
61
|
-
expect(normalize(transformXmlInvoice(inputXml))).toEqual(
|
|
62
|
-
normalize(expectedXml),
|
|
63
|
-
)
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
it('should only remove XML declaration if others are absent', () => {
|
|
67
|
-
const inputXml = `<?xml version="1.0" encoding="UTF-8"?>
|
|
68
|
-
<Invoice><ID>1</ID></Invoice>`
|
|
69
|
-
const expectedXml = `<Invoice><ID>1</ID></Invoice>`
|
|
70
|
-
expect(transformXmlInvoice(inputXml)).toEqual(expectedXml)
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
it('should only remove UBLExtensions if others are absent', () => {
|
|
74
|
-
const inputXml = `<Invoice xmlns:ext="urn:ext"><ext:UBLExtensions><data/></ext:UBLExtensions><ID>1</ID></Invoice>`
|
|
75
|
-
const expectedXml = `<Invoice xmlns:ext="urn:ext"><ID>1</ID></Invoice>`
|
|
76
|
-
expect(transformXmlInvoice(inputXml)).toEqual(expectedXml)
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
it('should only remove Signature if others are absent', () => {
|
|
80
|
-
const inputXml = `<Invoice xmlns:cac="urn:cac"><cac:Signature><data/></cac:Signature><ID>1</ID></Invoice>`
|
|
81
|
-
const expectedXml = `<Invoice xmlns:cac="urn:cac"><ID>1</ID></Invoice>`
|
|
82
|
-
expect(transformXmlInvoice(inputXml)).toEqual(expectedXml)
|
|
83
|
-
})
|
|
84
|
-
|
|
85
|
-
it('should return unchanged XML if no transformations are needed', () => {
|
|
86
|
-
const inputXml = `<Invoice><ID>1</ID><Amount>100</Amount></Invoice>`
|
|
87
|
-
expect(transformXmlInvoice(inputXml)).toEqual(inputXml)
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
it('should handle XML without specified elements gracefully', () => {
|
|
91
|
-
const inputXml = `<Invoice><ID>1</ID></Invoice>`
|
|
92
|
-
const expectedXml = `<Invoice><ID>1</ID></Invoice>`
|
|
93
|
-
expect(transformXmlInvoice(inputXml)).toEqual(expectedXml)
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
it('should throw an error for invalid XML', () => {
|
|
97
|
-
// Correctly define invalidXml for this test scope
|
|
98
|
-
const invalidXml = `<Invoice><ID>1</ID` // Missing closing tag
|
|
99
|
-
// Adjust the regex to match the actual error format from the handler
|
|
100
|
-
expect(() => transformXmlInvoice(invalidXml)).toThrow(
|
|
101
|
-
/^ERROR: \[xmldom error\]/,
|
|
102
|
-
)
|
|
103
|
-
})
|
|
104
|
-
|
|
105
|
-
it('should remove elements regardless of namespace prefixes', () => {
|
|
106
|
-
const inputXml = `<?xml version="1.0"?>
|
|
107
|
-
<inv:Invoice xmlns:inv="urn:invoice" xmlns:common="urn:common" xmlns:sig="urn:signature">
|
|
108
|
-
<common:UBLExtensions><data/></common:UBLExtensions>
|
|
109
|
-
<sig:Signature><data/></sig:Signature>
|
|
110
|
-
<inv:ID>INV999</inv:ID>
|
|
111
|
-
</inv:Invoice>`
|
|
112
|
-
const expectedXml = `<inv:Invoice xmlns:inv="urn:invoice" xmlns:common="urn:common" xmlns:sig="urn:signature">
|
|
113
|
-
|
|
114
|
-
<inv:ID>INV999</inv:ID>
|
|
115
|
-
</inv:Invoice>`
|
|
116
|
-
|
|
117
|
-
expect(normalize(transformXmlInvoice(inputXml))).toEqual(
|
|
118
|
-
normalize(expectedXml),
|
|
119
|
-
)
|
|
120
|
-
})
|
|
121
|
-
|
|
122
|
-
it('should handle self-closing UBLExtensions and Signature tags', () => {
|
|
123
|
-
const inputXml = `<?xml version="1.0"?>
|
|
124
|
-
<Invoice xmlns:ext="urn:ext" xmlns:cac="urn:cac">
|
|
125
|
-
<ext:UBLExtensions />
|
|
126
|
-
<cac:Signature />
|
|
127
|
-
<ID>1</ID>
|
|
128
|
-
</Invoice>`
|
|
129
|
-
const expectedXml = `<Invoice xmlns:ext="urn:ext" xmlns:cac="urn:cac">
|
|
130
|
-
|
|
131
|
-
<ID>1</ID>
|
|
132
|
-
</Invoice>`
|
|
133
|
-
expect(normalize(transformXmlInvoice(inputXml))).toEqual(
|
|
134
|
-
normalize(expectedXml),
|
|
135
|
-
)
|
|
136
|
-
})
|
|
137
|
-
|
|
138
|
-
it('should handle nested UBLExtensions/Signature (though unlikely structure)', () => {
|
|
139
|
-
const inputXml = `<?xml version="1.0"?>
|
|
140
|
-
<Invoice xmlns:ext="urn:ext" xmlns:cac="urn:cac">
|
|
141
|
-
<SomeElement>
|
|
142
|
-
<ext:UBLExtensions><Data1/></ext:UBLExtensions>
|
|
143
|
-
</SomeElement>
|
|
144
|
-
<cac:Signature><Data2/></cac:Signature>
|
|
145
|
-
<ID>1</ID>
|
|
146
|
-
</Invoice>`
|
|
147
|
-
const expectedXml = `<Invoice xmlns:ext="urn:ext" xmlns:cac="urn:cac">
|
|
148
|
-
<SomeElement>
|
|
149
|
-
|
|
150
|
-
</SomeElement>
|
|
151
|
-
|
|
152
|
-
<ID>1</ID>
|
|
153
|
-
</Invoice>`
|
|
154
|
-
expect(normalize(transformXmlInvoice(inputXml))).toEqual(
|
|
155
|
-
normalize(expectedXml),
|
|
156
|
-
)
|
|
157
|
-
})
|
|
158
|
-
})
|