From 5da80c274d664a7b72c97397a56ee70fe24a79a8 Mon Sep 17 00:00:00 2001 From: Leonardo Donelli Date: Sun, 26 May 2019 14:22:45 +0200 Subject: [PATCH 1/7] Use optional npm dependencies to shim DOMParser and WebSocket in node --- package-lock.json | 21 ++++++++ package.json | 6 ++- src/bosh.js | 1 + src/core.js | 64 ++----------------------- src/shims.js | 120 ++++++++++++++++++++++++++++++++++++++++++++++ src/websocket.js | 1 + 6 files changed, 153 insertions(+), 60 deletions(-) create mode 100644 src/shims.js diff --git a/package-lock.json b/package-lock.json index 321cb716..3ca35aaf 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1108,6 +1108,12 @@ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", "dev": true }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "optional": true + }, "atob": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", @@ -8760,6 +8766,21 @@ "mkdirp": "^0.5.1" } }, + "ws": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.0.0.tgz", + "integrity": "sha512-cknCal4k0EAOrh1SHHPPWWh4qm93g1IuGGGwBjWkXmCG7LsDtL8w9w+YVfaF+KSVwiHQKDIMsSLBVftKf9d1pg==", + "optional": true, + "requires": { + "async-limiter": "^1.0.0" + } + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "optional": true + }, "xvfb": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/xvfb/-/xvfb-0.2.3.tgz", diff --git a/package.json b/package.json index b9609d66..6ff333a4 100644 --- a/package.json +++ b/package.json @@ -73,5 +73,9 @@ "sinon-qunit": "~2.0.0", "yarpm": "^0.2.1" }, - "dependencies": {} + "dependencies": {}, + "optionalDependencies": { + "ws": "^7.0.0", + "xmldom": "^0.1.27" + } } diff --git a/src/bosh.js b/src/bosh.js index 95a1c0ec..1d32e883 100644 --- a/src/bosh.js +++ b/src/bosh.js @@ -8,6 +8,7 @@ /* global window, setTimeout, clearTimeout, XMLHttpRequest, ActiveXObject */ import core from './core'; +import { DOMParser } from './shims' const Strophe = core.Strophe; const $build = core.$build; diff --git a/src/core.js b/src/core.js index 93154162..be844d01 100644 --- a/src/core.js +++ b/src/core.js @@ -9,6 +9,7 @@ import MD5 from './md5'; import SHA1 from './sha1'; import utils from './utils'; +import * as shims from './shims'; /** Function: $build * Create a Strophe.Builder. @@ -330,26 +331,6 @@ const Strophe = { */ _xmlGenerator: null, - /** PrivateFunction: _makeGenerator - * _Private_ function that creates a dummy XML DOM document to serve as - * an element and text node generator. - */ - _makeGenerator: function () { - let doc; - // IE9 does implement createDocument(); however, using it will cause the browser to leak memory on page unload. - // Here, we test for presence of createDocument() plus IE's proprietary documentMode attribute, which would be - // less than 10 in the case of IE9 and below. - if (document.implementation.createDocument === undefined || - document.implementation.createDocument && document.documentMode && document.documentMode < 10) { - doc = this._getIEXmlDom(); - doc.appendChild(doc.createElement('strophe')); - } else { - doc = document.implementation - .createDocument('jabber:client', 'strophe', null); - } - return doc; - }, - /** Function: xmlGenerator * Get the DOM document to generate elements. * @@ -358,45 +339,11 @@ const Strophe = { */ xmlGenerator: function () { if (!Strophe._xmlGenerator) { - Strophe._xmlGenerator = Strophe._makeGenerator(); + Strophe._xmlGenerator = shims.getDummyXMLDOMDocument() } return Strophe._xmlGenerator; }, - /** PrivateFunction: _getIEXmlDom - * Gets IE xml doc object - * - * Returns: - * A Microsoft XML DOM Object - * See Also: - * http://msdn.microsoft.com/en-us/library/ms757837%28VS.85%29.aspx - */ - _getIEXmlDom : function() { - let doc = null; - const docStrings = [ - "Msxml2.DOMDocument.6.0", - "Msxml2.DOMDocument.5.0", - "Msxml2.DOMDocument.4.0", - "MSXML2.DOMDocument.3.0", - "MSXML2.DOMDocument", - "MSXML.DOMDocument", - "Microsoft.XMLDOM" - ]; - - for (let d=0; d Date: Sun, 26 May 2019 23:01:03 +0200 Subject: [PATCH 2/7] Use abab for cross-platform atob/btoa, fix rollup config --- package-lock.json | 5 +++++ package.json | 4 +++- rollup.config.js | 8 ++++---- src/core.js | 2 ++ 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3ca35aaf..86667fca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -992,6 +992,11 @@ "@types/node": "*" } }, + "abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==" + }, "acorn": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", diff --git a/package.json b/package.json index 6ff333a4..2cf720a5 100644 --- a/package.json +++ b/package.json @@ -73,7 +73,9 @@ "sinon-qunit": "~2.0.0", "yarpm": "^0.2.1" }, - "dependencies": {}, + "dependencies": { + "abab": "^2.0.0" + }, "optionalDependencies": { "ws": "^7.0.0", "xmldom": "^0.1.27" diff --git a/rollup.config.js b/rollup.config.js index 212a2108..7c406b98 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -19,7 +19,7 @@ export default [ commonjs(), globals(), babel({ - exclude: ['node_modules/**'], + babelrc: false, presets: [ ['@babel/preset-env', { targets: { @@ -43,7 +43,7 @@ export default [ commonjs(), globals(), babel({ - exclude: ['node_modules/**'], + babelrc: false, presets: [ ['@babel/preset-env', { targets: { @@ -58,7 +58,7 @@ export default [ // CommonJS (for Node) and ES module (for bundlers) build. { input: 'src/strophe.js', - external: ['window', 'md5'], + external: ['window', 'abab'], output: [ { file: pkg.main, format: 'cjs' }, { file: pkg.module, format: 'es' } @@ -66,7 +66,7 @@ export default [ plugins: [ globals(), babel({ - exclude: ['node_modules/**'], + babelrc: false, presets: [ ['@babel/preset-env'] ] diff --git a/src/core.js b/src/core.js index be844d01..841e0939 100644 --- a/src/core.js +++ b/src/core.js @@ -6,6 +6,8 @@ */ /*global define, document, sessionStorage, setTimeout, clearTimeout, ActiveXObject, DOMParser, btoa, atob, module */ +import { atob, btoa } from 'abab' + import MD5 from './md5'; import SHA1 from './sha1'; import utils from './utils'; From 734849a56628561bf16d64dcd93cca0f0818728b Mon Sep 17 00:00:00 2001 From: Leonardo Donelli Date: Thu, 4 Jul 2019 10:08:10 +0200 Subject: [PATCH 3/7] Upgrade sinon and sinon-qunit --- package-lock.json | 96 ++++++++++++++++++++++++++++++----------------- package.json | 4 +- 2 files changed, 64 insertions(+), 36 deletions(-) diff --git a/package-lock.json b/package-lock.json index 86667fca..07056052 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1656,6 +1656,12 @@ } } }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", @@ -2121,12 +2127,12 @@ "dev": true }, "formatio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", + "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", "dev": true, "requires": { - "samsam": "~1.1" + "samsam": "1.x" } }, "fragment-cache": { @@ -2589,9 +2595,9 @@ "dev": true }, "lolex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", + "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", "dev": true }, "loose-envify": { @@ -2770,6 +2776,12 @@ "to-regex": "^3.0.1" } }, + "native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -7654,6 +7666,23 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, "pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", @@ -8104,9 +8133,9 @@ "dev": true }, "samsam": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", - "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", "dev": true }, "semver": { @@ -8166,15 +8195,19 @@ "dev": true }, "sinon": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.4.1.tgz", + "integrity": "sha512-vFTrO9Wt0ECffDYIPSP/E5bBugt0UjcBQOfQUMh66xzkyPEnhl/vM2LRZi2ajuTdkH07sA6DzrM6KvdvGIH8xw==", "dev": true, "requires": { - "formatio": "1.1.1", - "lolex": "1.3.2", - "samsam": "1.1.2", - "util": ">=0.10.3 <1" + "diff": "^3.1.0", + "formatio": "1.2.0", + "lolex": "^1.6.0", + "native-promise-only": "^0.8.1", + "path-to-regexp": "^1.7.0", + "samsam": "^1.1.3", + "text-encoding": "0.6.4", + "type-detect": "^4.0.0" } }, "sinon-qunit": { @@ -8465,6 +8498,12 @@ } } }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -8549,6 +8588,12 @@ "prelude-ls": "~1.1.2" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -8715,23 +8760,6 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index 2cf720a5..4f1d4b9b 100644 --- a/package.json +++ b/package.json @@ -69,8 +69,8 @@ "rollup-plugin-node-resolve": "^5.0.0", "rollup-plugin-uglify": "^6.0.2", "run-headless-chromium": "^0.1.1", - "sinon": "1.17.7", - "sinon-qunit": "~2.0.0", + "sinon": "^2.4.1", + "sinon-qunit": "^2.0.0", "yarpm": "^0.2.1" }, "dependencies": { From 3407b6d15d84e715f9f431adc5b6d5946293afeb Mon Sep 17 00:00:00 2001 From: Leonardo Donelli Date: Thu, 4 Jul 2019 10:08:27 +0200 Subject: [PATCH 4/7] Fix lint script in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4f1d4b9b..6143793d 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "unpkg": "dist/strophe.umd.min.js", "scripts": { "build": "rollup -c", - "lint": "make jshint", + "lint": "make eslint", "clean": "make clean", "doc": "make doc", "prepare": "yarpm run build" From 6b4de90ede85f61f13253b2f67cd858f5f2a5cb2 Mon Sep 17 00:00:00 2001 From: Leonardo Donelli Date: Thu, 4 Jul 2019 10:13:16 +0200 Subject: [PATCH 5/7] Fix undefined variables in nodejs environments --- src/shims.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/shims.js b/src/shims.js index 78825c6e..0cb64755 100644 --- a/src/shims.js +++ b/src/shims.js @@ -8,6 +8,8 @@ * NPM module that provides a compatible implementation. */ +/* global global */ + /** * WHATWG WebSockets API * https://www.w3.org/TR/websockets/ @@ -21,7 +23,7 @@ * https://www.npmjs.com/package/ws */ function getWebSocketImplementation () { - let WebSocketImplementation = WebSocket + let WebSocketImplementation = global.WebSocket if (typeof WebSocketImplementation === 'undefined') { try { WebSocketImplementation = require('ws'); @@ -46,7 +48,7 @@ export const WebSocket = getWebSocketImplementation() * https://www.npmjs.com/package/xmldom */ function getDOMParserImplementation () { - let DOMParserImplementation = DOMParser + let DOMParserImplementation = global.DOMParser if (typeof DOMParserImplementation === 'undefined') { try { DOMParserImplementation = require('xmldom').DOMParser; From 3441a2c290644b6094a72a98c83cc5fb05fe9b1a Mon Sep 17 00:00:00 2001 From: Leonardo Donelli Date: Thu, 4 Jul 2019 10:26:53 +0200 Subject: [PATCH 6/7] Fix lint issues --- src/bosh.js | 2 +- src/core.js | 3 +-- src/shims.js | 1 + src/websocket.js | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/bosh.js b/src/bosh.js index 1d32e883..bd7aeea6 100644 --- a/src/bosh.js +++ b/src/bosh.js @@ -7,8 +7,8 @@ /* global window, setTimeout, clearTimeout, XMLHttpRequest, ActiveXObject */ -import core from './core'; import { DOMParser } from './shims' +import core from './core'; const Strophe = core.Strophe; const $build = core.$build; diff --git a/src/core.js b/src/core.js index 841e0939..18db063c 100644 --- a/src/core.js +++ b/src/core.js @@ -6,12 +6,11 @@ */ /*global define, document, sessionStorage, setTimeout, clearTimeout, ActiveXObject, DOMParser, btoa, atob, module */ +import * as shims from './shims'; import { atob, btoa } from 'abab' - import MD5 from './md5'; import SHA1 from './sha1'; import utils from './utils'; -import * as shims from './shims'; /** Function: $build * Create a Strophe.Builder. diff --git a/src/shims.js b/src/shims.js index 0cb64755..6e0e15e0 100644 --- a/src/shims.js +++ b/src/shims.js @@ -80,6 +80,7 @@ function _getIEXmlDom () { ]; for (let d = 0; d < docStrings.length; d++) { try { + // eslint-disable-next-line no-undef const doc = new ActiveXObject(docStrings[d]); return doc } catch (e) { diff --git a/src/websocket.js b/src/websocket.js index b9b46c7d..5a03c7a2 100644 --- a/src/websocket.js +++ b/src/websocket.js @@ -7,8 +7,8 @@ /* global window, clearTimeout, WebSocket, DOMParser */ +import { DOMParser, WebSocket } from './shims'; import core from './core'; -import { WebSocket, DOMParser } from './shims'; const Strophe = core.Strophe; const $build = core.$build; From 2138ed11df2385d3908a7ab1a956a24e15d1dc4e Mon Sep 17 00:00:00 2001 From: Leonardo Donelli Date: Thu, 4 Jul 2019 10:28:04 +0200 Subject: [PATCH 7/7] Fix indentation and other small stuff in tests/index.html --- tests/index.html | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/tests/index.html b/tests/index.html index e8548a81..3b178e85 100644 --- a/tests/index.html +++ b/tests/index.html @@ -1,24 +1,21 @@ - - - - - - + Strophe.js Tests

Strophe.js Tests

-
-
+
+
    -
    +
    + + + +