@ripwords/myinvois-client 0.0.9 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bun.lock +89 -132
- package/dist/0X-C4IRh_fJ.d.ts +211 -0
- package/dist/0X-C4IRh_fJ.d.ts.map +1 -0
- package/dist/0X-Yw7mZEro.d.cts +211 -0
- package/dist/0X-Yw7mZEro.d.cts.map +1 -0
- package/dist/1X-Brnls9Jh.d.ts +112 -0
- package/dist/1X-Brnls9Jh.d.ts.map +1 -0
- package/dist/1X-BwpSoT3o.d.cts +20 -0
- package/dist/1X-BwpSoT3o.d.cts.map +1 -0
- package/dist/1X-C-_KHV-Q.d.ts +20 -0
- package/dist/1X-C-_KHV-Q.d.ts.map +1 -0
- package/dist/1X-D_aUVsuM.d.cts +112 -0
- package/dist/1X-D_aUVsuM.d.cts.map +1 -0
- package/dist/2X-Bb6elyzV.d.cts +40 -0
- package/dist/2X-Bb6elyzV.d.cts.map +1 -0
- package/dist/2X-DkS1BoE5.d.ts +40 -0
- package/dist/2X-DkS1BoE5.d.ts.map +1 -0
- package/dist/2X-UdQcQW24.d.ts +140 -0
- package/dist/2X-UdQcQW24.d.ts.map +1 -0
- package/dist/2X-hClUyw26.d.cts +140 -0
- package/dist/2X-hClUyw26.d.cts.map +1 -0
- package/dist/3X-C7VFD-n-.d.cts +21 -0
- package/dist/3X-C7VFD-n-.d.cts.map +1 -0
- package/dist/3X-CLMESDvz.d.cts +62 -0
- package/dist/3X-CLMESDvz.d.cts.map +1 -0
- package/dist/3X-DFI-4RQQ.d.ts +21 -0
- package/dist/3X-DFI-4RQQ.d.ts.map +1 -0
- package/dist/3X-DVDyspgb.d.ts +62 -0
- package/dist/3X-DVDyspgb.d.ts.map +1 -0
- package/dist/4X-CIJ2JJ2w.d.ts +31 -0
- package/dist/4X-CIJ2JJ2w.d.ts.map +1 -0
- package/dist/4X-CUR8jlaZ.d.ts +265 -0
- package/dist/4X-CUR8jlaZ.d.ts.map +1 -0
- package/dist/4X-CvScPJTf.d.cts +265 -0
- package/dist/4X-CvScPJTf.d.cts.map +1 -0
- package/dist/4X-DIfvpU6V.d.cts +31 -0
- package/dist/4X-DIfvpU6V.d.cts.map +1 -0
- package/dist/5X-BOUxhadJ.d.cts +22 -0
- package/dist/5X-BOUxhadJ.d.cts.map +1 -0
- package/dist/5X-C6db432h.d.ts +77 -0
- package/dist/5X-C6db432h.d.ts.map +1 -0
- package/dist/5X-COsZHUaQ.d.ts +22 -0
- package/dist/5X-COsZHUaQ.d.ts.map +1 -0
- package/dist/5X-CkLu7Vyd.d.cts +77 -0
- package/dist/5X-CkLu7Vyd.d.cts.map +1 -0
- package/dist/6X-C_fFIcJC.d.ts +105 -0
- package/dist/6X-C_fFIcJC.d.ts.map +1 -0
- package/dist/6X-ClZDKOTC.d.ts +16 -0
- package/dist/6X-ClZDKOTC.d.ts.map +1 -0
- package/dist/6X-DE7RJeV6.d.cts +16 -0
- package/dist/6X-DE7RJeV6.d.cts.map +1 -0
- package/dist/6X-Mf32k1d0.d.cts +105 -0
- package/dist/6X-Mf32k1d0.d.cts.map +1 -0
- package/dist/7X-BZyesooz.d.ts +16 -0
- package/dist/7X-BZyesooz.d.ts.map +1 -0
- package/dist/7X-Chtd6B66.d.cts +16 -0
- package/dist/7X-Chtd6B66.d.cts.map +1 -0
- package/dist/7X-DoCUcp-J.d.cts +71 -0
- package/dist/7X-DoCUcp-J.d.cts.map +1 -0
- package/dist/7X-kot_VccM.d.ts +71 -0
- package/dist/7X-kot_VccM.d.ts.map +1 -0
- package/dist/8X-Df4DOBOe.d.ts +110 -0
- package/dist/8X-Df4DOBOe.d.ts.map +1 -0
- package/dist/8X-DkuKAkHz.d.ts +19 -0
- package/dist/8X-DkuKAkHz.d.ts.map +1 -0
- package/dist/8X-DqZyMvyV.d.cts +19 -0
- package/dist/8X-DqZyMvyV.d.cts.map +1 -0
- package/dist/8X-Dr9RunRw.d.cts +110 -0
- package/dist/8X-Dr9RunRw.d.cts.map +1 -0
- package/dist/9X-BDgifncF.d.ts +15 -0
- package/dist/9X-BDgifncF.d.ts.map +1 -0
- package/dist/9X-BaoZtjWF.d.cts +98 -0
- package/dist/9X-BaoZtjWF.d.cts.map +1 -0
- package/dist/9X-BcAb6Uso.d.cts +15 -0
- package/dist/9X-BcAb6Uso.d.cts.map +1 -0
- package/dist/9X-BhBWlgxG.d.ts +98 -0
- package/dist/9X-BhBWlgxG.d.ts.map +1 -0
- package/dist/AX-BY72FohC.d.cts +111 -0
- package/dist/AX-BY72FohC.d.cts.map +1 -0
- package/dist/AX-D6XHWdrY.d.ts +111 -0
- package/dist/AX-D6XHWdrY.d.ts.map +1 -0
- package/dist/BX-CA0OmrUZ.d.cts +115 -0
- package/dist/BX-CA0OmrUZ.d.cts.map +1 -0
- package/dist/BX-D_0C8Qbd.d.ts +115 -0
- package/dist/BX-D_0C8Qbd.d.ts.map +1 -0
- package/dist/CX-HH4cSZRX.d.ts +128 -0
- package/dist/CX-HH4cSZRX.d.ts.map +1 -0
- package/dist/CX-glpQSL8x.d.cts +128 -0
- package/dist/CX-glpQSL8x.d.cts.map +1 -0
- package/dist/DX-DimL1MDM.d.cts +115 -0
- package/dist/DX-DimL1MDM.d.cts.map +1 -0
- package/dist/DX-Dx22ax_I.d.ts +115 -0
- package/dist/DX-Dx22ax_I.d.ts.map +1 -0
- package/dist/EX-BRWh1wFc.d.ts +107 -0
- package/dist/EX-BRWh1wFc.d.ts.map +1 -0
- package/dist/EX-Cx87Ruxl.d.cts +107 -0
- package/dist/EX-Cx87Ruxl.d.cts.map +1 -0
- package/dist/FX-D81UlxNN.d.cts +127 -0
- package/dist/FX-D81UlxNN.d.cts.map +1 -0
- package/dist/FX-RmjwAr40.d.ts +127 -0
- package/dist/FX-RmjwAr40.d.ts.map +1 -0
- package/dist/GX-9i7piP9G.d.cts +136 -0
- package/dist/GX-9i7piP9G.d.cts.map +1 -0
- package/dist/GX-CJyo7oDp.d.ts +136 -0
- package/dist/GX-CJyo7oDp.d.ts.map +1 -0
- package/dist/HX-20GVJAvl.d.cts +126 -0
- package/dist/HX-20GVJAvl.d.cts.map +1 -0
- package/dist/HX-XALBTdLA.d.ts +126 -0
- package/dist/HX-XALBTdLA.d.ts.map +1 -0
- package/dist/IX-6SZ55QKb.d.ts +23 -0
- package/dist/IX-6SZ55QKb.d.ts.map +1 -0
- package/dist/IX-D54NGPsc.d.cts +23 -0
- package/dist/IX-D54NGPsc.d.cts.map +1 -0
- package/dist/JX-C1RYcwQX.d.cts +104 -0
- package/dist/JX-C1RYcwQX.d.cts.map +1 -0
- package/dist/JX-hQ1XRmLp.d.ts +104 -0
- package/dist/JX-hQ1XRmLp.d.ts.map +1 -0
- package/dist/KX-BNwunEfn.d.ts +151 -0
- package/dist/KX-BNwunEfn.d.ts.map +1 -0
- package/dist/KX-gQHCIgtQ.d.cts +151 -0
- package/dist/KX-gQHCIgtQ.d.cts.map +1 -0
- package/dist/LX-CHYX3X3J.d.ts +123 -0
- package/dist/LX-CHYX3X3J.d.ts.map +1 -0
- package/dist/LX-CPurJGIh.d.cts +123 -0
- package/dist/LX-CPurJGIh.d.cts.map +1 -0
- package/dist/MX-BPGLWSUz.d.ts +153 -0
- package/dist/MX-BPGLWSUz.d.ts.map +1 -0
- package/dist/MX-BnyW5eHf.d.cts +153 -0
- package/dist/MX-BnyW5eHf.d.cts.map +1 -0
- package/dist/MyInvoisClient-BrNyMjS-.d.cts +178 -0
- package/dist/MyInvoisClient-BrNyMjS-.d.cts.map +1 -0
- package/dist/MyInvoisClient-CXu4pdl-.d.ts +178 -0
- package/dist/MyInvoisClient-CXu4pdl-.d.ts.map +1 -0
- package/dist/MyInvoisClient-Cnvb5iUC.js +299 -0
- package/dist/MyInvoisClient-Cnvb5iUC.js.map +1 -0
- package/dist/MyInvoisClient-DO1dJfQq.cjs +304 -0
- package/dist/MyInvoisClient-DO1dJfQq.cjs.map +1 -0
- package/dist/NX-B11fQuco.d.cts +122 -0
- package/dist/NX-B11fQuco.d.cts.map +1 -0
- package/dist/NX-RulN5Ml3.d.ts +122 -0
- package/dist/NX-RulN5Ml3.d.ts.map +1 -0
- package/dist/OX-DgKVSp7I.d.ts +26 -0
- package/dist/OX-DgKVSp7I.d.ts.map +1 -0
- package/dist/OX-T-ydRXQS.d.cts +26 -0
- package/dist/OX-T-ydRXQS.d.cts.map +1 -0
- package/dist/PX-DA4A2kEv.d.ts +121 -0
- package/dist/PX-DA4A2kEv.d.ts.map +1 -0
- package/dist/PX-p0n1SzvU.d.cts +121 -0
- package/dist/PX-p0n1SzvU.d.cts.map +1 -0
- package/dist/QX-CI1NccIB.d.cts +59 -0
- package/dist/QX-CI1NccIB.d.cts.map +1 -0
- package/dist/QX-DrFqsMEs.d.ts +59 -0
- package/dist/QX-DrFqsMEs.d.ts.map +1 -0
- package/dist/RX-Cm7vFcFN.d.ts +23 -0
- package/dist/RX-Cm7vFcFN.d.ts.map +1 -0
- package/dist/RX-DnNKol22.d.cts +23 -0
- package/dist/RX-DnNKol22.d.cts.map +1 -0
- package/dist/SX-BUjiWQYz.d.cts +40 -0
- package/dist/SX-BUjiWQYz.d.cts.map +1 -0
- package/dist/SX-CsPPTu-W.d.ts +40 -0
- package/dist/SX-CsPPTu-W.d.ts.map +1 -0
- package/dist/TX-DCY25MdR.d.ts +31 -0
- package/dist/TX-DCY25MdR.d.ts.map +1 -0
- package/dist/TX-DOEpsf05.d.cts +31 -0
- package/dist/TX-DOEpsf05.d.cts.map +1 -0
- package/dist/UX-DauyagHy.d.ts +18 -0
- package/dist/UX-DauyagHy.d.ts.map +1 -0
- package/dist/UX-DgUOnTFK.d.cts +18 -0
- package/dist/UX-DgUOnTFK.d.cts.map +1 -0
- package/dist/VX-DD4scgCe.d.ts +17 -0
- package/dist/VX-DD4scgCe.d.ts.map +1 -0
- package/dist/VX-kUX6LM-3.d.cts +17 -0
- package/dist/VX-kUX6LM-3.d.cts.map +1 -0
- package/dist/WX-CjkoppdY.d.ts +26 -0
- package/dist/WX-CjkoppdY.d.ts.map +1 -0
- package/dist/WX-DPfyPFFh.d.cts +26 -0
- package/dist/WX-DPfyPFFh.d.cts.map +1 -0
- package/dist/XX-C4C1gQZH.d.cts +828 -0
- package/dist/XX-C4C1gQZH.d.cts.map +1 -0
- package/dist/XX-sbsIUOnA.d.ts +828 -0
- package/dist/XX-sbsIUOnA.d.ts.map +1 -0
- package/dist/YX-BeT-LsiA.d.cts +20 -0
- package/dist/YX-BeT-LsiA.d.cts.map +1 -0
- package/dist/YX-DUdO8mRC.d.ts +20 -0
- package/dist/YX-DUdO8mRC.d.ts.map +1 -0
- package/dist/ZX-BuVTTq-D.d.cts +22 -0
- package/dist/ZX-BuVTTq-D.d.cts.map +1 -0
- package/dist/ZX-DwfcSA-D.d.ts +22 -0
- package/dist/ZX-DwfcSA-D.d.ts.map +1 -0
- package/dist/api/platform/platformLogin.d.ts +67 -0
- package/dist/api/platform/platformLogin.d.ts.map +1 -0
- package/dist/api/platform/platformLogin.js +3 -0
- package/dist/canonicalize-C_fNNpYr.cjs +80 -0
- package/dist/canonicalize-C_fNNpYr.cjs.map +1 -0
- package/dist/canonicalize-DNUrCGad.js +68 -0
- package/dist/canonicalize-DNUrCGad.js.map +1 -0
- package/dist/chunk-CUT6urMc.cjs +30 -0
- package/dist/classification-codes-B15PbWxz.d.cts +118 -0
- package/dist/classification-codes-B15PbWxz.d.cts.map +1 -0
- package/dist/classification-codes-C2X4xW5-.d.ts +118 -0
- package/dist/classification-codes-C2X4xW5-.d.ts.map +1 -0
- package/dist/country-code-DPeNFMMi.d.cts +543 -0
- package/dist/country-code-DPeNFMMi.d.cts.map +1 -0
- package/dist/country-code-DsI8Mbzx.d.ts +543 -0
- package/dist/country-code-DsI8Mbzx.d.ts.map +1 -0
- package/dist/currencies-DKuDflOO.d.ts +208 -0
- package/dist/currencies-DKuDflOO.d.ts.map +1 -0
- package/dist/currencies-S5g1gzBU.d.cts +208 -0
- package/dist/currencies-S5g1gzBU.d.cts.map +1 -0
- package/dist/e-invoice-BuwtFnlI.d.cts +44 -0
- package/dist/e-invoice-BuwtFnlI.d.cts.map +1 -0
- package/dist/e-invoice-C2TxhyrK.d.ts +44 -0
- package/dist/e-invoice-C2TxhyrK.d.ts.map +1 -0
- package/dist/getBaseUrl-CO7Jp27d.cjs +14 -0
- package/dist/getBaseUrl-CO7Jp27d.cjs.map +1 -0
- package/dist/getBaseUrl-Dx6RDC8I.js +8 -0
- package/dist/getBaseUrl-Dx6RDC8I.js.map +1 -0
- package/dist/hashCert-Bol7lIh2.js +62 -0
- package/dist/hashCert-Bol7lIh2.js.map +1 -0
- package/dist/hashCert-mlYEuYex.cjs +68 -0
- package/dist/hashCert-mlYEuYex.cjs.map +1 -0
- package/dist/hashSignedProperties-9vj5wlYR.js +83 -0
- package/dist/hashSignedProperties-9vj5wlYR.js.map +1 -0
- package/dist/hashSignedProperties-CU_ZqqmY.cjs +95 -0
- package/dist/hashSignedProperties-CU_ZqqmY.cjs.map +1 -0
- package/dist/index-B1DSs-wd.d.cts +16 -0
- package/dist/index-B1DSs-wd.d.cts.map +1 -0
- package/dist/index-CJNLQVjx.d.ts +1 -0
- package/dist/index-FTgB2nM6.d.ts +16 -0
- package/dist/index-FTgB2nM6.d.ts.map +1 -0
- package/dist/index-Wy1ONBjV.d.cts +1 -0
- package/dist/index.cjs +13 -97
- package/dist/index.d.ts +60 -5664
- package/dist/index.js +11 -93
- package/dist/index10.cjs +34 -0
- package/dist/index10.cjs.map +1 -0
- package/dist/index11.cjs +24 -0
- package/dist/index11.cjs.map +1 -0
- package/dist/index12.cjs +0 -0
- package/dist/index13.cjs +13 -0
- package/dist/index14.cjs +13 -0
- package/dist/index14.cjs.map +1 -0
- package/dist/index15.cjs +3 -0
- package/dist/index16.cjs +17 -0
- package/dist/index17.cjs +3 -0
- package/dist/index18.cjs +208 -0
- package/dist/index18.cjs.map +1 -0
- package/dist/index19.cjs +109 -0
- package/dist/index19.cjs.map +1 -0
- package/dist/index2.cjs +62 -0
- package/dist/index2.cjs.map +1 -0
- package/dist/index20.cjs +137 -0
- package/dist/index20.cjs.map +1 -0
- package/dist/index21.cjs +64 -0
- package/dist/index21.cjs.map +1 -0
- package/dist/index22.cjs +267 -0
- package/dist/index22.cjs.map +1 -0
- package/dist/index23.cjs +79 -0
- package/dist/index23.cjs.map +1 -0
- package/dist/index24.cjs +107 -0
- package/dist/index24.cjs.map +1 -0
- package/dist/index25.cjs +73 -0
- package/dist/index25.cjs.map +1 -0
- package/dist/index26.cjs +112 -0
- package/dist/index26.cjs.map +1 -0
- package/dist/index27.cjs +100 -0
- package/dist/index27.cjs.map +1 -0
- package/dist/index28.cjs +18 -0
- package/dist/index28.cjs.map +1 -0
- package/dist/index29.cjs +38 -0
- package/dist/index29.cjs.map +1 -0
- package/dist/index3.cjs +532 -0
- package/dist/index3.cjs.map +1 -0
- package/dist/index30.cjs +19 -0
- package/dist/index30.cjs.map +1 -0
- package/dist/index31.cjs +29 -0
- package/dist/index31.cjs.map +1 -0
- package/dist/index32.cjs +20 -0
- package/dist/index32.cjs.map +1 -0
- package/dist/index33.cjs +14 -0
- package/dist/index33.cjs.map +1 -0
- package/dist/index34.cjs +14 -0
- package/dist/index34.cjs.map +1 -0
- package/dist/index35.cjs +17 -0
- package/dist/index35.cjs.map +1 -0
- package/dist/index36.cjs +13 -0
- package/dist/index36.cjs.map +1 -0
- package/dist/index37.cjs +108 -0
- package/dist/index37.cjs.map +1 -0
- package/dist/index38.cjs +113 -0
- package/dist/index38.cjs.map +1 -0
- package/dist/index39.cjs +126 -0
- package/dist/index39.cjs.map +1 -0
- package/dist/index4.cjs +196 -0
- package/dist/index4.cjs.map +1 -0
- package/dist/index40.cjs +113 -0
- package/dist/index40.cjs.map +1 -0
- package/dist/index41.cjs +105 -0
- package/dist/index41.cjs.map +1 -0
- package/dist/index42.cjs +125 -0
- package/dist/index42.cjs.map +1 -0
- package/dist/index43.cjs +134 -0
- package/dist/index43.cjs.map +1 -0
- package/dist/index44.cjs +124 -0
- package/dist/index44.cjs.map +1 -0
- package/dist/index45.cjs +21 -0
- package/dist/index45.cjs.map +1 -0
- package/dist/index46.cjs +102 -0
- package/dist/index46.cjs.map +1 -0
- package/dist/index47.cjs +149 -0
- package/dist/index47.cjs.map +1 -0
- package/dist/index48.cjs +121 -0
- package/dist/index48.cjs.map +1 -0
- package/dist/index49.cjs +151 -0
- package/dist/index49.cjs.map +1 -0
- package/dist/index5.cjs +25 -0
- package/dist/index5.cjs.map +1 -0
- package/dist/index50.cjs +120 -0
- package/dist/index50.cjs.map +1 -0
- package/dist/index51.cjs +24 -0
- package/dist/index51.cjs.map +1 -0
- package/dist/index52.cjs +119 -0
- package/dist/index52.cjs.map +1 -0
- package/dist/index53.cjs +54 -0
- package/dist/index53.cjs.map +1 -0
- package/dist/index54.cjs +21 -0
- package/dist/index54.cjs.map +1 -0
- package/dist/index55.cjs +35 -0
- package/dist/index55.cjs.map +1 -0
- package/dist/index56.cjs +29 -0
- package/dist/index56.cjs.map +1 -0
- package/dist/index57.cjs +16 -0
- package/dist/index57.cjs.map +1 -0
- package/dist/index58.cjs +15 -0
- package/dist/index58.cjs.map +1 -0
- package/dist/index59.cjs +24 -0
- package/dist/index59.cjs.map +1 -0
- package/dist/index59.cts.map +1 -0
- package/dist/index6.cjs +0 -0
- package/dist/index60.cjs +419 -0
- package/dist/index60.cjs.map +1 -0
- package/dist/index61.cjs +15 -0
- package/dist/index61.cjs.map +1 -0
- package/dist/index62.cjs +16 -0
- package/dist/index62.cjs.map +1 -0
- package/dist/index62.cts.map +1 -0
- package/dist/index63.cjs +0 -0
- package/dist/index63.cts.map +1 -0
- package/dist/index64.cjs +0 -0
- package/dist/index64.cts.map +1 -0
- package/dist/index65.cjs +122 -0
- package/dist/index65.cjs.map +1 -0
- package/dist/index65.cts.map +1 -0
- package/dist/index66.cjs +229 -0
- package/dist/index66.cjs.map +1 -0
- package/dist/index66.cts.map +1 -0
- package/dist/index67.cjs +4 -0
- package/dist/index67.cts.map +1 -0
- package/dist/index68.cjs +3 -0
- package/dist/index68.cts.map +1 -0
- package/dist/index69.cjs +4 -0
- package/dist/index69.cts.map +1 -0
- package/dist/index7.cjs +0 -0
- package/dist/index70.cjs +3 -0
- package/dist/index70.cts.map +1 -0
- package/dist/index71.cjs +3 -0
- package/dist/index71.cts.map +1 -0
- package/dist/index72.cjs +3 -0
- package/dist/index72.cts.map +1 -0
- package/dist/index73.cjs +3 -0
- package/dist/index73.cts.map +1 -0
- package/dist/index8.cjs +25 -0
- package/dist/index8.cjs.map +1 -0
- package/dist/index9.cjs +0 -0
- package/dist/invoice-1_1-BJVcw-oE.d.ts +432 -0
- package/dist/invoice-1_1-BJVcw-oE.d.ts.map +1 -0
- package/dist/invoice-1_1-DWdNPRzr.d.cts +432 -0
- package/dist/invoice-1_1-DWdNPRzr.d.cts.map +1 -0
- package/dist/invoice1-1-8S-QQn7P.cjs +547 -0
- package/dist/invoice1-1-8S-QQn7P.cjs.map +1 -0
- package/dist/invoice1-1-CHuLpkFz.js +504 -0
- package/dist/invoice1-1-CHuLpkFz.js.map +1 -0
- package/dist/msic-codes-B_1W6lZF.d.cts +26 -0
- package/dist/msic-codes-B_1W6lZF.d.cts.map +1 -0
- package/dist/msic-codes-bs0lTfSZ.d.ts +26 -0
- package/dist/msic-codes-bs0lTfSZ.d.ts.map +1 -0
- package/dist/payment-modes-B8dNy3SM.d.ts +44 -0
- package/dist/payment-modes-B8dNy3SM.d.ts.map +1 -0
- package/dist/payment-modes-DHihrywe.d.cts +44 -0
- package/dist/payment-modes-DHihrywe.d.cts.map +1 -0
- package/dist/platformLogin-DsxWWUXr.js +31 -0
- package/dist/platformLogin-DsxWWUXr.js.map +1 -0
- package/dist/platformLogin-PGzMhw1X.cjs +37 -0
- package/dist/platformLogin-PGzMhw1X.cjs.map +1 -0
- package/dist/populateFinalDocument-BdyYzz5Y.cjs +96 -0
- package/dist/populateFinalDocument-BdyYzz5Y.cjs.map +1 -0
- package/dist/populateFinalDocument-BpLXmgLv.js +90 -0
- package/dist/populateFinalDocument-BpLXmgLv.js.map +1 -0
- package/dist/populateSignedProperties-BJMcBQ6S.cjs +58 -0
- package/dist/populateSignedProperties-BJMcBQ6S.cjs.map +1 -0
- package/dist/populateSignedProperties-BvGN-YZH.js +52 -0
- package/dist/populateSignedProperties-BvGN-YZH.js.map +1 -0
- package/dist/sign-B61Cy3gO.cjs +40 -0
- package/dist/sign-B61Cy3gO.cjs.map +1 -0
- package/dist/sign-DzHK7UhR.js +34 -0
- package/dist/sign-DzHK7UhR.js.map +1 -0
- package/dist/signatures-BKi9DP2K.d.cts +173 -0
- package/dist/signatures-BKi9DP2K.d.cts.map +1 -0
- package/dist/signatures-C9QPZTQd.d.ts +173 -0
- package/dist/signatures-C9QPZTQd.d.ts.map +1 -0
- package/dist/state-codes-CxG1S9YY.d.ts +62 -0
- package/dist/state-codes-CxG1S9YY.d.ts.map +1 -0
- package/dist/state-codes-DXSWtE6a.d.cts +62 -0
- package/dist/state-codes-DXSWtE6a.d.cts.map +1 -0
- package/dist/tax-types-CEpfSh5P.d.ts +42 -0
- package/dist/tax-types-CEpfSh5P.d.ts.map +1 -0
- package/dist/tax-types-CgwxONDS.d.cts +42 -0
- package/dist/tax-types-CgwxONDS.d.cts.map +1 -0
- package/dist/transform-BLz0S687.cjs +72 -0
- package/dist/transform-BLz0S687.cjs.map +1 -0
- package/dist/transform-D1q-U6Zj.js +66 -0
- package/dist/transform-D1q-U6Zj.js.map +1 -0
- package/dist/types/classification-codes.d.ts +2 -0
- package/dist/types/country-code.d.ts +2 -0
- package/dist/types/currencies.d.ts +2 -0
- package/dist/types/documents/index.d.ts +57 -0
- package/dist/types/documents/invoice-1_1.d.ts +56 -0
- package/dist/types/e-invoice.d.ts +2 -0
- package/dist/types/index.d.ts +59 -0
- package/dist/types/msic/0X.d.ts +2 -0
- package/dist/types/msic/1X.d.ts +2 -0
- package/dist/types/msic/2X.d.ts +2 -0
- package/dist/types/msic/3X.d.ts +2 -0
- package/dist/types/msic/4X.d.ts +2 -0
- package/dist/types/msic/5X.d.ts +2 -0
- package/dist/types/msic/6X.d.ts +2 -0
- package/dist/types/msic/7X.d.ts +2 -0
- package/dist/types/msic/8X.d.ts +2 -0
- package/dist/types/msic/9X.d.ts +2 -0
- package/dist/types/msic-codes.d.ts +12 -0
- package/dist/types/payment-modes.d.ts +2 -0
- package/dist/types/signatures.d.ts +2 -0
- package/dist/types/state-codes.d.ts +2 -0
- package/dist/types/tax-types.d.ts +2 -0
- package/dist/types/unit/1X.d.ts +2 -0
- package/dist/types/unit/2X.d.ts +2 -0
- package/dist/types/unit/3X.d.ts +2 -0
- package/dist/types/unit/4X.d.ts +2 -0
- package/dist/types/unit/5X.d.ts +2 -0
- package/dist/types/unit/6X.d.ts +2 -0
- package/dist/types/unit/7X.d.ts +2 -0
- package/dist/types/unit/8X.d.ts +2 -0
- package/dist/types/unit/9X.d.ts +2 -0
- package/dist/types/unit/AX.d.ts +2 -0
- package/dist/types/unit/BX.d.ts +2 -0
- package/dist/types/unit/CX.d.ts +2 -0
- package/dist/types/unit/DX.d.ts +2 -0
- package/dist/types/unit/EX.d.ts +2 -0
- package/dist/types/unit/FX.d.ts +2 -0
- package/dist/types/unit/GX.d.ts +2 -0
- package/dist/types/unit/HX.d.ts +2 -0
- package/dist/types/unit/IX.d.ts +2 -0
- package/dist/types/unit/JX.d.ts +2 -0
- package/dist/types/unit/KX.d.ts +2 -0
- package/dist/types/unit/LX.d.ts +2 -0
- package/dist/types/unit/MX.d.ts +2 -0
- package/dist/types/unit/NX.d.ts +2 -0
- package/dist/types/unit/OX.d.ts +2 -0
- package/dist/types/unit/PX.d.ts +2 -0
- package/dist/types/unit/QX.d.ts +2 -0
- package/dist/types/unit/RX.d.ts +2 -0
- package/dist/types/unit/SX.d.ts +2 -0
- package/dist/types/unit/TX.d.ts +2 -0
- package/dist/types/unit/UX.d.ts +2 -0
- package/dist/types/unit/VX.d.ts +2 -0
- package/dist/types/unit/WX.d.ts +2 -0
- package/dist/types/unit/XX.d.ts +2 -0
- package/dist/types/unit/YX.d.ts +2 -0
- package/dist/types/unit/ZX.d.ts +2 -0
- package/dist/types/unit-types.d.ts +37 -0
- package/dist/unit-types-1bF0KhIp.d.ts +56 -0
- package/dist/unit-types-1bF0KhIp.d.ts.map +1 -0
- package/dist/unit-types-CsrkvgfG.d.cts +56 -0
- package/dist/unit-types-CsrkvgfG.d.cts.map +1 -0
- package/dist/utils/MyInvoisClient.d.ts +60 -0
- package/dist/utils/MyInvoisClient.js +13 -0
- package/dist/utils/base64.d.ts +6 -0
- package/dist/utils/base64.d.ts.map +1 -0
- package/dist/utils/base64.js +11 -0
- package/dist/utils/base64.js.map +1 -0
- package/dist/utils/debug/debug-document-hash.d.ts +100 -0
- package/dist/utils/debug/debug-document-hash.d.ts.map +1 -0
- package/dist/utils/debug/debug-document-hash.js +120 -0
- package/dist/utils/debug/debug-document-hash.js.map +1 -0
- package/dist/utils/debug/debug-invoice-submission.d.ts +152 -0
- package/dist/utils/debug/debug-invoice-submission.d.ts.map +1 -0
- package/dist/utils/debug/debug-invoice-submission.js +226 -0
- package/dist/utils/debug/debug-invoice-submission.js.map +1 -0
- package/dist/utils/getBaseUrl.d.ts +5 -0
- package/dist/utils/getBaseUrl.d.ts.map +1 -0
- package/dist/utils/getBaseUrl.js +3 -0
- package/dist/utils/invoice1-1.d.ts +117 -0
- package/dist/utils/invoice1-1.d.ts.map +1 -0
- package/dist/utils/invoice1-1.js +10 -0
- package/dist/utils/signature/canonicalize.d.ts +26 -0
- package/dist/utils/signature/canonicalize.d.ts.map +1 -0
- package/dist/utils/signature/canonicalize.js +3 -0
- package/dist/utils/signature/hashCert.d.ts +15 -0
- package/dist/utils/signature/hashCert.d.ts.map +1 -0
- package/dist/utils/signature/hashCert.js +3 -0
- package/dist/utils/signature/hashSignedProperties.d.ts +25 -0
- package/dist/utils/signature/hashSignedProperties.d.ts.map +1 -0
- package/dist/utils/signature/hashSignedProperties.js +3 -0
- package/dist/utils/signature/populateFinalDocument.d.ts +23 -0
- package/dist/utils/signature/populateFinalDocument.d.ts.map +1 -0
- package/dist/utils/signature/populateFinalDocument.js +3 -0
- package/dist/utils/signature/populateSignedProperties.d.ts +23 -0
- package/dist/utils/signature/populateSignedProperties.d.ts.map +1 -0
- package/dist/utils/signature/populateSignedProperties.js +3 -0
- package/dist/utils/signature/sign.d.ts +16 -0
- package/dist/utils/signature/sign.d.ts.map +1 -0
- package/dist/utils/signature/sign.js +3 -0
- package/dist/utils/signature/transform.d.ts +16 -0
- package/dist/utils/signature/transform.d.ts.map +1 -0
- package/dist/utils/signature/transform.js +3 -0
- package/package.json +12 -5
- package/src/api/platform/{taxpayerLogin.ts → platformLogin.ts} +8 -2
- package/src/types/documents/invoice-1_1.d.ts +90 -0
- package/src/types/index.d.ts +1 -0
- package/src/types/msic-codes.d.ts +1 -7
- package/src/utils/MyInvoisClient.ts +428 -11
- package/src/utils/base64.ts +7 -0
- package/src/utils/debug/debug-document-hash.ts +249 -0
- package/src/utils/debug/debug-invoice-submission.ts +355 -0
- package/src/utils/getBaseUrl.ts +1 -1
- package/src/utils/invoice1-1.ts +671 -0
- package/src/utils/signature/canonicalize.ts +104 -0
- package/src/utils/signature/hashCert.ts +115 -0
- package/src/utils/signature/hashSignedProperties.ts +155 -0
- package/src/utils/signature/populateFinalDocument.ts +187 -0
- package/src/utils/signature/populateSignedProperties.ts +87 -0
- package/src/utils/signature/sign.ts +51 -0
- package/src/utils/signature/transform.ts +99 -0
- package/test/MyInvoiClientWithRealData.test.ts +2 -1
- package/test/MyInvoisClient.test.ts +16 -8
- package/test/base64.test.ts +43 -0
- package/test/canonicalize.test.ts +110 -0
- package/test/hashCert.test.ts +95 -0
- package/test/hashSignedProperties.test.ts +140 -0
- package/test/populateFinalDocument.test.ts +218 -0
- package/test/populateSignedProperties.test.ts +155 -0
- package/test/sign.test.ts +70 -0
- package/test/signAndSubmitInvoice.test.ts +915 -0
- package/test/transform.test.ts +158 -0
- package/tsconfig.json +7 -1
- package/tsdown.config.ts +31 -0
- package/dist/index.cjs.map +0 -1
- package/rolldown.config.ts +0 -26
|
@@ -0,0 +1,218 @@
|
|
|
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
|
+
})
|
|
@@ -0,0 +1,155 @@
|
|
|
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
|
+
})
|
|
@@ -0,0 +1,70 @@
|
|
|
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
|
+
})
|