diff --git a/applicationinsights-react-native/package.json b/applicationinsights-react-native/package.json index e7d3b16f..d5f390bc 100644 --- a/applicationinsights-react-native/package.json +++ b/applicationinsights-react-native/package.json @@ -51,7 +51,6 @@ "@microsoft/api-extractor": "^7.18.1", "grunt": "^1.5.3", "grunt-cli": "^1.4.3", - "grunt-contrib-qunit": "^6.2.1", "grunt-contrib-uglify": "^5.0.1", "@nevware21/grunt-ts-plugin": "^0.4.3", "@nevware21/grunt-eslint-ts": "^0.2.2", @@ -75,8 +74,7 @@ "rollup": "^2.77.2", "typescript": "^4.3.4", "tslib": "^2.0.0", - "uglify-js": "3.16.0", - "tar-fs": "^3.0.8" + "uglify-js": "3.16.0" }, "dependencies": { "@microsoft/applicationinsights-common": "^3.3.6", diff --git a/common/Tests/Framework/package.json b/common/Tests/Framework/package.json index 020beb56..9fe6f6a6 100644 --- a/common/Tests/Framework/package.json +++ b/common/Tests/Framework/package.json @@ -32,7 +32,6 @@ "@types/qunit": "^2.5.3", "@types/sinon": "4.3.3", "grunt": "^1.5.3", - "grunt-contrib-qunit": "^6.2.1", "@nevware21/grunt-ts-plugin": "^0.4.3", "@rollup/plugin-commonjs": "^18.0.0", "@rollup/plugin-node-resolve": "^11.2.1", @@ -43,8 +42,7 @@ "qunit": "^2.11.2", "sinon": "^7.3.1", "globby": "^11.0.0", - "magic-string": "^0.25.7", - "tar-fs": "^3.0.8" + "magic-string": "^0.25.7" }, "peerDependencies": { "tslib": "*" diff --git a/common/config/rush/npm-shrinkwrap.json b/common/config/rush/npm-shrinkwrap.json index 234ca938..fa976b5a 100644 --- a/common/config/rush/npm-shrinkwrap.json +++ b/common/config/rush/npm-shrinkwrap.json @@ -36,7 +36,6 @@ "globby": "^11.0.0", "grunt": "^1.5.3", "grunt-cli": "^1.4.3", - "grunt-contrib-qunit": "^6.2.1", "grunt-contrib-uglify": "^5.0.1", "magic-string": "^0.25.7", "qunit": "^2.11.2", @@ -47,7 +46,6 @@ "rollup-plugin-minify-es": "^1.1.1", "rollup-plugin-peer-deps-external": "^2.2.4", "sinon": "^7.3.1", - "tar-fs": "^3.0.8", "tslib": "^2.0.0", "typescript": "^4.3.4", "uglify-js": "3.16.0" @@ -2218,11 +2216,11 @@ } }, "node_modules/@microsoft/applicationinsights-common": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.3.6.tgz", - "integrity": "sha512-XuqWwbDSW7DuagcUy9Op7UFZeAyjU9RWuIQppxlTGrITa7PF5QmsyvjCiSsBRy7vMt/q42qnmOYoHwhL7KoyOQ==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-common/-/applicationinsights-common-3.3.7.tgz", + "integrity": "sha512-PLHwpYF5jtXOXhri5hB/7TYJrpafEYdSdCK+6U6OH/KnMxu3jBrmbayitF9Dgfjjwz7DOEK1pOWphzI/Xs5O7Q==", "dependencies": { - "@microsoft/applicationinsights-core-js": "3.3.6", + "@microsoft/applicationinsights-core-js": "3.3.7", "@microsoft/applicationinsights-shims": "3.0.1", "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/ts-utils": ">= 0.11.8 < 2.x" @@ -2232,9 +2230,9 @@ } }, "node_modules/@microsoft/applicationinsights-core-js": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.3.6.tgz", - "integrity": "sha512-Yv09rk/QdLhM4Dr29WKi4xWmsnTJpuGE95kuKsBxSlzFYlC3foYAZ5wowsNU6Yscpv6TJQRd6RksMIEGV6Uz5Q==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@microsoft/applicationinsights-core-js/-/applicationinsights-core-js-3.3.7.tgz", + "integrity": "sha512-GVYUv+8c8eCYZdHhXF41PwES1W1+lur/1sVWiRmAmFdbKi42MgGhFJgUdNR8jW6h+CLZ35B9HjPrZOTKZ6X0NQ==", "dependencies": { "@microsoft/applicationinsights-shims": "3.0.1", "@microsoft/dynamicproto-js": "^2.0.3", @@ -2594,6 +2592,26 @@ "ws": "^7.5.1" } }, + "node_modules/@react-native-community/cli-server-api/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/@react-native-community/cli-tools": { "version": "8.0.4", "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-8.0.4.tgz", @@ -2821,7 +2839,7 @@ "node_modules/@rush-temp/ai-test-framework": { "version": "0.0.0", "resolved": "file:projects/ai-test-framework.tgz", - "integrity": "sha512-Jpx86ohvJ+jitAQwCprzNuM0h8ZGr9WPF6GFpbYmZbKfgfLRJU+oZGxNHLYRPzx15RpgyiDvP/p23ZFRIBLpnA==", + "integrity": "sha512-7xFD9RbaSUWRDw7h9FAcOv2XdbGfo5JZjgUt23O4qL99eZ6tKHGgrB07WsY3DlJnNXw7/t4YbdIloVn6PtWpIA==", "dependencies": { "@microsoft/dynamicproto-js": "^2.0.3", "@nevware21/grunt-ts-plugin": "^0.4.3", @@ -2832,12 +2850,10 @@ "@types/sinon": "4.3.3", "globby": "^11.0.0", "grunt": "^1.5.3", - "grunt-contrib-qunit": "^6.2.1", "magic-string": "^0.25.7", "qunit": "^2.11.2", "rollup": "^2.77.2", "sinon": "^7.3.1", - "tar-fs": "^3.0.8", "tslib": "^2.0.0", "typescript": "^4.3.4" } @@ -2854,7 +2870,7 @@ "node_modules/@rush-temp/applicationinsights-react-native": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-react-native.tgz", - "integrity": "sha512-yyVA3P3VOt1xIB5nqletqmleaghblZJ1+hRijrJvFm+ggHjU4is1R5UEJ+8FS1QOmz5WeVclwAbw1gbMO6UrRA==", + "integrity": "sha512-6rpk3l3ANxC5lOb/VkCzyxb9aZW66ISqHZzH3LzyhNacxkfaOOsm55iLjPEXfLV+b4bGVD1vf/XFnzeCKgX6FA==", "dependencies": { "@microsoft/api-extractor": "^7.18.1", "@microsoft/applicationinsights-common": "^3.3.6", @@ -2878,7 +2894,6 @@ "globby": "^11.0.0", "grunt": "^1.5.3", "grunt-cli": "^1.4.3", - "grunt-contrib-qunit": "^6.2.1", "grunt-contrib-uglify": "^5.0.1", "magic-string": "^0.25.7", "qunit": "^2.11.2", @@ -2888,7 +2903,6 @@ "rollup": "^2.77.2", "rollup-plugin-cleanup": "^3.2.1", "rollup-plugin-peer-deps-external": "^2.2.4", - "tar-fs": "^3.0.8", "tslib": "^2.0.0", "typescript": "^4.3.4", "uglify-js": "3.16.0" @@ -2897,7 +2911,7 @@ "node_modules/@rush-temp/applicationinsights-rollup-plugin-uglify3-js": { "version": "0.0.0", "resolved": "file:projects/applicationinsights-rollup-plugin-uglify3-js.tgz", - "integrity": "sha512-uuzFMfGh+LLWFc5xjGZYqg2lDSKfHKSntvyq7yvpEn/lmwc1rVIzXqpwcqt/fQFJPmh6owP9OCRH1Vin0GX3LQ==", + "integrity": "sha512-HDr4d/lkJfbHQsUfUR+Hlu31vVSgVs9GrgziqhQeKhhdJ1t3OuIaENZCMu75U/KN/+f/Y464VLSiVxvu1OPEDw==", "dependencies": { "@nevware21/grunt-eslint-ts": "^0.2.2", "@nevware21/grunt-ts-plugin": "^0.4.3", @@ -2906,10 +2920,8 @@ "@rollup/plugin-replace": "^2.3.3", "grunt": "^1.5.3", "grunt-cli": "^1.4.3", - "grunt-contrib-qunit": "^6.2.1", "rollup": "^2.77.2", "rollup-plugin-minify-es": "^1.1.1", - "tar-fs": "^3.0.8", "tslib": "^2.0.0", "typescript": "^4.3.4", "uglify-js": "3.16.0" @@ -3090,9 +3102,9 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" }, "node_modules/@types/node": { - "version": "22.15.15", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.15.tgz", - "integrity": "sha512-R5muMcZob3/Jjchn5LcO8jdKwSCbzqmPB6ruBxMcf9kbxtniZHP327s6C37iOfuw8mbKK3cAQa7sEl7afLrQ8A==", + "version": "22.15.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.15.17.tgz", + "integrity": "sha512-wIX2aSZL5FE+MR0JlvF87BNVrtFWf6AE6rxSE9X7OwnVvoyCQjpzSRJ+M87se/4QCkCiebQAqrJ0y6fwIyi7nw==", "dependencies": { "undici-types": "~6.21.0" } @@ -3128,15 +3140,6 @@ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==" }, - "node_modules/@types/yauzl": { - "version": "2.10.3", - "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", - "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", - "optional": true, - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "4.33.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz", @@ -3355,17 +3358,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, "node_modules/ajv": { "version": "8.12.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", @@ -3743,11 +3735,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/b4a": { - "version": "1.6.7", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz", - "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==" - }, "node_modules/babel-core": { "version": "7.0.0-bridge.0", "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-7.0.0-bridge.0.tgz", @@ -3847,73 +3834,6 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/bare-events": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz", - "integrity": "sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==", - "optional": true - }, - "node_modules/bare-fs": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.1.4.tgz", - "integrity": "sha512-r8+26Voz8dGX3AYpJdFb1ZPaUSM8XOLCZvy+YGpRTmwPHIxA7Z3Jov/oMPtV7hfRQbOnH8qGlLTzQAbgtdNN0Q==", - "optional": true, - "dependencies": { - "bare-events": "^2.5.4", - "bare-path": "^3.0.0", - "bare-stream": "^2.6.4" - }, - "engines": { - "bare": ">=1.16.0" - }, - "peerDependencies": { - "bare-buffer": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - } - } - }, - "node_modules/bare-os": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.1.tgz", - "integrity": "sha512-uaIjxokhFidJP+bmmvKSgiMzj2sV5GPHaZVAIktcxcpCyBFFWO+YlikVAdhmUo2vYFvFhOXIAlldqV29L8126g==", - "optional": true, - "engines": { - "bare": ">=1.14.0" - } - }, - "node_modules/bare-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-3.0.0.tgz", - "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", - "optional": true, - "dependencies": { - "bare-os": "^3.0.1" - } - }, - "node_modules/bare-stream": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.5.tgz", - "integrity": "sha512-jSmxKJNJmHySi6hC42zlZnq00rga4jjxcgNZjY9N5WlOe/iOoGRtdwGsHzQv2RlH2KOYMwGUXhf2zXd32BA9RA==", - "optional": true, - "dependencies": { - "streamx": "^2.21.0" - }, - "peerDependencies": { - "bare-buffer": "*", - "bare-events": "*" - }, - "peerDependenciesMeta": { - "bare-buffer": { - "optional": true - }, - "bare-events": { - "optional": true - } - } - }, "node_modules/base": { "version": "0.11.2", "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", @@ -4053,14 +3973,6 @@ "ieee754": "^1.1.13" } }, - "node_modules/buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", - "engines": { - "node": "*" - } - }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4242,11 +4154,6 @@ "node": ">=8" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, "node_modules/ci-info": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", @@ -4750,11 +4657,6 @@ "node": ">=0.10.0" } }, - "node_modules/devtools-protocol": { - "version": "0.0.869402", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.869402.tgz", - "integrity": "sha512-VvlVYY+VDJe639yHs5PHISzdWTLL3Aw8rO4cvUtwvoxFd6FHbE4OpHHcde52M6096uYYazAmd4l0o5VuFRO2WA==" - }, "node_modules/diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", @@ -4809,9 +4711,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.5.150", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.150.tgz", - "integrity": "sha512-rOOkP2ZUMx1yL4fCxXQKDHQ8ZXwisb2OycOQVKHgvB3ZI4CvehOd4y2tfnnLDieJ3Zs1RL1Dlp3cMkyIn7nnXA==" + "version": "1.5.152", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.152.tgz", + "integrity": "sha512-xBOfg/EBaIlVsHipHl2VdTPJRSvErNUaqW8ejTq5OlOlIYx1wOllCHsAvAIrr55jD1IYEfdR86miUEt8H5IeJg==" }, "node_modules/emoji-regex": { "version": "8.0.0", @@ -5594,17 +5496,6 @@ "node": ">=4.8" } }, - "node_modules/execa/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/execa/node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", @@ -5807,35 +5698,11 @@ "node": ">=0.10.0" } }, - "node_modules/extract-zip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", - "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", - "dependencies": { - "debug": "^4.1.1", - "get-stream": "^5.1.0", - "yauzl": "^2.10.0" - }, - "bin": { - "extract-zip": "cli.js" - }, - "engines": { - "node": ">= 10.17.0" - }, - "optionalDependencies": { - "@types/yauzl": "^2.9.1" - } - }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, - "node_modules/fast-fifo": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" - }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", @@ -5877,14 +5744,6 @@ "bser": "2.1.1" } }, - "node_modules/fd-slicer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", - "dependencies": { - "pend": "~1.2.0" - } - }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -5972,59 +5831,6 @@ "node": ">=6" } }, - "node_modules/find-cache-dir/node_modules/find-up": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", - "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", - "dependencies": { - "locate-path": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/locate-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", - "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", - "dependencies": { - "p-locate": "^3.0.0", - "path-exists": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/p-locate": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", - "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", - "dependencies": { - "p-limit": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/find-cache-dir/node_modules/path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/find-cache-dir/node_modules/pkg-dir": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", - "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", - "dependencies": { - "find-up": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -6152,11 +5958,6 @@ "node": ">= 0.6" } }, - "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==" - }, "node_modules/fs-extra": { "version": "11.3.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", @@ -6175,6 +5976,19 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -6267,17 +6081,14 @@ } }, "node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dependencies": { "pump": "^3.0.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=6" } }, "node_modules/get-symbol-description": { @@ -6525,24 +6336,6 @@ "node": ">=6" } }, - "node_modules/grunt-contrib-qunit": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/grunt-contrib-qunit/-/grunt-contrib-qunit-6.2.1.tgz", - "integrity": "sha512-zXz+tSH28sNAIZ7x0yK5+HFAFQCw9ODLccAw40IyN364l8LaIy2c33EgzO1rBvlmBWoal+3SbltRMqAUXKFCXw==", - "dependencies": { - "eventemitter2": "^6.4.2", - "p-each-series": "^2.1.0", - "puppeteer": "^9.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/grunt-contrib-qunit/node_modules/eventemitter2": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.9.tgz", - "integrity": "sha512-JEPTiaOt9f04oa6NOkc4aH+nVp5I3wEjpHbIPqfgCdD5v5bUzy7xQqwcVO2aDQgOWhI28da57HksMrzK9HlRxg==" - }, "node_modules/grunt-contrib-uglify": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-5.2.2.tgz", @@ -6910,18 +6703,6 @@ "node": ">= 0.8" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", @@ -8443,6 +8224,26 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/metro-inspector-proxy/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/metro-minify-uglify": { "version": "0.70.4", "resolved": "https://registry.npmjs.org/metro-minify-uglify/-/metro-minify-uglify-0.70.4.tgz", @@ -8666,6 +8467,26 @@ "node": ">=0.10.0" } }, + "node_modules/metro/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -8766,11 +8587,6 @@ "mkdirp": "bin/cmd.js" } }, - "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==" - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -9276,17 +9092,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/p-each-series": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-each-series/-/p-each-series-2.2.0.tgz", - "integrity": "sha512-ycIL2+1V32th+8scbpTvyHNaHe02z0sjgh91XXjAk+ZeXoPN4Z46DVUnzdso0aX4KckKw0FNNFHdjZ2UsZvxiA==", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", @@ -9457,11 +9262,6 @@ "node": ">=8" } }, - "node_modules/pend": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" - }, "node_modules/perf-regexes": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/perf-regexes/-/perf-regexes-1.0.1.tgz", @@ -9503,14 +9303,56 @@ } }, "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dependencies": { - "find-up": "^4.0.0" + "find-up": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-dir/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" } }, "node_modules/plist": { @@ -9631,11 +9473,6 @@ "node": ">= 6" } }, - "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==" - }, "node_modules/pump": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz", @@ -9653,56 +9490,6 @@ "node": ">=6" } }, - "node_modules/puppeteer": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-9.1.1.tgz", - "integrity": "sha512-W+nOulP2tYd/ZG99WuZC/I5ljjQQ7EUw/jQGcIb9eu8mDlZxNY2SgcJXTLG9h5gRvqA3uJOe4hZXYsd3EqioMw==", - "deprecated": "< 22.8.2 is no longer supported", - "hasInstallScript": true, - "dependencies": { - "debug": "^4.1.0", - "devtools-protocol": "0.0.869402", - "extract-zip": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "node-fetch": "^2.6.1", - "pkg-dir": "^4.2.0", - "progress": "^2.0.1", - "proxy-from-env": "^1.1.0", - "rimraf": "^3.0.2", - "tar-fs": "^2.0.0", - "unbzip2-stream": "^1.3.3", - "ws": "^7.2.3" - }, - "engines": { - "node": ">=10.18.1" - } - }, - "node_modules/puppeteer/node_modules/tar-fs": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.2.tgz", - "integrity": "sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==", - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/puppeteer/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==", - "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/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -9766,6 +9553,26 @@ "ws": "^7" } }, + "node_modules/react-devtools-core/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -9844,14 +9651,6 @@ "resolved": "https://registry.npmjs.org/react-native-gradle-plugin/-/react-native-gradle-plugin-0.0.7.tgz", "integrity": "sha512-+4JpbIx42zGTONhBTIXSyfyHICHC29VTvhkkoUOJAh/XHPEixpuBduYgf6Y4y9wsN1ARlQhBBoptTvXvAFQf5g==" }, - "node_modules/react-native/node_modules/ws": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", - "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", - "dependencies": { - "async-limiter": "~1.0.0" - } - }, "node_modules/react-refresh": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.4.3.tgz", @@ -11025,18 +10824,6 @@ "node": ">= 0.6" } }, - "node_modules/streamx": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.22.0.tgz", - "integrity": "sha512-sLh1evHOzBy/iWRiR6d1zRcLao4gGZr3C1kzNz4fopCOKJb6xD9ub8Mpi9Mr1R6id5o43S+d93fI48UC5uM9aw==", - "dependencies": { - "fast-fifo": "^1.3.2", - "text-decoder": "^1.1.0" - }, - "optionalDependencies": { - "bare-events": "^2.2.0" - } - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -11243,29 +11030,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/tar-fs": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.8.tgz", - "integrity": "sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==", - "dependencies": { - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^4.0.1", - "bare-path": "^3.0.0" - } - }, - "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, "node_modules/temp": { "version": "0.8.3", "resolved": "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz", @@ -11287,14 +11051,6 @@ "rimraf": "bin.js" } }, - "node_modules/text-decoder": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz", - "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==", - "dependencies": { - "b4a": "^1.6.4" - } - }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -11305,11 +11061,6 @@ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz", "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==" }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" - }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -11640,15 +11391,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/unbzip2-stream": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", - "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", - "dependencies": { - "buffer": "^5.2.1", - "through": "^2.3.8" - } - }, "node_modules/unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -12080,23 +11822,11 @@ } }, "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "engines": { - "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.3.tgz", + "integrity": "sha512-jmTjYU0j60B+vHey6TfR3Z7RD61z/hmxBS3VMSGIrroOWXQEneK1zNuotOUrGyBHQj0yrpsLHPWtigEFd13ndA==", + "dependencies": { + "async-limiter": "~1.0.0" } }, "node_modules/xmlbuilder": { @@ -12166,15 +11896,6 @@ "node": ">=6" } }, - "node_modules/yauzl": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", - "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", - "dependencies": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.1.0" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/gruntfile.js b/gruntfile.js index bf645181..e8be8dd5 100644 --- a/gruntfile.js +++ b/gruntfile.js @@ -503,7 +503,6 @@ module.exports = function (grunt) { grunt.loadNpmTasks("@nevware21/grunt-ts-plugin"); grunt.loadNpmTasks("@nevware21/grunt-eslint-ts"); grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-contrib-qunit'); grunt.loadNpmTasks('grunt-contrib-connect'); grunt.loadNpmTasks('grunt-string-replace'); grunt.loadTasks('./tools/grunt-tasks'); diff --git a/package.json b/package.json index ace22562..c0466b57 100644 --- a/package.json +++ b/package.json @@ -61,14 +61,13 @@ "grunt": "^1.5.3", "grunt-cli": "^1.4.3", "grunt-contrib-connect": "^3.0.0", - "grunt-contrib-qunit": "^6.2.1", "grunt-contrib-uglify": "^5.0.1", "grunt-string-replace": "^1.3.1", - "puppeteer": "22.12.1", + "eventemitter2": "6.4.9", + "puppeteer": "24.8.2", "typedoc": "^0.22.8", "typescript": "^4.3.4", - "whatwg-fetch": "^3.0.0", - "tar-fs": "^3.0.8" + "whatwg-fetch": "^3.0.0" }, "dependencies": { "@microsoft/applicationinsights-common": "^3.3.6", diff --git a/tools/grunt-tasks/chrome/bridge.js b/tools/grunt-tasks/chrome/bridge.js new file mode 100644 index 00000000..101c842b --- /dev/null +++ b/tools/grunt-tasks/chrome/bridge.js @@ -0,0 +1,153 @@ +/* + * grunt-contrib-qunit + * https://gruntjs.com/ + * + * Copyright (c) 2016 "Cowboy" Ben Alman, contributors + * Licensed under the MIT license. + */ + +/* global QUnit:true */ +(function (factory) { + if (window.self !== window.top) { + // Ignore iframes. https://github.com/gruntjs/grunt-contrib-qunit/issues/202 + return; + } + if (typeof define === 'function' && define.amd) { + require(['qunit'], factory); + } else { + factory(QUnit); + } +}(function(QUnit) { + 'use strict'; + + var lastMessage = performance.now(); + + // Don't re-order tests. + QUnit.config.reorder = false; + + // Send messages to the Node process + function sendMessage() { + self.__grunt_contrib_qunit__.apply(self, [].slice.call(arguments)); + lastMessage = performance.now(); + } + + if (self.__grunt_contrib_qunit_timeout__) { + setTimeout(function checkTimeout() { + if ((performance.now() - lastMessage) > self.__grunt_contrib_qunit_timeout__) { + sendMessage('fail.timeout'); + } else { + // Keep checking + setTimeout(checkTimeout, 1000); + } + }, 1000); + } + + // QUnit reporter events + // https://api.qunitjs.com/callbacks/QUnit.on/ + + QUnit.on('testStart', function(obj) { + sendMessage('qunit.on.testStart', obj); + }); + + QUnit.on('testEnd', function(obj) { + // Re-create object to strip out 'assertions' field + + // expected and actual may contain circular objects, which would fail in puppeteer as it uses JSON.stringify to serialize its messages + // In that case, replace actual and expected + var errors = obj.errors; + if (!canBeJSONStringified(errors)) { + errors = obj.errors.map(function (error) { + return { + passed: error.passed, + message: error.message, + stack: error.stack, + actual: replaceIfCannotBeJSONStringified(error.actual), + expected: replaceIfCannotBeJSONStringified(error.expected) + } + }); + } + + sendMessage('qunit.on.testEnd', { + name: obj.name, + moduleName: obj.moduleName, + fullName: obj.fullName, + status: obj.status, + runtime: obj.runtime, + errors: errors, + }); + }); + + function replaceIfCannotBeJSONStringified(obj) { + return canBeJSONStringified(obj) ? obj : obj.toString(); + } + + function canBeJSONStringified(obj) { + try { + JSON.stringify(obj); + return true; + } catch (e) { + return false; + } + } + + QUnit.on('runEnd', function(obj) { + // Re-create object to strip out large 'tests' field (deprecated). + sendMessage('qunit.on.runEnd', { + testCounts: obj.testCounts, + runtime: obj.runtime, + status: obj.status + }); + }); + + // QUnit plugin callbacks (for back-compat) + // https://api.qunitjs.com/callbacks/ + // + // TODO: Remove the below in a future major version of grunt-contrib-qunit, + // after updating docs for grunt.event.on() and announcing their deprecation, + // to give developers time to migrate any event consumers to their + // newer equivalents. + + QUnit.log(function(obj) { + // What is this I don’t even + if (obj.message === '[object Object], undefined:undefined') { + return; + } + + // Parse some stuff before sending it. + var actual; + var expected; + + if (!obj.result) { + // Dumping large objects can be very slow, and the dump isn't used for + // passing tests, so only dump if the test failed. + actual = QUnit.dump.parse(obj.actual); + expected = QUnit.dump.parse(obj.expected); + } + // Send it. + sendMessage('qunit.log', obj.result, actual, expected, obj.message, obj.source, obj.todo); + }); + + QUnit.testStart(function(obj) { + sendMessage('qunit.testStart', obj.name); + }); + + QUnit.testDone(function(obj) { + sendMessage('qunit.testDone', obj.name, obj.failed, obj.passed, obj.total, obj.runtime, obj.skipped, obj.todo); + }); + + QUnit.moduleStart(function(obj) { + sendMessage('qunit.moduleStart', obj.name); + }); + + QUnit.moduleDone(function(obj) { + sendMessage('qunit.moduleDone', obj.name, obj.failed, obj.passed, obj.total); + }); + + QUnit.begin(function() { + sendMessage('qunit.begin'); + }); + + QUnit.done(function(obj) { + sendMessage('qunit.done', obj.failed, obj.passed, obj.total, obj.runtime); + }); +})); diff --git a/tools/grunt-tasks/qunit.js b/tools/grunt-tasks/qunit.js new file mode 100644 index 00000000..b6391634 --- /dev/null +++ b/tools/grunt-tasks/qunit.js @@ -0,0 +1,465 @@ +/* + * grunt-contrib-qunit + * https://gruntjs.com/ + * + * Copyright (c) 2016 "Cowboy" Ben Alman, contributors + * Licensed under the MIT license. + */ + +'use strict'; + +// Nodejs libs. +var fs = require('fs'); +var path = require('path'); +var url = require('url'); +var EventEmitter = require('eventemitter2'); +// NPM libs. +var puppeteer = require('puppeteer'); + +var Promise = global.Promise; + +// From - https://github.com/sindresorhus/p-each-series/blob/main/index.js +async function pEachSeries(iterable, iterator) { + let index = 0; + + for (const value of iterable) { + // eslint-disable-next-line no-await-in-loop + const returnValue = await iterator(await value, index++); + + if (returnValue === pEachSeries.stop) { + break; + } + } + + return iterable; +}; + +pEachSeries.stop = Symbol('pEachSeries.stop'); +// ----------------------------------------------------------------- + +// Shared functions + +// Allow an error message to retain its color when split across multiple lines. +function formatMessage (message) { + var str = String(message); + if (typeof message === 'object' && /^\[object .*\]$/.test(str)) { + // try to use the JSON as a better string representation + try { + str = JSON.stringify(message, null, 2); + } catch ( _ ) { + } + } + return String(str).split('\n') + .map(function(s) { + return s.magenta; + }) + .join('\n'); +} + + +function createRunEnd () { + return { + status: 'passed', + testCounts: { + passed: 0, + failed: 0, + skipped: 0, + todo: 0, + total: 0 + }, + runtime: 0 + }; +} + +function combineRunEnd(combined, runEnd) { + if (runEnd.status === 'failed') { + combined.status = runEnd.status; + } + combined.testCounts.passed += runEnd.testCounts.passed; + combined.testCounts.failed += runEnd.testCounts.failed; + combined.testCounts.skipped += runEnd.testCounts.skipped; + combined.testCounts.todo += runEnd.testCounts.todo; + combined.testCounts.total += runEnd.testCounts.total; + combined.runtime += runEnd.runtime; +} + +function generateMessage(combined) { + return [ + combined.testCounts.total, + ' tests completed in ', + combined.runtime, + 'ms, with ', + combined.testCounts.failed, + ' failed, ' + + combined.testCounts.skipped, + ' skipped, and ', + combined.testCounts.todo, + ' todo.' + ].join(''); +} + +// Copied from QUnit source code +function generateHash (module) { + var hex; + var i = 0; + var hash = 0; + var str = module + '\x1C' + 'undefined'; + var len = str.length; + + for (; i < len; i++) { + hash = ((hash << 5) - hash) + str.charCodeAt(i); + hash |= 0; + } + + // Convert the possibly negative integer hash code into an 8 character + // hex string, which isn't strictly necessary but increases user understanding + // that the id is a SHA-like hash + hex = (0x100000000 + hash).toString(16); + if (hex.length < 8) { + hex = '0000000' + hex; + } + + return hex.slice(-8); +} + +function getPath(url) { + if (url.substr( 0, 7 ) === 'http://' || url.substr( 0, 8 ) === 'https://') { + return url; + } + + return 'file://' + path.resolve(process.cwd(), url); +} + +module.exports = function(grunt) { + + var eventBus = new EventEmitter({wildcard: true, maxListeners: 0}); + + // Keep track of the last-started module and test. Additionally, keep track + // of status for individual test files and the entire test suite. + var options; + var combinedRunEnd; + var failureBuffer = []; + var browser; + var page; + + // Get an asset file, local to the root of the project. + var asset = path.join.bind(null, __dirname, '..'); + + // If options.force then log an error, otherwise exit with a warning + function warnUnlessForced (message) { + if (options && options.force) { + grunt.log.error(message); + } else { + grunt.warn(message); + } + } + + function formatFailedAssertion(error) { + var failure = '' + + 'Message: ' + formatMessage(error.message) + '\n' + + 'Actual: ' + formatMessage(error.actual) + '\n' + + 'Expected: ' + formatMessage(error.expected); + if (error && error.stack) { + failure += '\n' + error.stack.replace(/^\s+(at) /g, ' $1 '); + } + return failure; + } + + + // QUnit hooks. + eventBus.on('qunit.on.testStart', function(testStart) { + var name = testStart.fullName.join(' > '); + grunt.verbose.write(name + '...'); + }); + + eventBus.on('qunit.on.testEnd', function(testEnd) { + var testPassed = (testEnd.status !== 'failed'); + if (testPassed) { + // plainly "passed", or "skipped", or expected-failing "todo". + // + // Either complete the verbose testStart line, or continue dot progress. + grunt.verbose.ok().or.write('.'); + return; + } + if (options && options.summaryOnly) { + return; + } + + var failure; + if (testEnd.status === 'todo') { + failure = 'Expected at least one failing assertion in todo test'; + } else { + failure = testEnd.errors.map(formatFailedAssertion).join('\n'); + } + + if (grunt.option('verbose')) { + grunt.log.error(); + grunt.log.error(failure); + } else { + var name = testEnd.fullName.join(' > '); + failureBuffer.push(name + '\n' + failure); + grunt.log.write('F'.red); + } + }); + + eventBus.on('qunit.on.runEnd', function(runEnd) { + if (!grunt.option('verbose')) { + // End the non-verbose dot progress line + if (runEnd.status === 'failed') { + grunt.log.writeln(); + } else { + grunt.log.ok(); + } + } + if (failureBuffer.length) { + grunt.log.error(failureBuffer.join('\n')); + failureBuffer.length = 0; + } + + combineRunEnd(combinedRunEnd, runEnd); + }); + + // Re-broadcast qunit events on grunt.event. + eventBus.on('qunit.**', function() { + var args = [this.event].concat(grunt.util.toArray(arguments)); + grunt.event.emit.apply(grunt.event, args); + }); + + // Built-in error handlers. + eventBus.on('fail.load', function(url) { + grunt.verbose.write('...'); + grunt.event.emit('qunit.fail.load', url); + grunt.log.error('Chrome unable to load \'' + url + '\' URI.'); + + combinedRunEnd.status = 'failed'; + }); + + eventBus.on('fail.timeout', function() { + grunt.log.writeln(); + grunt.event.emit('qunit.fail.timeout'); + grunt.log.error('Chrome timed out, possibly due to:\n' + + '- QUnit is not loaded correctly.\n- A missing QUnit start() call.\n' + + '- Or, a misconfiguration of this task.'); + + combinedRunEnd.status = 'failed'; + }); + + eventBus.on('error.onError', function (msg) { + // It is the responsibility of QUnit to ensure a run is marked as failure + // if there are (unexpected) messages received from window.onerror. + // + // Prior to QUnit 2.17, details of global failures were printed by + // creating a fake test with "testEnd" event. Now, it is our responsiblity + // to print these, via browser-level pageerror or `QUnit.on('error')`. + grunt.log.writeln(); + if (msg) { + grunt.log.error(msg.stack || msg); + } else { + grunt.log.error(new Error('Unknown error')); + } + grunt.event.emit('qunit.error.onError', msg); + }); + + grunt.registerMultiTask('qunit', 'Run QUnit tests in Headless Chrome.', function() { + // Chrome sandbox is incompatible with Docker and most CI environments + var defaultChromiumArgs = ( + process.env.CHROMIUM_FLAGS || (process.env.CI ? '--no-sandbox' : '') + ).split(' '); + + // Merge task-specific and/or target-specific options with these defaults. + options = this.options({ + // Default Chrome timeout. + timeout: 5000, + // QUnit-Chrome bridge file to be injected. + inject: asset('grunt-tasks/chrome/bridge.js'), + // Explicit non-file URLs to test. + urls: [], + force: false, + // Connect Chrome console output to Grunt output + console: true, + // Do not use an HTTP base by default + httpBase: false, + summaryOnly: false + }); + var puppeteerLaunchOptions = Object.assign( + { + headless: 'new', + args: defaultChromiumArgs + }, + options.puppeteer + ); + + // This task is asynchronous. + var done = this.async(); + var urls; + + // Read the content of the specified bridge files + var bridgeFiles = Array.isArray(options.inject) ? options.inject : [options.inject]; + var bridgContents = [ + "__grunt_contrib_qunit_timeout__ = " + JSON.stringify( options.timeout ) + ";" + ]; + + for (var i = 0; i < bridgeFiles.length; i++) { + try { + bridgContents.push(fs.readFileSync(bridgeFiles[i], 'utf8')); + } catch (err) { + grunt.fail.fatal('Could not load the specified Chrome/QUnit bridge file: ' + bridgeFiles[i]); + } + } + + if (options.httpBase) { + // If URLs are explicitly referenced, use them still + urls = options.urls; + // Then create URLs for the src files + this.filesSrc.forEach(function(testFile) { + urls.push(options.httpBase + '/' + testFile); + }); + } else { + // Combine any specified URLs with src files. + urls = options.urls.concat(this.filesSrc); + } + + // The final tasks to run before terminating the task + function finishTask(success) { + // Close the puppeteer browser + if (browser) { + browser.close(); + } + // Finish the task + done(success); + } + + function appendToUrls (queryParam, value) { + // Append the query param to all urls + urls = urls.map(function(testUrl) { + var parsed = url.parse(testUrl, true); + parsed.query[queryParam] = value; + delete parsed.search; + return url.format(parsed); + }); + } + + if (options.noGlobals) { + // Append a noglobal query string param to all urls + appendToUrls('noglobals', 'true'); + } + + if (grunt.option('modules')) { + var modules = grunt.option('modules').split(','); + var hashes = modules.map(function(module) { + return generateHash(module.trim()); + }); + // Append moduleId to all urls + appendToUrls('moduleId', hashes); + } + + if (grunt.option('seed')) { + // Append seed to all urls + appendToUrls('seed', grunt.option('seed')); + } + + // Reset combined data. + combinedRunEnd = createRunEnd(); + + // Instantiate headless browser + puppeteer.launch(puppeteerLaunchOptions) + .then(function(b) { + browser = b; + return b.newPage(); + }) + .then(function(p) { + page = p; + // emit events published in bridge.js. + // This function exposure survives url navigations. + return page.exposeFunction('__grunt_contrib_qunit__', function() { + eventBus.emit.apply(eventBus, [].slice.call(arguments)); + }); + }) + .then(function() { + // Pass through the console logs if instructed + if (options.console) { + page.on('console', function(msg) { + // The `msg` is a puppeteer.ConsoleMessage, which represents the console call + // including multple arguments passed to it. + // + // msg.text() formats the arguments into a naive newline-joined string, and + // includes error objects as a useless "JSHandle@error". + // + // msg.args() returns a JSHandle object for each argument, but all its + // evaluation features happen asynchronously via the browser, and in this + // event handler we can't await those easily as the grunt output will have + // moved on to other tests. If we want to print these, we'd have to refactor + // this so pEachSeries() below is aware of async code here. For now, we just + // let the useless "JSHandle" through and rely on developers to stringify any + // useful information ahead of time, e.g. `console.warn(String(err))`. + // + // Ref https://pptr.dev/#?product=Puppeteer&version=v9.0.0&show=api-class-consolemessage + var colors = { + 'error': 'red', + 'warning': 'yellow' + }; + var txt = msg.text(); + var color = colors[msg.type()]; + grunt.log.writeln(color ? txt[color] : txt); + // grunt.log.writeln(`${msg.location().url}:${msg.location().lineNumber}`.gray); // debug + }); + } + + // Surface uncaught exceptions + // Ref https://pptr.dev/#?product=Puppeteer&version=v9.0.0&show=api-event-pageerror + page.on('pageerror', function(err) { + eventBus.emit('error.onError', err); + }); + + // Whenever a page is loaded with a new document, before scripts execute, inject the bridge file. + // Tell the client that when DOMContentLoaded fires, it needs to tell this + // script to inject the bridge. This should ensure that the bridge gets + // injected before any other DOMContentLoaded or window.load event handler. + page.evaluateOnNewDocument('if (window.QUnit) {\n' + bridgContents.join(";") + '\n} else {\n' + 'document.addEventListener("DOMContentLoaded", function() {\n' + bridgContents.join(";") + '\n});\n}\n'); + + return pEachSeries(urls, function(url) { + // Reset current module. + grunt.event.emit('qunit.spawn', url); + grunt.verbose.subhead('Testing ' + url + ' ').or.write('Testing ' + url + ' '); + + return Promise.all([ + // Setup listeners for qunit.done / fail events + new Promise(function(resolve, reject) { + eventBus.once('qunit.on.runEnd', function() { resolve(); }); + eventBus.once('fail.*', function() { reject(url); }); + }), + + // Navigate to the url to be tested + page.goto(getPath(url), { timeout: options.timeout }) + ]); + }); + }) + .then(function() { + // All tests have been run. + var message = generateMessage(combinedRunEnd); + var success = (combinedRunEnd.status === 'passed'); + + // Log results. + if (!success) { + warnUnlessForced(message); + } else { + grunt.verbose.writeln(); + grunt.log.ok(message); + } + + if (!success && options && options.force) { + success = true; + } + + // All done! + finishTask(success); + }) + .catch(function(err) { + // If anything goes wrong, terminate the grunt task + grunt.log.error("There was an error with headless chrome"); + grunt.fail.fatal(err); + finishTask(false); + }); + }); + +}; diff --git a/tools/rollup-plugin-uglify3-js/package.json b/tools/rollup-plugin-uglify3-js/package.json index 8440e35d..9c89c8eb 100644 --- a/tools/rollup-plugin-uglify3-js/package.json +++ b/tools/rollup-plugin-uglify3-js/package.json @@ -27,7 +27,6 @@ "devDependencies": { "grunt": "^1.5.3", "grunt-cli": "^1.4.3", - "grunt-contrib-qunit": "^6.2.1", "@nevware21/grunt-ts-plugin": "^0.4.3", "@nevware21/grunt-eslint-ts": "^0.2.2", "@rollup/plugin-commonjs": "^18.0.0", @@ -36,8 +35,7 @@ "rollup-plugin-minify-es": "^1.1.1", "rollup": "^2.77.2", "typescript": "^4.3.4", - "tslib": "^2.0.0", - "tar-fs": "^3.0.8" + "tslib": "^2.0.0" }, "peerDependencies": { "tslib": "*"