@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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"platformLogin-DsxWWUXr.js","names":["client: ClientCredentials","tokenResponse: TokenResponse"],"sources":["../src/api/platform/platformLogin.ts"],"sourcesContent":["import type { ClientCredentials, TokenResponse } from 'src/types'\n\nexport const platformLogin = async (\n client: ClientCredentials,\n): Promise<{\n token: string\n tokenExpiration: Date\n}> => {\n const { clientId, clientSecret, baseUrl, onBehalfOf, debug } = client\n try {\n const response = await fetch(`${baseUrl}/connect/token`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n ...(onBehalfOf ? { onbehalfof: onBehalfOf } : {}),\n },\n body: new URLSearchParams({\n grant_type: 'client_credentials',\n client_id: clientId,\n client_secret: clientSecret,\n scope: 'InvoicingAPI',\n }),\n })\n\n const tokenResponse: TokenResponse = await response.json()\n return {\n token: tokenResponse.access_token,\n tokenExpiration: new Date(Date.now() + tokenResponse.expires_in * 1000),\n }\n } catch (error) {\n if (debug) console.error(error)\n throw error\n }\n}\n"],"mappings":";AAEA,MAAa,gBAAgB,OAC3BA,WAII;CACJ,MAAM,EAAE,UAAU,cAAc,SAAS,YAAY,OAAO,GAAG;AAC/D,KAAI;EACF,MAAM,WAAW,MAAM,OAAO,EAAE,QAAQ,iBAAiB;GACvD,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,GAAI,aAAa,EAAE,YAAY,WAAY,IAAG,CAAE;GACjD;GACD,MAAM,IAAI,gBAAgB;IACxB,YAAY;IACZ,WAAW;IACX,eAAe;IACf,OAAO;GACR;EACF,EAAC;EAEF,MAAMC,gBAA+B,MAAM,SAAS,MAAM;AAC1D,SAAO;GACL,OAAO,cAAc;GACrB,iBAAiB,IAAI,KAAK,KAAK,KAAK,GAAG,cAAc,aAAa;EACnE;CACF,SAAQ,OAAO;AACd,MAAI,MAAO,SAAQ,MAAM,MAAM;AAC/B,QAAM;CACP;AACF"}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
-
const xpath_ts = require_chunk.__toESM(require("xpath-ts"));
|
|
3
|
-
|
|
4
|
-
//#region src/utils/signature/populateFinalDocument.ts
|
|
5
|
-
/**
|
|
6
|
-
* Extracts the Base64 encoded DER certificate content from a PEM string,
|
|
7
|
-
* removing headers, footers, and newlines.
|
|
8
|
-
* @param pemCert The certificate in PEM format.
|
|
9
|
-
* @returns The cleaned Base64 DER string.
|
|
10
|
-
*/
|
|
11
|
-
function cleanCertificatePem(pemCert) {
|
|
12
|
-
const beginMarker = "-----BEGIN CERTIFICATE-----";
|
|
13
|
-
const endMarker = "-----END CERTIFICATE-----";
|
|
14
|
-
let content = pemCert;
|
|
15
|
-
const startIndex = pemCert.indexOf(beginMarker);
|
|
16
|
-
const endIndex = pemCert.indexOf(endMarker);
|
|
17
|
-
if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) content = pemCert.substring(startIndex + beginMarker.length, endIndex);
|
|
18
|
-
return content.replace(/[^A-Za-z0-9+/=]/g, "");
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Populates the final signature information fields within the UBL document's signature structure.
|
|
22
|
-
*
|
|
23
|
-
* Corresponds to Step 8 in the MyInvois Signature Creation guide:
|
|
24
|
-
* https://sdk.myinvois.hasil.gov.my/signature-creation/#step-8-populate-the-information-in-the-document-to-create-the-signed-document
|
|
25
|
-
*
|
|
26
|
-
* Modifies the passed Document object in place.
|
|
27
|
-
*
|
|
28
|
-
* @param doc The XML Document object (from xmldom-ts) containing the signature structure.
|
|
29
|
-
* @param finalData An object containing the final signature data to populate.
|
|
30
|
-
* @throws {Error} If any target element cannot be found or if multiple are found.
|
|
31
|
-
*/
|
|
32
|
-
function populateFinalDocument(doc, finalData) {
|
|
33
|
-
const ns = {
|
|
34
|
-
inv: "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2",
|
|
35
|
-
ext: "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2",
|
|
36
|
-
sig: "urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2",
|
|
37
|
-
sac: "urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2",
|
|
38
|
-
ds: "http://www.w3.org/2000/09/xmldsig#",
|
|
39
|
-
cac: "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2",
|
|
40
|
-
cbc: "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
|
|
41
|
-
};
|
|
42
|
-
const select = xpath_ts.useNamespaces(ns);
|
|
43
|
-
const setElementValue = (xpathExpr, value) => {
|
|
44
|
-
try {
|
|
45
|
-
const selectionResult = select(xpathExpr, doc);
|
|
46
|
-
if (selectionResult == null) throw new Error(`XPath selection returned null or undefined for: ${xpathExpr}`);
|
|
47
|
-
if (!Array.isArray(selectionResult)) throw new Error(`XPath selection did not return an array for: ${xpathExpr}. Result: ${typeof selectionResult}`);
|
|
48
|
-
if (selectionResult.length === 0) throw new Error(`Element not found for XPath: ${xpathExpr}`);
|
|
49
|
-
if (selectionResult.length > 1) throw new Error(`Multiple elements found for XPath (expected 1): ${xpathExpr}`);
|
|
50
|
-
const node = selectionResult[0];
|
|
51
|
-
if (!node || typeof node !== "object" || !("nodeType" in node) || node.nodeType !== 1) throw new Error(`Selected item is not an Element Node for XPath: ${xpathExpr}. Node details: ${JSON.stringify(node)}`);
|
|
52
|
-
if ("textContent" in node) node.textContent = value;
|
|
53
|
-
else throw new Error(`Selected Element Node does not have textContent property for XPath: ${xpathExpr}`);
|
|
54
|
-
} catch (error) {
|
|
55
|
-
console.error(`Error setting value for XPath ${xpathExpr}:`, error);
|
|
56
|
-
throw new Error(`Failed to set value for XPath ${xpathExpr}: ${error.message}`);
|
|
57
|
-
}
|
|
58
|
-
};
|
|
59
|
-
const checkElementExists = (xpathExpr) => {
|
|
60
|
-
try {
|
|
61
|
-
const selectionResult = select(xpathExpr, doc);
|
|
62
|
-
return Array.isArray(selectionResult) && selectionResult.length > 0;
|
|
63
|
-
} catch (error) {
|
|
64
|
-
console.error(`Error checking existence for XPath ${xpathExpr}:`, error);
|
|
65
|
-
return false;
|
|
66
|
-
}
|
|
67
|
-
};
|
|
68
|
-
const basePath = "/inv:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sig:UBLDocumentSignatures/sac:SignatureInformation/ds:Signature";
|
|
69
|
-
const propsRefPath = `${basePath}/ds:SignedInfo/ds:Reference[@URI='#id-xades-signed-props']`;
|
|
70
|
-
const docRefPath = `${basePath}/ds:SignedInfo/ds:Reference[@Id='id-doc-signed-data']`;
|
|
71
|
-
const signatureValuePath = `${basePath}/ds:SignatureValue`;
|
|
72
|
-
const x509CertPath = `${basePath}/ds:KeyInfo/ds:X509Data/ds:X509Certificate`;
|
|
73
|
-
const propsDigestPath = `${propsRefPath}/ds:DigestValue`;
|
|
74
|
-
const docDigestPath = `${docRefPath}/ds:DigestValue`;
|
|
75
|
-
setElementValue(signatureValuePath, finalData.signatureValue);
|
|
76
|
-
setElementValue(x509CertPath, cleanCertificatePem(finalData.certificatePem));
|
|
77
|
-
if (!checkElementExists(propsRefPath)) throw new Error(`Failed to set value for XPath ${propsDigestPath}: Element not found for XPath: ${propsDigestPath}`);
|
|
78
|
-
setElementValue(propsDigestPath, finalData.propsDigest);
|
|
79
|
-
if (!checkElementExists(docRefPath)) throw new Error(`Failed to set value for XPath ${docDigestPath}: Element not found for XPath: ${docDigestPath}`);
|
|
80
|
-
setElementValue(docDigestPath, finalData.docDigest);
|
|
81
|
-
const cacSignatureIdPath = "/inv:Invoice/cac:Signature/cbc:ID";
|
|
82
|
-
const cacSignatureMethodPath = "/inv:Invoice/cac:Signature/cbc:SignatureMethod";
|
|
83
|
-
const cacSignatureIdValue = "urn:oasis:names:specification:ubl:signature:Invoice";
|
|
84
|
-
const cacSignatureMethodValue = "urn:oasis:names:specification:ubl:dsig:enveloped:xades";
|
|
85
|
-
setElementValue(cacSignatureIdPath, cacSignatureIdValue);
|
|
86
|
-
setElementValue(cacSignatureMethodPath, cacSignatureMethodValue);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
//#endregion
|
|
90
|
-
Object.defineProperty(exports, 'populateFinalDocument', {
|
|
91
|
-
enumerable: true,
|
|
92
|
-
get: function () {
|
|
93
|
-
return populateFinalDocument;
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
//# sourceMappingURL=populateFinalDocument-BdyYzz5Y.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"populateFinalDocument-BdyYzz5Y.cjs","names":["pemCert: string","doc: Document","finalData: FinalDocumentData","xpathExpr: string","value: string","error: any"],"sources":["../src/utils/signature/populateFinalDocument.ts"],"sourcesContent":["import * as xpath from 'xpath-ts'\n\nexport interface FinalDocumentData {\n signatureValue: string // Base64 encoded RSA signature (Sig from Step 4)\n propsDigest: string // Base64 encoded hash of SignedProperties (PropsDigest from Step 7)\n docDigest: string // Base64 encoded hash of Canonicalized Document (DocDigest from Step 3)\n certificatePem: string // Signing certificate in PEM format\n}\n\n/**\n * Extracts the Base64 encoded DER certificate content from a PEM string,\n * removing headers, footers, and newlines.\n * @param pemCert The certificate in PEM format.\n * @returns The cleaned Base64 DER string.\n */\nfunction cleanCertificatePem(pemCert: string): string {\n const beginMarker = '-----BEGIN CERTIFICATE-----'\n const endMarker = '-----END CERTIFICATE-----'\n let content = pemCert\n\n const startIndex = pemCert.indexOf(beginMarker)\n const endIndex = pemCert.indexOf(endMarker)\n\n if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {\n content = pemCert.substring(startIndex + beginMarker.length, endIndex)\n } // else: Assume it might be just the Base64 part already, or another PEM type\n\n // Remove any remaining non-Base64 characters (newlines, etc.)\n return content.replace(/[^A-Za-z0-9+/=]/g, '')\n}\n\n/**\n * Populates the final signature information fields within the UBL document's signature structure.\n *\n * Corresponds to Step 8 in the MyInvois Signature Creation guide:\n * https://sdk.myinvois.hasil.gov.my/signature-creation/#step-8-populate-the-information-in-the-document-to-create-the-signed-document\n *\n * Modifies the passed Document object in place.\n *\n * @param doc The XML Document object (from xmldom-ts) containing the signature structure.\n * @param finalData An object containing the final signature data to populate.\n * @throws {Error} If any target element cannot be found or if multiple are found.\n */\nexport function populateFinalDocument(\n doc: Document,\n finalData: FinalDocumentData,\n): void {\n const ns = {\n inv: 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2',\n ext: 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2',\n sig: 'urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2',\n sac: 'urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2',\n ds: 'http://www.w3.org/2000/09/xmldsig#',\n // No xades needed here, but cac might be needed if populating /Invoice/cac:Signature\n // cac: 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2'\n cac: 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2',\n cbc: 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2',\n }\n const select = xpath.useNamespaces(ns)\n\n // Helper function to find a single node and set its text content\n const setElementValue = (xpathExpr: string, value: string) => {\n try {\n const selectionResult = select(xpathExpr, doc) // Store the result first\n\n // Check 0: Explicitly check for null/undefined before array check\n if (selectionResult == null) {\n // Use == to catch both null and undefined\n throw new Error(\n `XPath selection returned null or undefined for: ${xpathExpr}`,\n )\n }\n\n // Check 1: Ensure it's an array (xpath.select can return other types)\n if (!Array.isArray(selectionResult)) {\n throw new Error(\n `XPath selection did not return an array for: ${xpathExpr}. Result: ${typeof selectionResult}`,\n )\n }\n\n // Check 2: Ensure exactly one node was found\n if (selectionResult.length === 0) {\n throw new Error(`Element not found for XPath: ${xpathExpr}`)\n }\n if (selectionResult.length > 1) {\n throw new Error(\n `Multiple elements found for XPath (expected 1): ${xpathExpr}`,\n )\n }\n\n // Check 3: Ensure the found item is a Node and specifically an Element node (type 1)\n const node = selectionResult[0] as Node // Assert as Node for type checking\n // Node.ELEMENT_NODE is typically 1\n if (\n !node ||\n typeof node !== 'object' ||\n !('nodeType' in node) ||\n node.nodeType !== 1\n ) {\n throw new Error(\n `Selected item is not an Element Node for XPath: ${xpathExpr}. Node details: ${JSON.stringify(node)}`,\n )\n }\n\n // Check 4: Ensure textContent can be set (should be true for element nodes)\n if ('textContent' in node) {\n // Ensure the property is writable (though typically it is for elements)\n node.textContent = value\n } else {\n // This case should technically be impossible if nodeType is 1\n throw new Error(\n `Selected Element Node does not have textContent property for XPath: ${xpathExpr}`,\n )\n }\n } catch (error: any) {\n console.error(`Error setting value for XPath ${xpathExpr}:`, error)\n // Keep the wrapping error message format consistent with tests\n throw new Error(\n `Failed to set value for XPath ${xpathExpr}: ${error.message}`,\n )\n }\n }\n\n // Helper function to check if *at least one* node exists for an XPath\n const checkElementExists = (xpathExpr: string): boolean => {\n try {\n const selectionResult = select(xpathExpr, doc)\n // Check if it's an array and has at least one element\n return Array.isArray(selectionResult) && selectionResult.length > 0\n } catch (error) {\n console.error(`Error checking existence for XPath ${xpathExpr}:`, error)\n return false // Treat errors during check as non-existent\n }\n }\n\n // Define XPaths based on UBL documentation for Step 8\n const basePath =\n '/inv:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sig:UBLDocumentSignatures/sac:SignatureInformation/ds:Signature'\n\n // Define XPaths for the parent Reference elements\n const propsRefPath = `${basePath}/ds:SignedInfo/ds:Reference[@URI='#id-xades-signed-props']`\n const docRefPath = `${basePath}/ds:SignedInfo/ds:Reference[@Id='id-doc-signed-data']`\n\n // Define XPaths for the target elements\n const signatureValuePath = `${basePath}/ds:SignatureValue`\n const x509CertPath = `${basePath}/ds:KeyInfo/ds:X509Data/ds:X509Certificate`\n const propsDigestPath = `${propsRefPath}/ds:DigestValue`\n const docDigestPath = `${docRefPath}/ds:DigestValue`\n\n // Populate the values, adding existence checks for Reference parents\n setElementValue(signatureValuePath, finalData.signatureValue)\n setElementValue(x509CertPath, cleanCertificatePem(finalData.certificatePem))\n\n // Check propsDigest parent before setting value\n if (!checkElementExists(propsRefPath)) {\n // Throw using the child path to match original test intent\n throw new Error(\n `Failed to set value for XPath ${propsDigestPath}: Element not found for XPath: ${propsDigestPath}`,\n )\n }\n setElementValue(propsDigestPath, finalData.propsDigest)\n\n // Check docDigest parent before setting value\n if (!checkElementExists(docRefPath)) {\n // Throw using the child path to match original test intent\n throw new Error(\n `Failed to set value for XPath ${docDigestPath}: Element not found for XPath: ${docDigestPath}`,\n )\n }\n setElementValue(docDigestPath, finalData.docDigest)\n\n // Populate the /Invoice/cac:Signature elements\n const cacSignatureIdPath = '/inv:Invoice/cac:Signature/cbc:ID'\n const cacSignatureMethodPath =\n '/inv:Invoice/cac:Signature/cbc:SignatureMethod'\n\n // Static values based on the user's example XML\n const cacSignatureIdValue =\n 'urn:oasis:names:specification:ubl:signature:Invoice'\n const cacSignatureMethodValue =\n 'urn:oasis:names:specification:ubl:dsig:enveloped:xades'\n\n setElementValue(cacSignatureIdPath, cacSignatureIdValue)\n setElementValue(cacSignatureMethodPath, cacSignatureMethodValue)\n\n // Document `doc` is modified in place.\n}\n"],"mappings":";;;;;;;;;;AAeA,SAAS,oBAAoBA,SAAyB;CACpD,MAAM,cAAc;CACpB,MAAM,YAAY;CAClB,IAAI,UAAU;CAEd,MAAM,aAAa,QAAQ,QAAQ,YAAY;CAC/C,MAAM,WAAW,QAAQ,QAAQ,UAAU;AAE3C,KAAI,eAAe,MAAM,aAAa,MAAM,WAAW,WACrD,WAAU,QAAQ,UAAU,aAAa,YAAY,QAAQ,SAAS;AAIxE,QAAO,QAAQ,QAAQ,oBAAoB,GAAG;AAC/C;;;;;;;;;;;;;AAcD,SAAgB,sBACdC,KACAC,WACM;CACN,MAAM,KAAK;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,IAAI;EAGJ,KAAK;EACL,KAAK;CACN;CACD,MAAM,SAAS,SAAM,cAAc,GAAG;CAGtC,MAAM,kBAAkB,CAACC,WAAmBC,UAAkB;AAC5D,MAAI;GACF,MAAM,kBAAkB,OAAO,WAAW,IAAI;AAG9C,OAAI,mBAAmB,KAErB,OAAM,IAAI,OACP,kDAAkD,UAAU;AAKjE,QAAK,MAAM,QAAQ,gBAAgB,CACjC,OAAM,IAAI,OACP,+CAA+C,UAAU,mBAAmB,gBAAgB;AAKjG,OAAI,gBAAgB,WAAW,EAC7B,OAAM,IAAI,OAAO,+BAA+B,UAAU;AAE5D,OAAI,gBAAgB,SAAS,EAC3B,OAAM,IAAI,OACP,kDAAkD,UAAU;GAKjE,MAAM,OAAO,gBAAgB;AAE7B,QACG,eACM,SAAS,cACd,cAAc,SAChB,KAAK,aAAa,EAElB,OAAM,IAAI,OACP,kDAAkD,UAAU,kBAAkB,KAAK,UAAU,KAAK,CAAC;AAKxG,OAAI,iBAAiB,KAEnB,MAAK,cAAc;OAGnB,OAAM,IAAI,OACP,sEAAsE,UAAU;EAGtF,SAAQC,OAAY;AACnB,WAAQ,OAAO,gCAAgC,UAAU,IAAI,MAAM;AAEnE,SAAM,IAAI,OACP,gCAAgC,UAAU,IAAI,MAAM,QAAQ;EAEhE;CACF;CAGD,MAAM,qBAAqB,CAACF,cAA+B;AACzD,MAAI;GACF,MAAM,kBAAkB,OAAO,WAAW,IAAI;AAE9C,UAAO,MAAM,QAAQ,gBAAgB,IAAI,gBAAgB,SAAS;EACnE,SAAQ,OAAO;AACd,WAAQ,OAAO,qCAAqC,UAAU,IAAI,MAAM;AACxE,UAAO;EACR;CACF;CAGD,MAAM,WACJ;CAGF,MAAM,gBAAgB,EAAE,SAAS;CACjC,MAAM,cAAc,EAAE,SAAS;CAG/B,MAAM,sBAAsB,EAAE,SAAS;CACvC,MAAM,gBAAgB,EAAE,SAAS;CACjC,MAAM,mBAAmB,EAAE,aAAa;CACxC,MAAM,iBAAiB,EAAE,WAAW;AAGpC,iBAAgB,oBAAoB,UAAU,eAAe;AAC7D,iBAAgB,cAAc,oBAAoB,UAAU,eAAe,CAAC;AAG5E,MAAK,mBAAmB,aAAa,CAEnC,OAAM,IAAI,OACP,gCAAgC,gBAAgB,iCAAiC,gBAAgB;AAGtG,iBAAgB,iBAAiB,UAAU,YAAY;AAGvD,MAAK,mBAAmB,WAAW,CAEjC,OAAM,IAAI,OACP,gCAAgC,cAAc,iCAAiC,cAAc;AAGlG,iBAAgB,eAAe,UAAU,UAAU;CAGnD,MAAM,qBAAqB;CAC3B,MAAM,yBACJ;CAGF,MAAM,sBACJ;CACF,MAAM,0BACJ;AAEF,iBAAgB,oBAAoB,oBAAoB;AACxD,iBAAgB,wBAAwB,wBAAwB;AAGjE"}
|
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
import * as xpath from "xpath-ts";
|
|
2
|
-
|
|
3
|
-
//#region src/utils/signature/populateFinalDocument.ts
|
|
4
|
-
/**
|
|
5
|
-
* Extracts the Base64 encoded DER certificate content from a PEM string,
|
|
6
|
-
* removing headers, footers, and newlines.
|
|
7
|
-
* @param pemCert The certificate in PEM format.
|
|
8
|
-
* @returns The cleaned Base64 DER string.
|
|
9
|
-
*/
|
|
10
|
-
function cleanCertificatePem(pemCert) {
|
|
11
|
-
const beginMarker = "-----BEGIN CERTIFICATE-----";
|
|
12
|
-
const endMarker = "-----END CERTIFICATE-----";
|
|
13
|
-
let content = pemCert;
|
|
14
|
-
const startIndex = pemCert.indexOf(beginMarker);
|
|
15
|
-
const endIndex = pemCert.indexOf(endMarker);
|
|
16
|
-
if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) content = pemCert.substring(startIndex + beginMarker.length, endIndex);
|
|
17
|
-
return content.replace(/[^A-Za-z0-9+/=]/g, "");
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Populates the final signature information fields within the UBL document's signature structure.
|
|
21
|
-
*
|
|
22
|
-
* Corresponds to Step 8 in the MyInvois Signature Creation guide:
|
|
23
|
-
* https://sdk.myinvois.hasil.gov.my/signature-creation/#step-8-populate-the-information-in-the-document-to-create-the-signed-document
|
|
24
|
-
*
|
|
25
|
-
* Modifies the passed Document object in place.
|
|
26
|
-
*
|
|
27
|
-
* @param doc The XML Document object (from xmldom-ts) containing the signature structure.
|
|
28
|
-
* @param finalData An object containing the final signature data to populate.
|
|
29
|
-
* @throws {Error} If any target element cannot be found or if multiple are found.
|
|
30
|
-
*/
|
|
31
|
-
function populateFinalDocument(doc, finalData) {
|
|
32
|
-
const ns = {
|
|
33
|
-
inv: "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2",
|
|
34
|
-
ext: "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2",
|
|
35
|
-
sig: "urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2",
|
|
36
|
-
sac: "urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2",
|
|
37
|
-
ds: "http://www.w3.org/2000/09/xmldsig#",
|
|
38
|
-
cac: "urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2",
|
|
39
|
-
cbc: "urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2"
|
|
40
|
-
};
|
|
41
|
-
const select = xpath.useNamespaces(ns);
|
|
42
|
-
const setElementValue = (xpathExpr, value) => {
|
|
43
|
-
try {
|
|
44
|
-
const selectionResult = select(xpathExpr, doc);
|
|
45
|
-
if (selectionResult == null) throw new Error(`XPath selection returned null or undefined for: ${xpathExpr}`);
|
|
46
|
-
if (!Array.isArray(selectionResult)) throw new Error(`XPath selection did not return an array for: ${xpathExpr}. Result: ${typeof selectionResult}`);
|
|
47
|
-
if (selectionResult.length === 0) throw new Error(`Element not found for XPath: ${xpathExpr}`);
|
|
48
|
-
if (selectionResult.length > 1) throw new Error(`Multiple elements found for XPath (expected 1): ${xpathExpr}`);
|
|
49
|
-
const node = selectionResult[0];
|
|
50
|
-
if (!node || typeof node !== "object" || !("nodeType" in node) || node.nodeType !== 1) throw new Error(`Selected item is not an Element Node for XPath: ${xpathExpr}. Node details: ${JSON.stringify(node)}`);
|
|
51
|
-
if ("textContent" in node) node.textContent = value;
|
|
52
|
-
else throw new Error(`Selected Element Node does not have textContent property for XPath: ${xpathExpr}`);
|
|
53
|
-
} catch (error) {
|
|
54
|
-
console.error(`Error setting value for XPath ${xpathExpr}:`, error);
|
|
55
|
-
throw new Error(`Failed to set value for XPath ${xpathExpr}: ${error.message}`);
|
|
56
|
-
}
|
|
57
|
-
};
|
|
58
|
-
const checkElementExists = (xpathExpr) => {
|
|
59
|
-
try {
|
|
60
|
-
const selectionResult = select(xpathExpr, doc);
|
|
61
|
-
return Array.isArray(selectionResult) && selectionResult.length > 0;
|
|
62
|
-
} catch (error) {
|
|
63
|
-
console.error(`Error checking existence for XPath ${xpathExpr}:`, error);
|
|
64
|
-
return false;
|
|
65
|
-
}
|
|
66
|
-
};
|
|
67
|
-
const basePath = "/inv:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sig:UBLDocumentSignatures/sac:SignatureInformation/ds:Signature";
|
|
68
|
-
const propsRefPath = `${basePath}/ds:SignedInfo/ds:Reference[@URI='#id-xades-signed-props']`;
|
|
69
|
-
const docRefPath = `${basePath}/ds:SignedInfo/ds:Reference[@Id='id-doc-signed-data']`;
|
|
70
|
-
const signatureValuePath = `${basePath}/ds:SignatureValue`;
|
|
71
|
-
const x509CertPath = `${basePath}/ds:KeyInfo/ds:X509Data/ds:X509Certificate`;
|
|
72
|
-
const propsDigestPath = `${propsRefPath}/ds:DigestValue`;
|
|
73
|
-
const docDigestPath = `${docRefPath}/ds:DigestValue`;
|
|
74
|
-
setElementValue(signatureValuePath, finalData.signatureValue);
|
|
75
|
-
setElementValue(x509CertPath, cleanCertificatePem(finalData.certificatePem));
|
|
76
|
-
if (!checkElementExists(propsRefPath)) throw new Error(`Failed to set value for XPath ${propsDigestPath}: Element not found for XPath: ${propsDigestPath}`);
|
|
77
|
-
setElementValue(propsDigestPath, finalData.propsDigest);
|
|
78
|
-
if (!checkElementExists(docRefPath)) throw new Error(`Failed to set value for XPath ${docDigestPath}: Element not found for XPath: ${docDigestPath}`);
|
|
79
|
-
setElementValue(docDigestPath, finalData.docDigest);
|
|
80
|
-
const cacSignatureIdPath = "/inv:Invoice/cac:Signature/cbc:ID";
|
|
81
|
-
const cacSignatureMethodPath = "/inv:Invoice/cac:Signature/cbc:SignatureMethod";
|
|
82
|
-
const cacSignatureIdValue = "urn:oasis:names:specification:ubl:signature:Invoice";
|
|
83
|
-
const cacSignatureMethodValue = "urn:oasis:names:specification:ubl:dsig:enveloped:xades";
|
|
84
|
-
setElementValue(cacSignatureIdPath, cacSignatureIdValue);
|
|
85
|
-
setElementValue(cacSignatureMethodPath, cacSignatureMethodValue);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
//#endregion
|
|
89
|
-
export { populateFinalDocument };
|
|
90
|
-
//# sourceMappingURL=populateFinalDocument-BpLXmgLv.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"populateFinalDocument-BpLXmgLv.js","names":["pemCert: string","doc: Document","finalData: FinalDocumentData","xpathExpr: string","value: string","error: any"],"sources":["../src/utils/signature/populateFinalDocument.ts"],"sourcesContent":["import * as xpath from 'xpath-ts'\n\nexport interface FinalDocumentData {\n signatureValue: string // Base64 encoded RSA signature (Sig from Step 4)\n propsDigest: string // Base64 encoded hash of SignedProperties (PropsDigest from Step 7)\n docDigest: string // Base64 encoded hash of Canonicalized Document (DocDigest from Step 3)\n certificatePem: string // Signing certificate in PEM format\n}\n\n/**\n * Extracts the Base64 encoded DER certificate content from a PEM string,\n * removing headers, footers, and newlines.\n * @param pemCert The certificate in PEM format.\n * @returns The cleaned Base64 DER string.\n */\nfunction cleanCertificatePem(pemCert: string): string {\n const beginMarker = '-----BEGIN CERTIFICATE-----'\n const endMarker = '-----END CERTIFICATE-----'\n let content = pemCert\n\n const startIndex = pemCert.indexOf(beginMarker)\n const endIndex = pemCert.indexOf(endMarker)\n\n if (startIndex !== -1 && endIndex !== -1 && endIndex > startIndex) {\n content = pemCert.substring(startIndex + beginMarker.length, endIndex)\n } // else: Assume it might be just the Base64 part already, or another PEM type\n\n // Remove any remaining non-Base64 characters (newlines, etc.)\n return content.replace(/[^A-Za-z0-9+/=]/g, '')\n}\n\n/**\n * Populates the final signature information fields within the UBL document's signature structure.\n *\n * Corresponds to Step 8 in the MyInvois Signature Creation guide:\n * https://sdk.myinvois.hasil.gov.my/signature-creation/#step-8-populate-the-information-in-the-document-to-create-the-signed-document\n *\n * Modifies the passed Document object in place.\n *\n * @param doc The XML Document object (from xmldom-ts) containing the signature structure.\n * @param finalData An object containing the final signature data to populate.\n * @throws {Error} If any target element cannot be found or if multiple are found.\n */\nexport function populateFinalDocument(\n doc: Document,\n finalData: FinalDocumentData,\n): void {\n const ns = {\n inv: 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2',\n ext: 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2',\n sig: 'urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2',\n sac: 'urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2',\n ds: 'http://www.w3.org/2000/09/xmldsig#',\n // No xades needed here, but cac might be needed if populating /Invoice/cac:Signature\n // cac: 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2'\n cac: 'urn:oasis:names:specification:ubl:schema:xsd:CommonAggregateComponents-2',\n cbc: 'urn:oasis:names:specification:ubl:schema:xsd:CommonBasicComponents-2',\n }\n const select = xpath.useNamespaces(ns)\n\n // Helper function to find a single node and set its text content\n const setElementValue = (xpathExpr: string, value: string) => {\n try {\n const selectionResult = select(xpathExpr, doc) // Store the result first\n\n // Check 0: Explicitly check for null/undefined before array check\n if (selectionResult == null) {\n // Use == to catch both null and undefined\n throw new Error(\n `XPath selection returned null or undefined for: ${xpathExpr}`,\n )\n }\n\n // Check 1: Ensure it's an array (xpath.select can return other types)\n if (!Array.isArray(selectionResult)) {\n throw new Error(\n `XPath selection did not return an array for: ${xpathExpr}. Result: ${typeof selectionResult}`,\n )\n }\n\n // Check 2: Ensure exactly one node was found\n if (selectionResult.length === 0) {\n throw new Error(`Element not found for XPath: ${xpathExpr}`)\n }\n if (selectionResult.length > 1) {\n throw new Error(\n `Multiple elements found for XPath (expected 1): ${xpathExpr}`,\n )\n }\n\n // Check 3: Ensure the found item is a Node and specifically an Element node (type 1)\n const node = selectionResult[0] as Node // Assert as Node for type checking\n // Node.ELEMENT_NODE is typically 1\n if (\n !node ||\n typeof node !== 'object' ||\n !('nodeType' in node) ||\n node.nodeType !== 1\n ) {\n throw new Error(\n `Selected item is not an Element Node for XPath: ${xpathExpr}. Node details: ${JSON.stringify(node)}`,\n )\n }\n\n // Check 4: Ensure textContent can be set (should be true for element nodes)\n if ('textContent' in node) {\n // Ensure the property is writable (though typically it is for elements)\n node.textContent = value\n } else {\n // This case should technically be impossible if nodeType is 1\n throw new Error(\n `Selected Element Node does not have textContent property for XPath: ${xpathExpr}`,\n )\n }\n } catch (error: any) {\n console.error(`Error setting value for XPath ${xpathExpr}:`, error)\n // Keep the wrapping error message format consistent with tests\n throw new Error(\n `Failed to set value for XPath ${xpathExpr}: ${error.message}`,\n )\n }\n }\n\n // Helper function to check if *at least one* node exists for an XPath\n const checkElementExists = (xpathExpr: string): boolean => {\n try {\n const selectionResult = select(xpathExpr, doc)\n // Check if it's an array and has at least one element\n return Array.isArray(selectionResult) && selectionResult.length > 0\n } catch (error) {\n console.error(`Error checking existence for XPath ${xpathExpr}:`, error)\n return false // Treat errors during check as non-existent\n }\n }\n\n // Define XPaths based on UBL documentation for Step 8\n const basePath =\n '/inv:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sig:UBLDocumentSignatures/sac:SignatureInformation/ds:Signature'\n\n // Define XPaths for the parent Reference elements\n const propsRefPath = `${basePath}/ds:SignedInfo/ds:Reference[@URI='#id-xades-signed-props']`\n const docRefPath = `${basePath}/ds:SignedInfo/ds:Reference[@Id='id-doc-signed-data']`\n\n // Define XPaths for the target elements\n const signatureValuePath = `${basePath}/ds:SignatureValue`\n const x509CertPath = `${basePath}/ds:KeyInfo/ds:X509Data/ds:X509Certificate`\n const propsDigestPath = `${propsRefPath}/ds:DigestValue`\n const docDigestPath = `${docRefPath}/ds:DigestValue`\n\n // Populate the values, adding existence checks for Reference parents\n setElementValue(signatureValuePath, finalData.signatureValue)\n setElementValue(x509CertPath, cleanCertificatePem(finalData.certificatePem))\n\n // Check propsDigest parent before setting value\n if (!checkElementExists(propsRefPath)) {\n // Throw using the child path to match original test intent\n throw new Error(\n `Failed to set value for XPath ${propsDigestPath}: Element not found for XPath: ${propsDigestPath}`,\n )\n }\n setElementValue(propsDigestPath, finalData.propsDigest)\n\n // Check docDigest parent before setting value\n if (!checkElementExists(docRefPath)) {\n // Throw using the child path to match original test intent\n throw new Error(\n `Failed to set value for XPath ${docDigestPath}: Element not found for XPath: ${docDigestPath}`,\n )\n }\n setElementValue(docDigestPath, finalData.docDigest)\n\n // Populate the /Invoice/cac:Signature elements\n const cacSignatureIdPath = '/inv:Invoice/cac:Signature/cbc:ID'\n const cacSignatureMethodPath =\n '/inv:Invoice/cac:Signature/cbc:SignatureMethod'\n\n // Static values based on the user's example XML\n const cacSignatureIdValue =\n 'urn:oasis:names:specification:ubl:signature:Invoice'\n const cacSignatureMethodValue =\n 'urn:oasis:names:specification:ubl:dsig:enveloped:xades'\n\n setElementValue(cacSignatureIdPath, cacSignatureIdValue)\n setElementValue(cacSignatureMethodPath, cacSignatureMethodValue)\n\n // Document `doc` is modified in place.\n}\n"],"mappings":";;;;;;;;;AAeA,SAAS,oBAAoBA,SAAyB;CACpD,MAAM,cAAc;CACpB,MAAM,YAAY;CAClB,IAAI,UAAU;CAEd,MAAM,aAAa,QAAQ,QAAQ,YAAY;CAC/C,MAAM,WAAW,QAAQ,QAAQ,UAAU;AAE3C,KAAI,eAAe,MAAM,aAAa,MAAM,WAAW,WACrD,WAAU,QAAQ,UAAU,aAAa,YAAY,QAAQ,SAAS;AAIxE,QAAO,QAAQ,QAAQ,oBAAoB,GAAG;AAC/C;;;;;;;;;;;;;AAcD,SAAgB,sBACdC,KACAC,WACM;CACN,MAAM,KAAK;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,IAAI;EAGJ,KAAK;EACL,KAAK;CACN;CACD,MAAM,SAAS,MAAM,cAAc,GAAG;CAGtC,MAAM,kBAAkB,CAACC,WAAmBC,UAAkB;AAC5D,MAAI;GACF,MAAM,kBAAkB,OAAO,WAAW,IAAI;AAG9C,OAAI,mBAAmB,KAErB,OAAM,IAAI,OACP,kDAAkD,UAAU;AAKjE,QAAK,MAAM,QAAQ,gBAAgB,CACjC,OAAM,IAAI,OACP,+CAA+C,UAAU,mBAAmB,gBAAgB;AAKjG,OAAI,gBAAgB,WAAW,EAC7B,OAAM,IAAI,OAAO,+BAA+B,UAAU;AAE5D,OAAI,gBAAgB,SAAS,EAC3B,OAAM,IAAI,OACP,kDAAkD,UAAU;GAKjE,MAAM,OAAO,gBAAgB;AAE7B,QACG,eACM,SAAS,cACd,cAAc,SAChB,KAAK,aAAa,EAElB,OAAM,IAAI,OACP,kDAAkD,UAAU,kBAAkB,KAAK,UAAU,KAAK,CAAC;AAKxG,OAAI,iBAAiB,KAEnB,MAAK,cAAc;OAGnB,OAAM,IAAI,OACP,sEAAsE,UAAU;EAGtF,SAAQC,OAAY;AACnB,WAAQ,OAAO,gCAAgC,UAAU,IAAI,MAAM;AAEnE,SAAM,IAAI,OACP,gCAAgC,UAAU,IAAI,MAAM,QAAQ;EAEhE;CACF;CAGD,MAAM,qBAAqB,CAACF,cAA+B;AACzD,MAAI;GACF,MAAM,kBAAkB,OAAO,WAAW,IAAI;AAE9C,UAAO,MAAM,QAAQ,gBAAgB,IAAI,gBAAgB,SAAS;EACnE,SAAQ,OAAO;AACd,WAAQ,OAAO,qCAAqC,UAAU,IAAI,MAAM;AACxE,UAAO;EACR;CACF;CAGD,MAAM,WACJ;CAGF,MAAM,gBAAgB,EAAE,SAAS;CACjC,MAAM,cAAc,EAAE,SAAS;CAG/B,MAAM,sBAAsB,EAAE,SAAS;CACvC,MAAM,gBAAgB,EAAE,SAAS;CACjC,MAAM,mBAAmB,EAAE,aAAa;CACxC,MAAM,iBAAiB,EAAE,WAAW;AAGpC,iBAAgB,oBAAoB,UAAU,eAAe;AAC7D,iBAAgB,cAAc,oBAAoB,UAAU,eAAe,CAAC;AAG5E,MAAK,mBAAmB,aAAa,CAEnC,OAAM,IAAI,OACP,gCAAgC,gBAAgB,iCAAiC,gBAAgB;AAGtG,iBAAgB,iBAAiB,UAAU,YAAY;AAGvD,MAAK,mBAAmB,WAAW,CAEjC,OAAM,IAAI,OACP,gCAAgC,cAAc,iCAAiC,cAAc;AAGlG,iBAAgB,eAAe,UAAU,UAAU;CAGnD,MAAM,qBAAqB;CAC3B,MAAM,yBACJ;CAGF,MAAM,sBACJ;CACF,MAAM,0BACJ;AAEF,iBAAgB,oBAAoB,oBAAoB;AACxD,iBAAgB,wBAAwB,wBAAwB;AAGjE"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
-
const xpath_ts = require_chunk.__toESM(require("xpath-ts"));
|
|
3
|
-
|
|
4
|
-
//#region src/utils/signature/populateSignedProperties.ts
|
|
5
|
-
/**
|
|
6
|
-
* Populates the SignedProperties section within the UBL document's signature structure.
|
|
7
|
-
*
|
|
8
|
-
* Corresponds to Step 6 in the MyInvois Signature Creation guide:
|
|
9
|
-
* https://sdk.myinvois.hasil.gov.my/signature-creation/#step-6-populate-the-signed-properties-section
|
|
10
|
-
*
|
|
11
|
-
* Modifies the passed Document object in place.
|
|
12
|
-
*
|
|
13
|
-
* @param doc The XML Document object (from xmldom-ts) containing the signature structure.
|
|
14
|
-
* @param properties An object containing the data to populate.
|
|
15
|
-
* @throws {Error} If any target element cannot be found or if multiple are found.
|
|
16
|
-
*/
|
|
17
|
-
function populateSignedProperties(doc, properties) {
|
|
18
|
-
const ns = {
|
|
19
|
-
inv: "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2",
|
|
20
|
-
ext: "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2",
|
|
21
|
-
sig: "urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2",
|
|
22
|
-
sac: "urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2",
|
|
23
|
-
ds: "http://www.w3.org/2000/09/xmldsig#",
|
|
24
|
-
xades: "http://uri.etsi.org/01903/v1.3.2#"
|
|
25
|
-
};
|
|
26
|
-
const select = xpath_ts.useNamespaces(ns);
|
|
27
|
-
const setElementValue = (xpathExpr, value) => {
|
|
28
|
-
try {
|
|
29
|
-
const nodes = select(xpathExpr, doc);
|
|
30
|
-
if (!Array.isArray(nodes) || nodes.length === 0) throw new Error(`Element not found for XPath: ${xpathExpr}`);
|
|
31
|
-
if (nodes.length > 1) throw new Error(`Multiple elements found for XPath (expected 1): ${xpathExpr}`);
|
|
32
|
-
const node = nodes[0];
|
|
33
|
-
if (node && typeof node === "object" && "textContent" in node) node.textContent = value;
|
|
34
|
-
else throw new Error(`Selected item is not a valid Node for XPath: ${xpathExpr}`);
|
|
35
|
-
} catch (error) {
|
|
36
|
-
console.error(`Error setting value for XPath ${xpathExpr}:`, error);
|
|
37
|
-
throw new Error(`Failed to set value for XPath ${xpathExpr}: ${error.message}`);
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
const basePath = "/inv:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sig:UBLDocumentSignatures/sac:SignatureInformation/ds:Signature/ds:Object/xades:QualifyingProperties/xades:SignedProperties/xades:SignedSignatureProperties";
|
|
41
|
-
const certDigestPath = `${basePath}/xades:SigningCertificate/xades:Cert/xades:CertDigest/ds:DigestValue`;
|
|
42
|
-
const signingTimePath = `${basePath}/xades:SigningTime`;
|
|
43
|
-
const issuerNamePath = `${basePath}/xades:SigningCertificate/xades:Cert/xades:IssuerSerial/ds:X509IssuerName`;
|
|
44
|
-
const serialNumberPath = `${basePath}/xades:SigningCertificate/xades:Cert/xades:IssuerSerial/ds:X509SerialNumber`;
|
|
45
|
-
setElementValue(certDigestPath, properties.certDigest);
|
|
46
|
-
setElementValue(signingTimePath, properties.signingTime);
|
|
47
|
-
setElementValue(issuerNamePath, properties.issuerName);
|
|
48
|
-
setElementValue(serialNumberPath, properties.serialNumber);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
//#endregion
|
|
52
|
-
Object.defineProperty(exports, 'populateSignedProperties', {
|
|
53
|
-
enumerable: true,
|
|
54
|
-
get: function () {
|
|
55
|
-
return populateSignedProperties;
|
|
56
|
-
}
|
|
57
|
-
});
|
|
58
|
-
//# sourceMappingURL=populateSignedProperties-BJMcBQ6S.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"populateSignedProperties-BJMcBQ6S.cjs","names":["doc: Document","properties: SignedPropertiesData","xpathExpr: string","value: string","error: any"],"sources":["../src/utils/signature/populateSignedProperties.ts"],"sourcesContent":["import * as xpath from 'xpath-ts'\n\nexport interface SignedPropertiesData {\n certDigest: string // Base64 encoded SHA-256 hash of certificate (Step 5)\n signingTime: string // ISO 8601 UTC timestamp string (e.g., 2023-10-26T10:30:00Z)\n issuerName: string // Certificate Issuer Name\n serialNumber: string // Certificate Serial Number\n}\n\n/**\n * Populates the SignedProperties section within the UBL document's signature structure.\n *\n * Corresponds to Step 6 in the MyInvois Signature Creation guide:\n * https://sdk.myinvois.hasil.gov.my/signature-creation/#step-6-populate-the-signed-properties-section\n *\n * Modifies the passed Document object in place.\n *\n * @param doc The XML Document object (from xmldom-ts) containing the signature structure.\n * @param properties An object containing the data to populate.\n * @throws {Error} If any target element cannot be found or if multiple are found.\n */\nexport function populateSignedProperties(\n doc: Document,\n properties: SignedPropertiesData,\n): void {\n // Define namespaces used in the XPaths\n const ns = {\n inv: 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2', // Define prefix for default NS\n ext: 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2',\n sig: 'urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2',\n sac: 'urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2',\n ds: 'http://www.w3.org/2000/09/xmldsig#',\n xades: 'http://uri.etsi.org/01903/v1.3.2#', // Common XAdES namespace\n }\n const select = xpath.useNamespaces(ns)\n\n // Helper function to find a single node and set its text content\n const setElementValue = (xpathExpr: string, value: string) => {\n try {\n const nodes = select(xpathExpr, doc)\n\n // Refine check: Explicitly look for an empty array result\n if (!Array.isArray(nodes) || nodes.length === 0) {\n throw new Error(`Element not found for XPath: ${xpathExpr}`)\n }\n if (nodes.length > 1) {\n throw new Error(\n `Multiple elements found for XPath (expected 1): ${xpathExpr}`,\n )\n }\n\n const node = nodes[0]\n\n // Ensure it's a valid Node (like Element or Attr) before setting textContent\n if (node && typeof node === 'object' && 'textContent' in node) {\n // Type assertion might be needed if TS struggles with union type from select\n ;(node as Node).textContent = value\n } else {\n throw new Error(\n `Selected item is not a valid Node for XPath: ${xpathExpr}`,\n )\n }\n } catch (error: any) {\n console.error(`Error setting value for XPath ${xpathExpr}:`, error)\n // Re-throw to indicate failure to populate\n throw new Error(\n `Failed to set value for XPath ${xpathExpr}: ${error.message}`,\n )\n }\n }\n\n // Define XPaths based on UBL documentation\n // Use the defined prefix 'inv' for the root Invoice element\n const basePath =\n '/inv:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sig:UBLDocumentSignatures/sac:SignatureInformation/ds:Signature/ds:Object/xades:QualifyingProperties/xades:SignedProperties/xades:SignedSignatureProperties'\n\n const certDigestPath = `${basePath}/xades:SigningCertificate/xades:Cert/xades:CertDigest/ds:DigestValue`\n const signingTimePath = `${basePath}/xades:SigningTime`\n const issuerNamePath = `${basePath}/xades:SigningCertificate/xades:Cert/xades:IssuerSerial/ds:X509IssuerName`\n const serialNumberPath = `${basePath}/xades:SigningCertificate/xades:Cert/xades:IssuerSerial/ds:X509SerialNumber`\n\n // Populate the values\n setElementValue(certDigestPath, properties.certDigest)\n setElementValue(signingTimePath, properties.signingTime)\n setElementValue(issuerNamePath, properties.issuerName)\n setElementValue(serialNumberPath, properties.serialNumber)\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAqBA,SAAgB,yBACdA,KACAC,YACM;CAEN,MAAM,KAAK;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,IAAI;EACJ,OAAO;CACR;CACD,MAAM,SAAS,SAAM,cAAc,GAAG;CAGtC,MAAM,kBAAkB,CAACC,WAAmBC,UAAkB;AAC5D,MAAI;GACF,MAAM,QAAQ,OAAO,WAAW,IAAI;AAGpC,QAAK,MAAM,QAAQ,MAAM,IAAI,MAAM,WAAW,EAC5C,OAAM,IAAI,OAAO,+BAA+B,UAAU;AAE5D,OAAI,MAAM,SAAS,EACjB,OAAM,IAAI,OACP,kDAAkD,UAAU;GAIjE,MAAM,OAAO,MAAM;AAGnB,OAAI,eAAe,SAAS,YAAY,iBAAiB,KAEtD,CAAC,KAAc,cAAc;OAE9B,OAAM,IAAI,OACP,+CAA+C,UAAU;EAG/D,SAAQC,OAAY;AACnB,WAAQ,OAAO,gCAAgC,UAAU,IAAI,MAAM;AAEnE,SAAM,IAAI,OACP,gCAAgC,UAAU,IAAI,MAAM,QAAQ;EAEhE;CACF;CAID,MAAM,WACJ;CAEF,MAAM,kBAAkB,EAAE,SAAS;CACnC,MAAM,mBAAmB,EAAE,SAAS;CACpC,MAAM,kBAAkB,EAAE,SAAS;CACnC,MAAM,oBAAoB,EAAE,SAAS;AAGrC,iBAAgB,gBAAgB,WAAW,WAAW;AACtD,iBAAgB,iBAAiB,WAAW,YAAY;AACxD,iBAAgB,gBAAgB,WAAW,WAAW;AACtD,iBAAgB,kBAAkB,WAAW,aAAa;AAC3D"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import * as xpath from "xpath-ts";
|
|
2
|
-
|
|
3
|
-
//#region src/utils/signature/populateSignedProperties.ts
|
|
4
|
-
/**
|
|
5
|
-
* Populates the SignedProperties section within the UBL document's signature structure.
|
|
6
|
-
*
|
|
7
|
-
* Corresponds to Step 6 in the MyInvois Signature Creation guide:
|
|
8
|
-
* https://sdk.myinvois.hasil.gov.my/signature-creation/#step-6-populate-the-signed-properties-section
|
|
9
|
-
*
|
|
10
|
-
* Modifies the passed Document object in place.
|
|
11
|
-
*
|
|
12
|
-
* @param doc The XML Document object (from xmldom-ts) containing the signature structure.
|
|
13
|
-
* @param properties An object containing the data to populate.
|
|
14
|
-
* @throws {Error} If any target element cannot be found or if multiple are found.
|
|
15
|
-
*/
|
|
16
|
-
function populateSignedProperties(doc, properties) {
|
|
17
|
-
const ns = {
|
|
18
|
-
inv: "urn:oasis:names:specification:ubl:schema:xsd:Invoice-2",
|
|
19
|
-
ext: "urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2",
|
|
20
|
-
sig: "urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2",
|
|
21
|
-
sac: "urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2",
|
|
22
|
-
ds: "http://www.w3.org/2000/09/xmldsig#",
|
|
23
|
-
xades: "http://uri.etsi.org/01903/v1.3.2#"
|
|
24
|
-
};
|
|
25
|
-
const select = xpath.useNamespaces(ns);
|
|
26
|
-
const setElementValue = (xpathExpr, value) => {
|
|
27
|
-
try {
|
|
28
|
-
const nodes = select(xpathExpr, doc);
|
|
29
|
-
if (!Array.isArray(nodes) || nodes.length === 0) throw new Error(`Element not found for XPath: ${xpathExpr}`);
|
|
30
|
-
if (nodes.length > 1) throw new Error(`Multiple elements found for XPath (expected 1): ${xpathExpr}`);
|
|
31
|
-
const node = nodes[0];
|
|
32
|
-
if (node && typeof node === "object" && "textContent" in node) node.textContent = value;
|
|
33
|
-
else throw new Error(`Selected item is not a valid Node for XPath: ${xpathExpr}`);
|
|
34
|
-
} catch (error) {
|
|
35
|
-
console.error(`Error setting value for XPath ${xpathExpr}:`, error);
|
|
36
|
-
throw new Error(`Failed to set value for XPath ${xpathExpr}: ${error.message}`);
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
const basePath = "/inv:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sig:UBLDocumentSignatures/sac:SignatureInformation/ds:Signature/ds:Object/xades:QualifyingProperties/xades:SignedProperties/xades:SignedSignatureProperties";
|
|
40
|
-
const certDigestPath = `${basePath}/xades:SigningCertificate/xades:Cert/xades:CertDigest/ds:DigestValue`;
|
|
41
|
-
const signingTimePath = `${basePath}/xades:SigningTime`;
|
|
42
|
-
const issuerNamePath = `${basePath}/xades:SigningCertificate/xades:Cert/xades:IssuerSerial/ds:X509IssuerName`;
|
|
43
|
-
const serialNumberPath = `${basePath}/xades:SigningCertificate/xades:Cert/xades:IssuerSerial/ds:X509SerialNumber`;
|
|
44
|
-
setElementValue(certDigestPath, properties.certDigest);
|
|
45
|
-
setElementValue(signingTimePath, properties.signingTime);
|
|
46
|
-
setElementValue(issuerNamePath, properties.issuerName);
|
|
47
|
-
setElementValue(serialNumberPath, properties.serialNumber);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
//#endregion
|
|
51
|
-
export { populateSignedProperties };
|
|
52
|
-
//# sourceMappingURL=populateSignedProperties-BvGN-YZH.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"populateSignedProperties-BvGN-YZH.js","names":["doc: Document","properties: SignedPropertiesData","xpathExpr: string","value: string","error: any"],"sources":["../src/utils/signature/populateSignedProperties.ts"],"sourcesContent":["import * as xpath from 'xpath-ts'\n\nexport interface SignedPropertiesData {\n certDigest: string // Base64 encoded SHA-256 hash of certificate (Step 5)\n signingTime: string // ISO 8601 UTC timestamp string (e.g., 2023-10-26T10:30:00Z)\n issuerName: string // Certificate Issuer Name\n serialNumber: string // Certificate Serial Number\n}\n\n/**\n * Populates the SignedProperties section within the UBL document's signature structure.\n *\n * Corresponds to Step 6 in the MyInvois Signature Creation guide:\n * https://sdk.myinvois.hasil.gov.my/signature-creation/#step-6-populate-the-signed-properties-section\n *\n * Modifies the passed Document object in place.\n *\n * @param doc The XML Document object (from xmldom-ts) containing the signature structure.\n * @param properties An object containing the data to populate.\n * @throws {Error} If any target element cannot be found or if multiple are found.\n */\nexport function populateSignedProperties(\n doc: Document,\n properties: SignedPropertiesData,\n): void {\n // Define namespaces used in the XPaths\n const ns = {\n inv: 'urn:oasis:names:specification:ubl:schema:xsd:Invoice-2', // Define prefix for default NS\n ext: 'urn:oasis:names:specification:ubl:schema:xsd:CommonExtensionComponents-2',\n sig: 'urn:oasis:names:specification:ubl:schema:xsd:CommonSignatureComponents-2',\n sac: 'urn:oasis:names:specification:ubl:schema:xsd:SignatureAggregateComponents-2',\n ds: 'http://www.w3.org/2000/09/xmldsig#',\n xades: 'http://uri.etsi.org/01903/v1.3.2#', // Common XAdES namespace\n }\n const select = xpath.useNamespaces(ns)\n\n // Helper function to find a single node and set its text content\n const setElementValue = (xpathExpr: string, value: string) => {\n try {\n const nodes = select(xpathExpr, doc)\n\n // Refine check: Explicitly look for an empty array result\n if (!Array.isArray(nodes) || nodes.length === 0) {\n throw new Error(`Element not found for XPath: ${xpathExpr}`)\n }\n if (nodes.length > 1) {\n throw new Error(\n `Multiple elements found for XPath (expected 1): ${xpathExpr}`,\n )\n }\n\n const node = nodes[0]\n\n // Ensure it's a valid Node (like Element or Attr) before setting textContent\n if (node && typeof node === 'object' && 'textContent' in node) {\n // Type assertion might be needed if TS struggles with union type from select\n ;(node as Node).textContent = value\n } else {\n throw new Error(\n `Selected item is not a valid Node for XPath: ${xpathExpr}`,\n )\n }\n } catch (error: any) {\n console.error(`Error setting value for XPath ${xpathExpr}:`, error)\n // Re-throw to indicate failure to populate\n throw new Error(\n `Failed to set value for XPath ${xpathExpr}: ${error.message}`,\n )\n }\n }\n\n // Define XPaths based on UBL documentation\n // Use the defined prefix 'inv' for the root Invoice element\n const basePath =\n '/inv:Invoice/ext:UBLExtensions/ext:UBLExtension/ext:ExtensionContent/sig:UBLDocumentSignatures/sac:SignatureInformation/ds:Signature/ds:Object/xades:QualifyingProperties/xades:SignedProperties/xades:SignedSignatureProperties'\n\n const certDigestPath = `${basePath}/xades:SigningCertificate/xades:Cert/xades:CertDigest/ds:DigestValue`\n const signingTimePath = `${basePath}/xades:SigningTime`\n const issuerNamePath = `${basePath}/xades:SigningCertificate/xades:Cert/xades:IssuerSerial/ds:X509IssuerName`\n const serialNumberPath = `${basePath}/xades:SigningCertificate/xades:Cert/xades:IssuerSerial/ds:X509SerialNumber`\n\n // Populate the values\n setElementValue(certDigestPath, properties.certDigest)\n setElementValue(signingTimePath, properties.signingTime)\n setElementValue(issuerNamePath, properties.issuerName)\n setElementValue(serialNumberPath, properties.serialNumber)\n}\n"],"mappings":";;;;;;;;;;;;;;;AAqBA,SAAgB,yBACdA,KACAC,YACM;CAEN,MAAM,KAAK;EACT,KAAK;EACL,KAAK;EACL,KAAK;EACL,KAAK;EACL,IAAI;EACJ,OAAO;CACR;CACD,MAAM,SAAS,MAAM,cAAc,GAAG;CAGtC,MAAM,kBAAkB,CAACC,WAAmBC,UAAkB;AAC5D,MAAI;GACF,MAAM,QAAQ,OAAO,WAAW,IAAI;AAGpC,QAAK,MAAM,QAAQ,MAAM,IAAI,MAAM,WAAW,EAC5C,OAAM,IAAI,OAAO,+BAA+B,UAAU;AAE5D,OAAI,MAAM,SAAS,EACjB,OAAM,IAAI,OACP,kDAAkD,UAAU;GAIjE,MAAM,OAAO,MAAM;AAGnB,OAAI,eAAe,SAAS,YAAY,iBAAiB,KAEtD,CAAC,KAAc,cAAc;OAE9B,OAAM,IAAI,OACP,+CAA+C,UAAU;EAG/D,SAAQC,OAAY;AACnB,WAAQ,OAAO,gCAAgC,UAAU,IAAI,MAAM;AAEnE,SAAM,IAAI,OACP,gCAAgC,UAAU,IAAI,MAAM,QAAQ;EAEhE;CACF;CAID,MAAM,WACJ;CAEF,MAAM,kBAAkB,EAAE,SAAS;CACnC,MAAM,mBAAmB,EAAE,SAAS;CACpC,MAAM,kBAAkB,EAAE,SAAS;CACnC,MAAM,oBAAoB,EAAE,SAAS;AAGrC,iBAAgB,gBAAgB,WAAW,WAAW;AACtD,iBAAgB,iBAAiB,WAAW,YAAY;AACxD,iBAAgB,gBAAgB,WAAW,WAAW;AACtD,iBAAgB,kBAAkB,WAAW,aAAa;AAC3D"}
|
package/dist/sign-B61Cy3gO.cjs
DELETED
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
-
const crypto = require_chunk.__toESM(require("crypto"));
|
|
3
|
-
|
|
4
|
-
//#region src/utils/signature/sign.ts
|
|
5
|
-
/**
|
|
6
|
-
* Signs the document hash digest using RSA-SHA256 and a private key.
|
|
7
|
-
*
|
|
8
|
-
* Corresponds to Step 4 in the MyInvois Signature Creation guide:
|
|
9
|
-
* https://sdk.myinvois.hasil.gov.my/signature-creation/#step-4-sign-the-document-digest
|
|
10
|
-
*
|
|
11
|
-
* @param base64DocDigest The Base64 encoded SHA-256 hash of the canonicalized document (DocDigest from Step 3).
|
|
12
|
-
* @param privateKeyPem The private key in PEM format (string or Buffer).
|
|
13
|
-
* @returns The Base64 encoded RSA-SHA256 signature (Sig).
|
|
14
|
-
* @throws {Error} If signing fails.
|
|
15
|
-
*/
|
|
16
|
-
function signDocumentDigest(base64DocDigest, privateKeyPem) {
|
|
17
|
-
try {
|
|
18
|
-
const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;
|
|
19
|
-
if (base64DocDigest.length > 0 && !base64Regex.test(base64DocDigest)) throw new Error("Invalid Base64 characters detected in document digest.");
|
|
20
|
-
const rawDocDigest = Buffer.from(base64DocDigest, "base64");
|
|
21
|
-
if (base64DocDigest.length > 0 && rawDocDigest.length === 0) throw new Error("Invalid Base64 content for document digest.");
|
|
22
|
-
const signer = crypto.createSign("RSA-SHA256");
|
|
23
|
-
signer.update(rawDocDigest);
|
|
24
|
-
signer.end();
|
|
25
|
-
const base64Signature = signer.sign(privateKeyPem, "base64");
|
|
26
|
-
return base64Signature;
|
|
27
|
-
} catch (error) {
|
|
28
|
-
console.error("Error during signing:", error);
|
|
29
|
-
throw new Error(`Failed to sign document digest: ${error.message || error}`);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
//#endregion
|
|
34
|
-
Object.defineProperty(exports, 'signDocumentDigest', {
|
|
35
|
-
enumerable: true,
|
|
36
|
-
get: function () {
|
|
37
|
-
return signDocumentDigest;
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
//# sourceMappingURL=sign-B61Cy3gO.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sign-B61Cy3gO.cjs","names":["base64DocDigest: string","privateKeyPem: string | Buffer","error: any"],"sources":["../src/utils/signature/sign.ts"],"sourcesContent":["import * as crypto from 'crypto'\n\n/**\n * Signs the document hash digest using RSA-SHA256 and a private key.\n *\n * Corresponds to Step 4 in the MyInvois Signature Creation guide:\n * https://sdk.myinvois.hasil.gov.my/signature-creation/#step-4-sign-the-document-digest\n *\n * @param base64DocDigest The Base64 encoded SHA-256 hash of the canonicalized document (DocDigest from Step 3).\n * @param privateKeyPem The private key in PEM format (string or Buffer).\n * @returns The Base64 encoded RSA-SHA256 signature (Sig).\n * @throws {Error} If signing fails.\n */\nexport function signDocumentDigest(\n base64DocDigest: string,\n privateKeyPem: string | Buffer,\n): string {\n try {\n // Add stricter validation: Check if the input string contains only valid Base64 characters.\n const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/\n if (base64DocDigest.length > 0 && !base64Regex.test(base64DocDigest)) {\n throw new Error('Invalid Base64 characters detected in document digest.')\n }\n\n // 1. Decode the Base64 document digest back to a raw buffer\n // The signature is calculated over the raw hash bytes, not the Base64 string.\n const rawDocDigest = Buffer.from(base64DocDigest, 'base64')\n\n // Add check: If input Base64 string was not empty, but decoded buffer is,\n // it implies invalid Base64 characters were likely ignored instead of throwing.\n if (base64DocDigest.length > 0 && rawDocDigest.length === 0) {\n throw new Error('Invalid Base64 content for document digest.')\n }\n\n // 2. Create a signer instance with RSA-SHA256\n const signer = crypto.createSign('RSA-SHA256')\n\n // 3. Update the signer with the raw hash digest\n // Note: We sign the HASH itself, not the original data.\n signer.update(rawDocDigest)\n signer.end()\n\n // 4. Sign using the private key and get the signature in Base64 format\n const base64Signature = signer.sign(privateKeyPem, 'base64')\n\n return base64Signature\n } catch (error: any) {\n console.error('Error during signing:', error)\n throw new Error(`Failed to sign document digest: ${error.message || error}`)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAaA,SAAgB,mBACdA,iBACAC,eACQ;AACR,KAAI;EAEF,MAAM,cAAc;AACpB,MAAI,gBAAgB,SAAS,MAAM,YAAY,KAAK,gBAAgB,CAClE,OAAM,IAAI,MAAM;EAKlB,MAAM,eAAe,OAAO,KAAK,iBAAiB,SAAS;AAI3D,MAAI,gBAAgB,SAAS,KAAK,aAAa,WAAW,EACxD,OAAM,IAAI,MAAM;EAIlB,MAAM,SAAS,OAAO,WAAW,aAAa;AAI9C,SAAO,OAAO,aAAa;AAC3B,SAAO,KAAK;EAGZ,MAAM,kBAAkB,OAAO,KAAK,eAAe,SAAS;AAE5D,SAAO;CACR,SAAQC,OAAY;AACnB,UAAQ,MAAM,yBAAyB,MAAM;AAC7C,QAAM,IAAI,OAAO,kCAAkC,MAAM,WAAW,MAAM;CAC3E;AACF"}
|
package/dist/sign-DzHK7UhR.js
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import * as crypto from "crypto";
|
|
2
|
-
|
|
3
|
-
//#region src/utils/signature/sign.ts
|
|
4
|
-
/**
|
|
5
|
-
* Signs the document hash digest using RSA-SHA256 and a private key.
|
|
6
|
-
*
|
|
7
|
-
* Corresponds to Step 4 in the MyInvois Signature Creation guide:
|
|
8
|
-
* https://sdk.myinvois.hasil.gov.my/signature-creation/#step-4-sign-the-document-digest
|
|
9
|
-
*
|
|
10
|
-
* @param base64DocDigest The Base64 encoded SHA-256 hash of the canonicalized document (DocDigest from Step 3).
|
|
11
|
-
* @param privateKeyPem The private key in PEM format (string or Buffer).
|
|
12
|
-
* @returns The Base64 encoded RSA-SHA256 signature (Sig).
|
|
13
|
-
* @throws {Error} If signing fails.
|
|
14
|
-
*/
|
|
15
|
-
function signDocumentDigest(base64DocDigest, privateKeyPem) {
|
|
16
|
-
try {
|
|
17
|
-
const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;
|
|
18
|
-
if (base64DocDigest.length > 0 && !base64Regex.test(base64DocDigest)) throw new Error("Invalid Base64 characters detected in document digest.");
|
|
19
|
-
const rawDocDigest = Buffer.from(base64DocDigest, "base64");
|
|
20
|
-
if (base64DocDigest.length > 0 && rawDocDigest.length === 0) throw new Error("Invalid Base64 content for document digest.");
|
|
21
|
-
const signer = crypto.createSign("RSA-SHA256");
|
|
22
|
-
signer.update(rawDocDigest);
|
|
23
|
-
signer.end();
|
|
24
|
-
const base64Signature = signer.sign(privateKeyPem, "base64");
|
|
25
|
-
return base64Signature;
|
|
26
|
-
} catch (error) {
|
|
27
|
-
console.error("Error during signing:", error);
|
|
28
|
-
throw new Error(`Failed to sign document digest: ${error.message || error}`);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
//#endregion
|
|
33
|
-
export { signDocumentDigest };
|
|
34
|
-
//# sourceMappingURL=sign-DzHK7UhR.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sign-DzHK7UhR.js","names":["base64DocDigest: string","privateKeyPem: string | Buffer","error: any"],"sources":["../src/utils/signature/sign.ts"],"sourcesContent":["import * as crypto from 'crypto'\n\n/**\n * Signs the document hash digest using RSA-SHA256 and a private key.\n *\n * Corresponds to Step 4 in the MyInvois Signature Creation guide:\n * https://sdk.myinvois.hasil.gov.my/signature-creation/#step-4-sign-the-document-digest\n *\n * @param base64DocDigest The Base64 encoded SHA-256 hash of the canonicalized document (DocDigest from Step 3).\n * @param privateKeyPem The private key in PEM format (string or Buffer).\n * @returns The Base64 encoded RSA-SHA256 signature (Sig).\n * @throws {Error} If signing fails.\n */\nexport function signDocumentDigest(\n base64DocDigest: string,\n privateKeyPem: string | Buffer,\n): string {\n try {\n // Add stricter validation: Check if the input string contains only valid Base64 characters.\n const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/\n if (base64DocDigest.length > 0 && !base64Regex.test(base64DocDigest)) {\n throw new Error('Invalid Base64 characters detected in document digest.')\n }\n\n // 1. Decode the Base64 document digest back to a raw buffer\n // The signature is calculated over the raw hash bytes, not the Base64 string.\n const rawDocDigest = Buffer.from(base64DocDigest, 'base64')\n\n // Add check: If input Base64 string was not empty, but decoded buffer is,\n // it implies invalid Base64 characters were likely ignored instead of throwing.\n if (base64DocDigest.length > 0 && rawDocDigest.length === 0) {\n throw new Error('Invalid Base64 content for document digest.')\n }\n\n // 2. Create a signer instance with RSA-SHA256\n const signer = crypto.createSign('RSA-SHA256')\n\n // 3. Update the signer with the raw hash digest\n // Note: We sign the HASH itself, not the original data.\n signer.update(rawDocDigest)\n signer.end()\n\n // 4. Sign using the private key and get the signature in Base64 format\n const base64Signature = signer.sign(privateKeyPem, 'base64')\n\n return base64Signature\n } catch (error: any) {\n console.error('Error during signing:', error)\n throw new Error(`Failed to sign document digest: ${error.message || error}`)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;AAaA,SAAgB,mBACdA,iBACAC,eACQ;AACR,KAAI;EAEF,MAAM,cAAc;AACpB,MAAI,gBAAgB,SAAS,MAAM,YAAY,KAAK,gBAAgB,CAClE,OAAM,IAAI,MAAM;EAKlB,MAAM,eAAe,OAAO,KAAK,iBAAiB,SAAS;AAI3D,MAAI,gBAAgB,SAAS,KAAK,aAAa,WAAW,EACxD,OAAM,IAAI,MAAM;EAIlB,MAAM,SAAS,OAAO,WAAW,aAAa;AAI9C,SAAO,OAAO,aAAa;AAC3B,SAAO,KAAK;EAGZ,MAAM,kBAAkB,OAAO,KAAK,eAAe,SAAS;AAE5D,SAAO;CACR,SAAQC,OAAY;AACnB,UAAQ,MAAM,yBAAyB,MAAM;AAC7C,QAAM,IAAI,OAAO,kCAAkC,MAAM,WAAW,MAAM;CAC3E;AACF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signatures-BKi9DP2K.d.cts","names":["DigestMethod","CertDigest","IssuerSerial","Cert","SigningCertificate","SignedSignatureProperties","SignedProperties","QualifyingProperties","X509Data","KeyInfo","Transform","Reference","CanonicalizationMethod","SignatureMethod","SignedInfo","IssuerDigitalSignature"],"sources":["../src/types/signatures.d.ts"],"sourcesContent":["/**\n * Represents the Digest Method structure used within the signature.\n */\nexport interface DigestMethod {\n /** Algorithm used for digest. Should be http://www.w3.org/2001/04/xmlenc#sha256 */\n Algorithm: string\n}\n\n/**\n * Represents the Cert Digest structure.\n */\nexport interface CertDigest {\n /** Digest method details. */\n \"ds:DigestMethod\": DigestMethod\n /** Base64 encoded HEX-SHA256 certificate information (CertDigest). */\n \"ds:DigestValue\": string // base64binary\n}\n\n/**\n * Represents the Issuer Serial structure within the Signing Certificate.\n */\nexport interface IssuerSerial {\n /** CN of the certificate issuer (Organization name). */\n \"ds:X509IssuerName\": string\n /** Digital certificate serial number. */\n \"ds:X509SerialNumber\": string // xsd:normalizedString -> string\n}\n\n/**\n * Represents the Certificate structure within Signing Certificate.\n */\nexport interface Cert {\n /** Certificate digest details. */\n \"xades:CertDigest\": CertDigest\n /** Issuer details. */\n \"xades:IssuerSerial\": IssuerSerial\n}\n\n/**\n * Represents the Signing Certificate structure.\n */\nexport interface SigningCertificate {\n /** Certificate details. */\n \"xades:Cert\": Cert\n}\n\n/**\n * Represents the Signed Signature Properties.\n */\nexport interface SignedSignatureProperties {\n /** UTC timestamp of signing (YYYY-MM-DDTHH:mm:ssZ). */\n \"xades:SigningTime\": string // dateTime\n /** Signing certificate details. */\n \"xades:SigningCertificate\": SigningCertificate\n // Note: Other optional properties like SignaturePolicyIdentifier might exist\n}\n\n/**\n * Represents the Signed Properties structure.\n */\nexport interface SignedProperties {\n /** Target attribute, should be 'signature'. */\n Target: string\n /** ID attribute, should be 'id-xades-signed-props'. */\n Id: string\n /** Signed signature properties. */\n \"xades:SignedSignatureProperties\": SignedSignatureProperties\n}\n\n/**\n * Represents the Qualifying Properties structure (Object element).\n */\nexport interface QualifyingProperties {\n /** Target attribute, should be 'signature'. */\n Target: string\n /** Signed properties details. */\n \"xades:SignedProperties\": SignedProperties\n // Note: UnsignedProperties might exist but are not detailed in the mandatory part\n}\n\n/**\n * Represents the X509 Data structure within KeyInfo.\n */\nexport interface X509Data {\n /** Base64 encoded X509 certificate. */\n \"ds:X509Certificate\": string // base64binary\n}\n\n/**\n * Represents the Key Information structure.\n */\nexport interface KeyInfo {\n /** X509 certificate data. */\n \"ds:X509Data\": X509Data\n}\n\n/**\n * Represents the Transform structure within Reference.\n */\nexport interface Transform {\n /** Algorithm attribute for the transform. */\n Algorithm: string\n}\n\n/**\n * Represents a Reference within SignedInfo.\n */\nexport interface Reference {\n /** ID attribute for the reference (e.g., 'id-doc-signed-data', 'id-xades-signed-props'). */\n Id?: string\n /** URI attribute for the reference (e.g., '', '#id-xades-signed-props'). */\n URI: string\n /** Optional Transforms applied. */\n \"ds:Transforms\"?: {\n \"ds:Transform\": Transform | Transform[] // Can be single or multiple transforms\n }\n /** Digest method details. */\n \"ds:DigestMethod\": DigestMethod\n /** Base64 encoded digest value (DocDigest or PropsDigest). */\n \"ds:DigestValue\": string // base64binary\n}\n\n/**\n * Represents the Canonicalization Method structure.\n */\nexport interface CanonicalizationMethod {\n /** Algorithm used for canonicalization. Should be http://www.w3.org/2006/12/xml-c14n11 */\n Algorithm: string\n}\n\n/**\n * Represents the Signature Method structure.\n */\nexport interface SignatureMethod {\n /** Algorithm used for signing. Should be http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 */\n Algorithm: string\n}\n\n/**\n * Represents the Signed Information structure.\n */\nexport interface SignedInfo {\n /** Canonicalization method details. */\n \"ds:CanonicalizationMethod\": CanonicalizationMethod\n /** Signature method details. */\n \"ds:SignatureMethod\": SignatureMethod\n /** References to signed data and properties. Should contain two references. */\n \"ds:Reference\": [Reference, Reference] // Expecting two: one for document, one for signed properties\n}\n\n/**\n * Represents the root Signature element (IssuerDigitalSignature).\n * Based on the documentation: https://sdk.myinvois.hasil.gov.my/signature/\n * Conforms to XAdES enveloped signature requirements for UBL.\n */\nexport interface IssuerDigitalSignature {\n /** ID attribute, should be 'DocSig'. */\n Id: string\n /** Signed information details. */\n \"ds:SignedInfo\": SignedInfo\n /** Base64 encoded signature value (Sig). */\n \"ds:SignatureValue\": string // base64binary\n /** Public key information (certificate). */\n \"ds:KeyInfo\": KeyInfo\n /** Object containing signed properties. */\n \"ds:Object\": {\n \"xades:QualifyingProperties\": QualifyingProperties\n }\n}\n"],"mappings":";;AAGA;AAQA;AAUiBE,UAlBAF,YAAAA,CAkBY;EAU7B;EAAqB,SAAA,EAAA,MAAA;;;AAIe;AAMpC;AAQA;AAWiBM,UAjDAL,UAAAA,CAiDgB;EAYjC;EAWA,iBAAyB,EAtEJD,YAsEI;EAQzB;EAQA,gBAA0B,EAAA,MAAA,EAAA;AAQ1B;;;;;AAUiC,UAhGhBE,YAAAA,CAgGgB;EAQjC;EAQA,mBAAiBW,EAAe,MAAA;EAQhC;EAA2B,qBAAA,EAAA,MAAA,EAAA;;;;;AAMY;AAQtBE,UA5HAZ,IAAAA,CA4HAY;EAAsB;EAAA,kBAIpBD,EA9HGb,UA8HHa;EAAU;EAIN,oBAGWP,EAnIVL,YAmIUK;AAAoB;;;;;UA7HrCH,kBAAAA;;gBAEDD;;;;;;UAMCE,yBAAAA;;;;8BAIaD;;;;;;;UAObE,gBAAAA;;;;;;qCAMoBD;;;;;;UAMpBE,oBAAAA;;;;4BAIWD;;;;;;;UAOXE,QAAAA;;;;;;;;UAQAC,OAAAA;;iBAEAD;;;;;;UAMAE,SAAAA;;;;;;;;UAQAC,SAAAA;;;;;;;oBAOGD,YAAYA;;;qBAGXV;;;;;;;;UAQJY,sBAAAA;;;;;;;;UAQAC,eAAAA;;;;;;;;UAQAC,UAAAA;;+BAEcF;;wBAEPC;;mBAELF,WAAWA;;;;;;;;UAQbI,sBAAAA;;;;mBAIED;;;;gBAIHL;;;kCAGkBF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signatures-C9QPZTQd.d.ts","names":["DigestMethod","CertDigest","IssuerSerial","Cert","SigningCertificate","SignedSignatureProperties","SignedProperties","QualifyingProperties","X509Data","KeyInfo","Transform","Reference","CanonicalizationMethod","SignatureMethod","SignedInfo","IssuerDigitalSignature"],"sources":["../src/types/signatures.d.ts"],"sourcesContent":["/**\n * Represents the Digest Method structure used within the signature.\n */\nexport interface DigestMethod {\n /** Algorithm used for digest. Should be http://www.w3.org/2001/04/xmlenc#sha256 */\n Algorithm: string\n}\n\n/**\n * Represents the Cert Digest structure.\n */\nexport interface CertDigest {\n /** Digest method details. */\n \"ds:DigestMethod\": DigestMethod\n /** Base64 encoded HEX-SHA256 certificate information (CertDigest). */\n \"ds:DigestValue\": string // base64binary\n}\n\n/**\n * Represents the Issuer Serial structure within the Signing Certificate.\n */\nexport interface IssuerSerial {\n /** CN of the certificate issuer (Organization name). */\n \"ds:X509IssuerName\": string\n /** Digital certificate serial number. */\n \"ds:X509SerialNumber\": string // xsd:normalizedString -> string\n}\n\n/**\n * Represents the Certificate structure within Signing Certificate.\n */\nexport interface Cert {\n /** Certificate digest details. */\n \"xades:CertDigest\": CertDigest\n /** Issuer details. */\n \"xades:IssuerSerial\": IssuerSerial\n}\n\n/**\n * Represents the Signing Certificate structure.\n */\nexport interface SigningCertificate {\n /** Certificate details. */\n \"xades:Cert\": Cert\n}\n\n/**\n * Represents the Signed Signature Properties.\n */\nexport interface SignedSignatureProperties {\n /** UTC timestamp of signing (YYYY-MM-DDTHH:mm:ssZ). */\n \"xades:SigningTime\": string // dateTime\n /** Signing certificate details. */\n \"xades:SigningCertificate\": SigningCertificate\n // Note: Other optional properties like SignaturePolicyIdentifier might exist\n}\n\n/**\n * Represents the Signed Properties structure.\n */\nexport interface SignedProperties {\n /** Target attribute, should be 'signature'. */\n Target: string\n /** ID attribute, should be 'id-xades-signed-props'. */\n Id: string\n /** Signed signature properties. */\n \"xades:SignedSignatureProperties\": SignedSignatureProperties\n}\n\n/**\n * Represents the Qualifying Properties structure (Object element).\n */\nexport interface QualifyingProperties {\n /** Target attribute, should be 'signature'. */\n Target: string\n /** Signed properties details. */\n \"xades:SignedProperties\": SignedProperties\n // Note: UnsignedProperties might exist but are not detailed in the mandatory part\n}\n\n/**\n * Represents the X509 Data structure within KeyInfo.\n */\nexport interface X509Data {\n /** Base64 encoded X509 certificate. */\n \"ds:X509Certificate\": string // base64binary\n}\n\n/**\n * Represents the Key Information structure.\n */\nexport interface KeyInfo {\n /** X509 certificate data. */\n \"ds:X509Data\": X509Data\n}\n\n/**\n * Represents the Transform structure within Reference.\n */\nexport interface Transform {\n /** Algorithm attribute for the transform. */\n Algorithm: string\n}\n\n/**\n * Represents a Reference within SignedInfo.\n */\nexport interface Reference {\n /** ID attribute for the reference (e.g., 'id-doc-signed-data', 'id-xades-signed-props'). */\n Id?: string\n /** URI attribute for the reference (e.g., '', '#id-xades-signed-props'). */\n URI: string\n /** Optional Transforms applied. */\n \"ds:Transforms\"?: {\n \"ds:Transform\": Transform | Transform[] // Can be single or multiple transforms\n }\n /** Digest method details. */\n \"ds:DigestMethod\": DigestMethod\n /** Base64 encoded digest value (DocDigest or PropsDigest). */\n \"ds:DigestValue\": string // base64binary\n}\n\n/**\n * Represents the Canonicalization Method structure.\n */\nexport interface CanonicalizationMethod {\n /** Algorithm used for canonicalization. Should be http://www.w3.org/2006/12/xml-c14n11 */\n Algorithm: string\n}\n\n/**\n * Represents the Signature Method structure.\n */\nexport interface SignatureMethod {\n /** Algorithm used for signing. Should be http://www.w3.org/2001/04/xmldsig-more#rsa-sha256 */\n Algorithm: string\n}\n\n/**\n * Represents the Signed Information structure.\n */\nexport interface SignedInfo {\n /** Canonicalization method details. */\n \"ds:CanonicalizationMethod\": CanonicalizationMethod\n /** Signature method details. */\n \"ds:SignatureMethod\": SignatureMethod\n /** References to signed data and properties. Should contain two references. */\n \"ds:Reference\": [Reference, Reference] // Expecting two: one for document, one for signed properties\n}\n\n/**\n * Represents the root Signature element (IssuerDigitalSignature).\n * Based on the documentation: https://sdk.myinvois.hasil.gov.my/signature/\n * Conforms to XAdES enveloped signature requirements for UBL.\n */\nexport interface IssuerDigitalSignature {\n /** ID attribute, should be 'DocSig'. */\n Id: string\n /** Signed information details. */\n \"ds:SignedInfo\": SignedInfo\n /** Base64 encoded signature value (Sig). */\n \"ds:SignatureValue\": string // base64binary\n /** Public key information (certificate). */\n \"ds:KeyInfo\": KeyInfo\n /** Object containing signed properties. */\n \"ds:Object\": {\n \"xades:QualifyingProperties\": QualifyingProperties\n }\n}\n"],"mappings":";;AAGA;AAQA;AAUiBE,UAlBAF,YAAAA,CAkBY;EAU7B;EAAqB,SAAA,EAAA,MAAA;;;AAIe;AAMpC;AAQA;AAWiBM,UAjDAL,UAAAA,CAiDgB;EAYjC;EAWA,iBAAyB,EAtEJD,YAsEI;EAQzB;EAQA,gBAA0B,EAAA,MAAA,EAAA;AAQ1B;;;;;AAUiC,UAhGhBE,YAAAA,CAgGgB;EAQjC;EAQA,mBAAiBW,EAAe,MAAA;EAQhC;EAA2B,qBAAA,EAAA,MAAA,EAAA;;;;;AAMY;AAQtBE,UA5HAZ,IAAAA,CA4HAY;EAAsB;EAAA,kBAIpBD,EA9HGb,UA8HHa;EAAU;EAIN,oBAGWP,EAnIVL,YAmIUK;AAAoB;;;;;UA7HrCH,kBAAAA;;gBAEDD;;;;;;UAMCE,yBAAAA;;;;8BAIaD;;;;;;;UAObE,gBAAAA;;;;;;qCAMoBD;;;;;;UAMpBE,oBAAAA;;;;4BAIWD;;;;;;;UAOXE,QAAAA;;;;;;;;UAQAC,OAAAA;;iBAEAD;;;;;;UAMAE,SAAAA;;;;;;;;UAQAC,SAAAA;;;;;;;oBAOGD,YAAYA;;;qBAGXV;;;;;;;;UAQJY,sBAAAA;;;;;;;;UAQAC,eAAAA;;;;;;;;UAQAC,UAAAA;;+BAEcF;;wBAEPC;;mBAELF,WAAWA;;;;;;;;UAQbI,sBAAAA;;;;mBAIED;;;;gBAIHL;;;kCAGkBF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state-codes-CxG1S9YY.d.ts","names":["StateCode","StateCodeEnum","State"],"sources":["../src/types/state-codes.d.ts"],"sourcesContent":["/**\n * Represents the allowed codes for Malaysian states and federal territories.\n * Based on the documentation: https://sdk.myinvois.hasil.gov.my/codes/state-codes/\n */\nexport type StateCode =\n | '01' // Johor\n | '02' // Kedah\n | '03' // Kelantan\n | '04' // Melaka\n | '05' // Negeri Sembilan\n | '06' // Pahang\n | '07' // Pulau Pinang\n | '08' // Perak\n | '09' // Perlis\n | '10' // Selangor\n | '11' // Terengganu\n | '12' // Sabah\n | '13' // Sarawak\n | '14' // Wilayah Persekutuan Kuala Lumpur\n | '15' // Wilayah Persekutuan Labuan\n | '16' // Wilayah Persekutuan Putrajaya\n | '17' // Not Applicable\n\n/**\n * Enum representing the allowed state codes with descriptive names.\n * Provides a more readable way to reference states.\n *\n * @example\n * const code = StateCodeEnum.Selangor;\n * console.log(code); // Output: \"10\"\n */\nexport enum StateCodeEnum {\n Johor = '01',\n Kedah = '02',\n Kelantan = '03',\n Melaka = '04',\n NegeriSembilan = '05',\n Pahang = '06',\n PulauPinang = '07',\n Perak = '08',\n Perlis = '09',\n Selangor = '10',\n Terengganu = '11',\n Sabah = '12',\n Sarawak = '13',\n WPKualaLumpur = '14',\n WPLabuan = '15',\n WPPutrajaya = '16',\n NotApplicable = '17',\n}\n\n/**\n * Interface representing a state code entry.\n * Contains the code and its corresponding name.\n */\nexport interface State {\n code: StateCode\n name: string\n}\n"],"mappings":";;AAIA;AA2BA;AAwBA;KAnDYA,SAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;aA2BAC,aAAAA;;;;;;;;;;;;;;;;;;;;;;;;UAwBKC,KAAAA;QACTF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state-codes-DXSWtE6a.d.cts","names":["StateCode","StateCodeEnum","State"],"sources":["../src/types/state-codes.d.ts"],"sourcesContent":["/**\n * Represents the allowed codes for Malaysian states and federal territories.\n * Based on the documentation: https://sdk.myinvois.hasil.gov.my/codes/state-codes/\n */\nexport type StateCode =\n | '01' // Johor\n | '02' // Kedah\n | '03' // Kelantan\n | '04' // Melaka\n | '05' // Negeri Sembilan\n | '06' // Pahang\n | '07' // Pulau Pinang\n | '08' // Perak\n | '09' // Perlis\n | '10' // Selangor\n | '11' // Terengganu\n | '12' // Sabah\n | '13' // Sarawak\n | '14' // Wilayah Persekutuan Kuala Lumpur\n | '15' // Wilayah Persekutuan Labuan\n | '16' // Wilayah Persekutuan Putrajaya\n | '17' // Not Applicable\n\n/**\n * Enum representing the allowed state codes with descriptive names.\n * Provides a more readable way to reference states.\n *\n * @example\n * const code = StateCodeEnum.Selangor;\n * console.log(code); // Output: \"10\"\n */\nexport enum StateCodeEnum {\n Johor = '01',\n Kedah = '02',\n Kelantan = '03',\n Melaka = '04',\n NegeriSembilan = '05',\n Pahang = '06',\n PulauPinang = '07',\n Perak = '08',\n Perlis = '09',\n Selangor = '10',\n Terengganu = '11',\n Sabah = '12',\n Sarawak = '13',\n WPKualaLumpur = '14',\n WPLabuan = '15',\n WPPutrajaya = '16',\n NotApplicable = '17',\n}\n\n/**\n * Interface representing a state code entry.\n * Contains the code and its corresponding name.\n */\nexport interface State {\n code: StateCode\n name: string\n}\n"],"mappings":";;AAIA;AA2BA;AAwBA;KAnDYA,SAAAA;;;;;;;;;;;;;;;;;;;;;;;;;;aA2BAC,aAAAA;;;;;;;;;;;;;;;;;;;;;;;;UAwBKC,KAAAA;QACTF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tax-types-CEpfSh5P.d.ts","names":["TaxTypeCode","TaxTypeCodeEnum","TaxType"],"sources":["../src/types/tax-types.d.ts"],"sourcesContent":["/**\n * Represents the allowed codes for tax types.\n * Based on the documentation: https://sdk.myinvois.hasil.gov.my/codes/tax-types/\n */\nexport type TaxTypeCode =\n | '01' // Sales Tax\n | '02' // Service Tax\n | '03' // Tourism Tax\n | '04' // High-Value Goods Tax\n | '05' // Sales Tax on Low Value Goods\n | '06' // Not Applicable\n | 'E' // Tax exemption (where applicable)\n\n/**\n * Enum representing the allowed tax type codes with descriptive names.\n * Provides a more readable way to reference tax types.\n *\n * @example\n * const code = TaxTypeCodeEnum.SalesTax;\n * console.log(code); // Output: \"01\"\n */\nexport enum TaxTypeCodeEnum {\n SalesTax = '01',\n ServiceTax = '02',\n TourismTax = '03',\n HighValueGoodsTax = '04',\n SalesTaxLowValueGoods = '05',\n NotApplicable = '06',\n TaxExemption = 'E',\n}\n\n/**\n * Interface representing a tax type entry.\n * Contains the code and its corresponding description.\n */\nexport interface TaxType {\n code: TaxTypeCode\n description: string\n}\n"],"mappings":";;AAIA;AAiBA;AAcA;KA/BYA,WAAAA;;;;;;;;;;;;;;;;aAiBAC,eAAAA;;;;;;;;;;;;;;UAcKC,OAAAA;QACTF"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tax-types-CgwxONDS.d.cts","names":["TaxTypeCode","TaxTypeCodeEnum","TaxType"],"sources":["../src/types/tax-types.d.ts"],"sourcesContent":["/**\n * Represents the allowed codes for tax types.\n * Based on the documentation: https://sdk.myinvois.hasil.gov.my/codes/tax-types/\n */\nexport type TaxTypeCode =\n | '01' // Sales Tax\n | '02' // Service Tax\n | '03' // Tourism Tax\n | '04' // High-Value Goods Tax\n | '05' // Sales Tax on Low Value Goods\n | '06' // Not Applicable\n | 'E' // Tax exemption (where applicable)\n\n/**\n * Enum representing the allowed tax type codes with descriptive names.\n * Provides a more readable way to reference tax types.\n *\n * @example\n * const code = TaxTypeCodeEnum.SalesTax;\n * console.log(code); // Output: \"01\"\n */\nexport enum TaxTypeCodeEnum {\n SalesTax = '01',\n ServiceTax = '02',\n TourismTax = '03',\n HighValueGoodsTax = '04',\n SalesTaxLowValueGoods = '05',\n NotApplicable = '06',\n TaxExemption = 'E',\n}\n\n/**\n * Interface representing a tax type entry.\n * Contains the code and its corresponding description.\n */\nexport interface TaxType {\n code: TaxTypeCode\n description: string\n}\n"],"mappings":";;AAIA;AAiBA;AAcA;KA/BYA,WAAAA;;;;;;;;;;;;;;;;aAiBAC,eAAAA;;;;;;;;;;;;;;UAcKC,OAAAA;QACTF"}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
const require_chunk = require('./chunk-CUT6urMc.cjs');
|
|
2
|
-
const xmldom_ts = require_chunk.__toESM(require("xmldom-ts"));
|
|
3
|
-
const xpath_ts = require_chunk.__toESM(require("xpath-ts"));
|
|
4
|
-
|
|
5
|
-
//#region src/utils/signature/transform.ts
|
|
6
|
-
/**
|
|
7
|
-
* Transforms an XML invoice string according to specific rules using xmldom-ts and xpath-ts:
|
|
8
|
-
* - Removes the XML declaration.
|
|
9
|
-
* - Removes UBLExtensions and Signature elements within the Invoice element.
|
|
10
|
-
* Assumes the input XML is UTF-8 encoded.
|
|
11
|
-
*
|
|
12
|
-
* @param xmlString The raw XML invoice string.
|
|
13
|
-
* @returns The transformed XML string.
|
|
14
|
-
* @throws {Error} If parsing fails.
|
|
15
|
-
*/
|
|
16
|
-
function transformXmlInvoice(xmlString) {
|
|
17
|
-
let doc;
|
|
18
|
-
const errors = [];
|
|
19
|
-
const handleError = (msg) => {
|
|
20
|
-
errors.push(`ERROR: ${msg}`);
|
|
21
|
-
};
|
|
22
|
-
const handleFatalError = (msg) => {
|
|
23
|
-
errors.push(`FATALERROR: ${msg}`);
|
|
24
|
-
};
|
|
25
|
-
const handleWarning = (msg) => {
|
|
26
|
-
console.warn(`WARNING: ${msg}`);
|
|
27
|
-
};
|
|
28
|
-
const parser = new xmldom_ts.DOMParserImpl({
|
|
29
|
-
locator: {},
|
|
30
|
-
errorHandler: {
|
|
31
|
-
error: handleError,
|
|
32
|
-
fatalError: handleFatalError,
|
|
33
|
-
warning: handleWarning
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
try {
|
|
37
|
-
doc = parser.parseFromString(xmlString, "application/xml");
|
|
38
|
-
} catch (e) {
|
|
39
|
-
throw new Error(`XML Parsing Initialization Error: ${e.message || e}`);
|
|
40
|
-
}
|
|
41
|
-
const parserErrors = doc.getElementsByTagName("parsererror");
|
|
42
|
-
if (parserErrors.length > 0) {
|
|
43
|
-
const errorElement = parserErrors[0];
|
|
44
|
-
if (errorElement) {
|
|
45
|
-
const errorContent = errorElement.textContent ? errorElement.textContent.trim() : "Unknown parsing error reported by parsererror tag.";
|
|
46
|
-
throw new Error(`XML Parsing Error: ${errorContent}`);
|
|
47
|
-
} else throw new Error("XML Parsing Error: Malformed parsererror tag found.");
|
|
48
|
-
}
|
|
49
|
-
if (errors.length > 0) throw new Error(errors[0]);
|
|
50
|
-
const select = xpath_ts.select;
|
|
51
|
-
const removeNodesByXPath = (path) => {
|
|
52
|
-
const nodesToRemove = select(path, doc);
|
|
53
|
-
if (nodesToRemove && nodesToRemove instanceof Array) nodesToRemove.forEach((node) => {
|
|
54
|
-
if (node && node.parentNode) node.parentNode.removeChild(node);
|
|
55
|
-
});
|
|
56
|
-
};
|
|
57
|
-
removeNodesByXPath("//*[local-name()='Invoice']//*[local-name()='UBLExtensions']");
|
|
58
|
-
removeNodesByXPath("//*[local-name()='Invoice']//*[local-name()='Signature']");
|
|
59
|
-
const serializer = new xmldom_ts.XMLSerializerImpl();
|
|
60
|
-
let transformedXml = serializer.serializeToString(doc);
|
|
61
|
-
transformedXml = transformedXml.replace(/^<\?xml [^>]*\?>\s*/i, "");
|
|
62
|
-
return transformedXml;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
//#endregion
|
|
66
|
-
Object.defineProperty(exports, 'transformXmlInvoice', {
|
|
67
|
-
enumerable: true,
|
|
68
|
-
get: function () {
|
|
69
|
-
return transformXmlInvoice;
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
//# sourceMappingURL=transform-BLz0S687.cjs.map
|