From a78bfe5a2abe184530bd887713c425ec38fb3a2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82=C4=99biowski-Owczarek?= Date: Thu, 2 Dec 2021 18:54:54 +0100 Subject: [PATCH 001/118] Build: Switch from Travis to GitHub Actions Closes gh-445 --- .github/workflows/node.js.yml | 34 ++++++++++++++++++++++++++++++++++ .travis.yml | 7 ------- README.md | 2 +- 3 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 .github/workflows/node.js.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/node.js.yml b/.github/workflows/node.js.yml new file mode 100644 index 00000000..c09d79ab --- /dev/null +++ b/.github/workflows/node.js.yml @@ -0,0 +1,34 @@ +name: CI + +on: [push, pull_request] + +jobs: + build: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + # Node.js 10 is required by jQuery infra + NODE_VERSION: [10.x, 16.x] + steps: + - name: Checkout + uses: actions/checkout@v2 + + - name: Cache + uses: actions/cache@v2 + with: + path: ~/.npm + key: ${{ runner.os }}-node-${{ matrix.NODE_VERSION }}-npm-lock-${{ hashFiles('**/package-lock.json') }} + restore-keys: | + ${{ runner.os }}-node-${{ matrix.NODE_VERSION }}-npm-lock- + + - name: Use Node.js ${{ matrix.NODE_VERSION }} + uses: actions/setup-node@v2.1.2 + with: + node-version: ${{ matrix.NODE_VERSION }} + + - name: Install npm dependencies + run: npm install + + - name: Run test + run: npm run ci diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 34978f40..00000000 --- a/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: node_js -node_js: -- "14" -addons: - chrome: stable - firefox: latest -script: "npm run ci" diff --git a/README.md b/README.md index fdecbb92..f929b65a 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://travis-ci.org/jquery/jquery-migrate.svg?branch=main)](https://travis-ci.org/jquery/jquery-migrate) +![CI Status](https://github.com/jquery/jquery-migrate/actions/workflows/node.js.yml/badge.svg?branch=main) #### NOTE: To upgrade to jQuery 3.0, you first need version 1.12.x or 2.2.x. If you're using an older version, first upgrade to one of these versions using [jQuery Migrate 1.x](https://github.com/jquery/jquery-migrate/tree/1.x-stable#readme), to resolve any compatibility issues. For more information about the changes made in jQuery 3.0, see the [upgrade guide](https://jquery.com/upgrade-guide/3.0/) and [blog post](https://blog.jquery.com/2016/06/09/jquery-3-0-final-released/). From 3ed29b065b368912905863cfb68f9ef9c8a7d4d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82=C4=99biowski-Owczarek?= Date: Fri, 31 Dec 2021 00:25:55 +0100 Subject: [PATCH 002/118] Docs: Document the warning about the JSON-to-JSONP auto-promotion The warning landed in gh-376 but I forgot to document it. Fixes gh-443 Closes gh-447 Ref gh-376 Co-authored-by: Dave Methvin --- warnings.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/warnings.md b/warnings.md index 7337a8be..18f26f0f 100644 --- a/warnings.md +++ b/warnings.md @@ -87,7 +87,7 @@ This is _not_ a warning, but a console log message the plugin shows when it firs ### JQMIGRATE: jQuery.data() always sets/gets camelCased names -**Cause:** The page is attempting to set or get a jQuery data item using kebab case, e.g. `my-data`, when a `my-data` item has been set directly on the jQuery data object. jQuery 3.0 always exclusively uses camel case, e.g., `myData`, when it accesses data items via the `.data()` API and does not find kebab case data in that object. +**Cause:** The page is attempting to set or get a jQuery data item using kebab case, e.g. `my-data`, when a `my-data` item has been set directly on the jQuery data object. jQuery 3.0 always exclusively uses camel case, e.g., `myData`, when it accesses data items via the `.data()` API and does not find kebab case data in that object. **Solution:** Either 1) Always use the `.data()` API to set or get data items, 2) Always use camelCase names when also setting properties directly on jQuery's data object, or 3) Always set properties directly on the data object without using the API call to set or get data by name. Never mix direct access to the data object and API calls with kebab case names. @@ -225,7 +225,7 @@ See jQuery-ui [commit](https://github.com/jquery/jquery-ui/commit/c0093b599fcd58 ### JQMIGRATE: jQuery.fn.hover() is deprecated -**Cause:** The `.hover()` method is a shorthand for the use of the `mouseover`/`mouseout` events. It is often a poor user interface choice because it does not allow for any small amounts of delay between when the mouse enters or exits an area and when the event fires. This can make it quite difficult to use with UI widgets such as drop-down menus. For more information on the problems of hovering, see the [hoverIntent plugin](http://cherne.net/brian/resources/jquery.hoverIntent.html). +**Cause:** The `.hover()` method is a shorthand for the use of the `mouseover`/`mouseout` events. It is often a poor user interface choice because it does not allow for any small amounts of delay between when the mouse enters or exits an area and when the event fires. This can make it quite difficult to use with UI widgets such as drop-down menus. For more information on the problems of hovering, see the [hoverIntent plugin](http://cherne.net/brian/resources/jquery.hoverIntent.html). **Solution:** Review uses of `.hover()` to determine if they are appropriate, and consider use of plugins such as `hoverIntent` as an alternative. The direct replacement for `.hover(fn1, fn2)`, is `.on("mouseenter", fn1).on("mouseleave", fn2)`. @@ -264,3 +264,9 @@ See jQuery-ui [commit](https://github.com/jquery/jquery-ui/commit/c0093b599fcd58 **Cause:** jQuery 3.5.0 changed the way it processes HTML strings. Previously, jQuery would attempt to fix self-closed tags like `` that the HTML5 specification says are not self-closed, turning it into ``. This processing can create a [security problem](https://nvd.nist.gov/vuln/detail/CVE-2020-11022) with malicious strings, so the functionality had to be removed. **Solution:** Search for the reported HTML strings and edit the tags to close them explicitly. In some cases the strings passed to jQuery may be created inside the program and thus not searchable. Migrate warning messages include a stack trace that can be used to find the location of the usage in the code. + +### JQMIGRATE: JSON-to-JSONP auto-promotion is deprecated + +**Cause:** `jQuery.ajax` calls with `dataType: 'json'` with a provided callback are automatically converted by jQuery to JSONP requests unless the options also specify `jsonp: false`. Auto-promoting JSON requests to JSONP introduces a security risk as the developer may be unaware they're not just downloading data but executing code from a remote domain. This auto-promoting behavior is deprecated and will be removed in jQuery 4.0.0. + +**Solution:** To trigger a JSONP request, specify the `dataType: "jsonp"` option. From 3efa59a03a7efc425587abf82b505b767c09fb62 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jan 2022 19:23:50 +0100 Subject: [PATCH 003/118] Build: Bump follow-redirects from 1.14.0 to 1.14.7 Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.14.0 to 1.14.7. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.14.0...v1.14.7) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Closes gh-453 Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1e1eeee4..08dfe118 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1505,9 +1505,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.0.tgz", - "integrity": "sha512-0vRwd7RKQBTt+mgu87mtYeofLFZpTas2S9zY+jIeuLJMNvudIgF52nr19q40HOwH5RrhWIPuj9puybzSJiRrVg==", + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", "dev": true }, "for-in": { From f0150053ccf3e24da91274f9c6dab99c7f18091a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jan 2022 19:31:33 +0100 Subject: [PATCH 004/118] Build: Bump engine.io from 4.1.1 to 4.1.2 Bumps [engine.io](https://github.com/socketio/engine.io) from 4.1.1 to 4.1.2. - [Release notes](https://github.com/socketio/engine.io/releases) - [Changelog](https://github.com/socketio/engine.io/blob/4.1.2/CHANGELOG.md) - [Commits](https://github.com/socketio/engine.io/compare/4.1.1...4.1.2) --- updated-dependencies: - dependency-name: engine.io dependency-type: indirect ... Closes gh-454 Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 08dfe118..1b387202 100644 --- a/package-lock.json +++ b/package-lock.json @@ -888,9 +888,9 @@ "dev": true }, "engine.io": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.1.tgz", - "integrity": "sha512-t2E9wLlssQjGw0nluF6aYyfX8LwYU8Jj0xct+pAhfWfv/YrBn6TSNtEYsgxHIfaMqfrLx07czcMg9bMN6di+3w==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.2.tgz", + "integrity": "sha512-t5z6zjXuVLhXDMiFJPYsPOWEER8B0tIsD3ETgw19S1yg9zryvUfY3Vhtk3Gf4sihw/bQGIqQ//gjvVlu+Ca0bQ==", "dev": true, "requires": { "accepts": "~1.3.4", From 1f84456d2b4764310235aad1063796413353fabe Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 21 Jan 2022 23:19:39 +0100 Subject: [PATCH 005/118] Build: Bump log4js from 6.3.0 to 6.4.0 Bumps [log4js](https://github.com/log4js-node/log4js-node) from 6.3.0 to 6.4.0. - [Release notes](https://github.com/log4js-node/log4js-node/releases) - [Changelog](https://github.com/log4js-node/log4js-node/blob/master/CHANGELOG.md) - [Commits](https://github.com/log4js-node/log4js-node/compare/v6.3.0...v6.4.0) --- updated-dependencies: - dependency-name: log4js dependency-type: indirect ... Closes gh-455 Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 126 +++++++++++++++++++++++----------------------- 1 file changed, 64 insertions(+), 62 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1b387202..de42a608 100644 --- a/package-lock.json +++ b/package-lock.json @@ -766,12 +766,6 @@ "assert-plus": "^1.0.0" } }, - "date-format": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", - "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", - "dev": true - }, "dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -1548,17 +1542,6 @@ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", "dev": true }, - "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2451,15 +2434,6 @@ "minimist": "^1.2.0" } }, - "jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6" - } - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -2663,22 +2637,75 @@ "dev": true }, "log4js": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", - "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.0.tgz", + "integrity": "sha512-ysc/XUecZJuN8NoKOssk3V0cQ29xY4fra6fnigZa5VwxFsCsvdqsdnEuAxNN89LlHpbE4KUD3zGcn+kFqonSVQ==", "dev": true, "requires": { - "date-format": "^3.0.0", - "debug": "^4.1.1", - "flatted": "^2.0.1", - "rfdc": "^1.1.4", - "streamroller": "^2.2.4" + "date-format": "^4.0.3", + "debug": "^4.3.3", + "flatted": "^3.2.4", + "rfdc": "^1.3.0", + "streamroller": "^3.0.2" }, "dependencies": { + "date-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", + "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==", + "dev": true + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", + "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", + "dev": true + }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "streamroller": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", + "integrity": "sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA==", + "dev": true, + "requires": { + "date-format": "^4.0.3", + "debug": "^4.1.1", + "fs-extra": "^10.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", "dev": true } } @@ -3671,25 +3698,6 @@ "duplexer": "~0.1.1" } }, - "streamroller": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", - "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", - "dev": true, - "requires": { - "date-format": "^2.1.0", - "debug": "^4.1.1", - "fs-extra": "^8.1.0" - }, - "dependencies": { - "date-format": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", - "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", - "dev": true - } - } - }, "string-template": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", @@ -4031,12 +4039,6 @@ "util-deprecate": "^1.0.2" } }, - "universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true - }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", From 5c29fca5b167e329b7b114cc6b481634ef0e3e65 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 11 Feb 2022 12:53:54 +0100 Subject: [PATCH 006/118] Build: Bump karma from 6.3.2 to 6.3.14 Bumps [karma](https://github.com/karma-runner/karma) from 6.3.2 to 6.3.14. - [Release notes](https://github.com/karma-runner/karma/releases) - [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma/compare/v6.3.2...v6.3.14) --- updated-dependencies: - dependency-name: karma dependency-type: direct:development ... Closes gh-456 Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 406 ++++++++++++++++++++++++---------------------- package.json | 2 +- 2 files changed, 214 insertions(+), 194 deletions(-) diff --git a/package-lock.json b/package-lock.json index de42a608..5397a09b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -110,22 +110,28 @@ } } }, + "@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "dev": true + }, "@types/component-emitter": { - "version": "1.2.10", - "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.10.tgz", - "integrity": "sha512-bsjleuRKWmGqajMerkzox19aGbscQX5rmmvvXl3wlIp5gMG1HgkiwPxsN5p070fBDKTNSPgojVbuY1+HWMbFhg==", + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", "dev": true }, "@types/cookie": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.0.tgz", - "integrity": "sha512-y7mImlc/rNkvCRmg8gC3/lj87S7pTUIJ6QGjwHR9WQJcFs+ZMTOaoPrkdFA/YdbuqVEmEbb5RdhVxMkAcgOnpg==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", "dev": true }, "@types/cors": { - "version": "2.8.10", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz", - "integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ==", + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", "dev": true }, "@types/json5": { @@ -141,9 +147,9 @@ "dev": true }, "@types/node": { - "version": "15.0.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz", - "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==", + "version": "17.0.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.17.tgz", + "integrity": "sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==", "dev": true }, "abbrev": { @@ -153,13 +159,30 @@ "dev": true }, "accepts": { - "version": "1.3.7", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", - "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", "dev": true, "requires": { - "mime-types": "~2.1.24", - "negotiator": "0.6.2" + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "dependencies": { + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "requires": { + "mime-db": "1.51.0" + } + } } }, "acorn": { @@ -340,12 +363,6 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "base64-arraybuffer": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", - "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", - "dev": true - }, "base64id": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", @@ -380,27 +397,27 @@ } }, "body-parser": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", - "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", "dev": true, "requires": { - "bytes": "3.1.0", + "bytes": "3.1.1", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", - "http-errors": "1.7.2", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.7.0", - "raw-body": "2.4.0", - "type-is": "~1.6.17" + "qs": "6.9.6", + "raw-body": "2.4.2", + "type-is": "~1.6.18" }, "dependencies": { "bytes": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", - "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", "dev": true }, "debug": { @@ -419,19 +436,19 @@ "dev": true }, "qs": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", - "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", "dev": true }, "raw-body": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", - "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", "dev": true, "requires": { - "bytes": "3.1.0", - "http-errors": "1.7.2", + "bytes": "3.1.1", + "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" } @@ -535,19 +552,19 @@ } }, "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==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" } }, "cliui": { @@ -562,18 +579,18 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -713,9 +730,9 @@ "dev": true }, "cookie": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", - "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", "dev": true }, "core-util-is": { @@ -766,6 +783,12 @@ "assert-plus": "^1.0.0" } }, + "date-format": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", + "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==", + "dev": true + }, "dateformat": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz", @@ -882,27 +905,30 @@ "dev": true }, "engine.io": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-4.1.2.tgz", - "integrity": "sha512-t5z6zjXuVLhXDMiFJPYsPOWEER8B0tIsD3ETgw19S1yg9zryvUfY3Vhtk3Gf4sihw/bQGIqQ//gjvVlu+Ca0bQ==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.2.tgz", + "integrity": "sha512-v/7eGHxPvO2AWsksyx2PUsQvBafuvqs0jJJQ0FdmJG1b9qIvgSbqDRGwNhfk2XHaTTbTXiC4quRE8Q9nRjsrQQ==", "dev": true, "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~4.0.0", - "ws": "~7.4.2" + "engine.io-parser": "~5.0.0", + "ws": "~8.2.3" } }, "engine.io-parser": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-4.0.2.tgz", - "integrity": "sha512-sHfEQv6nmtJrq6TKuIz5kyEKH/qSdK56H/A+7DnAuUPWosnIZAS2NHNcPLmyjtY3cGS/MqJdZbUjW97JU72iYg==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", "dev": true, "requires": { - "base64-arraybuffer": "0.1.4" + "@socket.io/base64-arraybuffer": "~1.0.2" } }, "enquirer": { @@ -1499,9 +1525,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.7", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", - "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", + "version": "1.14.8", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", + "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", "dev": true }, "for-in": { @@ -1542,6 +1568,17 @@ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", "dev": true }, + "fs-extra": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", + "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -2030,24 +2067,16 @@ "dev": true }, "http-errors": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", - "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "dev": true, "requires": { "depd": "~1.1.2", - "inherits": "2.0.3", - "setprototypeof": "1.1.1", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - } + "toidentifier": "1.0.1" } }, "http-parser-js": { @@ -2434,6 +2463,16 @@ "minimist": "^1.2.0" } }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -2447,33 +2486,33 @@ } }, "karma": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.2.tgz", - "integrity": "sha512-fo4Wt0S99/8vylZMxNj4cBFyOBBnC1bewZ0QOlePij/2SZVWxqbyLeIddY13q6URa2EpLRW8ixvFRUMjkmo1bw==", + "version": "6.3.14", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.14.tgz", + "integrity": "sha512-SDFoU5F4LdosEiUVWUDRPCV/C1zQRNtIakx7rWkigf7R4sxGADlSEeOma4S1f/js7YAzvqLW92ByoiQptg+8oQ==", "dev": true, "requires": { "body-parser": "^1.19.0", "braces": "^3.0.2", - "chokidar": "^3.4.2", - "colors": "^1.4.0", + "chokidar": "^3.5.1", + "colors": "1.4.0", "connect": "^3.7.0", "di": "^0.0.1", "dom-serialize": "^2.2.1", - "glob": "^7.1.6", - "graceful-fs": "^4.2.4", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", "http-proxy": "^1.18.1", - "isbinaryfile": "^4.0.6", - "lodash": "^4.17.19", - "log4js": "^6.2.1", - "mime": "^2.4.5", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", "minimatch": "^3.0.4", "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", - "socket.io": "^3.1.0", + "socket.io": "^4.2.0", "source-map": "^0.6.1", - "tmp": "0.2.1", - "ua-parser-js": "^0.7.23", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", "yargs": "^16.1.1" }, "dependencies": { @@ -2637,9 +2676,9 @@ "dev": true }, "log4js": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.0.tgz", - "integrity": "sha512-ysc/XUecZJuN8NoKOssk3V0cQ29xY4fra6fnigZa5VwxFsCsvdqsdnEuAxNN89LlHpbE4KUD3zGcn+kFqonSVQ==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.1.tgz", + "integrity": "sha512-iUiYnXqAmNKiIZ1XSAitQ4TmNs8CdZYTAWINARF3LjnsLN8tY5m0vRwd6uuWj/yNY0YHxeZodnbmxKFUOM2rMg==", "dev": true, "requires": { "date-format": "^4.0.3", @@ -2649,12 +2688,6 @@ "streamroller": "^3.0.2" }, "dependencies": { - "date-format": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", - "integrity": "sha512-7P3FyqDcfeznLZp2b+OMitV9Sz2lUnsT87WaTat9nVwqsBkTzPG3lPLNwW3en6F4pHUiWzr6vb8CLhjdK9bcxQ==", - "dev": true - }, "debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -2665,47 +2698,9 @@ } }, "flatted": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz", - "integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==", - "dev": true - }, - "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - } - }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" - } - }, - "streamroller": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", - "integrity": "sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA==", - "dev": true, - "requires": { - "date-format": "^4.0.3", - "debug": "^4.1.1", - "fs-extra": "^10.0.0" - } - }, - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", "dev": true } } @@ -2796,9 +2791,9 @@ } }, "mime": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.5.2.tgz", - "integrity": "sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg==", + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", "dev": true }, "mime-db": { @@ -2869,9 +2864,9 @@ "dev": true }, "negotiator": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", - "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, "node-watch": { @@ -3362,9 +3357,9 @@ } }, "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==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -3531,9 +3526,9 @@ "dev": true }, "setprototypeof": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", "dev": true }, "shebang-command": { @@ -3574,26 +3569,34 @@ } }, "socket.io": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-3.1.2.tgz", - "integrity": "sha512-JubKZnTQ4Z8G4IZWtaAZSiRP3I/inpy8c/Bsx2jrwGrTbKeVU5xd6qkKMHpChYeM3dWZSO0QACiGK+obhBNwYw==", + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", "dev": true, "requires": { - "@types/cookie": "^0.4.0", - "@types/cors": "^2.8.8", - "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "~2.0.0", - "debug": "~4.3.1", - "engine.io": "~4.1.0", - "socket.io-adapter": "~2.1.0", - "socket.io-parser": "~4.0.3" + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + }, + "dependencies": { + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } } }, "socket.io-adapter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.1.0.tgz", - "integrity": "sha512-+vDov/aTsLjViYTwS9fPy5pEtTkrbEKsw2M+oVSoFGw6OD1IpvlV1VPhUzNbofCQ8oyMbdYJqDtGdmHQK6TdPg==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", "dev": true }, "socket.io-parser": { @@ -3698,6 +3701,17 @@ "duplexer": "~0.1.1" } }, + "streamroller": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.2.tgz", + "integrity": "sha512-ur6y5S5dopOaRXBuRIZ1u6GC5bcEXHRZKgfBjfCglMhmIf+roVCECjvkEYzNQOXIN2/JPnkMPW/8B3CZoKaEPA==", + "dev": true, + "requires": { + "date-format": "^4.0.3", + "debug": "^4.1.1", + "fs-extra": "^10.0.0" + } + }, "string-template": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", @@ -3932,9 +3946,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, "tough-cookie": { @@ -4000,9 +4014,9 @@ } }, "ua-parser-js": { - "version": "0.7.28", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.28.tgz", - "integrity": "sha512-6Gurc1n//gjp9eQNXjD9O3M/sMwVtN5S8Lv9bvOYBfKfDNiIIhqiyi01vMBO45u4zkDE420w/e0se7Vs+sIg+g==", + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", "dev": true }, "uglify-js": { @@ -4039,6 +4053,12 @@ "util-deprecate": "^1.0.2" } }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -4183,18 +4203,18 @@ }, "dependencies": { "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { - "ansi-regex": "^5.0.0" + "ansi-regex": "^5.0.1" } } } @@ -4206,9 +4226,9 @@ "dev": true }, "ws": { - "version": "7.4.6", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", "dev": true }, "y18n": { @@ -4239,9 +4259,9 @@ } }, "yargs-parser": { - "version": "20.2.7", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz", - "integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==", + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true } } diff --git a/package.json b/package.json index 29c715cc..443e8037 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "grunt-karma": "4.0.0", "grunt-npmcopy": "0.2.0", "gzip-js": "0.3.2", - "karma": "6.3.2", + "karma": "6.3.14", "karma-browserstack-launcher": "1.6.0", "karma-chrome-launcher": "3.1.0", "karma-firefox-launcher": "2.1.0", From c6d3ca2b45fe92baf841f613ed36a2ce817f5ea0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 2 Mar 2022 17:20:25 +0100 Subject: [PATCH 007/118] Build: Bump karma from 6.3.14 to 6.3.16 Bumps [karma](https://github.com/karma-runner/karma) from 6.3.14 to 6.3.16. - [Release notes](https://github.com/karma-runner/karma/releases) - [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma/compare/v6.3.14...v6.3.16) Closes gh-457 --- updated-dependencies: - dependency-name: karma dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 74 +++++++++++++++++++++++++++-------------------- package.json | 2 +- 2 files changed, 43 insertions(+), 33 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5397a09b..d553ee4e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -147,9 +147,9 @@ "dev": true }, "@types/node": { - "version": "17.0.17", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.17.tgz", - "integrity": "sha512-e8PUNQy1HgJGV3iU/Bp2+D/DXh3PYeyli8LgIwsQcs1Ar1LoaWHSIT6Rw+H2rNJmiq6SNWiDytfx8+gYj7wDHw==", + "version": "17.0.21", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.21.tgz", + "integrity": "sha512-DBZCJbhII3r90XbQxI8Y9IjjiiOGlZ0Hr32omXIZvwwZ7p4DMMXGrKXVyPfuoBOri9XNtL0UK69jYIBIsRX3QQ==", "dev": true }, "abbrev": { @@ -397,27 +397,27 @@ } }, "body-parser": { - "version": "1.19.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", - "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-SAAwOxgoCKMGs9uUAUFHygfLAyaniaoun6I8mFY9pRAJL9+Kec34aU+oIjDhTycub1jozEfEwx1W1IuOYxVSFw==", "dev": true, "requires": { - "bytes": "3.1.1", + "bytes": "3.1.2", "content-type": "~1.0.4", "debug": "2.6.9", "depd": "~1.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "on-finished": "~2.3.0", - "qs": "6.9.6", - "raw-body": "2.4.2", + "qs": "6.9.7", + "raw-body": "2.4.3", "type-is": "~1.6.18" }, "dependencies": { "bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true }, "debug": { @@ -436,18 +436,18 @@ "dev": true }, "qs": { - "version": "6.9.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", - "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-IhMFgUmuNpyRfxA90umL7ByLlgRXu6tIfKPpF5TmcfRLlLCckfP/g3IQmju6jjpu+Hh8rA+2p6A27ZSPOOHdKw==", "dev": true }, "raw-body": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", - "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.3.tgz", + "integrity": "sha512-UlTNLIcu0uzb4D2f4WltY6cVjLi+/jEN4lgEUj3E04tpMDpUlkBo/eSn6zou9hum2VMNpCCUone0O0WeJim07g==", "dev": true, "requires": { - "bytes": "3.1.1", + "bytes": "3.1.2", "http-errors": "1.8.1", "iconv-lite": "0.4.24", "unpipe": "1.0.0" @@ -905,9 +905,9 @@ "dev": true }, "engine.io": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.2.tgz", - "integrity": "sha512-v/7eGHxPvO2AWsksyx2PUsQvBafuvqs0jJJQ0FdmJG1b9qIvgSbqDRGwNhfk2XHaTTbTXiC4quRE8Q9nRjsrQQ==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", + "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -918,7 +918,7 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.0", + "engine.io-parser": "~5.0.3", "ws": "~8.2.3" } }, @@ -1525,9 +1525,9 @@ "dev": true }, "follow-redirects": { - "version": "1.14.8", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.8.tgz", - "integrity": "sha512-1x0S9UVJHsQprFcEC/qnNzBLcIxsjAV905f/UkQxbclCsoTWlacCNOpQa/anodLl2uaEKFhfWOvM2Qg77+15zA==", + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "dev": true }, "for-in": { @@ -1569,9 +1569,9 @@ "dev": true }, "fs-extra": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz", - "integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", "dev": true, "requires": { "graceful-fs": "^4.2.0", @@ -2486,9 +2486,9 @@ } }, "karma": { - "version": "6.3.14", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.14.tgz", - "integrity": "sha512-SDFoU5F4LdosEiUVWUDRPCV/C1zQRNtIakx7rWkigf7R4sxGADlSEeOma4S1f/js7YAzvqLW92ByoiQptg+8oQ==", + "version": "6.3.16", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.16.tgz", + "integrity": "sha512-nEU50jLvDe5yvXqkEJRf8IuvddUkOY2x5Xc4WXHz6dxINgGDrgD2uqQWeVrJs4hbfNaotn+HQ1LZJ4yOXrL7xQ==", "dev": true, "requires": { "body-parser": "^1.19.0", @@ -2506,6 +2506,7 @@ "log4js": "^6.4.1", "mime": "^2.5.2", "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", "qjobs": "^1.2.0", "range-parser": "^1.2.1", "rimraf": "^3.0.2", @@ -2521,6 +2522,15 @@ "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } } } }, diff --git a/package.json b/package.json index 443e8037..506d3eb6 100644 --- a/package.json +++ b/package.json @@ -41,7 +41,7 @@ "grunt-karma": "4.0.0", "grunt-npmcopy": "0.2.0", "gzip-js": "0.3.2", - "karma": "6.3.14", + "karma": "6.3.16", "karma-browserstack-launcher": "1.6.0", "karma-chrome-launcher": "3.1.0", "karma-firefox-launcher": "2.1.0", From 5ee8f69499af8aaa509c6107644babc822f802c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Go=C5=82=C4=99biowski-Owczarek?= Date: Mon, 14 Mar 2022 17:31:40 +0100 Subject: [PATCH 008/118] Core: Support selectively disabling Migrate patches This adds three new APIs: * `jQuery.migrateDisablePatches` * `jQuery.migrateEnablePatches` * `jQuery.migrateIsPatchEnabled` allowing to selectively disable/re-enable patches in runtime. Source code is refactored to avoid manually overwriting jQuery methods in favor of using `migratePatchAndWarnFunc` or `migratePatchFunc` which cooperate with above methods. The `jQuery.UNSAFE_restoreLegacyHtmlPrefilter` API, introduced in Migrate 3.2.0, is now deprecated in favor of calling: ```js jQuery.migrateEnablePatches( "self-closed-tags" ); ``` The commit also reorganizes test code a bit, grouping modules testing patches to jQuery modules in a separate directory and extracting tests of Migrate APIs out of `core.js` to a separate `migrate.js` file. Helper files are now put in `test/data/` and unit tests in `test/unit/`; jQuery patch tests are in `test/unit/jquery/`. Fixes gh-449 Closes gh-450 --- Gruntfile.js | 29 ++--- README.md | 8 ++ src/disablePatches.js | 33 ++++++ src/jquery/ajax.js | 14 +-- src/jquery/attributes.js | 16 +-- src/jquery/core.js | 80 +++++++------ src/jquery/css.js | 41 ++++--- src/jquery/data.js | 24 ++-- src/jquery/deferred.js | 16 +-- src/jquery/effects.js | 21 ++-- src/jquery/event.js | 88 ++++++++------- src/jquery/manipulation.js | 26 +++-- src/jquery/offset.js | 12 +- src/jquery/serialize.js | 14 ++- src/jquery/traversing.js | 10 +- src/main.js | 56 +++++++-- test/{ => data}/core-jquery2.html | 2 +- test/{ => data}/event-fixHooks.html | 0 test/{ => data}/event-lateload.html | 2 +- test/{ => data}/event-props-concat.html | 0 test/{ => data}/event-props.html | 0 test/{ => data}/event-ready.html | 0 test/{ => data}/iframeTest.js | 0 test/{migrate.js => data/test-utils.js} | 0 test/{ => data}/testinit.js | 68 +++++++---- test/index.html | 29 ++--- ...ion-UNSAFE_restoreLegacyHtmlPrefilter.html | 31 ----- test/{ => unit/jquery}/ajax.js | 12 +- test/{ => unit/jquery}/attributes.js | 0 test/{ => unit/jquery}/core.js | 50 +-------- test/{ => unit/jquery}/css.js | 0 test/{ => unit/jquery}/data.js | 0 test/{ => unit/jquery}/deferred.js | 0 test/{ => unit/jquery}/effects.js | 0 test/{ => unit/jquery}/event.js | 0 test/{ => unit/jquery}/manipulation.js | 29 +++-- test/{ => unit/jquery}/offset.js | 0 test/{ => unit/jquery}/serialize.js | 0 test/{ => unit/jquery}/traversing.js | 0 test/unit/migrate.js | 101 +++++++++++++++++ warnings.md | 106 ++++++++++-------- 41 files changed, 557 insertions(+), 361 deletions(-) create mode 100644 src/disablePatches.js rename test/{ => data}/core-jquery2.html (91%) rename test/{ => data}/event-fixHooks.html (100%) rename test/{ => data}/event-lateload.html (94%) rename test/{ => data}/event-props-concat.html (100%) rename test/{ => data}/event-props.html (100%) rename test/{ => data}/event-ready.html (100%) rename test/{ => data}/iframeTest.js (100%) rename test/{migrate.js => data/test-utils.js} (100%) rename test/{ => data}/testinit.js (75%) delete mode 100644 test/manipulation-UNSAFE_restoreLegacyHtmlPrefilter.html rename test/{ => unit/jquery}/ajax.js (90%) rename test/{ => unit/jquery}/attributes.js (100%) rename test/{ => unit/jquery}/core.js (89%) rename test/{ => unit/jquery}/css.js (100%) rename test/{ => unit/jquery}/data.js (100%) rename test/{ => unit/jquery}/deferred.js (100%) rename test/{ => unit/jquery}/effects.js (100%) rename test/{ => unit/jquery}/event.js (100%) rename test/{ => unit/jquery}/manipulation.js (62%) rename test/{ => unit/jquery}/offset.js (100%) rename test/{ => unit/jquery}/serialize.js (100%) rename test/{ => unit/jquery}/traversing.js (100%) create mode 100644 test/unit/migrate.js diff --git a/Gruntfile.js b/Gruntfile.js index eda8d5cf..e0e62123 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -11,20 +11,21 @@ module.exports = function( grunt ) { "dist/jquery-migrate.min.js", "test/data/compareVersions.js", - "test/testinit.js", - "test/migrate.js", - "test/core.js", - "test/ajax.js", - "test/attributes.js", - "test/css.js", - "test/data.js", - "test/deferred.js", - "test/effects.js", - "test/event.js", - "test/manipulation.js", - "test/offset.js", - "test/serialize.js", - "test/traversing.js", + "test/data/testinit.js", + "test/data/test-utils.js", + "test/unit/migrate.js", + "test/unit/jquery/core.js", + "test/unit/jquery/ajax.js", + "test/unit/jquery/attributes.js", + "test/unit/jquery/css.js", + "test/unit/jquery/data.js", + "test/unit/jquery/deferred.js", + "test/unit/jquery/effects.js", + "test/unit/jquery/event.js", + "test/unit/jquery/manipulation.js", + "test/unit/jquery/offset.js", + "test/unit/jquery/serialize.js", + "test/unit/jquery/traversing.js", { pattern: "dist/jquery-migrate.js", included: false, served: true }, { pattern: "test/**/*.@(js|json|css|jpg|html|xml)", included: false, served: true } diff --git a/README.md b/README.md index f929b65a..53849d4e 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,14 @@ This plugin adds some properties to the `jQuery` object that can be used to prog `jQuery.migrateDeduplicateWarnings`: By default, Migrate only gives a specific warning once. If you set this property to `false` it will give a warning for every occurrence each time it happens. Note that this can generate a lot of output, for example when a warning occurs in a loop. +`jQuery.migrateDisablePatches`: Disables patches by their codes. You can find a code for each patch in square brackets in [warnings.md](https://github.com/jquery/jquery-migrate/blob/main/warnings.md). A limited number of warnings doesn't have codes defined and cannot be disabled. These are mostly setup issues like using an incorrect version of jQuery or loading Migrate multiple times. + +`jQuery.migrateDisablePatches`: Disables patches by their codes. + +`jQuery.migrateIsPatchEnabled`: Returns `true` if a patch of a provided code is enabled and `false` otherwise. + +`jQuery.UNSAFE_restoreLegacyHtmlPrefilter`: A deprecated alias of `jQuery.migrateEnablePatches( "self-closed-tags" )` + ## Reporting problems Bugs that only occur when the jQuery Migrate plugin is used should be reported in the [jQuery Migrate Issue Tracker](https://github.com/jquery/jquery-migrate/issues) and should be accompanied by an executable test case that demonstrates the bug. The easiest way to do this is via an online test tool such as [jsFiddle.net](https://jsFiddle.net/) or [jsbin.com](https://jsbin.com). Use the development version when you are reporting bugs. diff --git a/src/disablePatches.js b/src/disablePatches.js new file mode 100644 index 00000000..07238a3c --- /dev/null +++ b/src/disablePatches.js @@ -0,0 +1,33 @@ +// A map from disabled patch codes to `true`. This should really +// be a `Set` but those are unsupported in IE. +var disabledPatches = Object.create( null ); + +// Don't apply patches for specified codes. Helpful for code bases +// where some Migrate warnings have been addressed and it's desirable +// to avoid needless patches or false positives. +jQuery.migrateDisablePatches = function() { + var i; + for ( i = 0; i < arguments.length; i++ ) { + disabledPatches[ arguments[ i ] ] = true; + } +}; + +// Allow enabling patches disabled via `jQuery.migrateDisablePatches`. +// Helpful if you want to disable a patch only for some code that won't +// be updated soon to be able to focus on other warnings - and enable it +// immediately after such a call: +// ```js +// jQuery.migrateDisablePatches( "workaroundA" ); +// elem.pluginViolatingWarningA( "pluginMethod" ); +// jQuery.migrateEnablePatches( "workaroundA" ); +// ``` +jQuery.migrateEnablePatches = function() { + var i; + for ( i = 0; i < arguments.length; i++ ) { + delete disabledPatches[ arguments[ i ] ]; + } +}; + +jQuery.migrateIsPatchEnabled = function( patchCode ) { + return !disabledPatches[ patchCode ]; +}; diff --git a/src/jquery/ajax.js b/src/jquery/ajax.js index 06b24a44..2caf7929 100644 --- a/src/jquery/ajax.js +++ b/src/jquery/ajax.js @@ -1,5 +1,5 @@ import { jQueryVersionSince } from "../compareVersions.js"; -import { migrateWarn, migrateWarnFunc } from "../main.js"; +import { migrateWarn, migratePatchAndWarnFunc, migratePatchFunc } from "../main.js"; // Support jQuery slim which excludes the ajax module if ( jQuery.ajax ) { @@ -7,21 +7,21 @@ if ( jQuery.ajax ) { var oldAjax = jQuery.ajax, rjsonp = /(=)\?(?=&|$)|\?\?/; -jQuery.ajax = function( ) { +migratePatchFunc( jQuery, "ajax", function() { var jQXHR = oldAjax.apply( this, arguments ); // Be sure we got a jQXHR (e.g., not sync) if ( jQXHR.promise ) { - migrateWarnFunc( jQXHR, "success", jQXHR.done, + migratePatchAndWarnFunc( jQXHR, "success", jQXHR.done, "jqXHR-methods", "jQXHR.success is deprecated and removed" ); - migrateWarnFunc( jQXHR, "error", jQXHR.fail, + migratePatchAndWarnFunc( jQXHR, "error", jQXHR.fail, "jqXHR-methods", "jQXHR.error is deprecated and removed" ); - migrateWarnFunc( jQXHR, "complete", jQXHR.always, + migratePatchAndWarnFunc( jQXHR, "complete", jQXHR.always, "jqXHR-methods", "jQXHR.complete is deprecated and removed" ); } return jQXHR; -}; +}, "jqXHR-methods" ); // Only trigger the logic in jQuery <4 as the JSON-to-JSONP auto-promotion // behavior is gone in jQuery 4.0 and as it has security implications, we don't @@ -40,7 +40,7 @@ if ( !jQueryVersionSince( "4.0.0" ) ) { .indexOf( "application/x-www-form-urlencoded" ) === 0 && rjsonp.test( s.data ) ) ) { - migrateWarn( "JSON-to-JSONP auto-promotion is deprecated" ); + migrateWarn( "jsonp-promotion", "JSON-to-JSONP auto-promotion is deprecated" ); } } ); } diff --git a/src/jquery/attributes.js b/src/jquery/attributes.js index 1efd9368..6228c163 100644 --- a/src/jquery/attributes.js +++ b/src/jquery/attributes.js @@ -1,30 +1,32 @@ -import { migrateWarn } from "../main.js"; +import { migratePatchFunc, migrateWarn } from "../main.js"; var oldRemoveAttr = jQuery.fn.removeAttr, oldToggleClass = jQuery.fn.toggleClass, rmatchNonSpace = /\S+/g; -jQuery.fn.removeAttr = function( name ) { +migratePatchFunc( jQuery.fn, "removeAttr", function( name ) { var self = this; jQuery.each( name.match( rmatchNonSpace ), function( _i, attr ) { if ( jQuery.expr.match.bool.test( attr ) ) { - migrateWarn( "jQuery.fn.removeAttr no longer sets boolean properties: " + attr ); + migrateWarn( "removeAttr-bool", + "jQuery.fn.removeAttr no longer sets boolean properties: " + attr ); self.prop( attr, false ); } } ); return oldRemoveAttr.apply( this, arguments ); -}; +}, "removeAttr-bool" ); -jQuery.fn.toggleClass = function( state ) { +migratePatchFunc( jQuery.fn, "toggleClass", function( state ) { // Only deprecating no-args or single boolean arg if ( state !== undefined && typeof state !== "boolean" ) { + return oldToggleClass.apply( this, arguments ); } - migrateWarn( "jQuery.fn.toggleClass( boolean ) is deprecated" ); + migrateWarn( "toggleClass-bool", "jQuery.fn.toggleClass( boolean ) is deprecated" ); // Toggle entire class name of each element return this.each( function() { @@ -46,4 +48,4 @@ jQuery.fn.toggleClass = function( state ) { ); } } ); -}; +}, "toggleClass-bool" ); diff --git a/src/jquery/core.js b/src/jquery/core.js index be411f54..e67b5782 100644 --- a/src/jquery/core.js +++ b/src/jquery/core.js @@ -1,5 +1,11 @@ import { jQueryVersionSince } from "../compareVersions.js"; -import { migrateWarn, migrateWarnFunc, migrateWarnProp } from "../main.js"; +import { + migratePatchFunc, + migrateWarn, + migratePatchAndWarnFunc, + migrateWarnProp +} from "../main.js"; +import "../disablePatches.js"; var findProp, class2type = {}, @@ -13,21 +19,27 @@ var findProp, // Make sure we trim BOM and NBSP rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; -jQuery.fn.init = function( arg1 ) { +migratePatchFunc( jQuery.fn, "init", function( arg1 ) { var args = Array.prototype.slice.call( arguments ); - if ( typeof arg1 === "string" && arg1 === "#" ) { + if ( jQuery.migrateIsPatchEnabled( "selector-empty-id" ) && + typeof arg1 === "string" && arg1 === "#" ) { - // JQuery( "#" ) is a bogus ID selector, but it returned an empty set before jQuery 3.0 - migrateWarn( "jQuery( '#' ) is not a valid selector" ); + // JQuery( "#" ) is a bogus ID selector, but it returned an empty set + // before jQuery 3.0 + migrateWarn( "selector-empty-id", "jQuery( '#' ) is not a valid selector" ); args[ 0 ] = []; } return oldInit.apply( this, args ); -}; +}, "selector-empty-id" ); + +// This is already done in Core but the above patch will lose this assignment +// so we need to redo it. It doesn't matter whether the patch is enabled or not +// as the method is always going to be a Migrate-created wrapper. jQuery.fn.init.prototype = jQuery.fn; -jQuery.find = function( selector ) { +migratePatchFunc( jQuery, "find", function( selector ) { var args = Array.prototype.slice.call( arguments ); // Support: PhantomJS 1.x @@ -49,16 +61,18 @@ jQuery.find = function( selector ) { // Note that there may be false alarms if selector uses jQuery extensions try { window.document.querySelector( selector ); - migrateWarn( "Attribute selector with '#' must be quoted: " + args[ 0 ] ); + migrateWarn( "selector-hash", + "Attribute selector with '#' must be quoted: " + args[ 0 ] ); args[ 0 ] = selector; } catch ( err2 ) { - migrateWarn( "Attribute selector with '#' was not fixed: " + args[ 0 ] ); + migrateWarn( "selector-hash", + "Attribute selector with '#' was not fixed: " + args[ 0 ] ); } } } return oldFind.apply( this, args ); -}; +}, "selector-hash" ); // Copy properties attached to original jQuery.find method (e.g. .attr, .isXML) for ( findProp in oldFind ) { @@ -68,53 +82,53 @@ for ( findProp in oldFind ) { } // The number of elements contained in the matched element set -migrateWarnFunc( jQuery.fn, "size", function() { +migratePatchAndWarnFunc( jQuery.fn, "size", function() { return this.length; -}, +}, "size", "jQuery.fn.size() is deprecated and removed; use the .length property" ); -migrateWarnFunc( jQuery, "parseJSON", function() { +migratePatchAndWarnFunc( jQuery, "parseJSON", function() { return JSON.parse.apply( null, arguments ); -}, +}, "parseJSON", "jQuery.parseJSON is deprecated; use JSON.parse" ); -migrateWarnFunc( jQuery, "holdReady", jQuery.holdReady, - "jQuery.holdReady is deprecated" ); +migratePatchAndWarnFunc( jQuery, "holdReady", jQuery.holdReady, + "holdReady", "jQuery.holdReady is deprecated" ); -migrateWarnFunc( jQuery, "unique", jQuery.uniqueSort, - "jQuery.unique is deprecated; use jQuery.uniqueSort" ); +migratePatchAndWarnFunc( jQuery, "unique", jQuery.uniqueSort, + "unique", "jQuery.unique is deprecated; use jQuery.uniqueSort" ); // Now jQuery.expr.pseudos is the standard incantation -migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos, +migrateWarnProp( jQuery.expr, "filters", jQuery.expr.pseudos, "expr-pre-pseudos", "jQuery.expr.filters is deprecated; use jQuery.expr.pseudos" ); -migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos, +migrateWarnProp( jQuery.expr, ":", jQuery.expr.pseudos, "expr-pre-pseudos", "jQuery.expr[':'] is deprecated; use jQuery.expr.pseudos" ); // Prior to jQuery 3.1.1 there were internal refs so we don't warn there if ( jQueryVersionSince( "3.1.1" ) ) { - migrateWarnFunc( jQuery, "trim", function( text ) { + migratePatchAndWarnFunc( jQuery, "trim", function( text ) { return text == null ? "" : ( text + "" ).replace( rtrim, "" ); - }, + }, "trim", "jQuery.trim is deprecated; use String.prototype.trim" ); } // Prior to jQuery 3.2 there were internal refs so we don't warn there if ( jQueryVersionSince( "3.2.0" ) ) { - migrateWarnFunc( jQuery, "nodeName", function( elem, name ) { + migratePatchAndWarnFunc( jQuery, "nodeName", function( elem, name ) { return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - }, + }, "nodeName", "jQuery.nodeName is deprecated" ); - migrateWarnFunc( jQuery, "isArray", Array.isArray, + migratePatchAndWarnFunc( jQuery, "isArray", Array.isArray, "isArray", "jQuery.isArray is deprecated; use Array.isArray" ); } if ( jQueryVersionSince( "3.3.0" ) ) { - migrateWarnFunc( jQuery, "isNumeric", function( obj ) { + migratePatchAndWarnFunc( jQuery, "isNumeric", function( obj ) { // As of jQuery 3.0, isNumeric is limited to // strings and numbers (primitives or objects) @@ -126,7 +140,7 @@ if ( jQueryVersionSince( "3.3.0" ) ) { // ...but misinterprets leading-number strings, e.g. hex literals ("0x...") // subtraction forces infinities to NaN !isNaN( obj - parseFloat( obj ) ); - }, + }, "isNumeric", "jQuery.isNumeric() is deprecated" ); @@ -137,7 +151,7 @@ if ( jQueryVersionSince( "3.3.0" ) ) { class2type[ "[object " + name + "]" ] = name.toLowerCase(); } ); - migrateWarnFunc( jQuery, "type", function( obj ) { + migratePatchAndWarnFunc( jQuery, "type", function( obj ) { if ( obj == null ) { return obj + ""; } @@ -146,19 +160,19 @@ if ( jQueryVersionSince( "3.3.0" ) ) { return typeof obj === "object" || typeof obj === "function" ? class2type[ Object.prototype.toString.call( obj ) ] || "object" : typeof obj; - }, + }, "type", "jQuery.type is deprecated" ); - migrateWarnFunc( jQuery, "isFunction", + migratePatchAndWarnFunc( jQuery, "isFunction", function( obj ) { return typeof obj === "function"; - }, + }, "isFunction", "jQuery.isFunction() is deprecated" ); - migrateWarnFunc( jQuery, "isWindow", + migratePatchAndWarnFunc( jQuery, "isWindow", function( obj ) { return obj != null && obj === obj.window; - }, + }, "isWindow", "jQuery.isWindow() is deprecated" ); } diff --git a/src/jquery/css.js b/src/jquery/css.js index f04b3649..fadcb11d 100644 --- a/src/jquery/css.js +++ b/src/jquery/css.js @@ -1,8 +1,8 @@ import { jQueryVersionSince } from "../compareVersions.js"; -import { migrateWarn } from "../main.js"; +import { migrateWarn, migratePatchFunc } from "../main.js"; import { camelCase } from "../utils.js"; -var oldFnCss, +var origFnCss, internalSwapCall = false, ralphaStart = /^[a-z]/, @@ -47,12 +47,12 @@ if ( jQuery.swap ) { } ); } -jQuery.swap = function( elem, options, callback, args ) { +migratePatchFunc( jQuery, "swap", function( elem, options, callback, args ) { var ret, name, old = {}; if ( !internalSwapCall ) { - migrateWarn( "jQuery.swap() is undocumented and deprecated" ); + migrateWarn( "swap", "jQuery.swap() is undocumented and deprecated" ); } // Remember the old values, and insert the new ones @@ -69,13 +69,12 @@ jQuery.swap = function( elem, options, callback, args ) { } return ret; -}; +}, "swap" ); if ( jQueryVersionSince( "3.4.0" ) && typeof Proxy !== "undefined" ) { - jQuery.cssProps = new Proxy( jQuery.cssProps || {}, { set: function() { - migrateWarn( "jQuery.cssProps is deprecated" ); + migrateWarn( "cssProps", "jQuery.cssProps is deprecated" ); return Reflect.set.apply( this, arguments ); } } ); @@ -85,8 +84,8 @@ if ( jQueryVersionSince( "3.4.0" ) && typeof Proxy !== "undefined" ) { // https://github.com/jquery/jquery/blob/3.6.0/src/css.js#L212-L233 // This way, number values for the CSS properties below won't start triggering // Migrate warnings when jQuery gets updated to >=4.0.0 (gh-438). -if ( !jQuery.cssNumber ) { - jQuery.cssNumber = { +if ( jQueryVersionSince( "4.0.0" ) && typeof Proxy !== "undefined" ) { + jQuery.cssNumber = new Proxy( { animationIterationCount: true, columnCount: true, fillOpacity: true, @@ -107,7 +106,16 @@ if ( !jQuery.cssNumber ) { widows: true, zIndex: true, zoom: true - }; + }, { + get: function() { + migrateWarn( "css-number", "jQuery.cssNumber is deprecated" ); + return Reflect.get.apply( this, arguments ); + }, + set: function() { + migrateWarn( "css-number", "jQuery.cssNumber is deprecated" ); + return Reflect.set.apply( this, arguments ); + } + } ); } function isAutoPx( prop ) { @@ -119,24 +127,27 @@ function isAutoPx( prop ) { rautoPx.test( prop[ 0 ].toUpperCase() + prop.slice( 1 ) ); } -oldFnCss = jQuery.fn.css; +origFnCss = jQuery.fn.css; -jQuery.fn.css = function( name, value ) { +migratePatchFunc( jQuery.fn, "css", function( name, value ) { var camelName, origThis = this; + if ( name && typeof name === "object" && !Array.isArray( name ) ) { jQuery.each( name, function( n, v ) { jQuery.fn.css.call( origThis, n, v ); } ); return this; } + if ( typeof value === "number" ) { camelName = camelCase( name ); if ( !isAutoPx( camelName ) && !jQuery.cssNumber[ camelName ] ) { - migrateWarn( "Number-typed values are deprecated for jQuery.fn.css( \"" + + migrateWarn( "css-number", + "Number-typed values are deprecated for jQuery.fn.css( \"" + name + "\", value )" ); } } - return oldFnCss.apply( this, arguments ); -}; + return origFnCss.apply( this, arguments ); +}, "css-number" ); diff --git a/src/jquery/data.js b/src/jquery/data.js index 40e07d96..07430ce6 100644 --- a/src/jquery/data.js +++ b/src/jquery/data.js @@ -1,34 +1,38 @@ -import { migrateWarn } from "../main.js"; +import { migratePatchFunc, migrateWarn } from "../main.js"; import { camelCase } from "../utils.js"; -var oldData = jQuery.data; +var origData = jQuery.data; -jQuery.data = function( elem, name, value ) { +migratePatchFunc( jQuery, "data", function( elem, name, value ) { var curData, sameKeys, key; // Name can be an object, and each entry in the object is meant to be set as data if ( name && typeof name === "object" && arguments.length === 2 ) { - curData = jQuery.hasData( elem ) && oldData.call( this, elem ); + + curData = jQuery.hasData( elem ) && origData.call( this, elem ); sameKeys = {}; for ( key in name ) { if ( key !== camelCase( key ) ) { - migrateWarn( "jQuery.data() always sets/gets camelCased names: " + key ); + migrateWarn( "data-camelCase", + "jQuery.data() always sets/gets camelCased names: " + key ); curData[ key ] = name[ key ]; } else { sameKeys[ key ] = name[ key ]; } } - oldData.call( this, elem, sameKeys ); + origData.call( this, elem, sameKeys ); return name; } // If the name is transformed, look for the un-transformed name in the data object if ( name && typeof name === "string" && name !== camelCase( name ) ) { - curData = jQuery.hasData( elem ) && oldData.call( this, elem ); + + curData = jQuery.hasData( elem ) && origData.call( this, elem ); if ( curData && name in curData ) { - migrateWarn( "jQuery.data() always sets/gets camelCased names: " + name ); + migrateWarn( "data-camelCase", + "jQuery.data() always sets/gets camelCased names: " + name ); if ( arguments.length > 2 ) { curData[ name ] = value; } @@ -36,5 +40,5 @@ jQuery.data = function( elem, name, value ) { } } - return oldData.apply( this, arguments ); -}; + return origData.apply( this, arguments ); +}, "data-camelCase" ); diff --git a/src/jquery/deferred.js b/src/jquery/deferred.js index 7fe22907..30268adb 100644 --- a/src/jquery/deferred.js +++ b/src/jquery/deferred.js @@ -1,4 +1,4 @@ -import { migrateWarn } from "../main.js"; +import { migratePatchFunc, migratePatchAndWarnFunc } from "../main.js"; // Support jQuery slim which excludes the deferred module in jQuery 4.0+ if ( jQuery.Deferred ) { @@ -15,15 +15,13 @@ var oldDeferred = jQuery.Deferred, jQuery.Callbacks( "memory" ) ] ]; -jQuery.Deferred = function( func ) { +migratePatchFunc( jQuery, "Deferred", function( func ) { var deferred = oldDeferred(), promise = deferred.promise(); - deferred.pipe = promise.pipe = function( /* fnDone, fnFail, fnProgress */ ) { + function newDeferredPipe( /* fnDone, fnFail, fnProgress */ ) { var fns = arguments; - migrateWarn( "deferred.pipe() is deprecated" ); - return jQuery.Deferred( function( newDefer ) { jQuery.each( tuples, function( i, tuple ) { var fn = typeof fns[ i ] === "function" && fns[ i ]; @@ -48,15 +46,19 @@ jQuery.Deferred = function( func ) { } ); fns = null; } ).promise(); + } - }; + migratePatchAndWarnFunc( deferred, "pipe", newDeferredPipe, "deferred-pipe", + "deferred.pipe() is deprecated" ); + migratePatchAndWarnFunc( promise, "pipe", newDeferredPipe, "deferred-pipe", + "deferred.pipe() is deprecated" ); if ( func ) { func.call( deferred, deferred ); } return deferred; -}; +}, "deferred-pipe" ); // Preserve handler of uncaught exceptions in promise chains jQuery.Deferred.exceptionHook = oldDeferred.exceptionHook; diff --git a/src/jquery/effects.js b/src/jquery/effects.js index bb9f5b4c..ad4453aa 100644 --- a/src/jquery/effects.js +++ b/src/jquery/effects.js @@ -1,4 +1,5 @@ -import { migrateWarn } from "../main.js"; +import { migratePatchFunc, migrateWarn } from "../main.js"; +import "../disablePatches.js"; // Support jQuery slim which excludes the effects module if ( jQuery.fx ) { @@ -9,9 +10,10 @@ var intervalValue, intervalMsg, return pct; }; -jQuery.Tween.prototype.run = function( ) { +migratePatchFunc( jQuery.Tween.prototype, "run", function( ) { if ( jQuery.easing[ this.easing ].length > 1 ) { migrateWarn( + "easing-one-arg", "'jQuery.easing." + this.easing.toString() + "' should use only one argument" ); @@ -19,9 +21,9 @@ jQuery.Tween.prototype.run = function( ) { } oldTweenRun.apply( this, arguments ); -}; +}, "easing-one-arg" ); -intervalValue = jQuery.fx.interval || 13; +intervalValue = jQuery.fx.interval; intervalMsg = "jQuery.fx.interval is deprecated"; // Support: IE9, Android <=4.4 @@ -33,12 +35,17 @@ if ( window.requestAnimationFrame ) { enumerable: true, get: function() { if ( !window.document.hidden ) { - migrateWarn( intervalMsg ); + migrateWarn( "fx-interval", intervalMsg ); } - return intervalValue; + + // Only fallback to the default if patch is enabled + if ( !jQuery.migrateIsPatchEnabled( "fx-interval" ) ) { + return intervalValue; + } + return intervalValue === undefined ? 13 : intervalValue; }, set: function( newValue ) { - migrateWarn( intervalMsg ); + migrateWarn( "fx-interval", intervalMsg ); intervalValue = newValue; } } ); diff --git a/src/jquery/event.js b/src/jquery/event.js index e74d5949..395589f3 100644 --- a/src/jquery/event.js +++ b/src/jquery/event.js @@ -1,4 +1,10 @@ -import { migrateWarn, migrateWarnProp } from "../main.js"; +import { + migrateWarn, + migratePatchAndWarnFunc, + migratePatchFunc, + migrateWarnProp +} from "../main.js"; +import "../disablePatches.js"; var oldLoad = jQuery.fn.load, oldEventAdd = jQuery.event.add, @@ -8,16 +14,18 @@ jQuery.event.props = []; jQuery.event.fixHooks = {}; migrateWarnProp( jQuery.event.props, "concat", jQuery.event.props.concat, + "event-old-patch", "jQuery.event.props.concat() is deprecated and removed" ); -jQuery.event.fix = function( originalEvent ) { +migratePatchFunc( jQuery.event, "fix", function( originalEvent ) { var event, type = originalEvent.type, fixHook = this.fixHooks[ type ], props = jQuery.event.props; if ( props.length ) { - migrateWarn( "jQuery.event.props are deprecated and removed: " + props.join() ); + migrateWarn( "event-old-patch", + "jQuery.event.props are deprecated and removed: " + props.join() ); while ( props.length ) { jQuery.event.addProp( props.pop() ); } @@ -25,7 +33,8 @@ jQuery.event.fix = function( originalEvent ) { if ( fixHook && !fixHook._migrated_ ) { fixHook._migrated_ = true; - migrateWarn( "jQuery.event.fixHooks are deprecated and removed: " + type ); + migrateWarn( "event-old-patch", + "jQuery.event.fixHooks are deprecated and removed: " + type ); if ( ( props = fixHook.props ) && props.length ) { while ( props.length ) { jQuery.event.addProp( props.pop() ); @@ -35,21 +44,24 @@ jQuery.event.fix = function( originalEvent ) { event = originalFix.call( this, originalEvent ); - return fixHook && fixHook.filter ? fixHook.filter( event, originalEvent ) : event; -}; + return fixHook && fixHook.filter ? + fixHook.filter( event, originalEvent ) : + event; +}, "event-old-patch" ); -jQuery.event.add = function( elem, types ) { +migratePatchFunc( jQuery.event, "add", function( elem, types ) { // This misses the multiple-types case but that seems awfully rare if ( elem === window && types === "load" && window.document.readyState === "complete" ) { - migrateWarn( "jQuery(window).on('load'...) called after load event occurred" ); + migrateWarn( "load-after-event", + "jQuery(window).on('load'...) called after load event occurred" ); } return oldEventAdd.apply( this, arguments ); -}; +}, "load-after-event" ); jQuery.each( [ "load", "unload", "error" ], function( _, name ) { - jQuery.fn[ name ] = function() { + migratePatchFunc( jQuery.fn, name, function() { var args = Array.prototype.slice.call( arguments, 0 ); // If this is an ajax load() the first arg should be the string URL; @@ -60,7 +72,8 @@ jQuery.each( [ "load", "unload", "error" ], function( _, name ) { return oldLoad.apply( this, args ); } - migrateWarn( "jQuery.fn." + name + "() is deprecated" ); + migrateWarn( "shorthand-removed-v3", + "jQuery.fn." + name + "() is deprecated" ); args.splice( 0, 0, name ); if ( arguments.length ) { @@ -73,7 +86,7 @@ jQuery.each( [ "load", "unload", "error" ], function( _, name ) { // See http://bugs.jquery.com/ticket/11820 this.triggerHandler.apply( this, args ); return this; - }; + }, "shorthand-removed-v3" ); } ); @@ -83,12 +96,13 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + function( _i, name ) { // Handle event binding - jQuery.fn[ name ] = function( data, fn ) { - migrateWarn( "jQuery.fn." + name + "() event shorthand is deprecated" ); + migratePatchAndWarnFunc( jQuery.fn, name, function( data, fn ) { return arguments.length > 0 ? this.on( name, null, data, fn ) : this.trigger( name ); - }; + }, + "shorthand-deprecated-v3", + "jQuery.fn." + name + "() event shorthand is deprecated" ); } ); // Trigger "ready" event only once, on document ready @@ -99,33 +113,25 @@ jQuery( function() { jQuery.event.special.ready = { setup: function() { if ( this === window.document ) { - migrateWarn( "'ready' event is deprecated" ); + migrateWarn( "ready-event", "'ready' event is deprecated" ); } } }; -jQuery.fn.extend( { - - bind: function( types, data, fn ) { - migrateWarn( "jQuery.fn.bind() is deprecated" ); - return this.on( types, null, data, fn ); - }, - unbind: function( types, fn ) { - migrateWarn( "jQuery.fn.unbind() is deprecated" ); - return this.off( types, null, fn ); - }, - delegate: function( selector, types, data, fn ) { - migrateWarn( "jQuery.fn.delegate() is deprecated" ); - return this.on( types, selector, data, fn ); - }, - undelegate: function( selector, types, fn ) { - migrateWarn( "jQuery.fn.undelegate() is deprecated" ); - return arguments.length === 1 ? - this.off( selector, "**" ) : - this.off( types, selector || "**", fn ); - }, - hover: function( fnOver, fnOut ) { - migrateWarn( "jQuery.fn.hover() is deprecated" ); - return this.on( "mouseenter", fnOver ).on( "mouseleave", fnOut || fnOver ); - } -} ); +migratePatchAndWarnFunc( jQuery.fn, "bind", function( types, data, fn ) { + return this.on( types, null, data, fn ); +}, "pre-on-methods", "jQuery.fn.bind() is deprecated" ); +migratePatchAndWarnFunc( jQuery.fn, "unbind", function( types, fn ) { + return this.off( types, null, fn ); +}, "pre-on-methods", "jQuery.fn.unbind() is deprecated" ); +migratePatchAndWarnFunc( jQuery.fn, "delegate", function( selector, types, data, fn ) { + return this.on( types, selector, data, fn ); +}, "pre-on-methods", "jQuery.fn.delegate() is deprecated" ); +migratePatchAndWarnFunc( jQuery.fn, "undelegate", function( selector, types, fn ) { + return arguments.length === 1 ? + this.off( selector, "**" ) : + this.off( types, selector || "**", fn ); +}, "pre-on-methods", "jQuery.fn.undelegate() is deprecated" ); +migratePatchAndWarnFunc( jQuery.fn, "hover", function( fnOver, fnOut ) { + return this.on( "mouseenter", fnOver ).on( "mouseleave", fnOut || fnOver ); +}, "pre-on-methods", "jQuery.fn.hover() is deprecated" ); diff --git a/src/jquery/manipulation.js b/src/jquery/manipulation.js index e925a8b1..fe0754da 100644 --- a/src/jquery/manipulation.js +++ b/src/jquery/manipulation.js @@ -1,7 +1,7 @@ -import { migrateWarn } from "../main.js"; +import { migratePatchFunc, migrateWarn } from "../main.js"; +import "../disablePatches.js"; var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - origHtmlPrefilter = jQuery.htmlPrefilter, makeMarkup = function( html ) { var doc = window.document.implementation.createHTMLDocument( "" ); doc.body.innerHTML = html; @@ -10,18 +10,24 @@ var rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\ warnIfChanged = function( html ) { var changed = html.replace( rxhtmlTag, "<$1>" ); if ( changed !== html && makeMarkup( html ) !== makeMarkup( changed ) ) { - migrateWarn( "HTML tags must be properly nested and closed: " + html ); + migrateWarn( "self-closed-tags", + "HTML tags must be properly nested and closed: " + html ); } }; +/** + * Deprecated, please use `jQuery.migrateDisablePatches( "self-closed-tags" )` instead. + * @deprecated + */ jQuery.UNSAFE_restoreLegacyHtmlPrefilter = function() { - jQuery.htmlPrefilter = function( html ) { - warnIfChanged( html ); - return html.replace( rxhtmlTag, "<$1>" ); - }; + jQuery.migrateEnablePatches( "self-closed-tags" ); }; -jQuery.htmlPrefilter = function( html ) { +migratePatchFunc( jQuery, "htmlPrefilter", function( html ) { warnIfChanged( html ); - return origHtmlPrefilter( html ); -}; + return html.replace( rxhtmlTag, "<$1>" ); +}, "self-closed-tags" ); + +// This patch needs to be disabled by default as it re-introduces +// security issues (CVE-2020-11022, CVE-2020-11023). +jQuery.migrateDisablePatches( "self-closed-tags" ); diff --git a/src/jquery/offset.js b/src/jquery/offset.js index 9caeff99..a99bc6a4 100644 --- a/src/jquery/offset.js +++ b/src/jquery/offset.js @@ -1,14 +1,14 @@ -import { migrateWarn } from "../main.js"; +import { migrateWarn, migratePatchFunc } from "../main.js"; -var oldOffset = jQuery.fn.offset; +var origOffset = jQuery.fn.offset; -jQuery.fn.offset = function() { +migratePatchFunc( jQuery.fn, "offset", function() { var elem = this[ 0 ]; if ( elem && ( !elem.nodeType || !elem.getBoundingClientRect ) ) { - migrateWarn( "jQuery.fn.offset() requires a valid DOM element" ); + migrateWarn( "offset-valid-elem", "jQuery.fn.offset() requires a valid DOM element" ); return arguments.length ? this : undefined; } - return oldOffset.apply( this, arguments ); -}; + return origOffset.apply( this, arguments ); +}, "offset-valid-elem" ); diff --git a/src/jquery/serialize.js b/src/jquery/serialize.js index 6313f90f..c26e10ed 100644 --- a/src/jquery/serialize.js +++ b/src/jquery/serialize.js @@ -1,22 +1,24 @@ -import { migrateWarn } from "../main.js"; +import { migratePatchFunc, migrateWarn } from "../main.js"; +import "../disablePatches.js"; // Support jQuery slim which excludes the ajax module // The jQuery.param patch is about respecting `jQuery.ajaxSettings.traditional` // so it doesn't make sense for the slim build. if ( jQuery.ajax ) { -var oldParam = jQuery.param; +var origParam = jQuery.param; -jQuery.param = function( data, traditional ) { +migratePatchFunc( jQuery, "param", function( data, traditional ) { var ajaxTraditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional; if ( traditional === undefined && ajaxTraditional ) { - migrateWarn( "jQuery.param() no longer uses jQuery.ajaxSettings.traditional" ); + migrateWarn( "param-ajax-traditional", + "jQuery.param() no longer uses jQuery.ajaxSettings.traditional" ); traditional = ajaxTraditional; } - return oldParam.call( this, data, traditional ); -}; + return origParam.call( this, data, traditional ); +}, "param-ajax-traditional" ); } diff --git a/src/jquery/traversing.js b/src/jquery/traversing.js index 9a3c5152..830226ae 100644 --- a/src/jquery/traversing.js +++ b/src/jquery/traversing.js @@ -1,8 +1,4 @@ -import { migrateWarn } from "../main.js"; +import { migratePatchAndWarnFunc } from "../main.js"; -var oldSelf = jQuery.fn.andSelf || jQuery.fn.addBack; - -jQuery.fn.andSelf = function() { - migrateWarn( "jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()" ); - return oldSelf.apply( this, arguments ); -}; +migratePatchAndWarnFunc( jQuery.fn, "andSelf", jQuery.fn.addBack, "andSelf", + "jQuery.fn.andSelf() is deprecated and removed, use jQuery.fn.addBack()" ); diff --git a/src/main.js b/src/main.js index fa773717..6312eb9c 100644 --- a/src/main.js +++ b/src/main.js @@ -1,4 +1,5 @@ import { jQueryVersionSince } from "./compareVersions.js"; +import "./disablePatches.js"; ( function() { @@ -24,7 +25,7 @@ import { jQueryVersionSince } from "./compareVersions.js"; } )(); -export var warnedAbout = {}; +var warnedAbout = {}; // By default each warning is only reported once. jQuery.migrateDeduplicateWarnings = true; @@ -43,11 +44,12 @@ jQuery.migrateReset = function() { jQuery.migrateWarnings.length = 0; }; -export function migrateWarn( msg ) { +export function migrateWarn( code, msg ) { var console = window.console; - if ( !jQuery.migrateDeduplicateWarnings || !warnedAbout[ msg ] ) { + if ( jQuery.migrateIsPatchEnabled( code ) && + ( !jQuery.migrateDeduplicateWarnings || !warnedAbout[ msg ] ) ) { warnedAbout[ msg ] = true; - jQuery.migrateWarnings.push( msg ); + jQuery.migrateWarnings.push( msg + " [" + code + "]" ); if ( console && console.warn && !jQuery.migrateMute ) { console.warn( "JQMIGRATE: " + msg ); if ( jQuery.migrateTrace && console.trace ) { @@ -57,30 +59,60 @@ export function migrateWarn( msg ) { } } -export function migrateWarnProp( obj, prop, value, msg ) { +export function migrateWarnProp( obj, prop, value, code, msg ) { Object.defineProperty( obj, prop, { configurable: true, enumerable: true, get: function() { - migrateWarn( msg ); + migrateWarn( code, msg ); return value; }, set: function( newValue ) { - migrateWarn( msg ); + migrateWarn( code, msg ); value = newValue; } } ); } -export function migrateWarnFunc( obj, prop, newFunc, msg ) { +function migrateWarnFuncInternal( obj, prop, newFunc, code, msg ) { + var finalFunc, + origFunc = obj[ prop ]; + obj[ prop ] = function() { - migrateWarn( msg ); - return newFunc.apply( this, arguments ); + + // If `msg` not provided, do not warn; more sophisticated warnings + // logic is most likely embedded in `newFunc`, in that case here + // we just care about the logic choosing the proper implementation + // based on whether the patch is disabled or not. + if ( msg ) { + migrateWarn( code, msg ); + } + + // Since patches can be disabled & enabled dynamically, we + // need to decide which implementation to run on each invocation. + finalFunc = jQuery.migrateIsPatchEnabled( code ) ? + newFunc : + + // The function may not have existed originally so we need a fallback. + ( origFunc || jQuery.noop ); + + return finalFunc.apply( this, arguments ); }; } +export function migratePatchAndWarnFunc( obj, prop, newFunc, code, msg ) { + if ( !msg ) { + throw new Error( "No warning message provided" ); + } + return migrateWarnFuncInternal( obj, prop, newFunc, code, msg ); +} + +export function migratePatchFunc( obj, prop, newFunc, code ) { + return migrateWarnFuncInternal( obj, prop, newFunc, code ); +} + if ( window.document.compatMode === "BackCompat" ) { - // JQuery has never supported or tested Quirks Mode - migrateWarn( "jQuery is not compatible with Quirks Mode" ); + // jQuery has never supported or tested Quirks Mode + migrateWarn( "quirks", "jQuery is not compatible with Quirks Mode" ); } diff --git a/test/core-jquery2.html b/test/data/core-jquery2.html similarity index 91% rename from test/core-jquery2.html rename to test/data/core-jquery2.html index dc3dd7f3..e1700555 100644 --- a/test/core-jquery2.html +++ b/test/data/core-jquery2.html @@ -5,7 +5,7 @@ jQuery Migrate old-jQuery initialization test - + + diff --git a/test/event-props-concat.html b/test/data/event-props-concat.html similarity index 100% rename from test/event-props-concat.html rename to test/data/event-props-concat.html diff --git a/test/event-props.html b/test/data/event-props.html similarity index 100% rename from test/event-props.html rename to test/data/event-props.html diff --git a/test/event-ready.html b/test/data/event-ready.html similarity index 100% rename from test/event-ready.html rename to test/data/event-ready.html diff --git a/test/iframeTest.js b/test/data/iframeTest.js similarity index 100% rename from test/iframeTest.js rename to test/data/iframeTest.js diff --git a/test/migrate.js b/test/data/test-utils.js similarity index 100% rename from test/migrate.js rename to test/data/test-utils.js diff --git a/test/testinit.js b/test/data/testinit.js similarity index 75% rename from test/testinit.js rename to test/data/testinit.js index f4107464..98b16895 100644 --- a/test/testinit.js +++ b/test/data/testinit.js @@ -14,7 +14,7 @@ TestManager = { lines = "", urlTag = this.projects[ projectName ].urlTag, matcher = new RegExp( "\\b" + urlTag + "=([^&]+)" ), - projectRoot = this.baseURL + ( isSelf ? ".." : "../../" + projectName ), + projectRoot = this.baseURL + ( isSelf ? "../.." : "../../../" + projectName ), version = ( matcher.exec( document.location.search ) || {} )[ 1 ] || defaultVersion; if ( window.__karma__ && isSelf ) { @@ -25,18 +25,19 @@ TestManager = { // Order is important file = [ "version", - "migrate", - "core", - "ajax", - "attributes", - "css", - "data", - "effects", - "event", - "offset", - "serialize", - "traversing", - "deferred" + "data/test-utils", + "unit/migrate", + "unit/jquery/core", + "unit/jquery/ajax", + "unit/jquery/attributes", + "unit/jquery/css", + "unit/jquery/data", + "unit/jquery/effects", + "unit/jquery/event", + "unit/jquery/offset", + "unit/jquery/serialize", + "unit/jquery/traversing", + "unit/jquery/deferred" ]; for ( i = 0; i < file.length; i++ ) { @@ -103,7 +104,7 @@ TestManager = { }; iframe = jQuery( "
" ) .css( { position: "absolute", width: "500px", left: "-600px" } ) - .append( jQuery( "