From dd609c1cec758cd4ae20d6fa7da85040b63715d8 Mon Sep 17 00:00:00 2001 From: JC Brand Date: Thu, 6 May 2021 11:44:16 +0200 Subject: [PATCH] Get the webpack dev server to work again This required triggering the `converse-loaded` event in the entry.js file, which means it won't be triggered for `@converse/headless` when used in isolation. Not ideal, but probably ok because consumers of `@converse/headless` should probably import it into their own project in any case. --- docs/source/dependencies.rst | 26 +- docs/source/plugin_development.rst | 39 +- package-lock.json | 1373 +++++++++++++++------------- package.json | 6 +- spec/mock.js | 1215 ++++++++++++------------ src/entry.js | 11 + src/headless/core.js | 10 - webpack.html | 57 +- webpack.prod.js | 2 +- webpack.serve.js | 9 +- 10 files changed, 1418 insertions(+), 1330 deletions(-) diff --git a/docs/source/dependencies.rst b/docs/source/dependencies.rst index 18914f826..dfe7c079d 100644 --- a/docs/source/dependencies.rst +++ b/docs/source/dependencies.rst @@ -2,9 +2,9 @@ -============ -Dependencies -============ +============================= +Starting up a dev environment +============================= Installing the 3rd party dependencies ===================================== @@ -64,30 +64,12 @@ the list under the ``devDependencies`` in `package.json `_ provides a better API for handling dates and times. -* `Strophe.js `_ maintains the XMPP session, is used to - build XMPP stanzas, to send them, and to register handlers for received stanzas. -* `lodash `_ provides very useful utility functions. -* `Skeletor `_, a `Backbone `_ fork - which is used to model the data as Models and Collections and to create Views that render the UI. -* `pluggable.js `_ provides the plugin - architecture for Converse. It registers and initializes plugins and - allows existing attributes, functions and objects on Converse to be - overridden inside plugins. - .. _`dependency-libsignal`: Libsignal --------- -If you want OMEMO encryption, you need to load `libsignal -`_ separately in -your page. +If you want OMEMO encryption, you need to load `libsignal `_ separately in your page. For example:: diff --git a/docs/source/plugin_development.rst b/docs/source/plugin_development.rst index 1bf9d3f31..2900b7a42 100644 --- a/docs/source/plugin_development.rst +++ b/docs/source/plugin_development.rst @@ -167,7 +167,7 @@ Accessing 3rd party libraries ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Immediately inside the module shown above you can access 3rd party libraries (such -dayjs and lodash) via the ``converse.env`` map. +dayjs) via the ``converse.env`` map. The code for it could look something like this: @@ -175,7 +175,7 @@ The code for it could look something like this: // Commonly used utilities and variables can be found under the "env" // namespace of the "converse" global. - const { Promise, Strophe, dayjs, sizzle, _, $build, $iq, $msg, $pres } = converse.env; + const { Promise, Strophe, dayjs, sizzle, $build, $iq, $msg, $pres } = converse.env; These dependencies are closured so that they don't pollute the global namespace, that's why you need to access them in such a way inside the module. @@ -263,7 +263,8 @@ For example: Overriding a template ~~~~~~~~~~~~~~~~~~~~~ -Converse uses various templates, loaded with lodash, to generate its HTML. +Converse uses `lit-html `_ +templates. It's not possible to override a template with the plugin's ``overrides`` feature, instead you should configure a new path to your own template via your @@ -278,26 +279,6 @@ For example, in your webpack config file, you could add the following to the .. code-block:: javascript - module: { - { - test: /templates\/.*\.(html|svg)$/, - use: [{ - loader: 'lodash-template-webpack-loader', - options: { - escape: /\{\{\{([\s\S]+?)\}\}\}/g, - evaluate: /\{\[([\s\S]+?)\]\}/g, - interpolate: /\{\{([\s\S]+?)\}\}/g, - // By default, template places the values from your data in the - // local scope via the with statement. However, you can specify - // a single variable name with the variable setting. This can - // significantly improve the speed at which a template is able - // to render. - variable: 'o', - prependFilenameComment: __dirname - } - }] - } - }, resolve: { extensions: ['.js'], modules: [ @@ -305,17 +286,13 @@ For example, in your webpack config file, you could add the following to the path.join(__dirname, 'node_modules/converse.js/src') ], alias: { - 'templates/profile_view.html$': path.resolve(__dirname, 'templates/profile_view.html') + 'plugins/profile/templates/profile.js$': path.resolve(__dirname, 'templates/custom-profile.js') } } - -You'll need to install ``lodash-template-webpack-loader``. - -Currently Converse uses a fork of `lodash-template-webpack-loader `_. - -To install it, you can add ``"lodash-template-webpack-loader": "jcbrand/lodash-template-webpack-loader"`` -to your package.json's ``devDependencies``. +This will override the template that gets imported at the path ``plugins/profile/templates/profile.js`` +with your own template at the path ``templates/custom-profile.js`` (relative to +your webpack config file). .. _`dependencies`: diff --git a/package-lock.json b/package-lock.json index 5a95550a2..640ca74fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4656,9 +4656,9 @@ } }, "@octokit/openapi-types": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-6.2.1.tgz", - "integrity": "sha512-rSyuVb2zVwEbWpl1FJzVziyDfvEhNcvIsp6QxmEJkpiFuPfcZ4LwXz2/fhVdVC8Xy7BCugUQr7/ISdhYwgs3zQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-7.0.0.tgz", + "integrity": "sha512-gV/8DJhAL/04zjTI95a7FhQwS6jlEE0W/7xeYAzuArD0KVAVWDLP2f3vi98hs3HLTczxXdRK/mF0tRoQPpolEw==", "dev": true }, "@octokit/plugin-enterprise-rest": { @@ -4800,12 +4800,12 @@ } }, "@octokit/types": { - "version": "6.14.1", - "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.14.1.tgz", - "integrity": "sha512-RDzkeFPaT2TgZcNtB2s1HtaMmtOrvXsc5VsAdpzApNkTwNN7Jk76RRCzGYhjm+hQ/HHuQXZkxUDWhJlt2QAyKQ==", + "version": "6.14.2", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-6.14.2.tgz", + "integrity": "sha512-wiQtW9ZSy4OvgQ09iQOdyXYNN60GqjCL/UdMsepDr1Gr0QzpW6irIKbH3REuAHXAhxkEk9/F2a3Gcs1P6kW5jA==", "dev": true, "requires": { - "@octokit/openapi-types": "^6.2.1" + "@octokit/openapi-types": "^7.0.0" } }, "@sinonjs/commons": { @@ -4843,12 +4843,6 @@ "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, - "@types/anymatch": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz", - "integrity": "sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==", - "dev": true - }, "@types/color-name": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", @@ -4917,11 +4911,20 @@ } }, "@types/html-minifier-terser": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.0.tgz", - "integrity": "sha512-iYCgjm1dGPRuo12+BStjd1HiVQqhlRhWDOQigNxn023HcjnhsiFz9pc6CzJj4HwDCSQca9bxTL4PxJDbkdm3PA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-5.1.1.tgz", + "integrity": "sha512-giAlZwstKbmvMk1OO7WXSj4OZ0keXAcl2TQq4LWHiiPH2ByaH7WeUzng+Qej8UPxxv+8lRTuouo0iaNDBuzIBA==", "dev": true }, + "@types/http-proxy": { + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.5.tgz", + "integrity": "sha512-GNkDE7bTv6Sf8JbV2GksknKOsk7OznNYHSdrtvPJXO0qJ9odZig6IZKUi5RFGi6d1bf6dgIAe4uXi3DBc7069Q==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/json-schema": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", @@ -4952,10 +4955,10 @@ "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, - "@types/source-list-map": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", - "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", "dev": true }, "@types/trusted-types": { @@ -4963,48 +4966,12 @@ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-1.0.6.tgz", "integrity": "sha512-230RC8sFeHoT6sSUlRO6a8cAnclO06eeiq1QDfiv2FGCLWFvvERWgwIQD4FWqD9A69BN7Lzee4OXwoMVnnsWDw==" }, - "@types/uglify-js": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.4.tgz", - "integrity": "sha512-SudIN9TRJ+v8g5pTG8RRCqfqTMNqgWCKKd3vtynhGzkIIjxaicNAMuY5TRadJ6tzDu3Dotf3ngaMILtmOdmWEQ==", - "dev": true, - "requires": { - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "@types/unist": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", "dev": true }, - "@types/webpack-sources": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.5.tgz", - "integrity": "sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==", - "dev": true, - "requires": { - "@types/node": "*", - "@types/source-list-map": "*", - "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } - } - }, "@typescript-eslint/typescript-estree": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.6.1.tgz", @@ -5212,24 +5179,24 @@ } }, "@webpack-cli/configtest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.1.tgz", - "integrity": "sha512-B+4uBUYhpzDXmwuo3V9yBH6cISwxEI4J+NO5ggDaGEEHb0osY/R7MzeKc0bHURXQuZjMM4qD+bSJCKIuI3eNBQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.2.tgz", + "integrity": "sha512-3OBzV2fBGZ5TBfdW50cha1lHDVf9vlvRXnjpVbJBa20pSZQaSkMJZiwA8V2vD9ogyeXn8nU5s5A6mHyf5jhMzA==", "dev": true }, "@webpack-cli/info": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.2.tgz", - "integrity": "sha512-5U9kUJHnwU+FhKH4PWGZuBC1hTEPYyxGSL5jjoBI96Gx8qcYJGOikpiIpFoTq8mmgX3im2zAo2wanv/alD74KQ==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.3.tgz", + "integrity": "sha512-lLek3/T7u40lTqzCGpC6CAbY6+vXhdhmwFRxZLMnRm6/sIF/7qMpT8MocXCRQfz0JAh63wpbXLMnsQ5162WS7Q==", "dev": true, "requires": { "envinfo": "^7.7.3" } }, "@webpack-cli/serve": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.0.tgz", - "integrity": "sha512-k2p2VrONcYVX1wRRrf0f3X2VGltLWcv+JzXRBDmvCxGlCeESx4OXw91TsWeKOkp784uNoVQo313vxJFHXPPwfw==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.1.tgz", + "integrity": "sha512-0qXvpeYO6vaNoRBI52/UsbcaBydJCggoBBnIo/ovQQdn6fug0BgwsjorV1hVS7fMqGVTZGcVxv8334gjmbj5hw==", "dev": true }, "@xtuc/ieee754": { @@ -5413,6 +5380,7 @@ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, + "optional": true, "requires": { "micromatch": "^3.1.4", "normalize-path": "^2.1.1" @@ -5423,6 +5391,7 @@ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, + "optional": true, "requires": { "remove-trailing-separator": "^1.0.1" } @@ -5577,13 +5546,8 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", - "dev": true - }, - "async-limiter": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", - "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", - "dev": true + "dev": true, + "optional": true }, "asynckit": { "version": "0.4.0", @@ -6086,7 +6050,8 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true + "dev": true, + "optional": true }, "bindings": { "version": "1.5.0", @@ -6441,19 +6406,19 @@ "dev": true }, "camel-case": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.1.tgz", - "integrity": "sha512-7fa2WcG4fYFkclIvEmxBbTvmibwF2/agfEBc6q3lOpVu0A13ltLsA+Hr/8Hp6kp5f+G7hKi6t8lys6XxP+1K6Q==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", "dev": true, "requires": { - "pascal-case": "^3.1.1", - "tslib": "^1.10.0" + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "dev": true } } @@ -6536,6 +6501,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", "dev": true, + "optional": true, "requires": { "anymatch": "^2.0.0", "async-each": "^1.0.1", @@ -6860,9 +6826,9 @@ }, "dependencies": { "mime-db": { - "version": "1.46.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", - "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==", + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", "dev": true } } @@ -7861,21 +7827,21 @@ } }, "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, "requires": { - "boolbase": "~1.0.0", - "css-what": "2.1", - "domutils": "1.5.1", - "nth-check": "~1.0.1" + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, "css-what": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", - "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", "dev": true }, "cssesc": { @@ -8023,13 +7989,114 @@ "dev": true }, "default-gateway": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", - "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", "dev": true, "requires": { - "execa": "^1.0.0", - "ip-regex": "^2.1.0" + "execa": "^5.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "execa": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz", + "integrity": "sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true + }, + "npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "requires": { + "mimic-fn": "^2.1.0" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "defaults": { @@ -8098,65 +8165,73 @@ } }, "del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", "dev": true, "requires": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" }, "dependencies": { - "globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" } }, "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, "requires": { "glob": "^7.1.3" - }, - "dependencies": { - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true } } }, @@ -8305,9 +8380,9 @@ }, "dependencies": { "domelementtype": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", - "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", "dev": true } } @@ -8328,9 +8403,9 @@ } }, "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "requires": { "dom-serializer": "0", @@ -8338,19 +8413,19 @@ } }, "dot-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.3.tgz", - "integrity": "sha512-7hwEmg6RiSQfm/GwPL4AAWXKy3YNNZA3oFv2Pdiey0mwkRCPZ9x6SZbkLcn8Ma5PYeVokzoD4Twv2n7LKp5WeA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", "dev": true, "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "dev": true } } @@ -8600,15 +8675,6 @@ "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", "dev": true }, - "errno": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", - "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", - "dev": true, - "requires": { - "prr": "~1.0.1" - } - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -9041,15 +9107,6 @@ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true }, - "eventsource": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.1.0.tgz", - "integrity": "sha512-VSJjT5oCNrFvCS6igjzPAt5hBzQ2qPBFIbJ03zLI9SE0mxwZpMw6BfJrbFHm1a141AavMEB8JHmBhWAd66PfCg==", - "dev": true, - "requires": { - "original": "^1.0.0" - } - }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", @@ -9894,6 +9951,12 @@ "minipass": "^3.0.0" } }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, "fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", @@ -11322,9 +11385,9 @@ "dev": true }, "html-entities": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", - "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", "dev": true }, "html-minifier-terser": { @@ -11378,80 +11441,16 @@ "dev": true }, "html-webpack-plugin": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-4.3.0.tgz", - "integrity": "sha512-C0fzKN8yQoVLTelcJxZfJCE+aAvQiY2VUf3UuKrR4a9k5UMWYOtpDLsaXwATbcVCnI05hUS7L9ULQHWLZhyi3w==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.3.1.tgz", + "integrity": "sha512-rZsVvPXUYFyME0cuGkyOHfx9hmkFa4pWfxY/mdY38PsBEaVNsRoA+Id+8z6DBDgyv3zaw6XQszdF8HLwfQvcdQ==", "dev": true, "requires": { "@types/html-minifier-terser": "^5.0.0", - "@types/tapable": "^1.0.5", - "@types/webpack": "^4.41.8", "html-minifier-terser": "^5.0.1", - "loader-utils": "^1.2.3", - "lodash": "^4.17.15", + "lodash": "^4.17.20", "pretty-error": "^2.1.1", - "tapable": "^1.1.3", - "util.promisify": "1.0.0" - }, - "dependencies": { - "@types/tapable": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.6.tgz", - "integrity": "sha512-W+bw9ds02rAQaMvaLYxAbJ6cvguW/iJXNT6lTssS1ps6QdrMKttqEAMEG/b5CR8TZl3/L7/lH0ZV5nNR1LXikA==", - "dev": true - }, - "@types/webpack": { - "version": "4.41.21", - "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.21.tgz", - "integrity": "sha512-2j9WVnNrr/8PLAB5csW44xzQSJwS26aOnICsP3pSGCEdsu6KYtfQ6QJsVUKHWRnm1bL7HziJsfh5fHqth87yKA==", - "dev": true, - "requires": { - "@types/anymatch": "*", - "@types/node": "*", - "@types/tapable": "*", - "@types/uglify-js": "*", - "@types/webpack-sources": "*", - "source-map": "^0.6.0" - } - }, - "big.js": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true - }, - "emojis-list": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true - }, - "json5": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", - "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "loader-utils": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", - "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", - "dev": true, - "requires": { - "big.js": "^5.2.2", - "emojis-list": "^3.0.0", - "json5": "^1.0.1" - } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } + "tapable": "^2.0.0" } }, "htmlparser2": { @@ -11563,15 +11562,82 @@ } }, "http-proxy-middleware": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", - "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz", + "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==", "dev": true, "requires": { - "http-proxy": "^1.17.0", - "is-glob": "^4.0.0", - "lodash": "^4.17.11", - "micromatch": "^3.1.10" + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "picomatch": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz", + "integrity": "sha512-KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + } } }, "http-server": { @@ -11895,13 +11961,23 @@ "dev": true }, "internal-ip": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", - "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-6.2.0.tgz", + "integrity": "sha512-D8WGsR6yDt8uq7vDMu7mjcR+yRMm3dW8yufyChmszWRjcSHuxLBkR3GdS2HZAjodsaGuCvXeEJpueisXJULghg==", "dev": true, "requires": { - "default-gateway": "^4.2.0", - "ipaddr.js": "^1.9.0" + "default-gateway": "^6.0.0", + "ipaddr.js": "^1.9.1", + "is-ip": "^3.1.0", + "p-event": "^4.2.0" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } } }, "interpret": { @@ -11917,15 +11993,15 @@ "dev": true }, "ip-regex": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", - "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-4.3.0.tgz", + "integrity": "sha512-B9ZWJxHHOHUhUjCPrMpLD4xEq35bUTClHM1S6CBU5ixQnkZmwipwgc96vAd7AAGM9TGHvJR+Uss+/Ak6UphK+Q==", "dev": true }, "ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.0.tgz", + "integrity": "sha512-S54H9mIj0rbxRIyrDMEuuER86LdlgUg9FSeZ8duQb6CUG2iRrA36MYVQBSprTF/ZeAwvyQ5mDGuNvIPM0BIl3w==", "dev": true }, "is-absolute-url": { @@ -11979,6 +12055,7 @@ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, + "optional": true, "requires": { "binary-extensions": "^1.0.0" } @@ -12059,6 +12136,12 @@ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -12098,6 +12181,15 @@ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", "dev": true }, + "is-ip": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-ip/-/is-ip-3.1.0.tgz", + "integrity": "sha512-35vd5necO7IitFPjd/YBeqwWnyDWbuLH9ZXQdMfDA8TEo7pv5X8yfrvVO3xbJbLUlERCMvf6X0hTUamQxCYJ9Q==", + "dev": true, + "requires": { + "ip-regex": "^4.0.0" + } + }, "is-number": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", @@ -12119,23 +12211,11 @@ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true }, - "is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "requires": { - "is-path-inside": "^2.1.0" - } - }, "is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "requires": { - "path-is-inside": "^1.0.2" - } + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true }, "is-plain-obj": { "version": "1.1.0", @@ -12225,10 +12305,13 @@ "dev": true }, "is-wsl": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", - "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", - "dev": true + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } }, "isarray": { "version": "1.0.0", @@ -12458,12 +12541,6 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "json3": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", - "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", - "dev": true - }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", @@ -13195,12 +13272,6 @@ } } }, - "loglevel": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", - "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", - "dev": true - }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -13212,18 +13283,18 @@ } }, "lower-case": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.1.tgz", - "integrity": "sha512-LiWgfDLLb1dwbFQZsSglpRj+1ctGnayXz3Uv0/WO8n558JycT5fg6zkNcnW0G68Nn0aEldTFeEfmjCfmqry/rQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "dev": true, "requires": { - "tslib": "^1.10.0" + "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "dev": true } } @@ -13370,14 +13441,31 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "mem": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", + "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", "dev": true, "requires": { - "errno": "^0.1.3", - "readable-stream": "^2.0.1" + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.1.0" + }, + "dependencies": { + "mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "dev": true + } + } + }, + "memfs": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.2.2.tgz", + "integrity": "sha512-RE0CwmIM3CEvpcdK3rZ19BC4E6hv9kADkMN5rPduRak58cNArWLi/9jFLsa4rhsjfVxMP3v0jO7FHXq7SvFY5Q==", + "dev": true, + "requires": { + "fs-monkey": "1.0.3" } }, "meow": { @@ -14062,19 +14150,19 @@ } }, "no-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.3.tgz", - "integrity": "sha512-ehY/mVQCf9BL0gKfsJBvFJen+1V//U+0HQMPrWct40ixE4jnv0bfvxDbWtAHL9EcaPEOJHVVYKoQn1TlZUB8Tw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "dev": true, "requires": { - "lower-case": "^2.0.1", - "tslib": "^1.10.0" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "dev": true } } @@ -18061,21 +18149,22 @@ "mimic-fn": "^1.0.0" } }, + "open": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", + "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", + "dev": true, + "requires": { + "is-docker": "^2.0.0", + "is-wsl": "^2.1.1" + } + }, "opener": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.1.tgz", "integrity": "sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==", "dev": true }, - "opn": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", - "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", - "dev": true, - "requires": { - "is-wsl": "^1.1.0" - } - }, "optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -18090,15 +18179,6 @@ "word-wrap": "^1.2.3" } }, - "original": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", - "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", - "dev": true, - "requires": { - "url-parse": "^1.4.3" - } - }, "os-homedir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", @@ -18137,6 +18217,15 @@ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, + "p-event": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", + "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "dev": true, + "requires": { + "p-timeout": "^3.1.0" + } + }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -18198,11 +18287,12 @@ "dev": true }, "p-retry": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", - "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.5.0.tgz", + "integrity": "sha512-5Hwh4aVQSu6BEP+w2zKlVXtFAaYQe1qWuVADSgoeVlLjwe/Q/AMSoRR4MDeaAfu8llT+YNbEijWu/YF3m6avkg==", "dev": true, "requires": { + "@types/retry": "^0.12.0", "retry": "^0.12.0" }, "dependencies": { @@ -18214,6 +18304,15 @@ } } }, + "p-timeout": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", + "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "dev": true, + "requires": { + "p-finally": "^1.0.0" + } + }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", @@ -18241,19 +18340,19 @@ } }, "param-case": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.3.tgz", - "integrity": "sha512-VWBVyimc1+QrzappRs7waeN2YmoZFCGXWASRYX1/rGHtXqEcrGEIDm+jqIwFa2fRXNgQEwrxaYuIrX0WcAguTA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", "dev": true, "requires": { - "dot-case": "^3.0.3", - "tslib": "^1.10.0" + "dot-case": "^3.0.4", + "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "dev": true } } @@ -18345,19 +18444,19 @@ "dev": true }, "pascal-case": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.1.tgz", - "integrity": "sha512-XIeHKqIrsquVTQL2crjq3NfJUxmdLasn3TYOU0VBM+UX2a6ztAWBlJQBePLGY7VHW8+2dRadeIPK5+KImwTxQA==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", "dev": true, "requires": { - "no-case": "^3.0.3", - "tslib": "^1.10.0" + "no-case": "^3.0.4", + "tslib": "^2.0.3" }, "dependencies": { "tslib": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", - "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.2.0.tgz", + "integrity": "sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w==", "dev": true } } @@ -18386,12 +18485,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -19199,13 +19292,13 @@ } }, "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.2.tgz", + "integrity": "sha512-EY5oDzmsX5wvuynAByrmY0P0hcp+QpnAKbJng2A2MPjVKXCxrDSUkzghVJ4ZGPIv+JC4gX8fPUWscC0RtjsWGw==", "dev": true, "requires": { - "renderkid": "^2.0.1", - "utila": "~0.4" + "lodash": "^4.17.20", + "renderkid": "^2.0.4" } }, "process-nextick-args": { @@ -19274,14 +19367,16 @@ "requires": { "forwarded": "~0.1.2", "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } } }, - "prr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", - "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", - "dev": true - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", @@ -19369,12 +19464,6 @@ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", "dev": true }, - "querystringify": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", - "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", - "dev": true - }, "quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", @@ -19593,6 +19682,7 @@ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", "dev": true, + "optional": true, "requires": { "graceful-fs": "^4.1.11", "micromatch": "^3.1.10", @@ -19762,19 +19852,20 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true + "dev": true, + "optional": true }, "renderkid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.3.tgz", - "integrity": "sha512-z8CLQp7EZBPCwCnncgf9C4XAi3WR0dv+uWu/PjIyhhAb5d6IJ/QZqlHFprHeKT+59//V6BNUsLbvN8+2LarxGA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.5.tgz", + "integrity": "sha512-ccqoLg+HLOHq1vdfYNm4TBeaCDIi1FLt3wGojTDSvdewUv65oTmI3cnT2E4hRjl1gzKZIPK+KZrXzlUYKnR+vQ==", "dev": true, "requires": { - "css-select": "^1.1.0", + "css-select": "^2.0.2", "dom-converter": "^0.2", - "htmlparser2": "^3.3.0", - "strip-ansi": "^3.0.0", - "utila": "^0.4.0" + "htmlparser2": "^3.10.1", + "lodash": "^4.17.20", + "strip-ansi": "^3.0.0" } }, "repeat-element": { @@ -20239,9 +20330,9 @@ "dev": true }, "selfsigned": { - "version": "1.10.8", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", - "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "version": "1.10.11", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.11.tgz", + "integrity": "sha512-aVmbPOfViZqOZPgRBT0+3u4yZFHpmnIghLMlAcb5/xhp5ZtB/RVnKhz5vl2M32CLXAqR4kha9zfhNg0Lf/sxKA==", "dev": true, "requires": { "node-forge": "^0.10.0" @@ -20739,43 +20830,6 @@ } } }, - "sockjs-client": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.5.0.tgz", - "integrity": "sha512-8Dt3BDi4FYNrCFGTL/HtwVzkARrENdwOUf1ZoW/9p3M8lZdFT35jVdrHza+qgxuG9H3/shR4cuX/X9umUrjP8Q==", - "dev": true, - "requires": { - "debug": "^3.2.6", - "eventsource": "^1.0.7", - "faye-websocket": "^0.11.3", - "inherits": "^2.0.4", - "json3": "^3.3.3", - "url-parse": "^1.4.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, "socks": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", @@ -20842,9 +20896,9 @@ } }, "source-map-support": { - "version": "0.5.12", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", - "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -21351,9 +21405,9 @@ "dev": true }, "tapable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", - "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz", + "integrity": "sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==", "dev": true }, "tar": { @@ -21428,9 +21482,9 @@ } }, "terser": { - "version": "4.6.12", - "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.12.tgz", - "integrity": "sha512-fnIwuaKjFPANG6MAixC/k1TDtnl1YlPLUlLVIxxGZUn1gfUx2+l3/zGNB72wya+lgsb50QBi2tUV75RiODwnww==", + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", "dev": true, "requires": { "commander": "^2.20.0", @@ -22097,7 +22151,8 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/upath/-/upath-1.1.2.tgz", "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", - "dev": true + "dev": true, + "optional": true }, "uri-js": { "version": "4.2.2", @@ -22143,16 +22198,6 @@ "integrity": "sha1-WvIvGMBSoACkjXuCxenC4v7tpyg=", "dev": true }, - "url-parse": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz", - "integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==", - "dev": true, - "requires": { - "querystringify": "^2.1.1", - "requires-port": "^1.0.0" - } - }, "use": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/use/-/use-3.1.0.tgz", @@ -22185,16 +22230,6 @@ "object.getownpropertydescriptors": "^2.0.3" } }, - "util.promisify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", - "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "object.getownpropertydescriptors": "^2.0.3" - } - }, "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", @@ -22500,15 +22535,15 @@ } }, "webpack-cli": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.5.0.tgz", - "integrity": "sha512-wXg/ef6Ibstl2f50mnkcHblRPN/P9J4Nlod5Hg9HGFgSeF8rsqDGHJeVe4aR26q9l62TUJi6vmvC2Qz96YJw1Q==", + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.6.0.tgz", + "integrity": "sha512-9YV+qTcGMjQFiY7Nb1kmnupvb1x40lfpj8pwdO/bom+sQiP4OBMKjHq29YQrlDWDPZO9r/qWaRRywKaRDKqBTA==", "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.0.1", - "@webpack-cli/info": "^1.2.2", - "@webpack-cli/serve": "^1.3.0", + "@webpack-cli/configtest": "^1.0.2", + "@webpack-cli/info": "^1.2.3", + "@webpack-cli/serve": "^1.3.1", "colorette": "^1.2.1", "commander": "^7.0.0", "enquirer": "^2.3.6", @@ -22528,9 +22563,9 @@ "dev": true }, "commander": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz", - "integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", "dev": true }, "cross-spawn": { @@ -22581,9 +22616,9 @@ } }, "get-stream": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.0.tgz", - "integrity": "sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, "import-local": { @@ -22719,76 +22754,241 @@ } }, "webpack-dev-middleware": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", - "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-4.1.0.tgz", + "integrity": "sha512-mpa/FY+DiBu5+r5JUIyTCYWRfkWgyA3/OOE9lwfzV9S70A4vJYLsVRKj5rMFEsezBroy2FmPyQ8oBRVW8QmK1A==", "dev": true, "requires": { - "memory-fs": "^0.4.1", - "mime": "^2.4.4", - "mkdirp": "^0.5.1", + "colorette": "^1.2.1", + "mem": "^8.0.0", + "memfs": "^3.2.0", + "mime-types": "^2.1.28", "range-parser": "^1.2.1", - "webpack-log": "^2.0.0" + "schema-utils": "^3.0.0" }, "dependencies": { - "mime": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", - "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==", + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "mime-db": { + "version": "1.47.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz", + "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==", + "dev": true + }, + "mime-types": { + "version": "2.1.30", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz", + "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==", + "dev": true, + "requires": { + "mime-db": "1.47.0" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } } } }, "webpack-dev-server": { - "version": "3.11.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.2.tgz", - "integrity": "sha512-A80BkuHRQfCiNtGBS1EMf2ChTUs0x+B3wGDFmOeT4rmJOHhHTCH2naNxIHhmkr0/UillP4U3yeIyv1pNp+QDLQ==", + "version": "4.0.0-beta.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.0.0-beta.2.tgz", + "integrity": "sha512-kbUAjQg1FLtCoIZ0NdcTZWRBVT1EDajBSvGAiAqQPJxBjsr0N3FQ57kJ/4SrIZPyAajn8kcHctwFsTKPwme1tQ==", "dev": true, "requires": { - "ansi-html": "0.0.7", + "ansi-html": "^0.0.7", "bonjour": "^3.5.0", - "chokidar": "^2.1.8", + "chokidar": "^3.5.1", "compression": "^1.7.4", "connect-history-api-fallback": "^1.6.0", - "debug": "^4.1.1", - "del": "^4.1.1", + "del": "^6.0.0", "express": "^4.17.1", - "html-entities": "^1.3.1", - "http-proxy-middleware": "0.19.1", - "import-local": "^2.0.0", - "internal-ip": "^4.3.0", - "ip": "^1.1.5", + "find-cache-dir": "^3.3.1", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^1.1.0", + "internal-ip": "^6.2.0", + "ipaddr.js": "^2.0.0", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.8", - "opn": "^5.5.0", - "p-retry": "^3.0.1", - "portfinder": "^1.0.26", - "schema-utils": "^1.0.0", + "open": "^7.4.2", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^3.0.0", "selfsigned": "^1.10.8", - "semver": "^6.3.0", "serve-index": "^1.9.1", "sockjs": "^0.3.21", - "sockjs-client": "^1.5.0", "spdy": "^4.0.2", - "strip-ansi": "^3.0.1", - "supports-color": "^6.1.0", + "strip-ansi": "^6.0.0", "url": "^0.11.0", - "webpack-dev-middleware": "^3.7.2", - "webpack-log": "^2.0.0", - "ws": "^6.2.1", - "yargs": "^13.3.2" + "webpack-dev-middleware": "^4.1.0", + "ws": "^7.4.4" }, "dependencies": { - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { - "ms": "2.1.2" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, + "ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", + "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "graceful-fs": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", + "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, "mkdirp": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", @@ -22799,9 +22999,9 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "portfinder": { @@ -22813,46 +23013,48 @@ "async": "^2.6.2", "debug": "^3.1.1", "mkdirp": "^0.5.5" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } } }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - }, - "supports-color": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", - "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", "dev": true, "requires": { - "has-flag": "^3.0.0" + "picomatch": "^2.2.1" + } + }, + "schema-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz", + "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.6", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" } } } }, - "webpack-log": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", - "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", - "dev": true, - "requires": { - "ansi-colors": "^3.0.0", - "uuid": "^3.3.2" - } - }, "webpack-merge": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz", @@ -23138,13 +23340,10 @@ } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", - "dev": true, - "requires": { - "async-limiter": "~1.0.0" - } + "version": "7.4.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", + "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", + "dev": true }, "xmlcreate": { "version": "2.0.3", @@ -23229,74 +23428,6 @@ } } }, - "yargs": { - "version": "13.3.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", - "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", - "dev": true, - "requires": { - "cliui": "^5.0.0", - "find-up": "^3.0.0", - "get-caller-file": "^2.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^2.0.0", - "set-blocking": "^2.0.0", - "string-width": "^3.0.0", - "which-module": "^2.0.0", - "y18n": "^4.0.0", - "yargs-parser": "^13.1.2" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "require-main-filename": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", - "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", - "dev": true - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "yargs-parser": { - "version": "13.1.2", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", - "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" - } - } - } - }, "yargs-parser": { "version": "20.2.7", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", diff --git a/package.json b/package.json index c56af1d27..bcce8b631 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,7 @@ "exports-loader": "^0.7.0", "fast-text-encoding": "^1.0.3", "file-loader": "^6.0.0", - "html-webpack-plugin": "^4.3.0", + "html-webpack-plugin": "^5.3.1", "http-server": "^0.12.3", "imports-loader": "^0.8.0", "install": "^0.13.0", @@ -110,8 +110,8 @@ "sinon": "^9.2.4", "style-loader": "^0.23.1", "webpack": "^5.36.1", - "webpack-cli": "^4.5.0", - "webpack-dev-server": "^3.11.2", + "webpack-cli": "^4.6.0", + "webpack-dev-server": "^4.0.0-beta.2", "webpack-merge": "^5.7.3" }, "dependencies": { diff --git a/spec/mock.js b/spec/mock.js index 5e30a788d..807a04720 100644 --- a/spec/mock.js +++ b/spec/mock.js @@ -1,10 +1,10 @@ -/*global converse */ - const mock = {}; window.mock = mock; -let _converse, initConverse; +let _converse; -const converseLoaded = new Promise(resolve => window.addEventListener('converse-loaded', resolve)); +const converse = window.converse; +converse.load(); +const { u, sizzle, Strophe, dayjs, $iq, $msg, $pres } = converse.env; jasmine.DEFAULT_TIMEOUT_INTERVAL = 7000; @@ -25,7 +25,6 @@ mock.initConverse = function (promise_names=[], settings=null, func) { } document.title = "Converse Tests"; - await converseLoaded; await initConverse(settings); await Promise.all((promise_names || []).map(_converse.api.waitUntil)); try { @@ -38,644 +37,638 @@ mock.initConverse = function (promise_names=[], settings=null, func) { } }; -window.addEventListener('converse-loaded', () => { - const { u, sizzle, Strophe, dayjs, $iq, $msg, $pres } = converse.env; +mock.waitUntilDiscoConfirmed = async function (_converse, entity_jid, identities, features=[], items=[], type='info') { + const sel = `iq[to="${entity_jid}"] query[xmlns="http://jabber.org/protocol/disco#${type}"]`; + const iq = await u.waitUntil(() => _converse.connection.IQ_stanzas.filter(iq => sizzle(sel, iq).length).pop(), 300); + const stanza = $iq({ + 'type': 'result', + 'from': entity_jid, + 'to': 'romeo@montague.lit/orchard', + 'id': iq.getAttribute('id'), + }).c('query', {'xmlns': 'http://jabber.org/protocol/disco#'+type}); - mock.waitUntilDiscoConfirmed = async function (_converse, entity_jid, identities, features=[], items=[], type='info') { - const sel = `iq[to="${entity_jid}"] query[xmlns="http://jabber.org/protocol/disco#${type}"]`; - const iq = await u.waitUntil(() => _converse.connection.IQ_stanzas.filter(iq => sizzle(sel, iq).length).pop(), 300); - const stanza = $iq({ - 'type': 'result', - 'from': entity_jid, - 'to': 'romeo@montague.lit/orchard', - 'id': iq.getAttribute('id'), - }).c('query', {'xmlns': 'http://jabber.org/protocol/disco#'+type}); + identities?.forEach(identity => stanza.c('identity', {'category': identity.category, 'type': identity.type}).up()); + features?.forEach(feature => stanza.c('feature', {'var': feature}).up()); + items?.forEach(item => stanza.c('item', {'jid': item}).up()); + _converse.connection._dataRecv(mock.createRequest(stanza)); +} - identities?.forEach(identity => stanza.c('identity', {'category': identity.category, 'type': identity.type}).up()); - features?.forEach(feature => stanza.c('feature', {'var': feature}).up()); - items?.forEach(item => stanza.c('item', {'jid': item}).up()); - _converse.connection._dataRecv(mock.createRequest(stanza)); - } - - mock.createRequest = function (iq) { - iq = typeof iq.tree == "function" ? iq.tree() : iq; - var req = new Strophe.Request(iq, function() {}); - req.getResponse = function () { - var env = new Strophe.Builder('env', {type: 'mock'}).tree(); - env.appendChild(iq); - return env; - }; - return req; +mock.createRequest = function (iq) { + iq = typeof iq.tree == "function" ? iq.tree() : iq; + var req = new Strophe.Request(iq, function() {}); + req.getResponse = function () { + var env = new Strophe.Builder('env', {type: 'mock'}).tree(); + env.appendChild(iq); + return env; }; + return req; +}; - mock.closeAllChatBoxes = function (_converse) { - return Promise.all(_converse.chatboxviews.map(view => view.close())); - }; +mock.closeAllChatBoxes = function (_converse) { + return Promise.all(_converse.chatboxviews.map(view => view.close())); +}; - mock.toggleControlBox = function () { - const toggle = document.querySelector(".toggle-controlbox"); - if (!u.isVisible(document.querySelector("#controlbox"))) { - if (!u.isVisible(toggle)) { - u.removeClass('hidden', toggle); - } - toggle.click(); +mock.toggleControlBox = function () { + const toggle = document.querySelector(".toggle-controlbox"); + if (!u.isVisible(document.querySelector("#controlbox"))) { + if (!u.isVisible(toggle)) { + u.removeClass('hidden', toggle); } + toggle.click(); } +} - mock.openControlBox = async function (_converse) { - const model = await _converse.api.controlbox.open(); - await u.waitUntil(() => model.get('connected')); - mock.toggleControlBox(); - return this; - }; +mock.openControlBox = async function (_converse) { + const model = await _converse.api.controlbox.open(); + await u.waitUntil(() => model.get('connected')); + mock.toggleControlBox(); + return this; +}; - mock.closeControlBox = function () { - const controlbox = document.querySelector("#controlbox"); - if (u.isVisible(controlbox)) { - const button = controlbox.querySelector(".close-chatbox-button"); - (button !== null) && button.click(); - } - return this; - }; +mock.closeControlBox = function () { + const controlbox = document.querySelector("#controlbox"); + if (u.isVisible(controlbox)) { + const button = controlbox.querySelector(".close-chatbox-button"); + (button !== null) && button.click(); + } + return this; +}; - mock.waitUntilBookmarksReturned = async function (_converse, bookmarks=[]) { - await mock.waitUntilDiscoConfirmed( - _converse, _converse.bare_jid, - [{'category': 'pubsub', 'type': 'pep'}], - ['http://jabber.org/protocol/pubsub#publish-options'] - ); - const IQ_stanzas = _converse.connection.IQ_stanzas; - const sent_stanza = await u.waitUntil( - () => IQ_stanzas.filter(s => sizzle('items[node="storage:bookmarks"]', s).length).pop() - ); - const stanza = $iq({ - 'to': _converse.connection.jid, - 'type':'result', - 'id':sent_stanza.getAttribute('id') - }).c('pubsub', {'xmlns': Strophe.NS.PUBSUB}) - .c('items', {'node': 'storage:bookmarks'}) - .c('item', {'id': 'current'}) - .c('storage', {'xmlns': 'storage:bookmarks'}); - bookmarks.forEach(bookmark => { - stanza.c('conference', { - 'name': bookmark.name, - 'autojoin': bookmark.autojoin, - 'jid': bookmark.jid - }).c('nick').t(bookmark.nick).up().up() +mock.waitUntilBookmarksReturned = async function (_converse, bookmarks=[]) { + await mock.waitUntilDiscoConfirmed( + _converse, _converse.bare_jid, + [{'category': 'pubsub', 'type': 'pep'}], + ['http://jabber.org/protocol/pubsub#publish-options'] + ); + const IQ_stanzas = _converse.connection.IQ_stanzas; + const sent_stanza = await u.waitUntil( + () => IQ_stanzas.filter(s => sizzle('items[node="storage:bookmarks"]', s).length).pop() + ); + const stanza = $iq({ + 'to': _converse.connection.jid, + 'type':'result', + 'id':sent_stanza.getAttribute('id') + }).c('pubsub', {'xmlns': Strophe.NS.PUBSUB}) + .c('items', {'node': 'storage:bookmarks'}) + .c('item', {'id': 'current'}) + .c('storage', {'xmlns': 'storage:bookmarks'}); + bookmarks.forEach(bookmark => { + stanza.c('conference', { + 'name': bookmark.name, + 'autojoin': bookmark.autojoin, + 'jid': bookmark.jid + }).c('nick').t(bookmark.nick).up().up() + }); + _converse.connection._dataRecv(mock.createRequest(stanza)); + await _converse.api.waitUntil('bookmarksInitialized'); +}; + +mock.openChatBoxes = function (converse, amount) { + for (let i=0; i _converse.chatboxviews.get(jid), 1000); +}; + +mock.openChatRoomViaModal = async function (_converse, jid, nick='') { + // Opens a new chatroom + const model = await _converse.api.controlbox.open('controlbox'); + await u.waitUntil(() => model.get('connected')); + await mock.openControlBox(_converse); + document.querySelector('converse-rooms-list .show-add-muc-modal').click(); + mock.closeControlBox(_converse); + const modal = _converse.api.modal.get('add-chatroom-modal'); + await u.waitUntil(() => u.isVisible(modal.el), 1500) + modal.el.querySelector('input[name="chatroom"]').value = jid; + if (nick) { + modal.el.querySelector('input[name="nickname"]').value = nick; + } + modal.el.querySelector('form input[type="submit"]').click(); + await u.waitUntil(() => _converse.chatboxviews.get(jid), 1000); + return _converse.chatboxviews.get(jid); +}; + +mock.openChatRoom = function (_converse, room, server) { + return _converse.api.rooms.open(`${room}@${server}`); +}; + +mock.getRoomFeatures = async function (_converse, muc_jid, features=[]) { + const room = Strophe.getNodeFromJid(muc_jid); + muc_jid = muc_jid.toLowerCase(); + const stanzas = _converse.connection.IQ_stanzas; + const stanza = await u.waitUntil(() => stanzas.filter( + iq => iq.querySelector( + `iq[to="${muc_jid}"] query[xmlns="http://jabber.org/protocol/disco#info"]` + )).pop() + ); + const features_stanza = $iq({ + 'from': muc_jid, + 'id': stanza.getAttribute('id'), + 'to': 'romeo@montague.lit/desktop', + 'type': 'result' + }).c('query', { 'xmlns': 'http://jabber.org/protocol/disco#info'}) + .c('identity', { + 'category': 'conference', + 'name': room[0].toUpperCase() + room.slice(1), + 'type': 'text' + }).up(); + + features = features.length ? features : mock.default_muc_features; + features.forEach(f => features_stanza.c('feature', {'var': f}).up()); + features_stanza.c('x', { 'xmlns':'jabber:x:data', 'type':'result'}) + .c('field', {'var':'FORM_TYPE', 'type':'hidden'}) + .c('value').t('http://jabber.org/protocol/muc#roominfo').up().up() + .c('field', {'type':'text-single', 'var':'muc#roominfo_description', 'label':'Description'}) + .c('value').t('This is the description').up().up() + .c('field', {'type':'text-single', 'var':'muc#roominfo_occupants', 'label':'Number of occupants'}) + .c('value').t(0); + _converse.connection._dataRecv(mock.createRequest(features_stanza)); +}; + + +mock.waitForReservedNick = async function (_converse, muc_jid, nick) { + const stanzas = _converse.connection.IQ_stanzas; + const selector = `iq[to="${muc_jid.toLowerCase()}"] query[node="x-roomuser-item"]`; + const iq = await u.waitUntil(() => stanzas.filter(s => sizzle(selector, s).length).pop()); + + // We remove the stanza, otherwise we might get stale stanzas returned in our filter above. + stanzas.splice(stanzas.indexOf(iq), 1) + + // The XMPP server returns the reserved nick for this user. + const IQ_id = iq.getAttribute('id'); + const stanza = $iq({ + 'type': 'result', + 'id': IQ_id, + 'from': muc_jid, + 'to': _converse.connection.jid + }).c('query', {'xmlns': 'http://jabber.org/protocol/disco#info', 'node': 'x-roomuser-item'}); + if (nick) { + stanza.c('identity', {'category': 'conference', 'name': nick, 'type': 'text'}); + } + _converse.connection._dataRecv(mock.createRequest(stanza)); + if (nick) { + return u.waitUntil(() => nick); + } +}; + + +mock.returnMemberLists = async function (_converse, muc_jid, members=[], affiliations=['member', 'owner', 'admin']) { + if (affiliations.length === 0) { + return; + } + const stanzas = _converse.connection.IQ_stanzas; + + if (affiliations.includes('member')) { + const member_IQ = await u.waitUntil(() => + stanzas.filter(s => sizzle(`iq[to="${muc_jid}"] query[xmlns="${Strophe.NS.MUC_ADMIN}"] item[affiliation="member"]`, s).length + ).pop()); + const member_list_stanza = $iq({ + 'from': 'coven@chat.shakespeare.lit', + 'id': member_IQ.getAttribute('id'), + 'to': 'romeo@montague.lit/orchard', + 'type': 'result' + }).c('query', {'xmlns': Strophe.NS.MUC_ADMIN}); + members.filter(m => m.affiliation === 'member').forEach(m => { + member_list_stanza.c('item', { + 'affiliation': m.affiliation, + 'jid': m.jid, + 'nick': m.nick + }); }); - _converse.connection._dataRecv(mock.createRequest(stanza)); - await _converse.api.waitUntil('bookmarksInitialized'); - }; + _converse.connection._dataRecv(mock.createRequest(member_list_stanza)); + } - mock.openChatBoxes = function (converse, amount) { - for (let i=0; i _converse.chatboxviews.get(jid), 1000); - }; - - mock.openChatRoomViaModal = async function (_converse, jid, nick='') { - // Opens a new chatroom - const model = await _converse.api.controlbox.open('controlbox'); - await u.waitUntil(() => model.get('connected')); - await mock.openControlBox(_converse); - document.querySelector('converse-rooms-list .show-add-muc-modal').click(); - mock.closeControlBox(_converse); - const modal = _converse.api.modal.get('add-chatroom-modal'); - await u.waitUntil(() => u.isVisible(modal.el), 1500) - modal.el.querySelector('input[name="chatroom"]').value = jid; - if (nick) { - modal.el.querySelector('input[name="nickname"]').value = nick; - } - modal.el.querySelector('form input[type="submit"]').click(); - await u.waitUntil(() => _converse.chatboxviews.get(jid), 1000); - return _converse.chatboxviews.get(jid); - }; - - mock.openChatRoom = function (_converse, room, server) { - return _converse.api.rooms.open(`${room}@${server}`); - }; - - mock.getRoomFeatures = async function (_converse, muc_jid, features=[]) { - const room = Strophe.getNodeFromJid(muc_jid); - muc_jid = muc_jid.toLowerCase(); - const stanzas = _converse.connection.IQ_stanzas; - const stanza = await u.waitUntil(() => stanzas.filter( - iq => iq.querySelector( - `iq[to="${muc_jid}"] query[xmlns="http://jabber.org/protocol/disco#info"]` - )).pop() - ); - const features_stanza = $iq({ - 'from': muc_jid, - 'id': stanza.getAttribute('id'), - 'to': 'romeo@montague.lit/desktop', - 'type': 'result' - }).c('query', { 'xmlns': 'http://jabber.org/protocol/disco#info'}) - .c('identity', { - 'category': 'conference', - 'name': room[0].toUpperCase() + room.slice(1), - 'type': 'text' - }).up(); - - features = features.length ? features : mock.default_muc_features; - features.forEach(f => features_stanza.c('feature', {'var': f}).up()); - features_stanza.c('x', { 'xmlns':'jabber:x:data', 'type':'result'}) - .c('field', {'var':'FORM_TYPE', 'type':'hidden'}) - .c('value').t('http://jabber.org/protocol/muc#roominfo').up().up() - .c('field', {'type':'text-single', 'var':'muc#roominfo_description', 'label':'Description'}) - .c('value').t('This is the description').up().up() - .c('field', {'type':'text-single', 'var':'muc#roominfo_occupants', 'label':'Number of occupants'}) - .c('value').t(0); - _converse.connection._dataRecv(mock.createRequest(features_stanza)); - }; - - - mock.waitForReservedNick = async function (_converse, muc_jid, nick) { - const stanzas = _converse.connection.IQ_stanzas; - const selector = `iq[to="${muc_jid.toLowerCase()}"] query[node="x-roomuser-item"]`; - const iq = await u.waitUntil(() => stanzas.filter(s => sizzle(selector, s).length).pop()); - - // We remove the stanza, otherwise we might get stale stanzas returned in our filter above. - stanzas.splice(stanzas.indexOf(iq), 1) - - // The XMPP server returns the reserved nick for this user. - const IQ_id = iq.getAttribute('id'); - const stanza = $iq({ - 'type': 'result', - 'id': IQ_id, - 'from': muc_jid, - 'to': _converse.connection.jid - }).c('query', {'xmlns': 'http://jabber.org/protocol/disco#info', 'node': 'x-roomuser-item'}); - if (nick) { - stanza.c('identity', {'category': 'conference', 'name': nick, 'type': 'text'}); - } - _converse.connection._dataRecv(mock.createRequest(stanza)); - if (nick) { - return u.waitUntil(() => nick); - } - }; - - - mock.returnMemberLists = async function (_converse, muc_jid, members=[], affiliations=['member', 'owner', 'admin']) { - if (affiliations.length === 0) { - return; - } - const stanzas = _converse.connection.IQ_stanzas; - - if (affiliations.includes('member')) { - const member_IQ = await u.waitUntil(() => - stanzas.filter(s => sizzle(`iq[to="${muc_jid}"] query[xmlns="${Strophe.NS.MUC_ADMIN}"] item[affiliation="member"]`, s).length - ).pop()); - const member_list_stanza = $iq({ - 'from': 'coven@chat.shakespeare.lit', - 'id': member_IQ.getAttribute('id'), - 'to': 'romeo@montague.lit/orchard', - 'type': 'result' - }).c('query', {'xmlns': Strophe.NS.MUC_ADMIN}); - members.filter(m => m.affiliation === 'member').forEach(m => { - member_list_stanza.c('item', { - 'affiliation': m.affiliation, - 'jid': m.jid, - 'nick': m.nick - }); + if (affiliations.includes('admin')) { + const admin_IQ = await u.waitUntil(() => stanzas.filter( + s => sizzle(`iq[to="${muc_jid}"] query[xmlns="${Strophe.NS.MUC_ADMIN}"] item[affiliation="admin"]`, s).length + ).pop()); + const admin_list_stanza = $iq({ + 'from': 'coven@chat.shakespeare.lit', + 'id': admin_IQ.getAttribute('id'), + 'to': 'romeo@montague.lit/orchard', + 'type': 'result' + }).c('query', {'xmlns': Strophe.NS.MUC_ADMIN}); + members.filter(m => m.affiliation === 'admin').forEach(m => { + admin_list_stanza.c('item', { + 'affiliation': m.affiliation, + 'jid': m.jid, + 'nick': m.nick }); - _converse.connection._dataRecv(mock.createRequest(member_list_stanza)); - } + }); + _converse.connection._dataRecv(mock.createRequest(admin_list_stanza)); + } - if (affiliations.includes('admin')) { - const admin_IQ = await u.waitUntil(() => stanzas.filter( - s => sizzle(`iq[to="${muc_jid}"] query[xmlns="${Strophe.NS.MUC_ADMIN}"] item[affiliation="admin"]`, s).length - ).pop()); - const admin_list_stanza = $iq({ - 'from': 'coven@chat.shakespeare.lit', - 'id': admin_IQ.getAttribute('id'), - 'to': 'romeo@montague.lit/orchard', - 'type': 'result' - }).c('query', {'xmlns': Strophe.NS.MUC_ADMIN}); - members.filter(m => m.affiliation === 'admin').forEach(m => { - admin_list_stanza.c('item', { - 'affiliation': m.affiliation, - 'jid': m.jid, - 'nick': m.nick - }); + if (affiliations.includes('owner')) { + const owner_IQ = await u.waitUntil(() => stanzas.filter( + s => sizzle(`iq[to="${muc_jid}"] query[xmlns="${Strophe.NS.MUC_ADMIN}"] item[affiliation="owner"]`, s).length + ).pop()); + const owner_list_stanza = $iq({ + 'from': 'coven@chat.shakespeare.lit', + 'id': owner_IQ.getAttribute('id'), + 'to': 'romeo@montague.lit/orchard', + 'type': 'result' + }).c('query', {'xmlns': Strophe.NS.MUC_ADMIN}); + members.filter(m => m.affiliation === 'owner').forEach(m => { + owner_list_stanza.c('item', { + 'affiliation': m.affiliation, + 'jid': m.jid, + 'nick': m.nick }); - _converse.connection._dataRecv(mock.createRequest(admin_list_stanza)); - } + }); + _converse.connection._dataRecv(mock.createRequest(owner_list_stanza)); + } + return new Promise(resolve => _converse.api.listen.on('membersFetched', resolve)); +}; - if (affiliations.includes('owner')) { - const owner_IQ = await u.waitUntil(() => stanzas.filter( - s => sizzle(`iq[to="${muc_jid}"] query[xmlns="${Strophe.NS.MUC_ADMIN}"] item[affiliation="owner"]`, s).length - ).pop()); - const owner_list_stanza = $iq({ - 'from': 'coven@chat.shakespeare.lit', - 'id': owner_IQ.getAttribute('id'), - 'to': 'romeo@montague.lit/orchard', - 'type': 'result' - }).c('query', {'xmlns': Strophe.NS.MUC_ADMIN}); - members.filter(m => m.affiliation === 'owner').forEach(m => { - owner_list_stanza.c('item', { - 'affiliation': m.affiliation, - 'jid': m.jid, - 'nick': m.nick - }); - }); - _converse.connection._dataRecv(mock.createRequest(owner_list_stanza)); - } - return new Promise(resolve => _converse.api.listen.on('membersFetched', resolve)); - }; +mock.receiveOwnMUCPresence = async function (_converse, muc_jid, nick) { + const sent_stanzas = _converse.connection.sent_stanzas; + await u.waitUntil(() => sent_stanzas.filter(iq => sizzle('presence history', iq).length).pop()); + const presence = $pres({ + to: _converse.connection.jid, + from: `${muc_jid}/${nick}`, + id: u.getUniqueId() + }).c('x').attrs({xmlns:'http://jabber.org/protocol/muc#user'}) + .c('item').attrs({ + affiliation: 'owner', + jid: _converse.bare_jid, + role: 'moderator' + }).up() + .c('status').attrs({code:'110'}); + _converse.connection._dataRecv(mock.createRequest(presence)); +}; - mock.receiveOwnMUCPresence = async function (_converse, muc_jid, nick) { - const sent_stanzas = _converse.connection.sent_stanzas; - await u.waitUntil(() => sent_stanzas.filter(iq => sizzle('presence history', iq).length).pop()); - const presence = $pres({ - to: _converse.connection.jid, - from: `${muc_jid}/${nick}`, - id: u.getUniqueId() - }).c('x').attrs({xmlns:'http://jabber.org/protocol/muc#user'}) - .c('item').attrs({ - affiliation: 'owner', - jid: _converse.bare_jid, - role: 'moderator' + +mock.openAndEnterChatRoom = async function (_converse, muc_jid, nick, features=[], members=[], force_open=true, settings={}) { + const { api } = _converse; + muc_jid = muc_jid.toLowerCase(); + const room_creation_promise = api.rooms.open(muc_jid, settings, force_open); + await mock.getRoomFeatures(_converse, muc_jid, features); + await mock.waitForReservedNick(_converse, muc_jid, nick); + // The user has just entered the room (because join was called) + // and receives their own presence from the server. + // See example 24: https://xmpp.org/extensions/xep-0045.html#enter-pres + await mock.receiveOwnMUCPresence(_converse, muc_jid, nick); + + await room_creation_promise; + const model = _converse.chatboxes.get(muc_jid); + await u.waitUntil(() => (model.session.get('connection_status') === converse.ROOMSTATUS.ENTERED)); + + const affs = _converse.muc_fetch_members; + const all_affiliations = Array.isArray(affs) ? affs : (affs ? ['member', 'admin', 'owner'] : []); + await mock.returnMemberLists(_converse, muc_jid, members, all_affiliations); + return model.messages.fetched; +}; + +mock.createContact = async function (_converse, name, ask, requesting, subscription) { + const jid = name.replace(/ /g,'.').toLowerCase() + '@montague.lit'; + if (_converse.roster.get(jid)) { + return Promise.resolve(); + } + const contact = await new Promise((success, error) => { + _converse.roster.create({ + 'ask': ask, + 'fullname': name, + 'jid': jid, + 'requesting': requesting, + 'subscription': subscription + }, {success, error}); + }); + return contact; +}; + +mock.createContacts = async function (_converse, type, length) { + /* Create current (as opposed to requesting or pending) contacts + * for the user's roster. + * + * These contacts are not grouped. See below. + */ + await _converse.api.waitUntil('rosterContactsFetched'); + let names, subscription, requesting, ask; + if (type === 'requesting') { + names = mock.req_names; + subscription = 'none'; + requesting = true; + ask = null; + } else if (type === 'pending') { + names = mock.pend_names; + subscription = 'none'; + requesting = false; + ask = 'subscribe'; + } else if (type === 'current') { + names = mock.cur_names; + subscription = 'both'; + requesting = false; + ask = null; + } else if (type === 'all') { + await this.createContacts(_converse, 'current'); + await this.createContacts(_converse, 'requesting') + await this.createContacts(_converse, 'pending'); + return this; + } else { + throw Error("Need to specify the type of contact to create"); + } + const promises = names.slice(0, length).map(n => this.createContact(_converse, n, ask, requesting, subscription)); + await Promise.all(promises); +}; + +mock.waitForRoster = async function (_converse, type='current', length=-1, include_nick=true, grouped=true) { + const s = `iq[type="get"] query[xmlns="${Strophe.NS.ROSTER}"]`; + const iq = await u.waitUntil(() => _converse.connection.IQ_stanzas.filter(iq => sizzle(s, iq).length).pop()); + + const result = $iq({ + 'to': _converse.connection.jid, + 'type': 'result', + 'id': iq.getAttribute('id') + }).c('query', { + 'xmlns': 'jabber:iq:roster' + }); + if (type === 'pending' || type === 'all') { + const pend_names = (length > -1) ? mock.pend_names.slice(0, length) : mock.pend_names; + pend_names.map(name => + result.c('item', { + jid: name.replace(/ /g,'.').toLowerCase() + '@montague.lit', + name: include_nick ? name : undefined, + subscription: 'none', + ask: 'subscribe' }).up() - .c('status').attrs({code:'110'}); - _converse.connection._dataRecv(mock.createRequest(presence)); - }; + ); + } + if (type === 'current' || type === 'all') { + const cur_names = Object.keys(mock.current_contacts_map); + const names = (length > -1) ? cur_names.slice(0, length) : cur_names; + names.forEach(name => { + result.c('item', { + jid: name.replace(/ /g,'.').toLowerCase() + '@montague.lit', + name: include_nick ? name : undefined, + subscription: 'both', + ask: null + }); + if (grouped) { + mock.current_contacts_map[name].forEach(g => result.c('group').t(g).up()); + } + result.up(); + }); + } + _converse.connection._dataRecv(mock.createRequest(result)); + await _converse.api.waitUntil('rosterContactsFetched'); +}; + +mock.createChatMessage = function (_converse, sender_jid, message) { + return $msg({ + from: sender_jid, + to: _converse.connection.jid, + type: 'chat', + id: (new Date()).getTime() + }) + .c('body').t(message).up() + .c('markable', {'xmlns': Strophe.NS.MARKERS}).up() + .c('active', {'xmlns': Strophe.NS.CHATSTATES}).tree(); +} + +mock.sendMessage = async function (view, message) { + const promise = new Promise(resolve => view.model.messages.once('rendered', resolve)); + const textarea = await u.waitUntil(() => view.querySelector('.chat-textarea')); + textarea.value = message; + const bottom_panel = view.querySelector('converse-chat-bottom-panel') || view.querySelector('converse-muc-bottom-panel'); + bottom_panel.onKeyDown({ + target: view.querySelector('textarea.chat-textarea'), + preventDefault: () => {}, + keyCode: 13 + }); + return promise; +}; - mock.openAndEnterChatRoom = async function (_converse, muc_jid, nick, features=[], members=[], force_open=true, settings={}) { - const { api } = _converse; - muc_jid = muc_jid.toLowerCase(); - const room_creation_promise = api.rooms.open(muc_jid, settings, force_open); - await mock.getRoomFeatures(_converse, muc_jid, features); - await mock.waitForReservedNick(_converse, muc_jid, nick); - // The user has just entered the room (because join was called) - // and receives their own presence from the server. - // See example 24: https://xmpp.org/extensions/xep-0045.html#enter-pres - await mock.receiveOwnMUCPresence(_converse, muc_jid, nick); - - await room_creation_promise; - const model = _converse.chatboxes.get(muc_jid); - await u.waitUntil(() => (model.session.get('connection_status') === converse.ROOMSTATUS.ENTERED)); - - const affs = _converse.muc_fetch_members; - const all_affiliations = Array.isArray(affs) ? affs : (affs ? ['member', 'admin', 'owner'] : []); - await mock.returnMemberLists(_converse, muc_jid, members, all_affiliations); - return model.messages.fetched; - }; - - mock.createContact = async function (_converse, name, ask, requesting, subscription) { - const jid = name.replace(/ /g,'.').toLowerCase() + '@montague.lit'; - if (_converse.roster.get(jid)) { +window.libsignal = { + 'SignalProtocolAddress': function (name, device_id) { + this.name = name; + this.deviceId = device_id; + }, + 'SessionCipher': function (storage, remote_address) { + this.remoteAddress = remote_address; + this.storage = storage; + this.encrypt = () => Promise.resolve({ + 'type': 1, + 'body': 'c1ph3R73X7', + 'registrationId': '1337' + }); + this.decryptPreKeyWhisperMessage = (key_and_tag) => { + return Promise.resolve(key_and_tag); + }; + this.decryptWhisperMessage = (key_and_tag) => { + return Promise.resolve(key_and_tag); + } + }, + 'SessionBuilder': function (storage, remote_address) { // eslint-disable-line no-unused-vars + this.processPreKey = function () { return Promise.resolve(); } - const contact = await new Promise((success, error) => { - _converse.roster.create({ - 'ask': ask, - 'fullname': name, - 'jid': jid, - 'requesting': requesting, - 'subscription': subscription - }, {success, error}); - }); - return contact; - }; - - mock.createContacts = async function (_converse, type, length) { - /* Create current (as opposed to requesting or pending) contacts - * for the user's roster. - * - * These contacts are not grouped. See below. - */ - await _converse.api.waitUntil('rosterContactsFetched'); - let names, subscription, requesting, ask; - if (type === 'requesting') { - names = mock.req_names; - subscription = 'none'; - requesting = true; - ask = null; - } else if (type === 'pending') { - names = mock.pend_names; - subscription = 'none'; - requesting = false; - ask = 'subscribe'; - } else if (type === 'current') { - names = mock.cur_names; - subscription = 'both'; - requesting = false; - ask = null; - } else if (type === 'all') { - await this.createContacts(_converse, 'current'); - await this.createContacts(_converse, 'requesting') - await this.createContacts(_converse, 'pending'); - return this; - } else { - throw Error("Need to specify the type of contact to create"); - } - const promises = names.slice(0, length).map(n => this.createContact(_converse, n, ask, requesting, subscription)); - await Promise.all(promises); - }; - - mock.waitForRoster = async function (_converse, type='current', length=-1, include_nick=true, grouped=true) { - const s = `iq[type="get"] query[xmlns="${Strophe.NS.ROSTER}"]`; - const iq = await u.waitUntil(() => _converse.connection.IQ_stanzas.filter(iq => sizzle(s, iq).length).pop()); - - const result = $iq({ - 'to': _converse.connection.jid, - 'type': 'result', - 'id': iq.getAttribute('id') - }).c('query', { - 'xmlns': 'jabber:iq:roster' - }); - if (type === 'pending' || type === 'all') { - const pend_names = (length > -1) ? mock.pend_names.slice(0, length) : mock.pend_names; - pend_names.map(name => - result.c('item', { - jid: name.replace(/ /g,'.').toLowerCase() + '@montague.lit', - name: include_nick ? name : undefined, - subscription: 'none', - ask: 'subscribe' - }).up() - ); - } - if (type === 'current' || type === 'all') { - const cur_names = Object.keys(mock.current_contacts_map); - const names = (length > -1) ? cur_names.slice(0, length) : cur_names; - names.forEach(name => { - result.c('item', { - jid: name.replace(/ /g,'.').toLowerCase() + '@montague.lit', - name: include_nick ? name : undefined, - subscription: 'both', - ask: null - }); - if (grouped) { - mock.current_contacts_map[name].forEach(g => result.c('group').t(g).up()); - } - result.up(); + }, + 'KeyHelper': { + 'generateIdentityKeyPair': function () { + return Promise.resolve({ + 'pubKey': new TextEncoder('utf-8').encode('1234'), + 'privKey': new TextEncoder('utf-8').encode('4321') }); - } - _converse.connection._dataRecv(mock.createRequest(result)); - await _converse.api.waitUntil('rosterContactsFetched'); - }; - - mock.createChatMessage = function (_converse, sender_jid, message) { - return $msg({ - from: sender_jid, - to: _converse.connection.jid, - type: 'chat', - id: (new Date()).getTime() - }) - .c('body').t(message).up() - .c('markable', {'xmlns': Strophe.NS.MARKERS}).up() - .c('active', {'xmlns': Strophe.NS.CHATSTATES}).tree(); - } - - mock.sendMessage = async function (view, message) { - const promise = new Promise(resolve => view.model.messages.once('rendered', resolve)); - const textarea = await u.waitUntil(() => view.querySelector('.chat-textarea')); - textarea.value = message; - const bottom_panel = view.querySelector('converse-chat-bottom-panel') || view.querySelector('converse-muc-bottom-panel'); - bottom_panel.onKeyDown({ - target: view.querySelector('textarea.chat-textarea'), - preventDefault: () => {}, - keyCode: 13 - }); - return promise; - }; - - - window.libsignal = { - 'SignalProtocolAddress': function (name, device_id) { - this.name = name; - this.deviceId = device_id; }, - 'SessionCipher': function (storage, remote_address) { - this.remoteAddress = remote_address; - this.storage = storage; - this.encrypt = () => Promise.resolve({ - 'type': 1, - 'body': 'c1ph3R73X7', - 'registrationId': '1337' - }); - this.decryptPreKeyWhisperMessage = (key_and_tag) => { - return Promise.resolve(key_and_tag); - }; - this.decryptWhisperMessage = (key_and_tag) => { - return Promise.resolve(key_and_tag); - } + 'generateRegistrationId': function () { + return '123456789'; }, - 'SessionBuilder': function (storage, remote_address) { // eslint-disable-line no-unused-vars - this.processPreKey = function () { - return Promise.resolve(); - } - }, - 'KeyHelper': { - 'generateIdentityKeyPair': function () { - return Promise.resolve({ + 'generatePreKey': function (keyid) { + return Promise.resolve({ + 'keyId': keyid, + 'keyPair': { 'pubKey': new TextEncoder('utf-8').encode('1234'), 'privKey': new TextEncoder('utf-8').encode('4321') - }); - }, - 'generateRegistrationId': function () { - return '123456789'; - }, - 'generatePreKey': function (keyid) { - return Promise.resolve({ - 'keyId': keyid, - 'keyPair': { - 'pubKey': new TextEncoder('utf-8').encode('1234'), - 'privKey': new TextEncoder('utf-8').encode('4321') - } - }); - }, - 'generateSignedPreKey': function (identity_keypair, keyid) { - return Promise.resolve({ - 'signature': new TextEncoder('utf-8').encode('11112222333344445555'), - 'keyId': keyid, - 'keyPair': { - 'pubKey': new TextEncoder('utf-8').encode('1234'), - 'privKey': new TextEncoder('utf-8').encode('4321') - } - }); - } + } + }); + }, + 'generateSignedPreKey': function (identity_keypair, keyid) { + return Promise.resolve({ + 'signature': new TextEncoder('utf-8').encode('11112222333344445555'), + 'keyId': keyid, + 'keyPair': { + 'pubKey': new TextEncoder('utf-8').encode('1234'), + 'privKey': new TextEncoder('utf-8').encode('4321') + } + }); } - }; + } +}; - mock.default_muc_features = [ - 'http://jabber.org/protocol/muc', - 'jabber:iq:register', - Strophe.NS.SID, - Strophe.NS.MAM, - 'muc_passwordprotected', - 'muc_hidden', - 'muc_temporary', - 'muc_open', - 'muc_unmoderated', - 'muc_anonymous' - ]; +mock.default_muc_features = [ + 'http://jabber.org/protocol/muc', + 'jabber:iq:register', + Strophe.NS.SID, + Strophe.NS.MAM, + 'muc_passwordprotected', + 'muc_hidden', + 'muc_temporary', + 'muc_open', + 'muc_unmoderated', + 'muc_anonymous' +]; - mock.view_mode = 'overlayed'; +mock.view_mode = 'overlayed'; - // Names from http://www.fakenamegenerator.com/ - mock.req_names = [ - 'Escalus, prince of Verona', 'The Nurse', 'Paris' - ]; - mock.pend_names = [ - 'Lord Capulet', 'Guard', 'Servant' - ]; - mock.current_contacts_map = { - 'Mercutio': ['Colleagues', 'friends & acquaintences'], - 'Juliet Capulet': ['friends & acquaintences'], - 'Lady Montague': ['Colleagues', 'Family'], - 'Lord Montague': ['Family'], - 'Friar Laurence': ['friends & acquaintences'], - 'Tybalt': ['friends & acquaintences'], - 'Lady Capulet': ['ænemies'], - 'Benviolo': ['friends & acquaintences'], - 'Balthasar': ['Colleagues'], - 'Peter': ['Colleagues'], - 'Abram': ['Colleagues'], - 'Sampson': ['Colleagues'], - 'Gregory': ['friends & acquaintences'], - 'Potpan': [], - 'Friar John': [] - }; +// Names from http://www.fakenamegenerator.com/ +mock.req_names = [ + 'Escalus, prince of Verona', 'The Nurse', 'Paris' +]; +mock.pend_names = [ + 'Lord Capulet', 'Guard', 'Servant' +]; +mock.current_contacts_map = { + 'Mercutio': ['Colleagues', 'friends & acquaintences'], + 'Juliet Capulet': ['friends & acquaintences'], + 'Lady Montague': ['Colleagues', 'Family'], + 'Lord Montague': ['Family'], + 'Friar Laurence': ['friends & acquaintences'], + 'Tybalt': ['friends & acquaintences'], + 'Lady Capulet': ['ænemies'], + 'Benviolo': ['friends & acquaintences'], + 'Balthasar': ['Colleagues'], + 'Peter': ['Colleagues'], + 'Abram': ['Colleagues'], + 'Sampson': ['Colleagues'], + 'Gregory': ['friends & acquaintences'], + 'Potpan': [], + 'Friar John': [] +}; - const map = mock.current_contacts_map; - const groups_map = {}; - Object.keys(map).forEach(k => { - const groups = map[k].length ? map[k] : ["Ungrouped"]; - Object.values(groups).forEach(g => { - groups_map[g] = groups_map[g] ? [...groups_map[g], k] : [k] - }); +const map = mock.current_contacts_map; +const groups_map = {}; +Object.keys(map).forEach(k => { + const groups = map[k].length ? map[k] : ["Ungrouped"]; + Object.values(groups).forEach(g => { + groups_map[g] = groups_map[g] ? [...groups_map[g], k] : [k] }); - mock.groups_map = groups_map; - - mock.cur_names = Object.keys(mock.current_contacts_map); - mock.num_contacts = mock.req_names.length + mock.pend_names.length + mock.cur_names.length; - - mock.groups = { - 'colleagues': 3, - 'friends & acquaintences': 3, - 'Family': 4, - 'ænemies': 3, - 'Ungrouped': 2 - }; - - mock.chatroom_names = [ - 'Dyon van de Wege', - 'Thomas Kalb', - 'Dirk Theissen', - 'Felix Hofmann', - 'Ka Lek', - 'Anne Ebersbacher' - ]; - // TODO: need to also test other roles and affiliations - mock.chatroom_roles = { - 'Anne Ebersbacher': { affiliation: "owner", role: "moderator" }, - 'Dirk Theissen': { affiliation: "admin", role: "moderator" }, - 'Dyon van de Wege': { affiliation: "member", role: "occupant" }, - 'Felix Hofmann': { affiliation: "member", role: "occupant" }, - 'Ka Lek': { affiliation: "member", role: "occupant" }, - 'Thomas Kalb': { affiliation: "member", role: "occupant" } - }; - - mock.event = { - 'preventDefault': function () {} - }; - - function clearIndexedDB () { - const promise = u.getOpenPromise(); - const db_request = window.indexedDB.open("converse-test-persistent"); - db_request.onsuccess = function () { - const db = db_request.result; - const bare_jid = "romeo@montague.lit"; - let store; - try { - store= db.transaction([bare_jid], "readwrite").objectStore(bare_jid); - } catch (e) { - return promise.resolve(); - } - const request = store.clear(); - request.onsuccess = promise.resolve(); - request.onerror = promise.resolve(); - }; - db_request.onerror = function (ev) { - return promise.reject(ev.target.error); - } - return promise; - } - - function clearStores () { - [localStorage, sessionStorage].forEach( - s => Object.keys(s).forEach(k => k.match(/^converse-test-/) && s.removeItem(k)) - ); - const cache_key = `converse.room-bookmarksromeo@montague.lit`; - window.sessionStorage.removeItem(cache_key+'fetched'); - } - - initConverse = async (settings) => { - clearStores(); - await clearIndexedDB(); - - _converse = await converse.initialize(Object.assign({ - 'animate': false, - 'auto_subscribe': false, - 'bosh_service_url': 'montague.lit/http-bind', - 'discover_connection_methods': false, - 'enable_smacks': false, - 'i18n': 'en', - // 'persistent_store': 'IndexedDB', - 'loglevel': 'warn', - 'no_trimming': true, - 'play_sounds': false, - 'use_emojione': false, - 'view_mode': mock.view_mode - }, settings || {})); - - window._converse = _converse; - - _converse.api.vcard.get = function (model, force) { - let jid; - if (typeof model === 'string' || model instanceof String) { - jid = model; - } else if (!model.get('vcard_updated') || force) { - jid = model.get('jid') || model.get('muc_jid'); - } - let fullname; - if (!jid || jid == 'romeo@montague.lit') { - jid = 'romeo@montague.lit'; - fullname = 'Romeo Montague' ; - } else { - const name = jid.split('@')[0].replace(/\./g, ' ').split(' '); - const last = name.length-1; - name[0] = name[0].charAt(0).toUpperCase()+name[0].slice(1); - name[last] = name[last].charAt(0).toUpperCase()+name[last].slice(1); - fullname = name.join(' '); - } - const vcard = $iq().c('vCard').c('FN').t(fullname).nodeTree; - return { - 'stanza': vcard, - 'fullname': vcard.querySelector('FN')?.textContent, - 'image': vcard.querySelector('PHOTO BINVAL')?.textContent, - 'image_type': vcard.querySelector('PHOTO TYPE')?.textContent, - 'url': vcard.querySelector('URL')?.textContent, - 'vcard_updated': dayjs().format(), - 'vcard_error': undefined - }; - }; - if (settings?.auto_login !== false) { - _converse.api.user.login('romeo@montague.lit/orchard', 'secret'); - await _converse.api.waitUntil('afterResourceBinding'); - } - window.converse_disable_effects = true; - return _converse; - } }); +mock.groups_map = groups_map; -converse.load(); +mock.cur_names = Object.keys(mock.current_contacts_map); +mock.num_contacts = mock.req_names.length + mock.pend_names.length + mock.cur_names.length; + +mock.groups = { + 'colleagues': 3, + 'friends & acquaintences': 3, + 'Family': 4, + 'ænemies': 3, + 'Ungrouped': 2 +}; + +mock.chatroom_names = [ + 'Dyon van de Wege', + 'Thomas Kalb', + 'Dirk Theissen', + 'Felix Hofmann', + 'Ka Lek', + 'Anne Ebersbacher' +]; +// TODO: need to also test other roles and affiliations +mock.chatroom_roles = { + 'Anne Ebersbacher': { affiliation: "owner", role: "moderator" }, + 'Dirk Theissen': { affiliation: "admin", role: "moderator" }, + 'Dyon van de Wege': { affiliation: "member", role: "occupant" }, + 'Felix Hofmann': { affiliation: "member", role: "occupant" }, + 'Ka Lek': { affiliation: "member", role: "occupant" }, + 'Thomas Kalb': { affiliation: "member", role: "occupant" } +}; + +mock.event = { + 'preventDefault': function () {} +}; + +function clearIndexedDB () { + const promise = u.getOpenPromise(); + const db_request = window.indexedDB.open("converse-test-persistent"); + db_request.onsuccess = function () { + const db = db_request.result; + const bare_jid = "romeo@montague.lit"; + let store; + try { + store= db.transaction([bare_jid], "readwrite").objectStore(bare_jid); + } catch (e) { + return promise.resolve(); + } + const request = store.clear(); + request.onsuccess = promise.resolve(); + request.onerror = promise.resolve(); + }; + db_request.onerror = function (ev) { + return promise.reject(ev.target.error); + } + return promise; +} + +function clearStores () { + [localStorage, sessionStorage].forEach( + s => Object.keys(s).forEach(k => k.match(/^converse-test-/) && s.removeItem(k)) + ); + const cache_key = `converse.room-bookmarksromeo@montague.lit`; + window.sessionStorage.removeItem(cache_key+'fetched'); +} + +const initConverse = async (settings) => { + clearStores(); + await clearIndexedDB(); + + _converse = await converse.initialize(Object.assign({ + 'animate': false, + 'auto_subscribe': false, + 'bosh_service_url': 'montague.lit/http-bind', + 'discover_connection_methods': false, + 'enable_smacks': false, + 'i18n': 'en', + // 'persistent_store': 'IndexedDB', + 'loglevel': 'warn', + 'no_trimming': true, + 'play_sounds': false, + 'use_emojione': false, + 'view_mode': mock.view_mode + }, settings || {})); + + window._converse = _converse; + + _converse.api.vcard.get = function (model, force) { + let jid; + if (typeof model === 'string' || model instanceof String) { + jid = model; + } else if (!model.get('vcard_updated') || force) { + jid = model.get('jid') || model.get('muc_jid'); + } + let fullname; + if (!jid || jid == 'romeo@montague.lit') { + jid = 'romeo@montague.lit'; + fullname = 'Romeo Montague' ; + } else { + const name = jid.split('@')[0].replace(/\./g, ' ').split(' '); + const last = name.length-1; + name[0] = name[0].charAt(0).toUpperCase()+name[0].slice(1); + name[last] = name[last].charAt(0).toUpperCase()+name[last].slice(1); + fullname = name.join(' '); + } + const vcard = $iq().c('vCard').c('FN').t(fullname).nodeTree; + return { + 'stanza': vcard, + 'fullname': vcard.querySelector('FN')?.textContent, + 'image': vcard.querySelector('PHOTO BINVAL')?.textContent, + 'image_type': vcard.querySelector('PHOTO TYPE')?.textContent, + 'url': vcard.querySelector('URL')?.textContent, + 'vcard_updated': dayjs().format(), + 'vcard_error': undefined + }; + }; + if (settings?.auto_login !== false) { + _converse.api.user.login('romeo@montague.lit/orchard', 'secret'); + await _converse.api.waitUntil('afterResourceBinding'); + } + window.converse_disable_effects = true; + return _converse; +} diff --git a/src/entry.js b/src/entry.js index bfaa35c90..0474f3cd2 100644 --- a/src/entry.js +++ b/src/entry.js @@ -64,4 +64,15 @@ const converse = { } window.converse = converse; + +/** + * Once Converse.js has loaded, it'll dispatch a custom event with the name `converse-loaded`. + * You can listen for this event in order to be informed as soon as converse.js has been + * loaded and parsed, which would mean it's safe to call `converse.initialize`. + * @event converse-loaded + * @example window.addEventListener('converse-loaded', () => converse.initialize()); + */ +const ev = new CustomEvent('converse-loaded', {'detail': { converse }}); +window.dispatchEvent(ev); + export default converse; diff --git a/src/headless/core.js b/src/headless/core.js index 5a4b845a7..4466999d8 100644 --- a/src/headless/core.js +++ b/src/headless/core.js @@ -1419,13 +1419,3 @@ Object.assign(converse, { u, } }); - -/** - * Once Converse.js has loaded, it'll dispatch a custom event with the name `converse-loaded`. - * You can listen for this event in order to be informed as soon as converse.js has been - * loaded and parsed, which would mean it's safe to call `converse.initialize`. - * @event converse-loaded - * @example window.addEventListener('converse-loaded', () => converse.initialize()); - */ -const ev = new CustomEvent('converse-loaded', {'detail': { converse }}); -window.dispatchEvent(ev); diff --git a/webpack.html b/webpack.html index 2e2f34af3..e789060fe 100644 --- a/webpack.html +++ b/webpack.html @@ -9,37 +9,38 @@ - diff --git a/webpack.prod.js b/webpack.prod.js index d272caf31..66d268fe3 100644 --- a/webpack.prod.js +++ b/webpack.prod.js @@ -5,7 +5,7 @@ const MiniCssExtractPlugin = require('mini-css-extract-plugin'); const common = require("./webpack.common.js"); const path = require('path'); const webpack = require('webpack'); -const { merge} = require("webpack-merge"); +const { merge } = require("webpack-merge"); const plugins = [ new MiniCssExtractPlugin({filename: '../dist/converse.min.css'}), diff --git a/webpack.serve.js b/webpack.serve.js index 5ef31cea0..64ddfb62e 100644 --- a/webpack.serve.js +++ b/webpack.serve.js @@ -1,18 +1,21 @@ -/* global module */ +/* global module, __dirname */ const HTMLWebpackPlugin = require('html-webpack-plugin'); const common = require("./webpack.common.js"); const { merge } = require("webpack-merge"); +const path = require("path"); module.exports = merge(common, { mode: "development", devtool: "inline-source-map", devServer: { - contentBase: "./" + static: [ path.resolve(__dirname, '') ], + port: 3003 }, plugins: [ new HTMLWebpackPlugin({ title: 'Converse.js Dev', - template: 'webpack.html' + template: 'webpack.html', + filename: 'index.html' }) ], });