From bf64593440c849539e9eecd55e2e668fff30d3e8 Mon Sep 17 00:00:00 2001 From: Maik Marschner Date: Wed, 26 Mar 2025 13:17:45 +0100 Subject: [PATCH] Replace libxmljs with xmllint-wasm to fix installation and tests on node 22. --- lib/Client.js | 33 ++-- package-lock.json | 402 ++-------------------------------------------- package.json | 4 +- test/spec/H004.js | 49 +++--- 4 files changed, 60 insertions(+), 428 deletions(-) diff --git a/lib/Client.js b/lib/Client.js index 13f9b57..f4baebd 100644 --- a/lib/Client.js +++ b/lib/Client.js @@ -216,26 +216,25 @@ module.exports = class Client { .persist(); rock({ - method: 'POST', - url: this.url, - body: r, - headers: { 'content-type': 'text/xml;charset=UTF-8' }, - }, - (err, res, data) => { - if (err) reject(err); + method: 'POST', + url: this.url, + body: r, + headers: { 'content-type': 'text/xml;charset=UTF-8' }, + }, + (err, res, data) => { + if (err) reject(err); - const ebicsResponse = response.version(version)(data.toString('utf-8'), keys); + const ebicsResponse = response.version(version)(data.toString('utf-8'), keys); - if (this.tracesStorage) - this.tracesStorage - .label(`RESPONSE.${order.orderDetails.OrderType}`) - .connect() - .data(ebicsResponse.toXML()) - .persist(); + if (this.tracesStorage) + this.tracesStorage + .label(`RESPONSE.${order.orderDetails.OrderType}`) + .connect() + .data(ebicsResponse.toXML()) + .persist(); - resolve(ebicsResponse); - }, - ); + resolve(ebicsResponse); + }); }); } diff --git a/package-lock.json b/package-lock.json index fff4ed5..93bca49 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "ebics-client", - "version": "4.1.0", + "version": "4.2.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ebics-client", - "version": "4.1.0", + "version": "4.2.0", "license": "MIT", "dependencies": { "@xmldom/xmldom": "^0.8.10", @@ -25,9 +25,9 @@ "eslint": "^6.7.2", "eslint-config-ecollect-base": "^0.1.2", "eslint-plugin-import": "^2.28.1", - "libxmljs": "^1.0.10", "mocha": "^10.2.0", - "nyc": "^15.1.0" + "nyc": "^15.1.0", + "xmllint-wasm": "^4.0.2" } }, "node_modules/@babel/code-frame": { @@ -490,40 +490,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.9", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@types/json5": { "version": "0.0.29", "dev": true, @@ -544,11 +510,6 @@ "node": ">=10.0.0" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "dev": true, - "license": "ISC" - }, "node_modules/acorn": { "version": "7.4.1", "dev": true, @@ -568,33 +529,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/agent-base/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "dev": true, @@ -716,28 +650,11 @@ "node": ">=8" } }, - "node_modules/aproba": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, "node_modules/archy": { "version": "1.0.0", "dev": true, "license": "MIT" }, - "node_modules/are-we-there-yet": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/argparse": { "version": "1.0.10", "dev": true, @@ -962,11 +879,6 @@ "node": ">=8" } }, - "node_modules/bindings": { - "version": "1.3.1", - "dev": true, - "license": "MIT" - }, "node_modules/brace-expansion": { "version": "1.1.11", "dev": true, @@ -1186,14 +1098,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "2.0.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, "node_modules/clean-stack": { "version": "2.2.0", "dev": true, @@ -1265,14 +1169,6 @@ "dev": true, "license": "MIT" }, - "node_modules/color-support": { - "version": "1.1.3", - "dev": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, "node_modules/combined-stream": { "version": "1.0.8", "dev": true, @@ -1307,11 +1203,6 @@ "dev": true, "license": "MIT" }, - "node_modules/console-control-strings": { - "version": "1.1.0", - "dev": true, - "license": "ISC" - }, "node_modules/convert-source-map": { "version": "1.7.0", "dev": true, @@ -1460,19 +1351,6 @@ "node": ">=0.4.0" } }, - "node_modules/delegates": { - "version": "1.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.0.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, "node_modules/diff": { "version": "5.0.0", "dev": true, @@ -2241,17 +2119,6 @@ ], "license": "MIT" }, - "node_modules/fs-minipass": { - "version": "2.1.0", - "dev": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/fs.realpath": { "version": "1.0.0", "dev": true, @@ -2304,46 +2171,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/gauge": { - "version": "3.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/gauge/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/gauge/node_modules/string-width": { - "version": "4.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "dev": true, @@ -2594,11 +2421,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-unicode": { - "version": "2.0.1", - "dev": true, - "license": "ISC" - }, "node_modules/hasha": { "version": "5.2.2", "dev": true, @@ -2641,34 +2463,6 @@ "npm": ">=1.3.7" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/https-proxy-agent/node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/iconv-lite": { "version": "0.4.24", "dev": true, @@ -3344,21 +3138,6 @@ "node": ">= 0.8.0" } }, - "node_modules/libxmljs": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/libxmljs/-/libxmljs-1.0.11.tgz", - "integrity": "sha512-ChqXkhZuvhbjariwPakKs/h+dF5Pe7j+QJ/PmTidzx7mDiFa5chhy7806PQiO+VnBJZ5mVLVq4Dk+W7fZP6luw==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "@mapbox/node-pre-gyp": "^1.0.9", - "bindings": "~1.3.0", - "nan": "^2.17.0" - }, - "engines": { - "node": ">=0.8.0" - } - }, "node_modules/locate-path": { "version": "6.0.0", "dev": true, @@ -3519,29 +3298,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "3.3.4", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/minizlib": { - "version": "2.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/mkdirp": { "version": "0.5.6", "dev": true, @@ -3674,11 +3430,6 @@ "dev": true, "license": "ISC" }, - "node_modules/nan": { - "version": "2.18.0", - "dev": true, - "license": "MIT" - }, "node_modules/nanoid": { "version": "3.3.3", "dev": true, @@ -3747,20 +3498,6 @@ "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==", "dev": true }, - "node_modules/nopt": { - "version": "5.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "dev": true, @@ -3769,17 +3506,6 @@ "node": ">=0.10.0" } }, - "node_modules/npmlog": { - "version": "5.0.1", - "dev": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, "node_modules/nyc": { "version": "15.1.0", "dev": true, @@ -3969,14 +3695,6 @@ "node": "*" } }, - "node_modules/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-inspect": { "version": "1.12.3", "dev": true, @@ -4289,19 +4007,6 @@ "safe-buffer": "^5.1.0" } }, - "node_modules/readable-stream": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/readdirp": { "version": "3.6.0", "dev": true, @@ -4663,46 +4368,6 @@ "node": ">=0.10.0" } }, - "node_modules/string_decoder": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-width": { - "version": "2.1.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/string.prototype.trim": { "version": "1.2.8", "dev": true, @@ -4859,43 +4524,6 @@ "node": ">=6" } }, - "node_modules/tar": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", - "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", - "dev": true, - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^5.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/tar/node_modules/mkdirp": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/test-exclude": { "version": "6.0.0", "dev": true, @@ -5169,11 +4797,6 @@ "punycode": "^2.1.0" } }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, "node_modules/uuid": { "version": "9.0.1", "funding": [ @@ -5269,14 +4892,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/wide-align": { - "version": "1.1.3", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, "node_modules/word-wrap": { "version": "1.2.5", "dev": true, @@ -5382,6 +4997,15 @@ "version": "2.0.4", "license": "Apache-2.0" }, + "node_modules/xmllint-wasm": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xmllint-wasm/-/xmllint-wasm-4.0.2.tgz", + "integrity": "sha512-tJxQzA9krv9gaQxYFJ/NVrpLf/wpWYPKjweCLMNbjooBTsW7/O26pyc3Pd0Lp0oTLUMFir/MEX3ybY/hhRjIpw==", + "dev": true, + "engines": { + "node": ">=12.4.0" + } + }, "node_modules/xpath": { "version": "0.0.32", "license": "MIT", diff --git a/package.json b/package.json index 8278baf..f61f2ac 100644 --- a/package.json +++ b/package.json @@ -79,8 +79,8 @@ "eslint": "^6.7.2", "eslint-config-ecollect-base": "^0.1.2", "eslint-plugin-import": "^2.28.1", - "libxmljs": "^1.0.10", "mocha": "^10.2.0", - "nyc": "^15.1.0" + "nyc": "^15.1.0", + "xmllint-wasm": "^4.0.2" } } diff --git a/test/spec/H004.js b/test/spec/H004.js index 12936a4..8b9ae3a 100644 --- a/test/spec/H004.js +++ b/test/spec/H004.js @@ -9,27 +9,36 @@ const fs = require('fs'); const ebics = require('../../'); -const libxml = require('libxmljs'); +const xmlLintWasm = require('xmllint-wasm'); -const schemaPath = path.resolve(__dirname, '../xsd/ebics_H004.xsd'); -const schemaDoc = libxml.parseXml( - fs.readFileSync(schemaPath, { encoding: 'utf8' }), -); +const validateXML = (() => { + const xsdDir = path.resolve(__dirname, '../xsd'); + const schemaPath = path.resolve(xsdDir, 'ebics_H004.xsd'); + const schemaDoc = fs.readFileSync(schemaPath, { encoding: 'utf8' }); + const preload = fs + .readdirSync(xsdDir) + .filter(file => file.endsWith('.xsd') && file !== 'ebics_H004.xsd') + .map(file => ({ + fileName: file, + contents: fs.readFileSync(path.join(xsdDir, file), { + encoding: 'utf8', + }), + })); -const schemaDir = path.dirname(schemaPath); -const cwd = process.cwd(); - -const validateXML = (str) => { - try { - process.chdir(schemaDir); - const isValid = libxml.parseXml(str).validate(schemaDoc); - process.chdir(cwd); - return isValid; - } catch (e) { - process.chdir(cwd); - return false; - } -}; + return async (str) => { + const results = await xmlLintWasm.validateXML({ + xml: { fileName: 'ebics.xml', contents: str }, + schema: [ + { + fileName: 'ebics_H004.xsd', + contents: schemaDoc, + }, + ], + preload, + }); + return results.valid; + }; +})(); const client = new ebics.Client({ url: 'https://iso20022test.credit-suisse.com/ebicsweb/ebicsweb', @@ -103,7 +112,7 @@ describe('H004 order generation', () => { it(`[${operation}] ${type} order generation`, async () => { const signedOrder = await client.signOrder(order); - assert.isTrue(validateXML(signedOrder)); + assert.isTrue(await validateXML(signedOrder)); }); } });