From 016abe5cdb2429a83487948e47a58c615a24fda4 Mon Sep 17 00:00:00 2001 From: Christian Bewernitz Date: Sat, 7 Oct 2023 20:15:15 +0200 Subject: [PATCH 1/8] test: add fuzzer.js and first fuzz target https://github.com/google/oss-fuzz/pull/11036 --- .gitignore | 4 +- package-lock.json | 1467 +++++++++++++++++++++++++++++++++- package.json | 3 +- test/dom-parser.html.fuzz.js | 19 + test/dom-parser.xml.fuzz.js | 19 + 5 files changed, 1474 insertions(+), 38 deletions(-) create mode 100644 test/dom-parser.html.fuzz.js create mode 100644 test/dom-parser.xml.fuzz.js diff --git a/.gitignore b/.gitignore index 018bb3b31..4a1690de0 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,6 @@ /node_modules /reports -/test/error/reported.json +/test/errors/reported.json docs/*.jar @@ -13,3 +13,5 @@ coverage .envrc /.idea +/.fuzzer* +crash-* diff --git a/package-lock.json b/package-lock.json index 584333915..6b3c6f1cd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,8 @@ "license": "MIT", "devDependencies": { "@homer0/prettier-plugin-jsdoc": "8.0.0", + "@jazzer.js/core": "2.0.0", + "@jazzer.js/jest-runner": "2.0.0", "auto-changelog": "2.4.0", "eslint": "8.50.0", "eslint-config-prettier": "9.0.0", @@ -835,6 +837,131 @@ "node": ">=8" } }, + "node_modules/@jazzer.js/bug-detectors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@jazzer.js/bug-detectors/-/bug-detectors-2.0.0.tgz", + "integrity": "sha512-m7DyeXzPnxsQE3dWkO+5hb2aIKBupPfU/t2q+PwRtUrYDy9MtSMZi2hUeGy8OXGmf2Uo32WwrYgiErgxtxrh7g==", + "dev": true, + "dependencies": { + "@jazzer.js/core": "2.0.0", + "@jazzer.js/hooking": "2.0.0" + }, + "engines": { + "node": ">= 14.0.0", + "npm": ">= 7.0.0" + } + }, + "node_modules/@jazzer.js/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@jazzer.js/core/-/core-2.0.0.tgz", + "integrity": "sha512-p3ifJuTX7Td7No5cRqMiNCqMO/kOYKkGGB7X43/X4JaK5DblxeENvVGo7jXUOkUJ5sWhRslZEzL9D2ai36dq3Q==", + "dev": true, + "dependencies": { + "@jazzer.js/bug-detectors": "2.0.0", + "@jazzer.js/fuzzer": "2.0.0", + "@jazzer.js/hooking": "2.0.0", + "@jazzer.js/instrumentor": "2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "tmp": "^0.2.1", + "yargs": "^17.7.2" + }, + "bin": { + "jazzer": "dist/cli.js" + }, + "engines": { + "node": ">= 14.0.0", + "npm": ">= 7.0.0" + } + }, + "node_modules/@jazzer.js/core/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/@jazzer.js/fuzzer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@jazzer.js/fuzzer/-/fuzzer-2.0.0.tgz", + "integrity": "sha512-t2xOzFF6p/OTq9KlyX5zDCD9ucIaIybYQYq/TDZ/7OBV0XAtutd9/4+768dTiRpHg1tg3kAqwp0qoeaqlQYFUw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "bindings": "^1.5.0", + "cmake-js": "^7.2.1", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1" + }, + "engines": { + "node": ">= 14.0.0", + "npm": ">= 7.0.0" + } + }, + "node_modules/@jazzer.js/hooking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@jazzer.js/hooking/-/hooking-2.0.0.tgz", + "integrity": "sha512-D80MM4Q5AtBwXlgC/7RDiJsJ0WwCnjhegDy1llbzahgHDwVQdfcVlWSLpGXG4vHerZVgUBPKQgNu6mxGzpFwEg==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.20" + }, + "engines": { + "node": ">= 14.0.0", + "npm": ">= 7.0.0" + } + }, + "node_modules/@jazzer.js/instrumentor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@jazzer.js/instrumentor/-/instrumentor-2.0.0.tgz", + "integrity": "sha512-hEvuZbwastQbSNlYJk14AJ7Yh6GL3zWMgfJagCI8Ah+lE3l2zhC812jhomwARhjjG9HEbGSYqIA3Ph42PSKJBA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.20", + "@babel/generator": "^7.22.15", + "@jazzer.js/fuzzer": "2.0.0", + "@jazzer.js/hooking": "2.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "proper-lockfile": "^4.1.2", + "source-map-support": "^0.5.21" + }, + "engines": { + "node": ">= 14.0.0", + "npm": ">= 7.0.0" + } + }, + "node_modules/@jazzer.js/instrumentor/node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/@jazzer.js/jest-runner": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@jazzer.js/jest-runner/-/jest-runner-2.0.0.tgz", + "integrity": "sha512-lJ9QzemjrU40VGMX0BaP2WxJE1lZ5S88ob4MX8g5tjIJOZF5hLwFraE9PBOZ842ofi0UFGw8ThNeQvjNppVzBA==", + "dev": true, + "dependencies": { + "@jazzer.js/core": "2.0.0", + "cosmiconfig": "^8.3.6", + "istanbul-reports": "^3.1.6" + }, + "engines": { + "node": ">= 14.0.0", + "npm": ">= 7.0.0" + } + }, "node_modules/@jest/console": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", @@ -1930,6 +2057,37 @@ "node": ">= 8" } }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -1948,6 +2106,12 @@ "node": ">=0.10.0" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "node_modules/auto-changelog": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.4.0.tgz", @@ -1991,6 +2155,17 @@ "node": ">=10" } }, + "node_modules/axios": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -2142,6 +2317,15 @@ "node": ">=8" } }, + "node_modules/bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "dependencies": { + "file-uri-to-path": "1.0.0" + } + }, "node_modules/bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -2617,6 +2801,15 @@ "fsevents": "~2.3.2" } }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", @@ -2805,6 +2998,48 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/cmake-js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.2.1.tgz", + "integrity": "sha512-AdPSz9cSIJWdKvm0aJgVu3X8i0U3mNTswJkSHzZISqmYVjZk7Td4oDFg0mCBA383wO+9pG5Ix7pEP1CZH9x2BA==", + "dev": true, + "dependencies": { + "axios": "^1.3.2", + "debug": "^4", + "fs-extra": "^10.1.0", + "lodash.isplainobject": "^4.0.6", + "memory-stream": "^1.0.0", + "node-api-headers": "^0.0.2", + "npmlog": "^6.0.2", + "rc": "^1.2.7", + "semver": "^7.3.8", + "tar": "^6.1.11", + "url-join": "^4.0.1", + "which": "^2.0.2", + "yargs": "^17.6.0" + }, + "bin": { + "cmake-js": "bin/cmake-js" + }, + "engines": { + "node": ">= 14.15.0" + } + }, + "node_modules/cmake-js/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -2845,6 +3080,27 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", @@ -2923,6 +3179,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -3298,6 +3560,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -3377,6 +3654,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "node_modules/detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -4007,6 +4308,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -4131,6 +4441,12 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4175,6 +4491,40 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/form-data-encoder": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", @@ -4184,6 +4534,50 @@ "node": ">= 14.17" } }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -4210,6 +4604,25 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4249,6 +4662,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, "node_modules/github-url-from-git": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz", @@ -4460,6 +4879,12 @@ "node": ">=4" } }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, "node_modules/has-yarn": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", @@ -5404,6 +5829,18 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/istanbul-lib-instrument": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", @@ -6188,6 +6625,18 @@ "node": ">=6" } }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/keyv": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", @@ -6602,6 +7051,12 @@ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -6839,8 +7294,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/meow": { - "version": "12.1.1", + "node_modules/memory-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz", + "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==", + "dev": true, + "dependencies": { + "readable-stream": "^3.4.0" + } + }, + "node_modules/meow": { + "version": "12.1.1", "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", "dev": true, @@ -6879,6 +7343,27 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -6938,6 +7423,58 @@ "node": ">= 6" } }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -6950,6 +7487,12 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "node_modules/napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -6989,6 +7532,45 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/node-abi": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "dev": true, + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-abi/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", + "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==", + "dev": true + }, + "node_modules/node-api-headers": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-0.0.2.tgz", + "integrity": "sha512-YsjmaKGPDkmhoNKIpkChtCsPVaRE0a274IdERKnuc/E8K1UJdBZ4/mvI006OijlQZHCfpRNOH3dfHQs92se8gg==", + "dev": true + }, "node_modules/node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -7554,6 +8136,21 @@ "node": ">=8" } }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -8208,6 +8805,32 @@ "node": ">=8" } }, + "node_modules/prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -8292,12 +8915,29 @@ "node": ">= 6" } }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "node_modules/pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -8749,6 +9389,15 @@ "node": ">=8" } }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -8830,6 +9479,26 @@ "tslib": "^2.1.0" } }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -8887,6 +9556,12 @@ "node": ">=10" } }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -8914,6 +9589,51 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "node_modules/simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -9052,26 +9772,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -9212,6 +9912,57 @@ "url": "https://opencollective.com/unts" } }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-fs/node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -9307,6 +10058,18 @@ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", "dev": true }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -9408,6 +10171,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -9511,6 +10283,12 @@ "punycode": "^2.1.0" } }, + "node_modules/url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -9598,6 +10376,15 @@ "node": ">= 8" } }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "node_modules/widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", @@ -10441,6 +11228,104 @@ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, + "@jazzer.js/bug-detectors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@jazzer.js/bug-detectors/-/bug-detectors-2.0.0.tgz", + "integrity": "sha512-m7DyeXzPnxsQE3dWkO+5hb2aIKBupPfU/t2q+PwRtUrYDy9MtSMZi2hUeGy8OXGmf2Uo32WwrYgiErgxtxrh7g==", + "dev": true, + "requires": { + "@jazzer.js/core": "2.0.0", + "@jazzer.js/hooking": "2.0.0" + } + }, + "@jazzer.js/core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@jazzer.js/core/-/core-2.0.0.tgz", + "integrity": "sha512-p3ifJuTX7Td7No5cRqMiNCqMO/kOYKkGGB7X43/X4JaK5DblxeENvVGo7jXUOkUJ5sWhRslZEzL9D2ai36dq3Q==", + "dev": true, + "requires": { + "@jazzer.js/bug-detectors": "2.0.0", + "@jazzer.js/fuzzer": "2.0.0", + "@jazzer.js/hooking": "2.0.0", + "@jazzer.js/instrumentor": "2.0.0", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "tmp": "^0.2.1", + "yargs": "^17.7.2" + }, + "dependencies": { + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + } + } + }, + "@jazzer.js/fuzzer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@jazzer.js/fuzzer/-/fuzzer-2.0.0.tgz", + "integrity": "sha512-t2xOzFF6p/OTq9KlyX5zDCD9ucIaIybYQYq/TDZ/7OBV0XAtutd9/4+768dTiRpHg1tg3kAqwp0qoeaqlQYFUw==", + "dev": true, + "requires": { + "bindings": "^1.5.0", + "cmake-js": "^7.2.1", + "node-addon-api": "^7.0.0", + "prebuild-install": "^7.1.1" + } + }, + "@jazzer.js/hooking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@jazzer.js/hooking/-/hooking-2.0.0.tgz", + "integrity": "sha512-D80MM4Q5AtBwXlgC/7RDiJsJ0WwCnjhegDy1llbzahgHDwVQdfcVlWSLpGXG4vHerZVgUBPKQgNu6mxGzpFwEg==", + "dev": true, + "requires": { + "@babel/core": "^7.22.20" + } + }, + "@jazzer.js/instrumentor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@jazzer.js/instrumentor/-/instrumentor-2.0.0.tgz", + "integrity": "sha512-hEvuZbwastQbSNlYJk14AJ7Yh6GL3zWMgfJagCI8Ah+lE3l2zhC812jhomwARhjjG9HEbGSYqIA3Ph42PSKJBA==", + "dev": true, + "requires": { + "@babel/core": "^7.22.20", + "@babel/generator": "^7.22.15", + "@jazzer.js/fuzzer": "2.0.0", + "@jazzer.js/hooking": "2.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^6.0.0", + "proper-lockfile": "^4.1.2", + "source-map-support": "^0.5.21" + }, + "dependencies": { + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "@jazzer.js/jest-runner": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@jazzer.js/jest-runner/-/jest-runner-2.0.0.tgz", + "integrity": "sha512-lJ9QzemjrU40VGMX0BaP2WxJE1lZ5S88ob4MX8g5tjIJOZF5hLwFraE9PBOZ842ofi0UFGw8ThNeQvjNppVzBA==", + "dev": true, + "requires": { + "@jazzer.js/core": "2.0.0", + "cosmiconfig": "^8.3.6", + "istanbul-reports": "^3.1.6" + } + }, "@jest/console": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", @@ -11266,14 +12151,39 @@ } } }, - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "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" + } + }, + "append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "requires": { + "default-require-extensions": "^3.0.0" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", "dev": true, "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" } }, "argparse": { @@ -11291,6 +12201,12 @@ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true + }, "auto-changelog": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/auto-changelog/-/auto-changelog-2.4.0.tgz", @@ -11321,6 +12237,17 @@ } } }, + "axios": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", + "dev": true, + "requires": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, "babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -11430,6 +12357,15 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", + "dev": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bl": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", @@ -11741,6 +12677,12 @@ "readdirp": "~3.6.0" } }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, "ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", @@ -11870,6 +12812,38 @@ "mimic-response": "^1.0.0" } }, + "cmake-js": { + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-7.2.1.tgz", + "integrity": "sha512-AdPSz9cSIJWdKvm0aJgVu3X8i0U3mNTswJkSHzZISqmYVjZk7Td4oDFg0mCBA383wO+9pG5Ix7pEP1CZH9x2BA==", + "dev": true, + "requires": { + "axios": "^1.3.2", + "debug": "^4", + "fs-extra": "^10.1.0", + "lodash.isplainobject": "^4.0.6", + "memory-stream": "^1.0.0", + "node-api-headers": "^0.0.2", + "npmlog": "^6.0.2", + "rc": "^1.2.7", + "semver": "^7.3.8", + "tar": "^6.1.11", + "url-join": "^4.0.1", + "which": "^2.0.2", + "yargs": "^17.6.0" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -11903,6 +12877,21 @@ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, "commander": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", @@ -11965,6 +12954,12 @@ } } }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==", + "dev": true + }, "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", @@ -12213,6 +13208,15 @@ "untildify": "^4.0.0" } }, + "default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "requires": { + "strip-bom": "^4.0.0" + } + }, "defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -12264,6 +13268,24 @@ } } }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==", + "dev": true + }, + "detect-libc": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", + "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", + "dev": true + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -12691,6 +13713,12 @@ "integrity": "sha512-aIQN7Q04HGAV/I5BszisuHTZHXNoC23WtLkxdCLuYZMdWviRD0TMIt2bnUBi9MrHaF/hH8b3gwG9iaAUHKnJGA==", "dev": true }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "dev": true + }, "expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", @@ -12797,6 +13825,12 @@ "flat-cache": "^3.0.4" } }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -12832,12 +13866,66 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", "dev": true }, + "follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "dev": true + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, "form-data-encoder": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", "integrity": "sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==", "dev": true }, + "fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "dev": true + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -12857,6 +13945,22 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -12881,6 +13985,12 @@ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "dev": true + }, "github-url-from-git": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/github-url-from-git/-/github-url-from-git-1.5.0.tgz", @@ -13036,6 +14146,12 @@ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", + "dev": true + }, "has-yarn": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-3.0.0.tgz", @@ -13709,6 +14825,15 @@ "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, + "istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "requires": { + "append-transform": "^2.0.0" + } + }, "istanbul-lib-instrument": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz", @@ -14310,6 +15435,16 @@ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, + "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" + } + }, "keyv": { "version": "4.5.3", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", @@ -14636,6 +15771,12 @@ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -14810,6 +15951,15 @@ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true }, + "memory-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-1.0.0.tgz", + "integrity": "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww==", + "dev": true, + "requires": { + "readable-stream": "^3.4.0" + } + }, "meow": { "version": "12.1.1", "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", @@ -14838,6 +15988,21 @@ "picomatch": "^2.2.3" } }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, + "requires": { + "mime-db": "1.52.0" + } + }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -14882,6 +16047,45 @@ "kind-of": "^6.0.3" } }, + "minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "dev": true + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -14894,6 +16098,12 @@ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", + "dev": true + }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", @@ -14923,6 +16133,38 @@ } } }, + "node-abi": { + "version": "3.47.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz", + "integrity": "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A==", + "dev": true, + "requires": { + "semver": "^7.3.5" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "node-addon-api": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.0.0.tgz", + "integrity": "sha512-vgbBJTS4m5/KkE16t5Ly0WW9hz46swAstv0hYYwMtbG7AznRhNyfLRe8HZAiWIpcHzoO7HxhLuBQj9rJ/Ho0ZA==", + "dev": true + }, + "node-api-headers": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/node-api-headers/-/node-api-headers-0.0.2.tgz", + "integrity": "sha512-YsjmaKGPDkmhoNKIpkChtCsPVaRE0a274IdERKnuc/E8K1UJdBZ4/mvI006OijlQZHCfpRNOH3dfHQs92se8gg==", + "dev": true + }, "node-fetch": { "version": "2.6.7", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", @@ -15301,6 +16543,18 @@ "path-key": "^3.0.0" } }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -15747,6 +17001,26 @@ "find-up": "^4.0.0" } }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "dev": true, + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + } + }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -15803,12 +17077,29 @@ "sisteransi": "^1.0.5" } }, + "proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, "proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==", "dev": true }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "pstree.remy": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", @@ -16119,6 +17410,12 @@ "signal-exit": "^3.0.2" } }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -16167,6 +17464,12 @@ "tslib": "^2.1.0" } }, + "safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -16205,6 +17508,12 @@ } } }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -16226,6 +17535,23 @@ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, + "simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "dev": true + }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "dev": true, + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + } + }, "simple-update-notifier": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", @@ -16342,14 +17668,6 @@ "dev": true, "requires": { "safe-buffer": "~5.2.0" - }, - "dependencies": { - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true - } } }, "string-length": { @@ -16452,6 +17770,53 @@ "tslib": "^2.5.0" } }, + "tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + } + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "dev": true, + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -16526,6 +17891,15 @@ "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==", "dev": true }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -16603,6 +17977,12 @@ "crypto-random-string": "^4.0.0" } }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, "untildify": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", @@ -16667,6 +18047,12 @@ "punycode": "^2.1.0" } }, + "url-join": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz", + "integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==", + "dev": true + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -16744,6 +18130,15 @@ "isexe": "^2.0.0" } }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, "widest-line": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-4.0.1.tgz", diff --git a/package.json b/package.json index 754896663..fda5594be 100644 --- a/package.json +++ b/package.json @@ -41,9 +41,10 @@ "engines": { "node": ">=10.0.0" }, - "dependencies": {}, "devDependencies": { "@homer0/prettier-plugin-jsdoc": "8.0.0", + "@jazzer.js/core": "2.0.0", + "@jazzer.js/jest-runner": "2.0.0", "auto-changelog": "2.4.0", "eslint": "8.50.0", "eslint-config-prettier": "9.0.0", diff --git a/test/dom-parser.html.fuzz.js b/test/dom-parser.html.fuzz.js new file mode 100644 index 000000000..d2ceff07d --- /dev/null +++ b/test/dom-parser.html.fuzz.js @@ -0,0 +1,19 @@ +'use strict'; + +const { DOMParser, ParseError, MIME_TYPE, XMLSerializer } = require('../lib'); + +module.exports.fuzz = (buffer) => { + try { + const parsed = new DOMParser({ + errorHandler: (level, message) => { + if (level === 'error' && message.startsWith('element parse error: ')) { + throw new Error(message); + } + }, + }).parseFromString(buffer.toString(), MIME_TYPE.HTML); + new XMLSerializer().serializeToString(parsed); + } catch (error) { + if (error instanceof ParseError) return -1; + throw error; + } +}; diff --git a/test/dom-parser.xml.fuzz.js b/test/dom-parser.xml.fuzz.js new file mode 100644 index 000000000..771267e48 --- /dev/null +++ b/test/dom-parser.xml.fuzz.js @@ -0,0 +1,19 @@ +'use strict'; + +const { DOMParser, ParseError, MIME_TYPE, XMLSerializer } = require('../lib'); + +module.exports.fuzz = (buffer) => { + try { + const parsed = new DOMParser({ + errorHandler: (level, message) => { + if (level === 'error' && message.startsWith('element parse error: ')) { + throw new Error(message); + } + }, + }).parseFromString(buffer.toString(), MIME_TYPE.XML_TEXT); + new XMLSerializer().serializeToString(parsed); + } catch (error) { + if (error instanceof ParseError) return -1; + throw error; + } +}; From 59e235f7c8ae5512300f4ecd6cce3dd2ddb5dcc4 Mon Sep 17 00:00:00 2001 From: Christian Bewernitz Date: Mon, 9 Oct 2023 07:30:52 +0200 Subject: [PATCH 2/8] test: add fuzzer regression tests (WIP) --- .cifuzz-corpus/crash-doctype-in-element.xml | 4 ++++ .cifuzz-corpus/crash-proto-prefix.xml | 1 + .../console.log/crash-doctype-in-element.xml | 4 ++++ .../console.log/crash-proto-prefix.xml | 1 + .../crash-doctype-in-element.xml | 4 ++++ .../dom-parser.html.fuzz.js/crash-proto-prefix.xml | 1 + .../crash-doctype-in-element.xml | 4 ++++ .../dom-parser.xml.fuzz.js/crash-proto-prefix.xml | 1 + .gitignore | 2 +- .jazzerjsrc.json | 9 +++++++++ jest.config.js | 14 +++++++++++++- test/regression.test.fuzz.js | 11 +++++++++++ 12 files changed, 54 insertions(+), 2 deletions(-) create mode 100644 .cifuzz-corpus/crash-doctype-in-element.xml create mode 100644 .cifuzz-corpus/crash-proto-prefix.xml create mode 100644 .cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/console.log/crash-doctype-in-element.xml create mode 100644 .cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/console.log/crash-proto-prefix.xml create mode 100644 .cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-doctype-in-element.xml create mode 100644 .cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-proto-prefix.xml create mode 100644 .cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-doctype-in-element.xml create mode 100644 .cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-proto-prefix.xml create mode 100644 .jazzerjsrc.json create mode 100644 test/regression.test.fuzz.js diff --git a/.cifuzz-corpus/crash-doctype-in-element.xml b/.cifuzz-corpus/crash-doctype-in-element.xml new file mode 100644 index 000000000..3356b75e7 --- /dev/null +++ b/.cifuzz-corpus/crash-doctype-in-element.xml @@ -0,0 +1,4 @@ + +]> + diff --git a/.cifuzz-corpus/crash-proto-prefix.xml b/.cifuzz-corpus/crash-proto-prefix.xml new file mode 100644 index 000000000..311f33989 --- /dev/null +++ b/.cifuzz-corpus/crash-proto-prefix.xml @@ -0,0 +1 @@ +<__proto__:i/> diff --git a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/console.log/crash-doctype-in-element.xml b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/console.log/crash-doctype-in-element.xml new file mode 100644 index 000000000..3356b75e7 --- /dev/null +++ b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/console.log/crash-doctype-in-element.xml @@ -0,0 +1,4 @@ + +]> + diff --git a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/console.log/crash-proto-prefix.xml b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/console.log/crash-proto-prefix.xml new file mode 100644 index 000000000..311f33989 --- /dev/null +++ b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/console.log/crash-proto-prefix.xml @@ -0,0 +1 @@ +<__proto__:i/> diff --git a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-doctype-in-element.xml b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-doctype-in-element.xml new file mode 100644 index 000000000..3356b75e7 --- /dev/null +++ b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-doctype-in-element.xml @@ -0,0 +1,4 @@ + +]> + diff --git a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-proto-prefix.xml b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-proto-prefix.xml new file mode 100644 index 000000000..311f33989 --- /dev/null +++ b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-proto-prefix.xml @@ -0,0 +1 @@ +<__proto__:i/> diff --git a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-doctype-in-element.xml b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-doctype-in-element.xml new file mode 100644 index 000000000..3356b75e7 --- /dev/null +++ b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-doctype-in-element.xml @@ -0,0 +1,4 @@ + +]> + diff --git a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-proto-prefix.xml b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-proto-prefix.xml new file mode 100644 index 000000000..311f33989 --- /dev/null +++ b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-proto-prefix.xml @@ -0,0 +1 @@ +<__proto__:i/> diff --git a/.gitignore b/.gitignore index 4a1690de0..d8f4d1aef 100644 --- a/.gitignore +++ b/.gitignore @@ -14,4 +14,4 @@ coverage /.idea /.fuzzer* -crash-* +./crash-* diff --git a/.jazzerjsrc.json b/.jazzerjsrc.json new file mode 100644 index 000000000..a3cc5667a --- /dev/null +++ b/.jazzerjsrc.json @@ -0,0 +1,9 @@ +{ + "includes": ["lib"], + "excludes": ["node_modules"], + "customHooks": [], + "fuzzerOptions": [], + "sync": true, + "timeout": 10, + "verbose": false +} diff --git a/jest.config.js b/jest.config.js index 49dda59cf..429ff8bfb 100644 --- a/jest.config.js +++ b/jest.config.js @@ -88,7 +88,19 @@ module.exports = { // preset: undefined, // Run tests from one or more projects - // projects: undefined, + projects: [ + { + displayName: 'test', + }, + { + displayName: { + name: 'Jazzer.js', + color: 'cyan', + }, + testMatch: ['/test/*.test.fuzz.js'], + testRunner: '@jazzer.js/jest-runner', + }, + ], // Use this configuration option to add custom reporters to Jest // reporters: undefined, diff --git a/test/regression.test.fuzz.js b/test/regression.test.fuzz.js new file mode 100644 index 000000000..db48af02f --- /dev/null +++ b/test/regression.test.fuzz.js @@ -0,0 +1,11 @@ +'use strict'; + +const { describe, test } = require('@jest/globals'); +const xml = require('./dom-parser.xml.fuzz'); +const html = require('./dom-parser.html.fuzz'); + +describe('ensure previous fuzzer findings are not reintroduced', () => { + test.fuzz('dom-parser.xml.fuzz.js', xml.fuzz); + test.fuzz('dom-parser.html.fuzz.js', html.fuzz); + test.fuzz('console.log', (data) => console.log(data.toString())); +}); From 82cb495bd5dc3411a51b05ae5ebed324a3a1522e Mon Sep 17 00:00:00 2001 From: Christian Bewernitz Date: Mon, 9 Oct 2023 17:10:27 +0200 Subject: [PATCH 3/8] test: properly integrate fuzzer regression tests - own folder with sub folders for regression data - moved target along with tests --- .../crash-doctype-in-element.xml | 4 ---- .../crash-proto-prefix.xml | 1 - .../crash-doctype-in-element.xml | 4 ---- .../crash-proto-prefix.xml | 1 - .gitignore | 1 + .jazzerjsrc.json | 6 ++--- jest.config.js | 2 +- .../dom-parser.html.target.js} | 2 +- .../dom-parser.xml.target.js} | 2 +- test/fuzz/regression.test.fuzz.js | 22 +++++++++++++++++++ .../crash-doctype-in-element.xml | 0 .../crash-proto-prefix.xml | 0 .../crash-doctype-in-element.xml | 0 .../crash-proto-prefix.xml | 0 test/regression.test.fuzz.js | 11 ---------- 15 files changed, 29 insertions(+), 27 deletions(-) delete mode 100644 .cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-doctype-in-element.xml delete mode 100644 .cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-proto-prefix.xml delete mode 100644 .cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-doctype-in-element.xml delete mode 100644 .cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-proto-prefix.xml rename test/{dom-parser.html.fuzz.js => fuzz/dom-parser.html.target.js} (96%) rename test/{dom-parser.xml.fuzz.js => fuzz/dom-parser.xml.target.js} (96%) create mode 100644 test/fuzz/regression.test.fuzz.js rename {.cifuzz-corpus => test/fuzz/regression.test.fuzz/dom-parser.html.target.js}/crash-doctype-in-element.xml (100%) rename {.cifuzz-corpus => test/fuzz/regression.test.fuzz/dom-parser.html.target.js}/crash-proto-prefix.xml (100%) rename {.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/console.log => test/fuzz/regression.test.fuzz/dom-parser.xml.target.js}/crash-doctype-in-element.xml (100%) rename {.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/console.log => test/fuzz/regression.test.fuzz/dom-parser.xml.target.js}/crash-proto-prefix.xml (100%) delete mode 100644 test/regression.test.fuzz.js diff --git a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-doctype-in-element.xml b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-doctype-in-element.xml deleted file mode 100644 index 3356b75e7..000000000 --- a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-doctype-in-element.xml +++ /dev/null @@ -1,4 +0,0 @@ - -]> - diff --git a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-proto-prefix.xml b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-proto-prefix.xml deleted file mode 100644 index 311f33989..000000000 --- a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.html.fuzz.js/crash-proto-prefix.xml +++ /dev/null @@ -1 +0,0 @@ -<__proto__:i/> diff --git a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-doctype-in-element.xml b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-doctype-in-element.xml deleted file mode 100644 index 3356b75e7..000000000 --- a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-doctype-in-element.xml +++ /dev/null @@ -1,4 +0,0 @@ - -]> - diff --git a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-proto-prefix.xml b/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-proto-prefix.xml deleted file mode 100644 index 311f33989..000000000 --- a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/dom-parser.xml.fuzz.js/crash-proto-prefix.xml +++ /dev/null @@ -1 +0,0 @@ -<__proto__:i/> diff --git a/.gitignore b/.gitignore index d8f4d1aef..ccf3ecb5e 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,4 @@ coverage /.idea /.fuzzer* ./crash-* +/.cifuzz-corpus diff --git a/.jazzerjsrc.json b/.jazzerjsrc.json index a3cc5667a..6e8af83a5 100644 --- a/.jazzerjsrc.json +++ b/.jazzerjsrc.json @@ -2,8 +2,8 @@ "includes": ["lib"], "excludes": ["node_modules"], "customHooks": [], - "fuzzerOptions": [], + "fuzzerOptions": ["--sync", "--timeout=10"], "sync": true, - "timeout": 10, - "verbose": false + "timeout": 500, + "verbose": false } diff --git a/jest.config.js b/jest.config.js index 429ff8bfb..08b9878aa 100644 --- a/jest.config.js +++ b/jest.config.js @@ -97,7 +97,7 @@ module.exports = { name: 'Jazzer.js', color: 'cyan', }, - testMatch: ['/test/*.test.fuzz.js'], + testMatch: ['/test/fuzz/*.test.fuzz.js'], testRunner: '@jazzer.js/jest-runner', }, ], diff --git a/test/dom-parser.html.fuzz.js b/test/fuzz/dom-parser.html.target.js similarity index 96% rename from test/dom-parser.html.fuzz.js rename to test/fuzz/dom-parser.html.target.js index d2ceff07d..5541f31c0 100644 --- a/test/dom-parser.html.fuzz.js +++ b/test/fuzz/dom-parser.html.target.js @@ -1,6 +1,6 @@ 'use strict'; -const { DOMParser, ParseError, MIME_TYPE, XMLSerializer } = require('../lib'); +const { DOMParser, ParseError, MIME_TYPE, XMLSerializer } = require('../../lib'); module.exports.fuzz = (buffer) => { try { diff --git a/test/dom-parser.xml.fuzz.js b/test/fuzz/dom-parser.xml.target.js similarity index 96% rename from test/dom-parser.xml.fuzz.js rename to test/fuzz/dom-parser.xml.target.js index 771267e48..01f3626d4 100644 --- a/test/dom-parser.xml.fuzz.js +++ b/test/fuzz/dom-parser.xml.target.js @@ -1,6 +1,6 @@ 'use strict'; -const { DOMParser, ParseError, MIME_TYPE, XMLSerializer } = require('../lib'); +const { DOMParser, ParseError, MIME_TYPE, XMLSerializer } = require('../../lib'); module.exports.fuzz = (buffer) => { try { diff --git a/test/fuzz/regression.test.fuzz.js b/test/fuzz/regression.test.fuzz.js new file mode 100644 index 000000000..9a6e65d1f --- /dev/null +++ b/test/fuzz/regression.test.fuzz.js @@ -0,0 +1,22 @@ +'use strict'; +// wallaby:file.skip since it complains regarding jasmine +const { expect, test, beforeAll, afterAll } = require('@jest/globals'); + +const fs = require('fs'); +const path = require('path'); +const TARGETS = fs.readdirSync(__dirname).filter((file) => file.endsWith('.target.js')); + +TARGETS.forEach((target) => { + const module = require(path.join(__dirname, target)); + const spy = jest.spyOn(module, 'fuzz'); + const testfiles = fs.readdirSync(path.join(__filename.replace(/\.js$/, ''), target)); + beforeAll(() => { + expect(testfiles.length).toBeGreaterThan(0); + }); + afterAll(() => { + // avoid silently failing for targets that have no test input + // there is one call with an empty buffer + expect(spy).toBeCalledTimes(testfiles.length + 1); + }); + test.fuzz(target, (data) => module.fuzz(data)); +}); diff --git a/.cifuzz-corpus/crash-doctype-in-element.xml b/test/fuzz/regression.test.fuzz/dom-parser.html.target.js/crash-doctype-in-element.xml similarity index 100% rename from .cifuzz-corpus/crash-doctype-in-element.xml rename to test/fuzz/regression.test.fuzz/dom-parser.html.target.js/crash-doctype-in-element.xml diff --git a/.cifuzz-corpus/crash-proto-prefix.xml b/test/fuzz/regression.test.fuzz/dom-parser.html.target.js/crash-proto-prefix.xml similarity index 100% rename from .cifuzz-corpus/crash-proto-prefix.xml rename to test/fuzz/regression.test.fuzz/dom-parser.html.target.js/crash-proto-prefix.xml diff --git a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/console.log/crash-doctype-in-element.xml b/test/fuzz/regression.test.fuzz/dom-parser.xml.target.js/crash-doctype-in-element.xml similarity index 100% rename from .cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/console.log/crash-doctype-in-element.xml rename to test/fuzz/regression.test.fuzz/dom-parser.xml.target.js/crash-doctype-in-element.xml diff --git a/.cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/console.log/crash-proto-prefix.xml b/test/fuzz/regression.test.fuzz/dom-parser.xml.target.js/crash-proto-prefix.xml similarity index 100% rename from .cifuzz-corpus/regression.test.fuzz/ensure_previous_fuzzer_findings_are_not_reintroduced/console.log/crash-proto-prefix.xml rename to test/fuzz/regression.test.fuzz/dom-parser.xml.target.js/crash-proto-prefix.xml diff --git a/test/regression.test.fuzz.js b/test/regression.test.fuzz.js deleted file mode 100644 index db48af02f..000000000 --- a/test/regression.test.fuzz.js +++ /dev/null @@ -1,11 +0,0 @@ -'use strict'; - -const { describe, test } = require('@jest/globals'); -const xml = require('./dom-parser.xml.fuzz'); -const html = require('./dom-parser.html.fuzz'); - -describe('ensure previous fuzzer findings are not reintroduced', () => { - test.fuzz('dom-parser.xml.fuzz.js', xml.fuzz); - test.fuzz('dom-parser.html.fuzz.js', html.fuzz); - test.fuzz('console.log', (data) => console.log(data.toString())); -}); From c551b774f87cb2d14a9dd61fa32324d45390155e Mon Sep 17 00:00:00 2001 From: Christian Bewernitz Date: Mon, 9 Oct 2023 18:30:06 +0200 Subject: [PATCH 4/8] chore: separate fuzz tests - own jest config, folder and script - only run it in node v16 (since node v14 support is broken) --- .github/workflows/test-node.js.yml | 2 + {test/fuzz => fuzz}/dom-parser.html.target.js | 2 +- {test/fuzz => fuzz}/dom-parser.xml.target.js | 2 +- .../regression.test.js | 3 +- .../crash-doctype-in-element.xml | 0 .../crash-proto-prefix.xml | 0 .../crash-doctype-in-element.xml | 0 .../crash-proto-prefix.xml | 0 jest.config.js | 28 +-- jest.fuzz.config.js | 183 ++++++++++++++++++ package.json | 1 + 11 files changed, 203 insertions(+), 18 deletions(-) rename {test/fuzz => fuzz}/dom-parser.html.target.js (96%) rename {test/fuzz => fuzz}/dom-parser.xml.target.js (96%) rename test/fuzz/regression.test.fuzz.js => fuzz/regression.test.js (86%) rename {test/fuzz/regression.test.fuzz => fuzz/regression.test}/dom-parser.html.target.js/crash-doctype-in-element.xml (100%) rename {test/fuzz/regression.test.fuzz => fuzz/regression.test}/dom-parser.html.target.js/crash-proto-prefix.xml (100%) rename {test/fuzz/regression.test.fuzz => fuzz/regression.test}/dom-parser.xml.target.js/crash-doctype-in-element.xml (100%) rename {test/fuzz/regression.test.fuzz => fuzz/regression.test}/dom-parser.xml.target.js/crash-proto-prefix.xml (100%) create mode 100644 jest.fuzz.config.js diff --git a/.github/workflows/test-node.js.yml b/.github/workflows/test-node.js.yml index 4c5d1e78a..2f8d442b2 100644 --- a/.github/workflows/test-node.js.yml +++ b/.github/workflows/test-node.js.yml @@ -41,6 +41,8 @@ jobs: if: matrix.node-version != 16 - run: npm run test -- --coverage if: matrix.node-version == 16 + - run: npm run fuzz + if: matrix.node-version == 16 - if: matrix.node-version == 16 uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d # v3.1.4 env: diff --git a/test/fuzz/dom-parser.html.target.js b/fuzz/dom-parser.html.target.js similarity index 96% rename from test/fuzz/dom-parser.html.target.js rename to fuzz/dom-parser.html.target.js index 5541f31c0..d2ceff07d 100644 --- a/test/fuzz/dom-parser.html.target.js +++ b/fuzz/dom-parser.html.target.js @@ -1,6 +1,6 @@ 'use strict'; -const { DOMParser, ParseError, MIME_TYPE, XMLSerializer } = require('../../lib'); +const { DOMParser, ParseError, MIME_TYPE, XMLSerializer } = require('../lib'); module.exports.fuzz = (buffer) => { try { diff --git a/test/fuzz/dom-parser.xml.target.js b/fuzz/dom-parser.xml.target.js similarity index 96% rename from test/fuzz/dom-parser.xml.target.js rename to fuzz/dom-parser.xml.target.js index 01f3626d4..771267e48 100644 --- a/test/fuzz/dom-parser.xml.target.js +++ b/fuzz/dom-parser.xml.target.js @@ -1,6 +1,6 @@ 'use strict'; -const { DOMParser, ParseError, MIME_TYPE, XMLSerializer } = require('../../lib'); +const { DOMParser, ParseError, MIME_TYPE, XMLSerializer } = require('../lib'); module.exports.fuzz = (buffer) => { try { diff --git a/test/fuzz/regression.test.fuzz.js b/fuzz/regression.test.js similarity index 86% rename from test/fuzz/regression.test.fuzz.js rename to fuzz/regression.test.js index 9a6e65d1f..dfe4ae14e 100644 --- a/test/fuzz/regression.test.fuzz.js +++ b/fuzz/regression.test.js @@ -1,5 +1,4 @@ 'use strict'; -// wallaby:file.skip since it complains regarding jasmine const { expect, test, beforeAll, afterAll } = require('@jest/globals'); const fs = require('fs'); @@ -16,7 +15,7 @@ TARGETS.forEach((target) => { afterAll(() => { // avoid silently failing for targets that have no test input // there is one call with an empty buffer - expect(spy).toBeCalledTimes(testfiles.length + 1); + // expect(spy).toBeCalledTimes(testfiles.length + 1); }); test.fuzz(target, (data) => module.fuzz(data)); }); diff --git a/test/fuzz/regression.test.fuzz/dom-parser.html.target.js/crash-doctype-in-element.xml b/fuzz/regression.test/dom-parser.html.target.js/crash-doctype-in-element.xml similarity index 100% rename from test/fuzz/regression.test.fuzz/dom-parser.html.target.js/crash-doctype-in-element.xml rename to fuzz/regression.test/dom-parser.html.target.js/crash-doctype-in-element.xml diff --git a/test/fuzz/regression.test.fuzz/dom-parser.html.target.js/crash-proto-prefix.xml b/fuzz/regression.test/dom-parser.html.target.js/crash-proto-prefix.xml similarity index 100% rename from test/fuzz/regression.test.fuzz/dom-parser.html.target.js/crash-proto-prefix.xml rename to fuzz/regression.test/dom-parser.html.target.js/crash-proto-prefix.xml diff --git a/test/fuzz/regression.test.fuzz/dom-parser.xml.target.js/crash-doctype-in-element.xml b/fuzz/regression.test/dom-parser.xml.target.js/crash-doctype-in-element.xml similarity index 100% rename from test/fuzz/regression.test.fuzz/dom-parser.xml.target.js/crash-doctype-in-element.xml rename to fuzz/regression.test/dom-parser.xml.target.js/crash-doctype-in-element.xml diff --git a/test/fuzz/regression.test.fuzz/dom-parser.xml.target.js/crash-proto-prefix.xml b/fuzz/regression.test/dom-parser.xml.target.js/crash-proto-prefix.xml similarity index 100% rename from test/fuzz/regression.test.fuzz/dom-parser.xml.target.js/crash-proto-prefix.xml rename to fuzz/regression.test/dom-parser.xml.target.js/crash-proto-prefix.xml diff --git a/jest.config.js b/jest.config.js index 08b9878aa..ca3eb2ccc 100644 --- a/jest.config.js +++ b/jest.config.js @@ -88,19 +88,19 @@ module.exports = { // preset: undefined, // Run tests from one or more projects - projects: [ - { - displayName: 'test', - }, - { - displayName: { - name: 'Jazzer.js', - color: 'cyan', - }, - testMatch: ['/test/fuzz/*.test.fuzz.js'], - testRunner: '@jazzer.js/jest-runner', - }, - ], + // projects: [ + // { + // displayName: 'test', + // }, + // { + // displayName: { + // name: 'Jazzer.js', + // color: 'cyan', + // }, + // testMatch: ['/test/fuzz/*.test.fuzz.js'], + // testRunner: '@jazzer.js/jest-runner', + // }, + // ], // Use this configuration option to add custom reporters to Jest // reporters: undefined, @@ -161,7 +161,7 @@ module.exports = { // ], // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: ['test/**/*.test.js$'], + testRegex: ['^test', '.test.js$'], // This option allows the use of a custom results processor // testResultsProcessor: undefined, diff --git a/jest.fuzz.config.js b/jest.fuzz.config.js new file mode 100644 index 000000000..653114991 --- /dev/null +++ b/jest.fuzz.config.js @@ -0,0 +1,183 @@ +'use strict'; +// For a detailed explanation regarding each configuration property, visit: +// https://jestjs.io/docs/en/configuration.html + +module.exports = { + // All imported modules in your tests should be mocked automatically + // automock: false, + + // Stop running tests after `n` failures + // bail: 0, + + // The directory where Jest should store its cached dependency information + // cacheDirectory: "/tmp/jest_rs", + + // Automatically clear mock calls and instances between every test + clearMocks: true, + + // Indicates whether the coverage information should be collected while executing the test + // collectCoverage: false, + + // An array of glob patterns indicating a set of files for which coverage information should be collected + // collectCoverageFrom: undefined, + + // The directory where Jest should output its coverage files + coverageDirectory: 'coverage', + + // An array of regexp pattern strings used to skip coverage collection + coveragePathIgnorePatterns: ['/node_modules/', '/test/'], + + // Indicates which provider should be used to instrument code for coverage + // coverageProvider: "v8", + + // A list of reporter names that Jest uses when writing coverage reports + coverageReporters: ['json', 'text', 'lcov', 'clover', 'cobertura'], + + // An object that configures minimum threshold enforcement for coverage results + // coverageThreshold: undefined, + + // A path to a custom dependency extractor + // dependencyExtractor: undefined, + + // Make calling deprecated APIs throw helpful error messages + // errorOnDeprecated: false, + + // Force coverage collection from ignored files using an array of glob patterns + // forceCoverageMatch: [], + + // A path to a module which exports an async function that is triggered once before all test suites + // globalSetup: undefined, + + // A path to a module which exports an async function that is triggered once after all test suites + // globalTeardown: undefined, + + // A set of global variables that need to be available in all test environments + // globals: {}, + + // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. + // maxWorkers: "50%", + + // An array of directory names to be searched recursively up from the requiring module's location + // moduleDirectories: [ + // "node_modules" + // ], + + // An array of file extensions your modules use + // moduleFileExtensions: [ + // "js", + // "json", + // "jsx", + // "ts", + // "tsx", + // "node" + // ], + + // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module + // moduleNameMapper: {}, + + // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader + // modulePathIgnorePatterns: [], + + // Activates notifications for test results + // notify: false, + + // An enum that specifies notification mode. Requires { notify: true } + // notifyMode: "failure-change", + + // A preset that is used as a base for Jest's configuration + // preset: undefined, + + // Run tests from one or more projects + // projects: undefined, + + // Use this configuration option to add custom reporters to Jest + // reporters: undefined, + + // Automatically reset mock state between every test + // resetMocks: false, + + // Reset the module registry before running each individual test + // resetModules: false, + + // A path to a custom resolver + // resolver: undefined, + + // Automatically restore mock state between every test + // restoreMocks: false, + + // The root directory that Jest should scan for tests and modules within + // rootDir: undefined, + + // A list of paths to directories that Jest should use to search for files in + // roots: [ + // "" + // ], + + // Allows you to use a custom runner instead of Jest's default test runner + // runner: "jest-runner", + + // The paths to modules that run some code to configure or set up the testing environment before each test + // setupFiles: [], + + // A list of paths to modules that run some code to configure or set up the testing framework before each test + // setupFilesAfterEnv: [], + + // The number of seconds after which a test is considered as slow and reported as such in the results. + // slowTestThreshold: 5, + + // A list of paths to snapshot serializer modules Jest should use for snapshot testing + // snapshotSerializers: [], + + // The test environment that will be used for testing + testEnvironment: 'node', + + // Options that will be passed to the testEnvironment + // testEnvironmentOptions: {}, + + // Adds a location field to test results + // testLocationInResults: false, + + // The glob patterns Jest uses to detect test files + testMatch: ['/fuzz/*.test.js'], + + // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped + // testPathIgnorePatterns: [ + // "/node_modules/" + // ], + + // The regexp pattern or array of patterns that Jest uses to detect test files + // testRegex: ['test/**/*.test.js$'], + + // This option allows the use of a custom results processor + // testResultsProcessor: undefined, + + // This option allows use of a custom test runner + testRunner: '@jazzer.js/jest-runner', + + // This option sets the URL for the jsdom environment. It is reflected in properties such as location.href + // testURL: "http://localhost", + + // Setting this value to "fake" allows the use of fake timers for functions such as "setTimeout" + // timers: "real", + + // A map from regular expressions to paths to transformers + // transform: undefined, + + // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation + // transformIgnorePatterns: [ + // "/node_modules/", + // "\\.pnp\\.[^\\/]+$" + // ], + + // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them + // unmockedModulePathPatterns: undefined, + + // Indicates whether each individual test should be reported during the run + // verbose: undefined, + + // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode + // watchPathIgnorePatterns: [], + + // Whether to use watchman for file crawling + // watchman: true, +}; diff --git a/package.json b/package.json index fda5594be..fd95711fe 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "changelog": "auto-changelog --unreleased-only", "start": "nodemon --watch package.json --watch lib --watch test --exec 'npm --silent run test && npm --silent run lint'", "test": "jest", + "fuzz": "jest --config=./jest.fuzz.config.js", "test:types": "cd examples/typescript-node-es6 && ./pretest.sh 3 && ./pretest.sh 4 && ./pretest.sh 5 && node dist/index.js", "testrelease": "npm test && eslint lib", "version": "./changelog-has-version.sh", From 71944d75ded85e2808e82c35c983009151736473 Mon Sep 17 00:00:00 2001 From: Christian Bewernitz Date: Mon, 9 Oct 2023 18:49:43 +0200 Subject: [PATCH 5/8] test: restore check for spy calls --- fuzz/regression.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fuzz/regression.test.js b/fuzz/regression.test.js index dfe4ae14e..fde2aa4a9 100644 --- a/fuzz/regression.test.js +++ b/fuzz/regression.test.js @@ -15,7 +15,7 @@ TARGETS.forEach((target) => { afterAll(() => { // avoid silently failing for targets that have no test input // there is one call with an empty buffer - // expect(spy).toBeCalledTimes(testfiles.length + 1); + expect(spy).toBeCalledTimes(testfiles.length + 1); }); test.fuzz(target, (data) => module.fuzz(data)); }); From 328330df14d2ad9a25b999909e737db354940a51 Mon Sep 17 00:00:00 2001 From: Christian Bewernitz Date: Mon, 9 Oct 2023 18:52:53 +0200 Subject: [PATCH 6/8] test: set roots in jest configs to be as explicit as possible --- jest.config.js | 6 ++---- jest.fuzz.config.js | 4 +--- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/jest.config.js b/jest.config.js index ca3eb2ccc..752b25da7 100644 --- a/jest.config.js +++ b/jest.config.js @@ -121,9 +121,7 @@ module.exports = { // rootDir: undefined, // A list of paths to directories that Jest should use to search for files in - // roots: [ - // "" - // ], + roots: ['/test'], // Allows you to use a custom runner instead of Jest's default test runner // runner: "jest-runner", @@ -161,7 +159,7 @@ module.exports = { // ], // The regexp pattern or array of patterns that Jest uses to detect test files - testRegex: ['^test', '.test.js$'], + testRegex: ['.test.js$'], // This option allows the use of a custom results processor // testResultsProcessor: undefined, diff --git a/jest.fuzz.config.js b/jest.fuzz.config.js index 653114991..0a357a2d3 100644 --- a/jest.fuzz.config.js +++ b/jest.fuzz.config.js @@ -109,9 +109,7 @@ module.exports = { // rootDir: undefined, // A list of paths to directories that Jest should use to search for files in - // roots: [ - // "" - // ], + roots: ['/fuzz'], // Allows you to use a custom runner instead of Jest's default test runner // runner: "jest-runner", From 9b2ab34035fa7f254cc545209240e4e8cfae296d Mon Sep 17 00:00:00 2001 From: Christian Bewernitz Date: Wed, 11 Oct 2023 07:33:13 +0200 Subject: [PATCH 7/8] test: drop assertion on spy calls since it doesn't work as expected --- fuzz/regression.test.js | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/fuzz/regression.test.js b/fuzz/regression.test.js index fde2aa4a9..a9623fcbc 100644 --- a/fuzz/regression.test.js +++ b/fuzz/regression.test.js @@ -1,21 +1,22 @@ 'use strict'; -const { expect, test, beforeAll, afterAll } = require('@jest/globals'); +const { describe, expect, test, beforeAll, afterAll } = require('@jest/globals'); const fs = require('fs'); const path = require('path'); -const TARGETS = fs.readdirSync(__dirname).filter((file) => file.endsWith('.target.js')); +const TARGETS = fs + .readdirSync(__dirname) + .filter((file) => file.endsWith('.target.js')) + .map((target) => [target, path.join(__dirname, target)]); -TARGETS.forEach((target) => { - const module = require(path.join(__dirname, target)); - const spy = jest.spyOn(module, 'fuzz'); - const testfiles = fs.readdirSync(path.join(__filename.replace(/\.js$/, ''), target)); - beforeAll(() => { - expect(testfiles.length).toBeGreaterThan(0); +TARGETS.forEach(([target, targetPath]) => { + describe('', () => { + beforeAll(() => { + const regressionDir = path.join(__filename.replace(/\.js$/, ''), target); + expect(fs.existsSync(regressionDir)).toBe(true); + const testfiles = fs.readdirSync(regressionDir); + expect(testfiles.length).toBeGreaterThan(0); + }); + const module = require(targetPath); + test.fuzz(target, (data) => module.fuzz(data)); }); - afterAll(() => { - // avoid silently failing for targets that have no test input - // there is one call with an empty buffer - expect(spy).toBeCalledTimes(testfiles.length + 1); - }); - test.fuzz(target, (data) => module.fuzz(data)); }); From 38e03a37881c335d9df136a64c30538d17bdee47 Mon Sep 17 00:00:00 2001 From: Christian Bewernitz Date: Wed, 11 Oct 2023 07:35:54 +0200 Subject: [PATCH 8/8] style: drop unused import --- fuzz/regression.test.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fuzz/regression.test.js b/fuzz/regression.test.js index a9623fcbc..c5cd21b59 100644 --- a/fuzz/regression.test.js +++ b/fuzz/regression.test.js @@ -1,5 +1,5 @@ 'use strict'; -const { describe, expect, test, beforeAll, afterAll } = require('@jest/globals'); +const { describe, expect, test, beforeAll } = require('@jest/globals'); const fs = require('fs'); const path = require('path');