diff --git a/core/package-lock.json b/core/package-lock.json index 1a992c33f8..44f8e2bad8 100644 --- a/core/package-lock.json +++ b/core/package-lock.json @@ -42,6 +42,7 @@ "jest": "^29.7.0", "jest-cli": "^29.7.0", "prettier": "^2.6.1", + "puppeteer": "21.1.1", "rollup": "^2.26.4", "sass": "^1.33.0", "serve": "^14.0.1", @@ -1678,6 +1679,71 @@ "node": ">=16" } }, + "node_modules/@puppeteer/browsers": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.7.0.tgz", + "integrity": "sha512-sl7zI0IkbQGak/+IE3VEEZab5SSOlI5F6558WvzWGC1n3+C722rfewC1ZIkcF9dsoGSsxhsONoseVlNQG4wWvQ==", + "dev": true, + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.3.0", + "tar-fs": "3.0.4", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.1" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=16.3.0" + } + }, + "node_modules/@puppeteer/browsers/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@puppeteer/browsers/node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@puppeteer/browsers/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/@rollup/plugin-node-resolve": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.4.0.tgz", @@ -1814,6 +1880,12 @@ "postcss-syntax": ">=0.36.2" } }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true + }, "node_modules/@types/babel__core": { "version": "7.20.3", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", @@ -1991,6 +2063,16 @@ "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", "dev": true }, + "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==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.7.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", @@ -2472,6 +2554,35 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/agent-base/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2644,6 +2755,18 @@ "node": ">=0.10.0" } }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -2684,6 +2807,12 @@ "node": ">=4" } }, + "node_modules/b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", + "dev": true + }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -2865,6 +2994,35 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/basic-ftp": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", + "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", @@ -3036,6 +3194,39 @@ "node-int64": "^0.4.0" } }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": { + "base64-js": "^1.3.1", + "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==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -3283,6 +3474,18 @@ "fsevents": "~2.3.2" } }, + "node_modules/chromium-bidi": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.22.tgz", + "integrity": "sha512-wR7Y9Ioez+cNXT4ZP7VNM1HRTljpNnMSLw4/RnwhhZUP4yCU7kIQND00YiktuHekch68jklGPK1q9Jkb29+fQg==", + "dev": true, + "dependencies": { + "mitt": "3.0.1" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -3539,6 +3742,42 @@ "safe-buffer": "~5.1.1" } }, + "node_modules/cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, + "dependencies": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -3609,6 +3848,15 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dev": true, + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -3635,6 +3883,15 @@ "node": ">=4" } }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz", + "integrity": "sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -3737,6 +3994,20 @@ "node": ">= 0.4" } }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -3746,6 +4017,12 @@ "node": ">=8" } }, + "node_modules/devtools-protocol": { + "version": "0.0.1159816", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1159816.tgz", + "integrity": "sha512-2cZlHxC5IlgkIWe2pSDmCrDiTzbSJWywjbDDnupOImEBcG31CQgBLV8wWE+5t+C4rimcjHsbzy7CBzf9oFjboA==", + "dev": true + }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -3859,6 +4136,15 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "dependencies": { + "once": "^1.4.0" + } + }, "node_modules/enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -3955,6 +4241,36 @@ "node": ">=0.8.0" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, "node_modules/eslint": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", @@ -4644,12 +4960,55 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "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==", + "dev": true, + "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/extract-zip/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "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==", "dev": true }, + "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==", + "dev": true + }, "node_modules/fast-glob": { "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", @@ -4717,6 +5076,15 @@ "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==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -4882,6 +5250,21 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -4898,6 +5281,70 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-uri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.2.tgz", + "integrity": "sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==", + "dev": true, + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.0", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/get-uri/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/get-uri/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/get-uri/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/get-uri/node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true, + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -5131,6 +5578,66 @@ "readable-stream": "^3.1.1" } }, + "node_modules/http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dev": true, + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/https-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -5140,6 +5647,26 @@ "node": ">=10.17.0" } }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -5265,6 +5792,12 @@ "@stencil/core": "^4.0.3" } }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, "node_modules/is-alphabetical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", @@ -7635,6 +8168,18 @@ "node": ">= 6" } }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "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", @@ -7656,6 +8201,35 @@ "node": ">= 0.6" } }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -7844,6 +8418,56 @@ "node": ">=6" } }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dev": true, + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/pac-resolver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz", + "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", + "dev": true, + "dependencies": { + "degenerator": "^5.0.0", + "ip": "^1.1.8", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -7946,6 +8570,12 @@ "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==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -8199,9 +8829,9 @@ } }, "node_modules/progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true, "engines": { "node": ">=0.4.0" @@ -8220,6 +8850,67 @@ "node": ">= 6" } }, + "node_modules/proxy-agent": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", + "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/proxy-agent/node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "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/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -8229,6 +8920,55 @@ "node": ">=6" } }, + "node_modules/puppeteer": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.1.1.tgz", + "integrity": "sha512-2TLntjGA4qLrI9/8N0UK/5OoZJ2Ue7QgphN2SD+RsaHiha12AEiVyMGsB+i6LY1IoPAtEgYIjblQ7lw3kWDNRw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@puppeteer/browsers": "1.7.0", + "cosmiconfig": "8.2.0", + "puppeteer-core": "21.1.1" + }, + "engines": { + "node": ">=16.3.0" + } + }, + "node_modules/puppeteer-core": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.1.1.tgz", + "integrity": "sha512-Tlcajcf44zwfa9Sbwv3T8BtaNMJ69wtpHIxwl2NOBTyTK3D1wppQovXTjfw0TDOm3a16eCfQ+5BMi3vRQ4kuAQ==", + "dev": true, + "dependencies": { + "@puppeteer/browsers": "1.7.0", + "chromium-bidi": "0.4.22", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1159816", + "ws": "8.13.0" + }, + "engines": { + "node": ">=16.3.0" + } + }, + "node_modules/puppeteer-core/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, "node_modules/pure-rand": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", @@ -8245,6 +8985,12 @@ } ] }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, "node_modules/quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", @@ -8779,6 +9525,67 @@ "node": ">=8" } }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "dependencies": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dev": true, + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/socks-proxy-agent/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/socks/node_modules/ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -8866,6 +9673,16 @@ "node": ">=8" } }, + "node_modules/streamx": { + "version": "2.15.5", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.5.tgz", + "integrity": "sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg==", + "dev": true, + "dependencies": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -9339,6 +10156,28 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "dev": true, + "dependencies": { + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + } + }, + "node_modules/tar-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "dev": true, + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -9359,6 +10198,12 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -9386,6 +10231,12 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, "node_modules/trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -9535,6 +10386,16 @@ "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==", + "dev": true, + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, "node_modules/unified": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", @@ -9716,6 +10577,22 @@ "makeerror": "1.0.12" } }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -9906,6 +10783,27 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -9966,6 +10864,16 @@ "node": ">=12" } }, + "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==", + "dev": true, + "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", @@ -11164,6 +12072,53 @@ "playwright": "1.39.0" } }, + "@puppeteer/browsers": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.7.0.tgz", + "integrity": "sha512-sl7zI0IkbQGak/+IE3VEEZab5SSOlI5F6558WvzWGC1n3+C722rfewC1ZIkcF9dsoGSsxhsONoseVlNQG4wWvQ==", + "dev": true, + "requires": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.3.0", + "tar-fs": "3.0.4", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, "@rollup/plugin-node-resolve": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.4.0.tgz", @@ -11263,6 +12218,12 @@ "@babel/core": ">=7.9.0" } }, + "@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true + }, "@types/babel__core": { "version": "7.20.3", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.3.tgz", @@ -11440,6 +12401,16 @@ "integrity": "sha512-5qcvofLPbfjmBfKaLfj/+f+Sbd6pN4zl7w7VSVI5uz7m9QZTuB2aZAa2uo1wHFBNN2x6g/SoTkXmd8mQnQF2Cw==", "dev": true }, + "@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "6.7.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.2.tgz", @@ -11723,6 +12694,26 @@ "dev": true, "requires": {} }, + "agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "dev": true, + "requires": { + "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -11841,6 +12832,15 @@ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true }, + "ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, + "requires": { + "tslib": "^2.0.1" + } + }, "at-least-node": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", @@ -11868,6 +12868,12 @@ "integrity": "sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==", "dev": true }, + "b4a": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", + "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", + "dev": true + }, "babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", @@ -12007,6 +13013,18 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "basic-ftp": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.3.tgz", + "integrity": "sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==", + "dev": true + }, "binary-extensions": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", @@ -12116,6 +13134,22 @@ "node-int64": "^0.4.0" } }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -12280,6 +13314,15 @@ "readdirp": "~3.6.0" } }, + "chromium-bidi": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.22.tgz", + "integrity": "sha512-wR7Y9Ioez+cNXT4ZP7VNM1HRTljpNnMSLw4/RnwhhZUP4yCU7kIQND00YiktuHekch68jklGPK1q9Jkb29+fQg==", + "dev": true, + "requires": { + "mitt": "3.0.1" + } + }, "ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -12471,6 +13514,35 @@ "safe-buffer": "~5.1.1" } }, + "cosmiconfig": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", + "dev": true, + "requires": { + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + } + } + }, "create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -12522,6 +13594,15 @@ } } }, + "cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "dev": true, + "requires": { + "node-fetch": "^2.6.12" + } + }, "cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -12539,6 +13620,12 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, + "data-uri-to-buffer": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz", + "integrity": "sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==", + "dev": true + }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -12620,12 +13707,29 @@ "object-keys": "^1.0.12" } }, + "degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, + "requires": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + } + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, + "devtools-protocol": { + "version": "0.0.1159816", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1159816.tgz", + "integrity": "sha512-2cZlHxC5IlgkIWe2pSDmCrDiTzbSJWywjbDDnupOImEBcG31CQgBLV8wWE+5t+C4rimcjHsbzy7CBzf9oFjboA==", + "dev": true + }, "diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", @@ -12720,6 +13824,15 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dev": true, + "requires": { + "once": "^1.4.0" + } + }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -12795,6 +13908,26 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, "eslint": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", @@ -13306,12 +14439,41 @@ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, + "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==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, + "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==", + "dev": true + }, "fast-glob": { "version": "3.2.11", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", @@ -13378,6 +14540,15 @@ "bser": "2.1.1" } }, + "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==", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "file-entry-cache": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", @@ -13502,6 +14673,15 @@ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", "dev": true }, + "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==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -13512,6 +14692,55 @@ "get-intrinsic": "^1.1.1" } }, + "get-uri": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.2.tgz", + "integrity": "sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==", + "dev": true, + "requires": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.0", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + } + } + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -13687,12 +14916,60 @@ "readable-stream": "^3.1.1" } }, + "http-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", + "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "dev": true, + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "dev": true, + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, "ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -13786,6 +15063,12 @@ "@stencil/core": "^4.0.3" } }, + "ip": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==", + "dev": true + }, "is-alphabetical": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", @@ -15493,6 +16776,18 @@ "kind-of": "^6.0.3" } }, + "mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "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", @@ -15511,6 +16806,21 @@ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", "dev": true }, + "netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true + }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "requires": { + "whatwg-url": "^5.0.0" + } + }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -15651,6 +16961,44 @@ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, + "pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "dev": true, + "requires": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "pac-resolver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz", + "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", + "dev": true, + "requires": { + "degenerator": "^5.0.0", + "ip": "^1.1.8", + "netmask": "^2.0.2" + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -15728,6 +17076,12 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -15910,9 +17264,9 @@ } }, "progress": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz", - "integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "prompts": { @@ -15925,18 +17279,109 @@ "sisteransi": "^1.0.5" } }, + "proxy-agent": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", + "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", + "dev": true, + "requires": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "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 + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, + "puppeteer": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.1.1.tgz", + "integrity": "sha512-2TLntjGA4qLrI9/8N0UK/5OoZJ2Ue7QgphN2SD+RsaHiha12AEiVyMGsB+i6LY1IoPAtEgYIjblQ7lw3kWDNRw==", + "dev": true, + "requires": { + "@puppeteer/browsers": "1.7.0", + "cosmiconfig": "8.2.0", + "puppeteer-core": "21.1.1" + } + }, + "puppeteer-core": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.1.1.tgz", + "integrity": "sha512-Tlcajcf44zwfa9Sbwv3T8BtaNMJ69wtpHIxwl2NOBTyTK3D1wppQovXTjfw0TDOm3a16eCfQ+5BMi3vRQ4kuAQ==", + "dev": true, + "requires": { + "@puppeteer/browsers": "1.7.0", + "chromium-bidi": "0.4.22", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1159816", + "ws": "8.13.0" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, "pure-rand": { "version": "6.0.4", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.4.tgz", "integrity": "sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==", "dev": true }, + "queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true + }, "quick-lru": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", @@ -16322,6 +17767,52 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "dependencies": { + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + } + } + }, + "socks-proxy-agent": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", + "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "dev": true, + "requires": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -16399,6 +17890,16 @@ } } }, + "streamx": { + "version": "2.15.5", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.5.tgz", + "integrity": "sha512-9thPGMkKC2GctCzyCUjME3yR03x2xNo0GPKGkRw2UMYN+gqWa9uqpyNWhmsNCutU5zHmkUum0LsCRQTXUgUCAg==", + "dev": true, + "requires": { + "fast-fifo": "^1.1.0", + "queue-tick": "^1.0.1" + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -16760,6 +18261,28 @@ } } }, + "tar-fs": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "dev": true, + "requires": { + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + } + }, + "tar-stream": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz", + "integrity": "sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==", + "dev": true, + "requires": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -16777,6 +18300,12 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "dev": true + }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -16798,6 +18327,12 @@ "is-number": "^7.0.0" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true + }, "trim-newlines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", @@ -16908,6 +18443,16 @@ "which-boxed-primitive": "^1.0.2" } }, + "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==", + "dev": true, + "requires": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, "unified": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/unified/-/unified-9.2.0.tgz", @@ -17057,6 +18602,22 @@ "makeerror": "1.0.12" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -17185,6 +18746,13 @@ "typedarray-to-buffer": "^3.1.5" } }, + "ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "dev": true, + "requires": {} + }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", @@ -17232,6 +18800,16 @@ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/core/package.json b/core/package.json index bc5a42ccdd..4438d142ce 100644 --- a/core/package.json +++ b/core/package.json @@ -64,6 +64,7 @@ "jest": "^29.7.0", "jest-cli": "^29.7.0", "prettier": "^2.6.1", + "puppeteer": "21.1.1", "rollup": "^2.26.4", "sass": "^1.33.0", "serve": "^14.0.1", diff --git a/core/src/components/accordion/test/accordion.spec.ts b/core/src/components/accordion/test/accordion.spec.ts index 8f4b7b9141..54883002db 100644 --- a/core/src/components/accordion/test/accordion.spec.ts +++ b/core/src/components/accordion/test/accordion.spec.ts @@ -1,8 +1,8 @@ import { newSpecPage } from '@stencil/core/testing'; -import { AccordionGroup } from '../../accordion-group/accordion-group.tsx'; -import { Item } from '../../item/item.tsx'; -import { Accordion } from '../accordion.tsx'; +import { AccordionGroup } from '../../accordion-group/accordion-group'; +import { Item } from '../../item/item'; +import { Accordion } from '../accordion'; it('should open correct accordions when accordion group value is set', async () => { const page = await newSpecPage({ @@ -25,7 +25,7 @@ it('should open correct accordions when accordion group value is set', async () `, }); - const accordionGroup = page.body.querySelector('ion-accordion-group'); + const accordionGroup = page.body.querySelector('ion-accordion-group')!; const accordions = accordionGroup.querySelectorAll('ion-accordion'); accordions.forEach((accordion) => { @@ -61,7 +61,7 @@ it('should open correct accordions when accordion value is set', async () => { `, }); - const accordionGroup = page.body.querySelector('ion-accordion-group'); + const accordionGroup = page.body.querySelector('ion-accordion-group')!; const accordions = accordionGroup.querySelectorAll('ion-accordion'); accordions.forEach((accordion) => { @@ -97,7 +97,7 @@ it('should open more than one accordion when multiple="true"', async () => { `, }); - const accordionGroup = page.body.querySelector('ion-accordion-group'); + const accordionGroup = page.body.querySelector('ion-accordion-group')!; const accordions = accordionGroup.querySelectorAll('ion-accordion'); accordions.forEach((accordion) => { @@ -133,7 +133,7 @@ it('should render with accordion open', async () => { `, }); - const accordionGroup = page.body.querySelector('ion-accordion-group'); + const accordionGroup = page.body.querySelector('ion-accordion-group')!; const accordions = accordionGroup.querySelectorAll('ion-accordion'); expect(accordions[0].classList.contains('accordion-collapsed')).toEqual(false); @@ -162,7 +162,7 @@ it('should accept a string when multiple="true"', async () => { `, }); - const accordionGroup = page.body.querySelector('ion-accordion-group'); + const accordionGroup = page.body.querySelector('ion-accordion-group')!; const accordions = accordionGroup.querySelectorAll('ion-accordion'); expect(accordions[0].classList.contains('accordion-collapsed')).toEqual(false); @@ -183,8 +183,8 @@ it('should set default values if not provided', async () => { `, }); - const accordionGroup = page.body.querySelector('ion-accordion-group'); - const accordion = accordionGroup.querySelector('ion-accordion'); + const accordionGroup = page.body.querySelector('ion-accordion-group')!; + const accordion = accordionGroup.querySelector('ion-accordion')!; /** * ID is determined via an auto incrementing counter diff --git a/core/src/components/action-sheet/test/basic/action-sheet.spec.tsx b/core/src/components/action-sheet/test/basic/action-sheet.spec.tsx index 4343a95f4a..d35de2de0a 100644 --- a/core/src/components/action-sheet/test/basic/action-sheet.spec.tsx +++ b/core/src/components/action-sheet/test/basic/action-sheet.spec.tsx @@ -7,10 +7,17 @@ describe('action sheet: htmlAttributes inheritance', () => { it('should correctly inherit attributes on host', async () => { const page = await newSpecPage({ components: [ActionSheet], - template: () => , + template: () => ( + + ), }); - const actionSheet = page.body.querySelector('ion-action-sheet'); + const actionSheet = page.body.querySelector('ion-action-sheet')!; await expect(actionSheet.getAttribute('data-testid')).toBe('basic-action-sheet'); }); diff --git a/core/src/components/alert/test/alert.spec.ts b/core/src/components/alert/test/alert.spec.ts index e5b2960849..d7c8abb25c 100644 --- a/core/src/components/alert/test/alert.spec.ts +++ b/core/src/components/alert/test/alert.spec.ts @@ -1,6 +1,7 @@ import { newSpecPage } from '@stencil/core/testing'; -import { Alert } from '../alert'; + import { config } from '../../../global/config'; +import { Alert } from '../alert'; describe('alert: custom html', () => { it('should not allow for custom html by default', async () => { @@ -9,7 +10,7 @@ describe('alert: custom html', () => { html: ``, }); - const content = page.body.querySelector('.alert-message'); + const content = page.body.querySelector('.alert-message')!; expect(content.textContent).toContain('Custom Text'); expect(content.querySelector('button.custom-html')).toBe(null); }); @@ -21,7 +22,7 @@ describe('alert: custom html', () => { html: ``, }); - const content = page.body.querySelector('.alert-message'); + const content = page.body.querySelector('.alert-message')!; expect(content.textContent).toContain('Custom Text'); expect(content.querySelector('button.custom-html')).not.toBe(null); }); @@ -33,7 +34,7 @@ describe('alert: custom html', () => { html: ``, }); - const content = page.body.querySelector('.alert-message'); + const content = page.body.querySelector('.alert-message')!; expect(content.textContent).toContain('Custom Text'); expect(content.querySelector('button.custom-html')).toBe(null); }); diff --git a/core/src/components/breadcrumbs/test/breadcrumbs.spec.ts b/core/src/components/breadcrumbs/test/breadcrumbs.spec.ts index d305df1cb4..a3a990f635 100644 --- a/core/src/components/breadcrumbs/test/breadcrumbs.spec.ts +++ b/core/src/components/breadcrumbs/test/breadcrumbs.spec.ts @@ -1,7 +1,7 @@ import { newSpecPage } from '@stencil/core/testing'; -import { Breadcrumb } from '../../breadcrumb/breadcrumb.tsx'; -import { Breadcrumbs } from '../breadcrumbs.tsx'; +import { Breadcrumb } from '../../breadcrumb/breadcrumb'; +import { Breadcrumbs } from '../breadcrumbs'; it('should correctly provide the collapsed breadcrumbs in the event payload', async () => { const page = await newSpecPage({ @@ -18,8 +18,8 @@ it('should correctly provide the collapsed breadcrumbs in the event payload', as }); const onCollapsedClick = jest.fn((ev) => ev); - const breadcrumbs = page.body.querySelector('ion-breadcrumbs'); - const breadcrumb = page.body.querySelectorAll('ion-breadcrumb'); + const breadcrumbs = page.body.querySelector('ion-breadcrumbs')!; + const breadcrumb = page.body.querySelectorAll('ion-breadcrumb')!; breadcrumbs.addEventListener('ionCollapsedClick', onCollapsedClick); @@ -46,8 +46,8 @@ it('should exclude the separator from narrators', async () => { `, }); - const firstBreadcrumb = page.body.querySelector('ion-breadcrumb:first-of-type'); - const separator = firstBreadcrumb.shadowRoot.querySelector('[part="separator"]'); + const firstBreadcrumb = page.body.querySelector('ion-breadcrumb:first-of-type')!; + const separator = firstBreadcrumb.shadowRoot!.querySelector('[part="separator"]')!; expect(separator.getAttribute('aria-hidden')).toBe('true'); }); @@ -62,7 +62,7 @@ it('should have color attribute', async () => { `, }); - const breadcrumbs = page.body.querySelector('ion-breadcrumbs'); + const breadcrumbs = page.body.querySelector('ion-breadcrumbs')!; expect(breadcrumbs.hasAttribute('color')).toBe(true); }); diff --git a/core/src/components/button/test/form-reference/button.spec.ts b/core/src/components/button/test/form-reference/button.spec.ts index 810f46c846..45dcf03ace 100644 --- a/core/src/components/button/test/form-reference/button.spec.ts +++ b/core/src/components/button/test/form-reference/button.spec.ts @@ -1,4 +1,5 @@ import { newSpecPage } from '@stencil/core/testing'; + import { Button } from '../../button'; describe('Button: Hidden Form Button', () => { @@ -15,8 +16,7 @@ describe('Button: Hidden Form Button', () => { return page.body.querySelectorAll('form button'); }; - const form = page.body.querySelectorAll('form'); - const button = page.body.querySelector('ion-button'); + const button = page.body.querySelector('ion-button')!; await page.waitForChanges(); diff --git a/core/src/components/checkbox/test/checkbox.spec.ts b/core/src/components/checkbox/test/checkbox.spec.ts index 5dab5e284f..f695fdded9 100644 --- a/core/src/components/checkbox/test/checkbox.spec.ts +++ b/core/src/components/checkbox/test/checkbox.spec.ts @@ -11,7 +11,7 @@ describe('ion-checkbox: disabled', () => { `, }); - const checkbox = page.body.querySelector('ion-checkbox'); + const checkbox = page.body.querySelector('ion-checkbox')!; expect(checkbox.checked).toBe(false); diff --git a/core/src/components/datetime/test/comparison.spec.ts b/core/src/components/datetime/test/comparison.spec.ts index ca861d1ac8..31c549893f 100644 --- a/core/src/components/datetime/test/comparison.spec.ts +++ b/core/src/components/datetime/test/comparison.spec.ts @@ -1,21 +1,22 @@ +import type { DatetimeParts } from '../datetime-interface'; import { isSameDay, isBefore, isAfter } from '../utils/comparison'; describe('isSameDay()', () => { it('should return correct results for month, day, and year', () => { - const reference = { month: 1, day: 1, year: 2021 }; + const reference: DatetimeParts = { month: 1, day: 1, year: 2021 }; expect(isSameDay(reference, { month: 1, day: 1, year: 2021 })).toEqual(true); expect(isSameDay(reference, { month: 2, day: 1, year: 2021 })).toEqual(false); expect(isSameDay(reference, { month: 1, day: 2, year: 2021 })).toEqual(false); expect(isSameDay(reference, { month: 1, day: 1, year: 2022 })).toEqual(false); expect(isSameDay(reference, { month: 0, day: 0, year: 0 })).toEqual(false); - expect(isSameDay(reference, { month: null, day: null, year: null })).toEqual(false); + expect(isSameDay(reference, { month: null, day: null, year: null } as any)).toEqual(false); }); }); describe('isBefore()', () => { it('should return correct results for month, day, and year', () => { - const reference = { month: 1, day: 1, year: 2021 }; + const reference: DatetimeParts = { month: 1, day: 1, year: 2021 }; expect(isBefore(reference, { month: 1, day: 1, year: 2021 })).toEqual(false); expect(isBefore(reference, { month: 2, day: 1, year: 2021 })).toEqual(true); @@ -23,13 +24,13 @@ describe('isBefore()', () => { expect(isBefore(reference, { month: 1, day: 1, year: 2022 })).toEqual(true); expect(isBefore(reference, { month: 1, day: 1, year: 2020 })).toEqual(false); expect(isBefore(reference, { month: 0, day: 0, year: 0 })).toEqual(false); - expect(isBefore(reference, { month: null, day: null, year: null })).toEqual(false); + expect(isBefore(reference, { month: null, day: null, year: null } as any)).toEqual(false); }); }); describe('isAfter()', () => { it('should return correct results for month, day, and year', () => { - const reference = { month: 2, day: 2, year: 2021 }; + const reference: DatetimeParts = { month: 2, day: 2, year: 2021 }; expect(isAfter(reference, { month: 2, day: 2, year: 2021 })).toEqual(false); expect(isAfter(reference, { month: 2, day: 1, year: 2021 })).toEqual(true); @@ -42,6 +43,6 @@ describe('isAfter()', () => { * 2021 > undefined === false * 2021 > null === true */ - expect(isAfter(reference, { month: null, day: null, year: null })).toEqual(true); + expect(isAfter(reference, { month: null, day: null, year: null } as any)).toEqual(true); }); }); diff --git a/core/src/components/datetime/test/data.spec.ts b/core/src/components/datetime/test/data.spec.ts index 4484224402..506a2ab03f 100644 --- a/core/src/components/datetime/test/data.spec.ts +++ b/core/src/components/datetime/test/data.spec.ts @@ -1,3 +1,4 @@ +import type { DatetimeParts } from '../datetime-interface'; import { generateMonths, getDaysOfWeek, @@ -364,7 +365,7 @@ describe('generateTime()', () => { year: undefined, hour: 19, minute: 50, - }; + } as unknown as DatetimeParts; const minParts = { day: undefined, @@ -372,7 +373,7 @@ describe('generateTime()', () => { year: undefined, hour: 19, minute: 50, - }; + } as unknown as DatetimeParts; const { hours } = generateTime('en-US', refValue, 'h23', minParts); @@ -387,7 +388,7 @@ describe('generateTime()', () => { year: undefined, hour: 20, minute: 22, - }; + } as unknown as DatetimeParts; const minParts = { day: undefined, @@ -395,7 +396,7 @@ describe('generateTime()', () => { year: undefined, hour: 19, minute: 30, - }; + } as unknown as DatetimeParts; const { hours, minutes } = generateTime('en-US', refValue, 'h23', minParts); @@ -411,7 +412,7 @@ describe('generateTime()', () => { year: undefined, hour: 20, minute: 30, - }; + } as unknown as DatetimeParts; const minParts = { day: undefined, @@ -419,7 +420,7 @@ describe('generateTime()', () => { year: undefined, hour: 19, minute: 30, - }; + } as unknown as DatetimeParts; const maxParts = { day: undefined, @@ -427,7 +428,7 @@ describe('generateTime()', () => { year: undefined, hour: 20, minute: 40, - }; + } as unknown as DatetimeParts; const { hours } = generateTime('en-US', refValue, 'h23', minParts, maxParts); @@ -441,7 +442,7 @@ describe('generateTime()', () => { year: undefined, hour: 13, minute: 0, - }; + } as unknown as DatetimeParts; const maxParts = { day: undefined, @@ -449,7 +450,7 @@ describe('generateTime()', () => { year: undefined, hour: 13, minute: 2, - }; + } as unknown as DatetimeParts; const { minutes } = generateTime('en-US', refValue, 'h23', undefined, maxParts); @@ -463,7 +464,7 @@ describe('generateTime()', () => { year: undefined, hour: 12, minute: 0, - }; + } as unknown as DatetimeParts; const maxParts = { day: undefined, @@ -471,7 +472,7 @@ describe('generateTime()', () => { year: undefined, hour: 13, minute: 2, - }; + } as unknown as DatetimeParts; const { minutes } = generateTime('en-US', refValue, 'h23', undefined, maxParts); @@ -482,7 +483,7 @@ describe('generateTime()', () => { describe('getToday', () => { beforeAll(() => { - jest.useFakeTimers('modern'); + jest.useFakeTimers(); // System time is zero based, 1 = February jest.setSystemTime(new Date(2022, 1, 21, 18, 30)); }); diff --git a/core/src/components/datetime/test/format.spec.ts b/core/src/components/datetime/test/format.spec.ts index b4d5f693bd..5ff218167d 100644 --- a/core/src/components/datetime/test/format.spec.ts +++ b/core/src/components/datetime/test/format.spec.ts @@ -1,3 +1,4 @@ +import type { DatetimeParts } from '../datetime-interface'; import { generateDayAriaLabel, getMonthAndDay, @@ -109,7 +110,7 @@ describe('getLocalizedDayPeriod', () => { describe('getLocalizedTime', () => { it('should localize the time to PM', () => { - const datetimeParts = { + const datetimeParts: DatetimeParts = { day: 1, month: 1, year: 2022, @@ -121,7 +122,7 @@ describe('getLocalizedTime', () => { }); it('should localize the time to AM', () => { - const datetimeParts = { + const datetimeParts: DatetimeParts = { day: 1, month: 1, year: 2022, @@ -133,7 +134,7 @@ describe('getLocalizedTime', () => { }); it('should avoid Chromium bug when using 12 hour time in a 24 hour locale', () => { - const datetimeParts = { + const datetimeParts: DatetimeParts = { day: 1, month: 1, year: 2022, @@ -144,12 +145,12 @@ describe('getLocalizedTime', () => { expect(getLocalizedTime('en-GB', datetimeParts, 'h12')).toEqual('12:00 am'); }); it('should parse time-only values correctly', () => { - const datetimeParts = { + const datetimeParts: Partial = { hour: 22, minute: 40, }; - expect(getLocalizedTime('en-US', datetimeParts, 'h12')).toEqual('10:40 PM'); - expect(getLocalizedTime('en-US', datetimeParts, 'h23')).toEqual('22:40'); + expect(getLocalizedTime('en-US', datetimeParts as DatetimeParts, 'h12')).toEqual('10:40 PM'); + expect(getLocalizedTime('en-US', datetimeParts as DatetimeParts, 'h23')).toEqual('22:40'); }); }); diff --git a/core/src/components/datetime/test/manipulation.spec.ts b/core/src/components/datetime/test/manipulation.spec.ts index f2c8188295..8cfdbcf65b 100644 --- a/core/src/components/datetime/test/manipulation.spec.ts +++ b/core/src/components/datetime/test/manipulation.spec.ts @@ -1,3 +1,4 @@ +import type { DatetimeParts } from '../datetime-interface'; import { getPreviousYear, getNextYear, @@ -103,31 +104,31 @@ describe('getInternalHourValue()', () => { describe('calculateHourFromAMPM()', () => { it('should correctly convert from AM to PM', () => { - expect(calculateHourFromAMPM({ hour: 12, ampm: 'am' }, 'pm')).toEqual(12); - expect(calculateHourFromAMPM({ hour: 1, ampm: 'am' }, 'pm')).toEqual(13); - expect(calculateHourFromAMPM({ hour: 2, ampm: 'am' }, 'pm')).toEqual(14); - expect(calculateHourFromAMPM({ hour: 3, ampm: 'am' }, 'pm')).toEqual(15); - expect(calculateHourFromAMPM({ hour: 4, ampm: 'am' }, 'pm')).toEqual(16); - expect(calculateHourFromAMPM({ hour: 5, ampm: 'am' }, 'pm')).toEqual(17); - expect(calculateHourFromAMPM({ hour: 6, ampm: 'am' }, 'pm')).toEqual(18); - expect(calculateHourFromAMPM({ hour: 7, ampm: 'am' }, 'pm')).toEqual(19); - expect(calculateHourFromAMPM({ hour: 8, ampm: 'am' }, 'pm')).toEqual(20); - expect(calculateHourFromAMPM({ hour: 9, ampm: 'am' }, 'pm')).toEqual(21); - expect(calculateHourFromAMPM({ hour: 10, ampm: 'am' }, 'pm')).toEqual(22); - expect(calculateHourFromAMPM({ hour: 11, ampm: 'am' }, 'pm')).toEqual(23); + expect(calculateHourFromAMPM({ hour: 12, ampm: 'am' } as DatetimeParts, 'pm')).toEqual(12); + expect(calculateHourFromAMPM({ hour: 1, ampm: 'am' } as DatetimeParts, 'pm')).toEqual(13); + expect(calculateHourFromAMPM({ hour: 2, ampm: 'am' } as DatetimeParts, 'pm')).toEqual(14); + expect(calculateHourFromAMPM({ hour: 3, ampm: 'am' } as DatetimeParts, 'pm')).toEqual(15); + expect(calculateHourFromAMPM({ hour: 4, ampm: 'am' } as DatetimeParts, 'pm')).toEqual(16); + expect(calculateHourFromAMPM({ hour: 5, ampm: 'am' } as DatetimeParts, 'pm')).toEqual(17); + expect(calculateHourFromAMPM({ hour: 6, ampm: 'am' } as DatetimeParts, 'pm')).toEqual(18); + expect(calculateHourFromAMPM({ hour: 7, ampm: 'am' } as DatetimeParts, 'pm')).toEqual(19); + expect(calculateHourFromAMPM({ hour: 8, ampm: 'am' } as DatetimeParts, 'pm')).toEqual(20); + expect(calculateHourFromAMPM({ hour: 9, ampm: 'am' } as DatetimeParts, 'pm')).toEqual(21); + expect(calculateHourFromAMPM({ hour: 10, ampm: 'am' } as DatetimeParts, 'pm')).toEqual(22); + expect(calculateHourFromAMPM({ hour: 11, ampm: 'am' } as DatetimeParts, 'pm')).toEqual(23); - expect(calculateHourFromAMPM({ hour: 13, ampm: 'pm' }, 'am')).toEqual(1); - expect(calculateHourFromAMPM({ hour: 14, ampm: 'pm' }, 'am')).toEqual(2); - expect(calculateHourFromAMPM({ hour: 15, ampm: 'pm' }, 'am')).toEqual(3); - expect(calculateHourFromAMPM({ hour: 16, ampm: 'pm' }, 'am')).toEqual(4); - expect(calculateHourFromAMPM({ hour: 17, ampm: 'pm' }, 'am')).toEqual(5); - expect(calculateHourFromAMPM({ hour: 18, ampm: 'pm' }, 'am')).toEqual(6); - expect(calculateHourFromAMPM({ hour: 19, ampm: 'pm' }, 'am')).toEqual(7); - expect(calculateHourFromAMPM({ hour: 20, ampm: 'pm' }, 'am')).toEqual(8); - expect(calculateHourFromAMPM({ hour: 21, ampm: 'pm' }, 'am')).toEqual(9); - expect(calculateHourFromAMPM({ hour: 22, ampm: 'pm' }, 'am')).toEqual(10); - expect(calculateHourFromAMPM({ hour: 23, ampm: 'pm' }, 'am')).toEqual(11); - expect(calculateHourFromAMPM({ hour: 0, ampm: 'pm' }, 'am')).toEqual(12); + expect(calculateHourFromAMPM({ hour: 13, ampm: 'pm' } as DatetimeParts, 'am')).toEqual(1); + expect(calculateHourFromAMPM({ hour: 14, ampm: 'pm' } as DatetimeParts, 'am')).toEqual(2); + expect(calculateHourFromAMPM({ hour: 15, ampm: 'pm' } as DatetimeParts, 'am')).toEqual(3); + expect(calculateHourFromAMPM({ hour: 16, ampm: 'pm' } as DatetimeParts, 'am')).toEqual(4); + expect(calculateHourFromAMPM({ hour: 17, ampm: 'pm' } as DatetimeParts, 'am')).toEqual(5); + expect(calculateHourFromAMPM({ hour: 18, ampm: 'pm' } as DatetimeParts, 'am')).toEqual(6); + expect(calculateHourFromAMPM({ hour: 19, ampm: 'pm' } as DatetimeParts, 'am')).toEqual(7); + expect(calculateHourFromAMPM({ hour: 20, ampm: 'pm' } as DatetimeParts, 'am')).toEqual(8); + expect(calculateHourFromAMPM({ hour: 21, ampm: 'pm' } as DatetimeParts, 'am')).toEqual(9); + expect(calculateHourFromAMPM({ hour: 22, ampm: 'pm' } as DatetimeParts, 'am')).toEqual(10); + expect(calculateHourFromAMPM({ hour: 23, ampm: 'pm' } as DatetimeParts, 'am')).toEqual(11); + expect(calculateHourFromAMPM({ hour: 0, ampm: 'pm' } as DatetimeParts, 'am')).toEqual(12); }); }); diff --git a/core/src/components/datetime/test/parse.spec.ts b/core/src/components/datetime/test/parse.spec.ts index ea2e5132b0..5bd85e4a61 100644 --- a/core/src/components/datetime/test/parse.spec.ts +++ b/core/src/components/datetime/test/parse.spec.ts @@ -42,7 +42,8 @@ describe('parseDate()', () => { * See https://github.com/ionic-team/ionic-framework/commit/3fb4caf21ffac12f765c4c80bf1850e05d211c6a */ it('should return the correct time zone offset', () => { - expect(parseDate('2022-12-15T13:47:30-02:00').tzOffset).toEqual(undefined); + // Casting as any since `tzOffset` does not exist on DatetimeParts + expect((parseDate('2022-12-15T13:47:30-02:00') as any)?.tzOffset).toEqual(undefined); }); it('should parse an array of dates', () => { @@ -162,8 +163,8 @@ describe('parseMinParts()', () => { minute: 4, hour: 2, }; - expect(parseMinParts(undefined, today)).toEqual(undefined); - expect(parseMinParts(null, today)).toEqual(undefined); + expect(parseMinParts(undefined as any, today)).toEqual(undefined); + expect(parseMinParts(null as any, today)).toEqual(undefined); expect(parseMinParts('foo', today)).toEqual(undefined); }); }); @@ -225,8 +226,8 @@ describe('parseMaxParts()', () => { minute: 4, hour: 2, }; - expect(parseMaxParts(undefined, today)).toEqual(undefined); - expect(parseMaxParts(null, today)).toEqual(undefined); + expect(parseMaxParts(undefined as any, today)).toEqual(undefined); + expect(parseMaxParts(null as any, today)).toEqual(undefined); expect(parseMaxParts('foo', today)).toEqual(undefined); }); }); diff --git a/core/src/components/datetime/test/state.spec.ts b/core/src/components/datetime/test/state.spec.ts index 71cc968c8b..55f039a7c0 100644 --- a/core/src/components/datetime/test/state.spec.ts +++ b/core/src/components/datetime/test/state.spec.ts @@ -84,13 +84,13 @@ describe('isPrevMonthDisabled()', () => { // Date month and year is the same as min month and year expect(isPrevMonthDisabled({ month: 1, year: 2021, day: null }, { month: 1, year: 2021, day: null })).toEqual(true); // Date year is the same as min year (month not provided) - expect(isPrevMonthDisabled({ month: 1, year: 2021, day: null }, { year: 2021, month: null, day: null })).toEqual( - true - ); + expect( + isPrevMonthDisabled({ month: 1, year: 2021, day: null }, { year: 2021, month: null, day: null } as any) + ).toEqual(true); // Date year is less than the min year (month not provided) - expect(isPrevMonthDisabled({ month: 5, year: 2021, day: null }, { year: 2022, month: null, day: null })).toEqual( - true - ); + expect( + isPrevMonthDisabled({ month: 5, year: 2021, day: null }, { year: 2022, month: null, day: null } as any) + ).toEqual(true); // Date is above the maximum bounds and the previous month does not does not fall within the // min-max range. @@ -118,12 +118,12 @@ describe('isPrevMonthDisabled()', () => { expect(isPrevMonthDisabled({ month: 12, year: 2021, day: null })).toEqual(false); // Date year is the same as min year, // but can navigate to a previous month without reducing the year. - expect(isPrevMonthDisabled({ month: 12, year: 2021, day: null }, { year: 2021, month: null, day: null })).toEqual( - false - ); - expect(isPrevMonthDisabled({ month: 2, year: 2021, day: null }, { year: 2021, month: null, day: null })).toEqual( - false - ); + expect( + isPrevMonthDisabled({ month: 12, year: 2021, day: null }, { year: 2021, month: null, day: null } as any) + ).toEqual(false); + expect( + isPrevMonthDisabled({ month: 2, year: 2021, day: null }, { year: 2021, month: null, day: null } as any) + ).toEqual(false); }); }); diff --git a/core/src/components/infinite-scroll-content/test/infinite-scroll-content.spec.ts b/core/src/components/infinite-scroll-content/test/infinite-scroll-content.spec.ts index 251ef26492..27d4b0554b 100644 --- a/core/src/components/infinite-scroll-content/test/infinite-scroll-content.spec.ts +++ b/core/src/components/infinite-scroll-content/test/infinite-scroll-content.spec.ts @@ -1,6 +1,7 @@ import { newSpecPage } from '@stencil/core/testing'; -import { InfiniteScrollContent } from '../infinite-scroll-content'; + import { config } from '../../../global/config'; +import { InfiniteScrollContent } from '../infinite-scroll-content'; describe('infinite-scroll-content: custom html', () => { it('should not allow for custom html by default', async () => { @@ -9,7 +10,7 @@ describe('infinite-scroll-content: custom html', () => { html: ``, }); - const content = page.body.querySelector('.infinite-loading-text'); + const content = page.body.querySelector('.infinite-loading-text')!; expect(content.textContent).toContain('Custom Text'); expect(content.querySelector('button.custom-html')).toBe(null); }); @@ -21,7 +22,7 @@ describe('infinite-scroll-content: custom html', () => { html: ``, }); - const content = page.body.querySelector('.infinite-loading-text'); + const content = page.body.querySelector('.infinite-loading-text')!; expect(content.textContent).toContain('Custom Text'); expect(content.querySelector('button.custom-html')).not.toBe(null); }); @@ -33,7 +34,7 @@ describe('infinite-scroll-content: custom html', () => { html: ``, }); - const content = page.body.querySelector('.infinite-loading-text'); + const content = page.body.querySelector('.infinite-loading-text')!; expect(content.textContent).toContain('Custom Text'); expect(content.querySelector('button.custom-html')).toBe(null); }); diff --git a/core/src/components/input/test/input.spec.ts b/core/src/components/input/test/input.spec.ts index e7b39a451d..ce52d4540a 100644 --- a/core/src/components/input/test/input.spec.ts +++ b/core/src/components/input/test/input.spec.ts @@ -1,4 +1,5 @@ import { newSpecPage } from '@stencil/core/testing'; + import { Input } from '../input'; describe('input: rendering', () => { @@ -8,7 +9,7 @@ describe('input: rendering', () => { html: '', }); - const nativeEl = page.body.querySelector('ion-input input'); + const nativeEl = page.body.querySelector('ion-input input')!; expect(nativeEl.getAttribute('title')).toBe('my title'); expect(nativeEl.getAttribute('tabindex')).toBe('-1'); expect(nativeEl.getAttribute('data-form-type')).toBe('password'); @@ -63,9 +64,9 @@ describe('input: label rendering', () => { `, }); - const input = page.body.querySelector('ion-input'); + const input = page.body.querySelector('ion-input')!; - const labelText = input.querySelector('.label-text-wrapper'); + const labelText = input.querySelector('.label-text-wrapper')!; expect(labelText.textContent).toBe('Label Prop Text'); }); @@ -77,9 +78,9 @@ describe('input: label rendering', () => { `, }); - const input = page.body.querySelector('ion-input'); + const input = page.body.querySelector('ion-input')!; - const labelText = input.querySelector('.label-text-wrapper'); + const labelText = input.querySelector('.label-text-wrapper')!; expect(labelText.textContent).toBe('Label Slot Text'); }); @@ -91,9 +92,9 @@ describe('input: label rendering', () => { `, }); - const input = page.body.querySelector('ion-input'); + const input = page.body.querySelector('ion-input')!; - const labelText = input.querySelector('.label-text-wrapper'); + const labelText = input.querySelector('.label-text-wrapper')!; expect(labelText.textContent).toBe('Label Prop Text'); }); diff --git a/core/src/components/input/test/item/input.spec.ts b/core/src/components/input/test/item/input.spec.ts index e7ef5a69f5..589abf7684 100644 --- a/core/src/components/input/test/item/input.spec.ts +++ b/core/src/components/input/test/item/input.spec.ts @@ -1,6 +1,7 @@ import { newSpecPage } from '@stencil/core/testing'; -import { Input } from '../../input'; + import { Item } from '../../../item/item'; +import { Input } from '../../input'; it('should render as modern when label is set asynchronously', async () => { const page = await newSpecPage({ @@ -12,7 +13,7 @@ it('should render as modern when label is set asynchronously', async () => { `, }); - const input = page.body.querySelector('ion-input'); + const input = page.body.querySelector('ion-input')!; // Template should be modern expect(input.classList.contains('legacy-input')).toBe(false); diff --git a/core/src/components/item/test/a11y/item.spec.ts b/core/src/components/item/test/a11y/item.spec.ts index cb7cf3562e..6580f10db3 100644 --- a/core/src/components/item/test/a11y/item.spec.ts +++ b/core/src/components/item/test/a11y/item.spec.ts @@ -1,9 +1,10 @@ -import { Radio } from '../../../radio/radio.tsx'; -import { RadioGroup } from '../../../radio-group/radio-group.tsx'; -import { Item } from '../../item.tsx'; -import { List } from '../../../list/list.tsx'; import { newSpecPage } from '@stencil/core/testing'; +import { List } from '../../../list/list'; +import { RadioGroup } from '../../../radio-group/radio-group'; +import { Radio } from '../../../radio/radio'; +import { Item } from '../../item'; + describe('ion-item', () => { it('should not have a role when used without list', async () => { const page = await newSpecPage({ @@ -11,7 +12,7 @@ describe('ion-item', () => { html: `Hello World`, }); - const item = page.body.querySelector('ion-item'); + const item = page.body.querySelector('ion-item')!; expect(item.getAttribute('role')).toBe(null); }); @@ -27,7 +28,7 @@ describe('ion-item', () => { `, }); - const item = page.body.querySelector('ion-item'); + const item = page.body.querySelector('ion-item')!; expect(item.getAttribute('role')).toBe('listitem'); }); @@ -45,7 +46,7 @@ describe('ion-item', () => { `, }); - const item = page.body.querySelector('ion-item'); + const item = page.body.querySelector('ion-item')!; expect(item.getAttribute('role')).toBe(null); }); }); diff --git a/core/src/components/loading/test/basic/loading.spec.tsx b/core/src/components/loading/test/basic/loading.spec.tsx index 768beffe22..e8116a36ce 100644 --- a/core/src/components/loading/test/basic/loading.spec.tsx +++ b/core/src/components/loading/test/basic/loading.spec.tsx @@ -7,10 +7,10 @@ describe('loading: htmlAttributes inheritance', () => { it('should correctly inherit attributes on host', async () => { const page = await newSpecPage({ components: [Loading], - template: () => , + template: () => , }); - const loading = page.body.querySelector('ion-loading'); + const loading = page.body.querySelector('ion-loading')!; await expect(loading.getAttribute('data-testid')).toBe('basic-loading'); }); diff --git a/core/src/components/modal/test/a11y/modal.spec.ts b/core/src/components/modal/test/a11y/modal.spec.ts index 3c21a77438..a80c33e0b8 100644 --- a/core/src/components/modal/test/a11y/modal.spec.ts +++ b/core/src/components/modal/test/a11y/modal.spec.ts @@ -15,8 +15,8 @@ describe('modal: a11y', () => { `, }); - const modal = page.body.querySelector('ion-modal'); - const modalWrapper = modal.shadowRoot.querySelector('.modal-wrapper'); + const modal = page.body.querySelector('ion-modal')!; + const modalWrapper = modal.shadowRoot!.querySelector('.modal-wrapper')!; await expect(modalWrapper.getAttribute('role')).toBe('alertdialog'); }); diff --git a/core/src/components/modal/test/basic/modal.spec.tsx b/core/src/components/modal/test/basic/modal.spec.tsx index adecf53d7a..01bd0ab22f 100644 --- a/core/src/components/modal/test/basic/modal.spec.tsx +++ b/core/src/components/modal/test/basic/modal.spec.tsx @@ -7,10 +7,10 @@ describe('modal: htmlAttributes inheritance', () => { it('should correctly inherit attributes on host', async () => { const page = await newSpecPage({ components: [Modal], - template: () => , + template: () => , }); - const modal = page.body.querySelector('ion-modal'); + const modal = page.body.querySelector('ion-modal')!; await expect(modal.getAttribute('data-testid')).toBe('basic-modal'); }); diff --git a/core/src/components/modal/test/can-dismiss/modal.spec.tsx b/core/src/components/modal/test/can-dismiss/modal.spec.tsx index 74da7b0c93..ed12166b20 100644 --- a/core/src/components/modal/test/can-dismiss/modal.spec.tsx +++ b/core/src/components/modal/test/can-dismiss/modal.spec.tsx @@ -1,19 +1,18 @@ -import { h } from '@stencil/core'; +import { h, setMode } from '@stencil/core'; import { newSpecPage } from '@stencil/core/testing'; -import { setMode } from '@stencil/core'; -import { Modal } from '../../modal'; import { Content } from '../../../content/content'; +import { Modal } from '../../modal'; describe('modal: canDismiss', () => { describe('modal: regular modal', () => { it('should dismiss when canDismiss is true', async () => { const page = await newSpecPage({ components: [Modal], - template: () => , + template: () => , }); - const modal = page.body.querySelector('ion-modal'); + const modal = page.body.querySelector('ion-modal')!; await modal.present(); await page.waitForChanges(); @@ -26,10 +25,10 @@ describe('modal: canDismiss', () => { it('should not dismiss when canDismiss is false', async () => { const page = await newSpecPage({ components: [Modal], - template: () => , + template: () => , }); - const modal = page.body.querySelector('ion-modal'); + const modal = page.body.querySelector('ion-modal')!; await modal.present(); await page.waitForChanges(); @@ -44,6 +43,7 @@ describe('modal: canDismiss', () => { components: [Modal], template: () => ( { return new Promise((resolve) => { @@ -54,7 +54,7 @@ describe('modal: canDismiss', () => { ), }); - const modal = page.body.querySelector('ion-modal'); + const modal = page.body.querySelector('ion-modal')!; await modal.present(); await page.waitForChanges(); @@ -69,6 +69,7 @@ describe('modal: canDismiss', () => { components: [Modal], template: () => ( { return new Promise((resolve) => { @@ -79,7 +80,7 @@ describe('modal: canDismiss', () => { ), }); - const modal = page.body.querySelector('ion-modal'); + const modal = page.body.querySelector('ion-modal')!; await modal.present(); await page.waitForChanges(); @@ -94,19 +95,24 @@ describe('modal: canDismiss', () => { /** * Card modal is only available on iOS */ - setMode((elm) => 'ios'); + setMode(() => 'ios'); }); it('should dismiss when canDismiss is true', async () => { const page = await newSpecPage({ components: [Content, Modal], template: () => ( - + Test Content ), }); - const modal = page.body.querySelector('ion-modal'); + const modal = page.body.querySelector('ion-modal')!; await modal.present(); await page.waitForChanges(); @@ -120,13 +126,18 @@ describe('modal: canDismiss', () => { const page = await newSpecPage({ components: [Content, Modal], template: () => ( - + Test Content ), }); - const modal = page.body.querySelector('ion-modal'); + const modal = page.body.querySelector('ion-modal')!; await modal.present(); await page.waitForChanges(); @@ -141,6 +152,7 @@ describe('modal: canDismiss', () => { components: [Content, Modal], template: () => ( { @@ -154,7 +166,7 @@ describe('modal: canDismiss', () => { ), }); - const modal = page.body.querySelector('ion-modal'); + const modal = page.body.querySelector('ion-modal')!; await modal.present(); await page.waitForChanges(); @@ -169,6 +181,7 @@ describe('modal: canDismiss', () => { components: [Content, Modal], template: () => ( { @@ -182,7 +195,7 @@ describe('modal: canDismiss', () => { ), }); - const modal = page.body.querySelector('ion-modal'); + const modal = page.body.querySelector('ion-modal')!; await modal.present(); await page.waitForChanges(); @@ -197,11 +210,17 @@ describe('modal: canDismiss', () => { const page = await newSpecPage({ components: [Modal], template: () => ( - + ), }); - const modal = page.body.querySelector('ion-modal'); + const modal = page.body.querySelector('ion-modal')!; await modal.present(); await page.waitForChanges(); @@ -215,11 +234,17 @@ describe('modal: canDismiss', () => { const page = await newSpecPage({ components: [Modal], template: () => ( - + ), }); - const modal = page.body.querySelector('ion-modal'); + const modal = page.body.querySelector('ion-modal')!; await modal.present(); await page.waitForChanges(); @@ -234,6 +259,7 @@ describe('modal: canDismiss', () => { components: [Modal], template: () => ( { ), }); - const modal = page.body.querySelector('ion-modal'); + const modal = page.body.querySelector('ion-modal')!; await modal.present(); await page.waitForChanges(); @@ -261,6 +287,7 @@ describe('modal: canDismiss', () => { components: [Modal], template: () => ( { ), }); - const modal = page.body.querySelector('ion-modal'); + const modal = page.body.querySelector('ion-modal')!; await modal.present(); await page.waitForChanges(); @@ -288,15 +315,15 @@ describe('modal: canDismiss', () => { const canDismiss = jest.fn(); const page = await newSpecPage({ components: [Modal], - template: () => , + template: () => , }); - const modal = page.body.querySelector('ion-modal'); + const modal = page.body.querySelector('ion-modal')!; await modal.present(); await page.waitForChanges(); - const returnValue = await modal.dismiss('my data', 'my role'); + await modal.dismiss('my data', 'my role'); expect(canDismiss).toHaveBeenCalledWith('my data', 'my role'); }); diff --git a/core/src/components/nav/test/nav-controller.spec.ts b/core/src/components/nav/test/nav-controller.spec.ts index 2bb0eabd46..93b5884b86 100644 --- a/core/src/components/nav/test/nav-controller.spec.ts +++ b/core/src/components/nav/test/nav-controller.spec.ts @@ -1,6 +1,5 @@ import { newSpecPage } from '@stencil/core/testing'; -import { Config } from '../../../global/config'; import type { ComponentProps } from '../../../interface'; import { Nav } from '../nav'; import type { NavOptions } from '../nav-interface'; @@ -197,7 +196,6 @@ describe('NavController', () => { .insert(-1, null as any, null, null, trnsDone) .then(() => { fail('it should not succeed'); - done(); }) .catch((err: Error) => { const hasCompleted = false; @@ -252,7 +250,6 @@ describe('NavController', () => { .pop(null, trnsDone) .then(() => { fail('it should not succeed'); - done(); }) .catch((err: any) => { const hasCompleted = false; @@ -819,15 +816,10 @@ describe('NavController', () => { beforeEach(async () => { trnsDone = jest.fn(); - const config = new Config(); - config.reset({ animated: false }); const page = await newSpecPage({ components: [Nav], html: ``, autoApplyChanges: true, - context: { - config, - }, }); nav = page.rootInstance; }); @@ -848,7 +840,7 @@ describe('NavController', () => { pause: jest.fn(), cancel: jest.fn(), onfinish: undefined, - }; + } as any; animation.play = () => { if (animation.onfinish) { diff --git a/core/src/components/picker-column/test/picker-column-aria.spec.tsx b/core/src/components/picker-column/test/picker-column-aria.spec.tsx index 9e518e655a..f2756063d8 100644 --- a/core/src/components/picker-column/test/picker-column-aria.spec.tsx +++ b/core/src/components/picker-column/test/picker-column-aria.spec.tsx @@ -19,6 +19,7 @@ describe('picker-column', () => { text: 'Java', }, ], + name: 'programmingLanguages', }; const page = await newSpecPage({ @@ -26,8 +27,8 @@ describe('picker-column', () => { template: () => , }); - const firstOption = page.body.querySelector('ion-picker-column .picker-opt:nth-child(1)'); - const secondOption = page.body.querySelector('ion-picker-column .picker-opt:nth-child(2)'); + const firstOption = page.body.querySelector('ion-picker-column .picker-opt:nth-child(1)')!; + const secondOption = page.body.querySelector('ion-picker-column .picker-opt:nth-child(2)')!; expect(firstOption.getAttribute('aria-label')).toBe('C Sharp'); expect(secondOption.getAttribute('aria-label')).toBe(null); diff --git a/core/src/components/picker-column/test/picker-column-dynamic.spec.tsx b/core/src/components/picker-column/test/picker-column-dynamic.spec.tsx index f0f5fbe757..aa1b0a3c3f 100644 --- a/core/src/components/picker-column/test/picker-column-dynamic.spec.tsx +++ b/core/src/components/picker-column/test/picker-column-dynamic.spec.tsx @@ -15,18 +15,19 @@ describe('picker-column: dynamic options', () => { const page = await newSpecPage({ components: [PickerColumnCmp], - template: () => , + template: () => , }); - const pickerCol = page.body.querySelector('ion-picker-column'); + const pickerCol = page.body.querySelector('ion-picker-column')!; pickerCol.col = { options: [...defaultOptions, { text: 'Carrot', value: 'carrot' }], + name: 'vegetables', }; await page.waitForChanges(); - const pickerOpt = pickerCol.querySelector('.picker-opt:nth(2)'); + const pickerOpt = pickerCol.querySelector('.picker-opt:nth(2)')!; expect(pickerOpt.getAttribute('style')).toContain('transform'); }); }); diff --git a/core/src/components/picker-column/test/picker-column.spec.tsx b/core/src/components/picker-column/test/picker-column.spec.tsx index d09d5980f5..654caa672c 100644 --- a/core/src/components/picker-column/test/picker-column.spec.tsx +++ b/core/src/components/picker-column/test/picker-column.spec.tsx @@ -5,14 +5,14 @@ import { PickerColumnCmp } from '../picker-column'; describe('picker-column', () => { it('should add class to host of component', async () => { - const col = { cssClass: 'test-class', options: [] }; + const col = { cssClass: 'test-class', options: [], name: 'col' }; const page = await newSpecPage({ components: [PickerColumnCmp], template: () => , }); - const pickerCol = page.body.querySelector('ion-picker-column'); + const pickerCol = page.body.querySelector('ion-picker-column')!; expect(pickerCol.classList.contains('test-class')).toBe(true); }); }); diff --git a/core/src/components/popover/test/basic/popover.spec.tsx b/core/src/components/popover/test/basic/popover.spec.tsx index 8fe935fe37..84ecc7150c 100644 --- a/core/src/components/popover/test/basic/popover.spec.tsx +++ b/core/src/components/popover/test/basic/popover.spec.tsx @@ -7,10 +7,10 @@ describe('popover: htmlAttributes inheritance', () => { it('should correctly inherit attributes on host', async () => { const page = await newSpecPage({ components: [Popover], - template: () => , + template: () => , }); - const popover = page.body.querySelector('ion-popover'); + const popover = page.body.querySelector('ion-popover')!; await expect(popover.getAttribute('data-testid')).toBe('basic-popover'); }); diff --git a/core/src/components/popover/test/util.spec.ts b/core/src/components/popover/test/util.spec.ts index 3f848be61f..a383209f96 100644 --- a/core/src/components/popover/test/util.spec.ts +++ b/core/src/components/popover/test/util.spec.ts @@ -17,20 +17,20 @@ describe('isTriggerElement', () => { describe('getIndexOfItem', () => { it('should return the correct index in an array of ion-items', () => { - const array = createArrayOfElements(['ion-item', 'ion-item', 'ion-item']); + const array = createArrayOfElements(['ion-item', 'ion-item', 'ion-item']) as HTMLIonItemElement[]; expect(getIndexOfItem(array, array[1])).toEqual(1); }); it('should return -1 when ion-item not found', () => { const el = document.createElement('ion-item'); - const array = createArrayOfElements(['ion-item', 'ion-item']); + const array = createArrayOfElements(['ion-item', 'ion-item']) as HTMLIonItemElement[]; expect(getIndexOfItem(array, el)).toEqual(-1); }); it('should return -1 if a non-ion-item is passed in', () => { - const array = createArrayOfElements(['ion-item', 'div', 'ion-item']); + const array = createArrayOfElements(['ion-item', 'div', 'ion-item']) as HTMLIonItemElement[]; expect(getIndexOfItem(array, array[1])).toEqual(-1); }); @@ -38,24 +38,24 @@ describe('getIndexOfItem', () => { describe('getNextItem', () => { it('should get the next item in an array of ion-items', () => { - const array = createArrayOfElements(['ion-item', 'ion-item', 'ion-item']); + const array = createArrayOfElements(['ion-item', 'ion-item', 'ion-item']) as HTMLIonItemElement[]; expect(getNextItem(array, array[1])).toEqual(array[2]); }); it('should return undefined if there is no next item', () => { - const array = createArrayOfElements(['ion-item', 'ion-item', 'ion-item']); + const array = createArrayOfElements(['ion-item', 'ion-item', 'ion-item']) as HTMLIonItemElement[]; expect(getNextItem(array, array[2])).toEqual(undefined); }); }); describe('getPrevItem', () => { it('should get the previous item in an array of ion-items', () => { - const array = createArrayOfElements(['ion-item', 'ion-item', 'ion-item']); + const array = createArrayOfElements(['ion-item', 'ion-item', 'ion-item']) as HTMLIonItemElement[]; expect(getPrevItem(array, array[1])).toEqual(array[0]); }); it('should return undefined if there is no previous item', () => { - const array = createArrayOfElements(['ion-item', 'ion-item', 'ion-item']); + const array = createArrayOfElements(['ion-item', 'ion-item', 'ion-item']) as HTMLIonItemElement[]; expect(getPrevItem(array, array[0])).toEqual(undefined); }); }); diff --git a/core/src/components/radio/test/radio.spec.ts b/core/src/components/radio/test/radio.spec.ts index 113a01dc5f..ecfa2d2fc8 100644 --- a/core/src/components/radio/test/radio.spec.ts +++ b/core/src/components/radio/test/radio.spec.ts @@ -1,7 +1,8 @@ -import { Radio } from '../radio.tsx'; -import { RadioGroup } from '../../radio-group/radio-group.tsx'; import { newSpecPage } from '@stencil/core/testing'; +import { RadioGroup } from '../../radio-group/radio-group'; +import { Radio } from '../radio'; + describe('ion-radio', () => { it('should set a default value', async () => { const radio = new Radio(); @@ -21,7 +22,7 @@ describe('ion-radio', () => { `, }); - const radio = page.root.querySelector('ion-radio'); + const radio = page.body.querySelector('ion-radio')!; expect(radio.classList.contains('radio-checked')).toBe(false); radio.value = 'a'; @@ -43,8 +44,8 @@ describe('ion-radio: disabled', () => { `, }); - const radio = page.body.querySelector('ion-radio'); - const radioGroup = page.body.querySelector('ion-radio-group'); + const radio = page.body.querySelector('ion-radio')!; + const radioGroup = page.body.querySelector('ion-radio-group')!; expect(radioGroup.value).toBe(undefined); diff --git a/core/src/components/range/test/range.spec.ts b/core/src/components/range/test/range.spec.ts index 255914dbc7..65a09695b9 100644 --- a/core/src/components/range/test/range.spec.ts +++ b/core/src/components/range/test/range.spec.ts @@ -1,8 +1,10 @@ import { newSpecPage } from '@stencil/core/testing'; -import { Range } from '../range'; -import { Item } from '../../item/item'; -let sharedRange; +import { Item } from '../../item/item'; +import { Range } from '../range'; + +let sharedRange: Range; + describe('Range', () => { beforeEach(() => { sharedRange = new Range(); @@ -21,7 +23,8 @@ describe('Range', () => { ]; valueTests.forEach((test) => { - expect(sharedRange.ensureValueInBounds(test[0])).toBe(test[1]); + // Casting as any since we are accessing a private API on the range component + expect((sharedRange as any).ensureValueInBounds(test[0])).toBe(test[1]); }); }); @@ -58,7 +61,8 @@ describe('Range', () => { ]; valueTests.forEach((test) => { - expect(sharedRange.ensureValueInBounds(test[0])).toEqual(test[1]); + // Casting as any since we are accessing a private API on the range component + expect((sharedRange as any).ensureValueInBounds(test[0])).toEqual(test[1]); }); }); }); @@ -73,7 +77,7 @@ describe('range id', () => { `, }); - const range = page.body.querySelector('ion-range'); + const range = page.body.querySelector('ion-range')!; expect(range.getAttribute('id')).toBe('my-custom-range'); }); }); @@ -89,7 +93,7 @@ describe('range: item adjustments', () => { `, }); - const range = page.body.querySelector('ion-range'); + const range = page.body.querySelector('ion-range')!; expect(range.classList.contains('range-item-start-adjustment')).toBe(true); expect(range.classList.contains('range-item-end-adjustment')).toBe(true); }); @@ -104,7 +108,7 @@ describe('range: item adjustments', () => { `, }); - const range = page.body.querySelector('ion-range'); + const range = page.body.querySelector('ion-range')!; expect(range.classList.contains('range-item-start-adjustment')).toBe(true); expect(range.classList.contains('range-item-end-adjustment')).toBe(false); }); @@ -119,7 +123,7 @@ describe('range: item adjustments', () => { `, }); - const range = page.body.querySelector('ion-range'); + const range = page.body.querySelector('ion-range')!; expect(range.classList.contains('range-item-start-adjustment')).toBe(false); expect(range.classList.contains('range-item-end-adjustment')).toBe(true); }); @@ -134,7 +138,7 @@ describe('range: item adjustments', () => { `, }); - const range = page.body.querySelector('ion-range'); + const range = page.body.querySelector('ion-range')!; expect(range.classList.contains('range-item-start-adjustment')).toBe(false); expect(range.classList.contains('range-item-end-adjustment')).toBe(true); }); @@ -149,7 +153,7 @@ describe('range: item adjustments', () => { `, }); - const range = page.body.querySelector('ion-range'); + const range = page.body.querySelector('ion-range')!; expect(range.classList.contains('range-item-start-adjustment')).toBe(true); expect(range.classList.contains('range-item-end-adjustment')).toBe(true); }); @@ -164,7 +168,7 @@ describe('range: item adjustments', () => { `, }); - const range = page.body.querySelector('ion-range'); + const range = page.body.querySelector('ion-range')!; expect(range.classList.contains('range-item-start-adjustment')).toBe(true); expect(range.classList.contains('range-item-end-adjustment')).toBe(true); }); @@ -177,7 +181,7 @@ describe('range: item adjustments', () => { `, }); - const range = page.body.querySelector('ion-range'); + const range = page.body.querySelector('ion-range')!; expect(range.classList.contains('range-item-start-adjustment')).toBe(false); expect(range.classList.contains('range-item-end-adjustment')).toBe(false); }); @@ -191,7 +195,7 @@ describe('range: item adjustments', () => { `, }); - const range = page.body.querySelector('ion-range'); + const range = page.body.querySelector('ion-range')!; expect(range.classList.contains('range-item-start-adjustment')).toBe(false); expect(range.classList.contains('range-item-end-adjustment')).toBe(false); }); @@ -206,7 +210,7 @@ describe('range: item adjustments', () => { `, }); - const range = page.body.querySelector('ion-range'); + const range = page.body.querySelector('ion-range')!; expect(range.classList.contains('range-item-start-adjustment')).toBe(false); expect(range.classList.contains('range-item-end-adjustment')).toBe(false); }); @@ -221,7 +225,7 @@ describe('range: item adjustments', () => { `, }); - const range = page.body.querySelector('ion-range'); + const range = page.body.querySelector('ion-range')!; expect(range.classList.contains('range-item-start-adjustment')).toBe(false); expect(range.classList.contains('range-item-end-adjustment')).toBe(false); }); diff --git a/core/src/components/refresher-content/test/refresher-content.spec.ts b/core/src/components/refresher-content/test/refresher-content.spec.ts index 8153fabb09..36e0f31b8b 100644 --- a/core/src/components/refresher-content/test/refresher-content.spec.ts +++ b/core/src/components/refresher-content/test/refresher-content.spec.ts @@ -1,6 +1,7 @@ import { newSpecPage } from '@stencil/core/testing'; -import { RefresherContent } from '../refresher-content'; + import { config } from '../../../global/config'; +import { RefresherContent } from '../refresher-content'; describe('refresher-content: custom html', () => { it('should not allow for custom html by default', async () => { @@ -9,11 +10,11 @@ describe('refresher-content: custom html', () => { html: ``, }); - const pullingContent = page.body.querySelector('.refresher-pulling-text'); + const pullingContent = page.body.querySelector('.refresher-pulling-text')!; expect(pullingContent.textContent).toContain('Custom Pulling Text'); expect(pullingContent.querySelector('button.custom-pulling-html')).toBe(null); - const refreshingContent = page.body.querySelector('.refresher-refreshing-text'); + const refreshingContent = page.body.querySelector('.refresher-refreshing-text')!; expect(refreshingContent.textContent).toContain('Custom Refreshing Text'); expect(refreshingContent.querySelector('button.custom-refreshing-html')).toBe(null); }); @@ -25,11 +26,11 @@ describe('refresher-content: custom html', () => { html: ``, }); - const pullingContent = page.body.querySelector('.refresher-pulling-text'); + const pullingContent = page.body.querySelector('.refresher-pulling-text')!; expect(pullingContent.textContent).toContain('Custom Pulling Text'); expect(pullingContent.querySelector('button.custom-pulling-html')).not.toBe(null); - const refreshingContent = page.body.querySelector('.refresher-refreshing-text'); + const refreshingContent = page.body.querySelector('.refresher-refreshing-text')!; expect(refreshingContent.textContent).toContain('Custom Refreshing Text'); expect(refreshingContent.querySelector('button.custom-refreshing-html')).not.toBe(null); }); @@ -41,11 +42,11 @@ describe('refresher-content: custom html', () => { html: ``, }); - const pullingContent = page.body.querySelector('.refresher-pulling-text'); + const pullingContent = page.body.querySelector('.refresher-pulling-text')!; expect(pullingContent.textContent).toContain('Custom Pulling Text'); expect(pullingContent.querySelector('button.custom-pulling-html')).toBe(null); - const refreshingContent = page.body.querySelector('.refresher-refreshing-text'); + const refreshingContent = page.body.querySelector('.refresher-refreshing-text')!; expect(refreshingContent.textContent).toContain('Custom Refreshing Text'); expect(refreshingContent.querySelector('button.custom-refreshing-html')).toBe(null); }); diff --git a/core/src/components/router/test/matching.spec.tsx b/core/src/components/router/test/matching.spec.tsx index 0a540ff9f2..9b8947c38a 100644 --- a/core/src/components/router/test/matching.spec.tsx +++ b/core/src/components/router/test/matching.spec.tsx @@ -203,17 +203,17 @@ describe('findChainForSegments', () => { describe('mergeParams', () => { it('should merge undefined', () => { expect(mergeParams(undefined, undefined)).toBeUndefined(); - expect(mergeParams(null, undefined)).toBeUndefined(); - expect(mergeParams(undefined, null)).toBeUndefined(); - expect(mergeParams(null, null)).toBeUndefined(); + expect(mergeParams(null as any, undefined)).toBeUndefined(); + expect(mergeParams(undefined, null as any)).toBeUndefined(); + expect(mergeParams(null as any, null as any)).toBeUndefined(); }); it('should merge undefined with params', () => { const params = { data: '1' }; expect(mergeParams(undefined, params)).toEqual(params); - expect(mergeParams(null, params)).toEqual(params); + expect(mergeParams(null as any, params)).toEqual(params); expect(mergeParams(params, undefined)).toEqual(params); - expect(mergeParams(params, null)).toEqual(params); + expect(mergeParams(params, null as any)).toEqual(params); }); it('should merge params with params', () => { @@ -253,36 +253,44 @@ describe('RouterSegments', () => { describe('matchesRedirect', () => { it('should match empty redirect', () => { - expect(matchesRedirect([''], { from: [''], to: [''] })).toBeTruthy(); - expect(matchesRedirect([''], { from: ['*'], to: [''] })).toBeTruthy(); + expect(matchesRedirect([''], { from: [''], to: { segments: [''] } })).toBeTruthy(); + expect(matchesRedirect([''], { from: ['*'], to: { segments: [''] } })).toBeTruthy(); - expect(matchesRedirect([''], { from: ['hola'], to: [''] })).toBeFalsy(); - expect(matchesRedirect([''], { from: ['hola', '*'], to: [''] })).toBeFalsy(); + expect(matchesRedirect([''], { from: ['hola'], to: { segments: [] } })).toBeFalsy(); + expect(matchesRedirect([''], { from: ['hola', '*'], to: { segments: [''] } })).toBeFalsy(); }); it('should match simple segment redirect', () => { - expect(matchesRedirect(['workouts'], { from: ['workouts'], to: [''] })).toBeTruthy(); - expect(matchesRedirect(['workouts'], { from: ['*'], to: [''] })).toBeTruthy(); - expect(matchesRedirect(['workouts', 'hola'], { from: ['workouts', '*'], to: [''] })).toBeTruthy(); - expect(matchesRedirect(['workouts', 'hola'], { from: ['workouts', 'hola'], to: [''] })).toBeTruthy(); + expect(matchesRedirect(['workouts'], { from: ['workouts'], to: { segments: [''] } })).toBeTruthy(); + expect(matchesRedirect(['workouts'], { from: ['*'], to: { segments: [''] } })).toBeTruthy(); + expect(matchesRedirect(['workouts', 'hola'], { from: ['workouts', '*'], to: { segments: [''] } })).toBeTruthy(); + expect(matchesRedirect(['workouts', 'hola'], { from: ['workouts', 'hola'], to: { segments: [''] } })).toBeTruthy(); - expect(matchesRedirect(['workouts'], { from: ['workouts', '*'], to: [''] })).toBeFalsy(); - expect(matchesRedirect(['workouts', 'hola'], { from: ['workouts'], to: [''] })).toBeFalsy(); - expect(matchesRedirect(['workouts', 'hola'], { from: ['workouts', 'adios'], to: [''] })).toBeFalsy(); + expect(matchesRedirect(['workouts'], { from: ['workouts', '*'], to: { segments: [''] } })).toBeFalsy(); + expect(matchesRedirect(['workouts', 'hola'], { from: ['workouts'], to: { segments: [''] } })).toBeFalsy(); + expect(matchesRedirect(['workouts', 'hola'], { from: ['workouts', 'adios'], to: { segments: [''] } })).toBeFalsy(); }); it('should match long route', () => { - expect(matchesRedirect(['workouts', 'path', 'to'], { from: ['*'], to: [''] })).toBeTruthy(); - expect(matchesRedirect(['workouts', 'path', 'to'], { from: ['workouts', '*'], to: [''] })).toBeTruthy(); - expect(matchesRedirect(['workouts', 'path', 'to'], { from: ['workouts', 'path', '*'], to: [''] })).toBeTruthy(); - expect(matchesRedirect(['workouts', 'path', 'to'], { from: ['workouts', 'path', 'to'], to: [''] })).toBeTruthy(); - - expect(matchesRedirect(['workouts', 'path', 'to'], { from: ['login'], to: [''] })).toBeFalsy(); - expect(matchesRedirect(['workouts', 'path', 'to'], { from: ['login', '*'], to: [''] })).toBeFalsy(); - expect(matchesRedirect(['workouts', 'path', 'to'], { from: ['workouts'], to: [''] })).toBeFalsy(); - expect(matchesRedirect(['workouts', 'path', 'to'], { from: ['workouts', 'path'], to: [''] })).toBeFalsy(); + expect(matchesRedirect(['workouts', 'path', 'to'], { from: ['*'], to: { segments: [''] } })).toBeTruthy(); expect( - matchesRedirect(['workouts', 'path', 'to'], { from: ['workouts', 'path', 'to', '*'], to: [''] }) + matchesRedirect(['workouts', 'path', 'to'], { from: ['workouts', '*'], to: { segments: [''] } }) + ).toBeTruthy(); + expect( + matchesRedirect(['workouts', 'path', 'to'], { from: ['workouts', 'path', '*'], to: { segments: [''] } }) + ).toBeTruthy(); + expect( + matchesRedirect(['workouts', 'path', 'to'], { from: ['workouts', 'path', 'to'], to: { segments: [''] } }) + ).toBeTruthy(); + + expect(matchesRedirect(['workouts', 'path', 'to'], { from: ['login'], to: { segments: [''] } })).toBeFalsy(); + expect(matchesRedirect(['workouts', 'path', 'to'], { from: ['login', '*'], to: { segments: [''] } })).toBeFalsy(); + expect(matchesRedirect(['workouts', 'path', 'to'], { from: ['workouts'], to: { segments: [''] } })).toBeFalsy(); + expect( + matchesRedirect(['workouts', 'path', 'to'], { from: ['workouts', 'path'], to: { segments: [''] } }) + ).toBeFalsy(); + expect( + matchesRedirect(['workouts', 'path', 'to'], { from: ['workouts', 'path', 'to', '*'], to: { segments: [''] } }) ).toBeFalsy(); }); diff --git a/core/src/components/router/test/router.spec.tsx b/core/src/components/router/test/router.spec.tsx index ce6ec6bac7..e8729b8910 100644 --- a/core/src/components/router/test/router.spec.tsx +++ b/core/src/components/router/test/router.spec.tsx @@ -18,19 +18,21 @@ describe('ionic-conference-app', () => { expect(getRouteIDs('/about', routes)).toEqual(['page-tabs', 'page-about']); expect(getRouteIDs('/tutorial', routes)).toEqual(['page-tutorial']); - expect(getRoutePath([{ id: 'PAGE-TABS' }, { id: 'tab-schedule' }, { id: 'page-schedule' }], routes)).toEqual('/'); + expect( + getRoutePath([{ id: 'PAGE-TABS' }, { id: 'tab-schedule' }, { id: 'page-schedule' }] as RouteID[], routes) + ).toEqual('/'); - expect(getRoutePath([{ id: 'page-tabs' }, { id: 'TAB-SPEAKER' }], routes)).toEqual('/speaker'); + expect(getRoutePath([{ id: 'page-tabs' }, { id: 'TAB-SPEAKER' }] as RouteID[], routes)).toEqual('/speaker'); - expect(getRoutePath([{ id: 'page-tabs' }, { id: 'TAB-SPEAKER' }, { id: 'page-speaker-list' }], routes)).toEqual( - '/speaker' - ); + expect( + getRoutePath([{ id: 'page-tabs' }, { id: 'TAB-SPEAKER' }, { id: 'page-speaker-list' }] as RouteID[], routes) + ).toEqual('/speaker'); - expect(getRoutePath([{ id: 'page-tabs' }, { id: 'PAGE-MAP' }], routes)).toEqual('/map'); + expect(getRoutePath([{ id: 'page-tabs' }, { id: 'PAGE-MAP' }] as RouteID[], routes)).toEqual('/map'); - expect(getRoutePath([{ id: 'page-tabs' }, { id: 'page-about' }], routes)).toEqual('/about'); + expect(getRoutePath([{ id: 'page-tabs' }, { id: 'page-about' }] as RouteID[], routes)).toEqual('/about'); - expect(getRoutePath([{ id: 'page-tutorial' }], routes)).toEqual('/tutorial'); + expect(getRoutePath([{ id: 'page-tutorial' }] as RouteID[], routes)).toEqual('/tutorial'); }); let win: Window; diff --git a/core/src/components/searchbar/test/searchbar.spec.ts b/core/src/components/searchbar/test/searchbar.spec.ts index 36731dac06..ad3a1f9137 100644 --- a/core/src/components/searchbar/test/searchbar.spec.ts +++ b/core/src/components/searchbar/test/searchbar.spec.ts @@ -9,7 +9,7 @@ describe('searchbar: rendering', () => { html: '', }); - const nativeEl = page.body.querySelector('ion-searchbar input'); + const nativeEl = page.body.querySelector('ion-searchbar input')!; expect(nativeEl.getAttribute('name')).toBe('search'); }); }); diff --git a/core/src/components/segment/test/segment.spec.ts b/core/src/components/segment/test/segment.spec.ts index b9f55b3334..9d70993813 100644 --- a/core/src/components/segment/test/segment.spec.ts +++ b/core/src/components/segment/test/segment.spec.ts @@ -9,14 +9,14 @@ it('should disable segment buttons added to disabled segment async', async () => html: ``, }); - const segment = page.body.querySelector('ion-segment'); + const segment = page.body.querySelector('ion-segment')!; segment.innerHTML = ` Segment Button `; await page.waitForChanges(); - const segmentButton = page.body.querySelector('ion-segment-button'); + const segmentButton = page.body.querySelector('ion-segment-button')!; expect(segmentButton.disabled).toBe(true); }); @@ -32,7 +32,7 @@ it('should set checked state when value is set asynchronously', async () => { `, }); - const segmentButton = page.root.querySelector('ion-segment-button'); + const segmentButton = page.body.querySelector('ion-segment-button')!; expect(segmentButton.classList.contains('segment-button-checked')).toBe(false); diff --git a/core/src/components/select/test/select.spec.tsx b/core/src/components/select/test/select.spec.tsx index aa6436f338..4e7bedb626 100644 --- a/core/src/components/select/test/select.spec.tsx +++ b/core/src/components/select/test/select.spec.tsx @@ -10,9 +10,9 @@ describe('ion-select', () => { template: () => , }); - const select = page.body.querySelector('ion-select'); + const select = page.body.querySelector('ion-select')!; - const hiddenInput = select.querySelector('input[type="hidden"]'); + const hiddenInput = select.querySelector('input[type="hidden"]')!; expect(hiddenInput).not.toBe(null); expect(hiddenInput.value).toBe('my value'); @@ -28,10 +28,10 @@ describe('ion-select', () => { `, }); - const select = page.body.querySelector('ion-select'); + const select = page.body.querySelector('ion-select')!; - const propEl = select.shadowRoot.querySelector('.label-text'); - const slotEl = select.shadowRoot.querySelector('slot[name="label"]'); + const propEl = select.shadowRoot!.querySelector('.label-text'); + const slotEl = select.shadowRoot!.querySelector('slot[name="label"]'); expect(propEl).not.toBe(null); expect(slotEl).toBe(null); @@ -44,10 +44,10 @@ describe('ion-select', () => { `, }); - const select = page.body.querySelector('ion-select'); + const select = page.body.querySelector('ion-select')!; - const propEl = select.shadowRoot.querySelector('.label-text'); - const slotEl = select.shadowRoot.querySelector('slot[name="label"]'); + const propEl = select.shadowRoot!.querySelector('.label-text'); + const slotEl = select.shadowRoot!.querySelector('slot[name="label"]'); expect(propEl).toBe(null); expect(slotEl).not.toBe(null); @@ -60,10 +60,10 @@ describe('ion-select', () => { `, }); - const select = page.body.querySelector('ion-select'); + const select = page.body.querySelector('ion-select')!; - const propEl = select.shadowRoot.querySelector('.label-text'); - const slotEl = select.shadowRoot.querySelector('slot[name="label"]'); + const propEl = select.shadowRoot!.querySelector('.label-text'); + const slotEl = select.shadowRoot!.querySelector('slot[name="label"]'); expect(propEl).not.toBe(null); expect(slotEl).toBe(null); diff --git a/core/src/components/textarea/test/textarea.spec.ts b/core/src/components/textarea/test/textarea.spec.ts index 890d53e544..5925a19c01 100644 --- a/core/src/components/textarea/test/textarea.spec.ts +++ b/core/src/components/textarea/test/textarea.spec.ts @@ -1,4 +1,5 @@ import { newSpecPage } from '@stencil/core/testing'; + import { Textarea } from '../textarea'; it('should inherit attributes', async () => { @@ -7,7 +8,7 @@ it('should inherit attributes', async () => { html: '', }); - const nativeEl = page.body.querySelector('ion-textarea textarea'); + const nativeEl = page.body.querySelector('ion-textarea textarea')!; expect(nativeEl.getAttribute('title')).toBe('my title'); expect(nativeEl.getAttribute('tabindex')).toBe('-1'); expect(nativeEl.getAttribute('data-form-type')).toBe('password'); @@ -31,9 +32,9 @@ describe('textarea: label rendering', () => { `, }); - const textarea = page.body.querySelector('ion-textarea'); + const textarea = page.body.querySelector('ion-textarea')!; - const labelText = textarea.querySelector('.label-text-wrapper'); + const labelText = textarea.querySelector('.label-text-wrapper')!; expect(labelText.textContent).toBe('Label Prop Text'); }); @@ -45,9 +46,9 @@ describe('textarea: label rendering', () => { `, }); - const textarea = page.body.querySelector('ion-textarea'); + const textarea = page.body.querySelector('ion-textarea')!; - const labelText = textarea.querySelector('.label-text-wrapper'); + const labelText = textarea.querySelector('.label-text-wrapper')!; expect(labelText.textContent).toBe('Label Prop Slot'); }); @@ -59,9 +60,9 @@ describe('textarea: label rendering', () => { `, }); - const textarea = page.body.querySelector('ion-textarea'); + const textarea = page.body.querySelector('ion-textarea')!; - const labelText = textarea.querySelector('.label-text-wrapper'); + const labelText = textarea.querySelector('.label-text-wrapper')!; expect(labelText.textContent).toBe('Label Prop Text'); }); diff --git a/core/src/components/toast/test/toast.spec.tsx b/core/src/components/toast/test/toast.spec.tsx index d59e7d32e9..9db93c4bc3 100644 --- a/core/src/components/toast/test/toast.spec.tsx +++ b/core/src/components/toast/test/toast.spec.tsx @@ -1,8 +1,8 @@ import { h } from '@stencil/core'; import { newSpecPage } from '@stencil/core/testing'; -import { Toast } from '../toast'; + import { config } from '../../../global/config'; -import { toastController } from '../../../utils/overlays'; +import { Toast } from '../toast'; describe('toast: custom html', () => { it('should not allow for custom html by default', async () => { @@ -11,8 +11,8 @@ describe('toast: custom html', () => { html: ``, }); - const toast = page.body.querySelector('ion-toast'); - const content = toast.shadowRoot.querySelector('.toast-message'); + const toast = page.body.querySelector('ion-toast')!; + const content = toast.shadowRoot!.querySelector('.toast-message')!; expect(content.textContent).toContain('Custom Text'); expect(content.querySelector('button.custom-html')).toBe(null); }); @@ -24,8 +24,8 @@ describe('toast: custom html', () => { html: ``, }); - const toast = page.body.querySelector('ion-toast'); - const content = toast.shadowRoot.querySelector('.toast-message'); + const toast = page.body.querySelector('ion-toast')!; + const content = toast.shadowRoot!.querySelector('.toast-message')!; expect(content.textContent).toContain('Custom Text'); expect(content.querySelector('button.custom-html')).not.toBe(null); }); @@ -37,8 +37,8 @@ describe('toast: custom html', () => { html: ``, }); - const toast = page.body.querySelector('ion-toast'); - const content = toast.shadowRoot.querySelector('.toast-message'); + const toast = page.body.querySelector('ion-toast')!; + const content = toast.shadowRoot!.querySelector('.toast-message')!; expect(content.textContent).toContain('Custom Text'); expect(content.querySelector('button.custom-html')).toBe(null); }); @@ -56,9 +56,9 @@ describe('toast: a11y smoke test', () => { html: ``, }); - const toast = page.body.querySelector('ion-toast'); - const header = toast.shadowRoot.querySelector('.toast-header'); - const message = toast.shadowRoot.querySelector('.toast-message'); + const toast = page.body.querySelector('ion-toast')!; + const header = toast.shadowRoot!.querySelector('.toast-header')!; + const message = toast.shadowRoot!.querySelector('.toast-message')!; expect(header.getAttribute('aria-hidden')).toBe('true'); expect(message.getAttribute('aria-hidden')).toBe('true'); @@ -74,7 +74,7 @@ describe('toast: a11y smoke test', () => { `, }); - const toast = page.body.querySelector('ion-toast'); + const toast = page.body.querySelector('ion-toast')!; /** * Wait for present method to resolve @@ -83,8 +83,8 @@ describe('toast: a11y smoke test', () => { await toast.present(); await page.waitForChanges(); - const header = toast.shadowRoot.querySelector('.toast-header'); - const message = toast.shadowRoot.querySelector('.toast-message'); + const header = toast.shadowRoot!.querySelector('.toast-header')!; + const message = toast.shadowRoot!.querySelector('.toast-message')!; expect(header.getAttribute('aria-hidden')).toBe(null); expect(message.getAttribute('aria-hidden')).toBe(null); @@ -98,7 +98,7 @@ describe('toast: duration config', () => { html: ``, }); - const toast = page.body.querySelector('ion-toast'); + const toast = page.body.querySelector('ion-toast')!; expect(toast.duration).toBe(0); }); @@ -111,7 +111,7 @@ describe('toast: duration config', () => { html: ``, }); - const toast = page.body.querySelector('ion-toast'); + const toast = page.body.querySelector('ion-toast')!; expect(toast.duration).toBe(5000); }); @@ -121,10 +121,10 @@ describe('toast: htmlAttributes', () => { it('should correctly inherit attributes on host', async () => { const page = await newSpecPage({ components: [Toast], - template: () => , + template: () => , }); - const toast = page.body.querySelector('ion-toast'); + const toast = page.body.querySelector('ion-toast')!; await expect(toast.getAttribute('data-testid')).toBe('basic-toast'); }); @@ -134,12 +134,12 @@ describe('toast: button cancel', () => { it('should render the cancel button with part button-cancel', async () => { const page = await newSpecPage({ components: [Toast], - template: () => , + template: () => , }); - const toast = page.body.querySelector('ion-toast'); + const toast = page.body.querySelector('ion-toast')!; - const buttonCancel = toast?.shadowRoot?.querySelector('.toast-button-cancel'); + const buttonCancel = toast.shadowRoot!.querySelector('.toast-button-cancel')!; expect(buttonCancel.getAttribute('part')).toBe('button cancel'); }); diff --git a/core/src/components/toggle/test/toggle.spec.ts b/core/src/components/toggle/test/toggle.spec.ts index d09d0c208d..a37f6e1654 100644 --- a/core/src/components/toggle/test/toggle.spec.ts +++ b/core/src/components/toggle/test/toggle.spec.ts @@ -51,7 +51,7 @@ describe('ion-toggle: disabled', () => { `, }); - const toggle = page.body.querySelector('ion-toggle'); + const toggle = page.body.querySelector('ion-toggle')!; expect(toggle.checked).toBe(false); diff --git a/core/src/global/test/config-controller.spec.ts b/core/src/global/test/config-controller.spec.ts index 1b43c1c368..7550c5fc0a 100644 --- a/core/src/global/test/config-controller.spec.ts +++ b/core/src/global/test/config-controller.spec.ts @@ -1,11 +1,12 @@ +import type { IonicConfig } from '../../interface'; import { Config } from '../config'; describe('Config', () => { it('should get a value from the config', () => { const config = new Config(); - config.reset({ name: 'Doc Brown' }); - expect(config.get('name')).toEqual('Doc Brown'); - expect(config.getBoolean('name')).toBe(false); + config.reset({ mode: 'ios' } as IonicConfig); + expect(config.get('mode')).toEqual('ios'); + expect(config.getBoolean('mode')).toBe(false); }); it('should get a boolean value', () => { @@ -18,14 +19,14 @@ describe('Config', () => { bool4: 'hola', bool5: 0, bool6: 1, - }); - expect(config.getBoolean('bool0')).toEqual(false); - expect(config.getBoolean('bool1')).toEqual(false); - expect(config.getBoolean('bool2')).toEqual(true); - expect(config.getBoolean('bool3')).toEqual(true); - expect(config.getBoolean('bool4')).toEqual(false); - expect(config.getBoolean('bool5')).toEqual(false); - expect(config.getBoolean('bool6')).toEqual(true); + } as any); + expect(config.getBoolean('bool0' as any)).toEqual(false); + expect(config.getBoolean('bool1' as any)).toEqual(false); + expect(config.getBoolean('bool2' as any)).toEqual(true); + expect(config.getBoolean('bool3' as any)).toEqual(true); + expect(config.getBoolean('bool4' as any)).toEqual(false); + expect(config.getBoolean('bool5' as any)).toEqual(false); + expect(config.getBoolean('bool6' as any)).toEqual(true); }); it('should get a number value', () => { @@ -36,12 +37,12 @@ describe('Config', () => { nu2: '200', nu3: '2.3', nu4: -100.2, - }); - expect(config.getNumber('nu0')).toEqual(0); - expect(config.getNumber('nu1')).toEqual(-1); - expect(config.getNumber('nu2')).toEqual(200); - expect(config.getNumber('nu3')).toEqual(2.3); - expect(config.getNumber('nu4')).toEqual(-100.2); + } as any); + expect(config.getNumber('nu0' as any)).toEqual(0); + expect(config.getNumber('nu1' as any)).toEqual(-1); + expect(config.getNumber('nu2' as any)).toEqual(200); + expect(config.getNumber('nu3' as any)).toEqual(2.3); + expect(config.getNumber('nu4' as any)).toEqual(-100.2); }); it('should not get fallback', () => { @@ -56,29 +57,29 @@ describe('Config', () => { nu0: '0', nu1: 0, nu2: 10, - }); - expect(config.get('text0', 'HEY')).toEqual(''); - expect(config.get('text1', 'HEY')).toEqual('hola'); + } as any); + expect(config.get('text0' as any, 'HEY')).toEqual(''); + expect(config.get('text1' as any, 'HEY')).toEqual('hola'); - expect(config.getBoolean('bool0', true)).toEqual(false); - expect(config.getBoolean('bool1', true)).toEqual(false); + expect(config.getBoolean('bool0' as any, true)).toEqual(false); + expect(config.getBoolean('bool1' as any, true)).toEqual(false); - expect(config.getNumber('nu0', 100)).toEqual(0); - expect(config.getNumber('nu1', 100)).toEqual(0); - expect(config.getNumber('nu2', 100)).toEqual(10); + expect(config.getNumber('nu0' as any, 100)).toEqual(0); + expect(config.getNumber('nu1' as any, 100)).toEqual(0); + expect(config.getNumber('nu2' as any, 100)).toEqual(10); }); it('should get fallback', () => { const config = new Config(); - expect(config.get('text0', 'HEY')).toEqual('HEY'); - expect(config.getBoolean('bool0', true)).toEqual(true); - expect(config.getNumber('nu0', 100)).toEqual(100); + expect(config.get('text0' as any, 'HEY')).toEqual('HEY'); + expect(config.getBoolean('bool0' as any, true)).toEqual(true); + expect(config.getNumber('nu0' as any, 100)).toEqual(100); }); it('should set value', () => { const config = new Config(); - expect(config.get('text0', 'HEY')).toEqual('HEY'); - config.set('text0', 'hola'); - expect(config.get('text0', 'HEY')).toEqual('hola'); + expect(config.get('text0' as any, 'HEY')).toEqual('HEY'); + config.set('text0' as any, 'hola'); + expect(config.get('text0' as any, 'HEY')).toEqual('hola'); }); }); diff --git a/core/src/utils/animation/test/animation.spec.ts b/core/src/utils/animation/test/animation.spec.ts index b9cfb18c3d..a1622352da 100644 --- a/core/src/utils/animation/test/animation.spec.ts +++ b/core/src/utils/animation/test/animation.spec.ts @@ -108,7 +108,7 @@ describe('Animation Class', () => { animation.play(); animation.progressStart(); - animation.progressEnd(1); + animation.progressEnd(1, 0); expect(animation.isRunning()).toEqual(true); }); @@ -125,9 +125,9 @@ describe('Animation Class', () => { await animation.play(); animation.progressStart(); - animation.progressEnd(0); + animation.progressEnd(0, 0); - await new Promise((resolve) => { + await new Promise((resolve) => { animation.onFinish(() => { expect(animation.isRunning()).toEqual(false); resolve(); @@ -161,8 +161,8 @@ describe('Animation Class', () => { const el = document.createElement('p'); animation.addElement(el); - animation.addElement(null); - animation.addElement(undefined); + animation.addElement(null as any); + animation.addElement(undefined as any); expect(animation.elements.length).toEqual(1); }); @@ -188,8 +188,8 @@ describe('Animation Class', () => { }); it('should not error when trying to add null or undefined', () => { - animation.addAnimation(null); - animation.addAnimation(undefined); + animation.addAnimation(null as any); + animation.addAnimation(undefined as any); expect(animation.childAnimations.length).toEqual(0); }); @@ -312,7 +312,7 @@ describe('Animation Class', () => { animation.progressStart(true); expect(animation.getEasing()).toEqual('linear'); - animation.progressEnd(); + animation.progressEnd(0, 0); expect(animation.getEasing()).toEqual('ease-in-out'); }); @@ -428,9 +428,15 @@ describe('cubic-bezier conversion', () => { [1, 1], ]; - shouldApproximatelyEqual(getTimeGivenProgression(...equation, 0.5), [0.16]); - shouldApproximatelyEqual(getTimeGivenProgression(...equation, 0.97), [0.56]); - shouldApproximatelyEqual(getTimeGivenProgression(...equation, 0.33), [0.11]); + shouldApproximatelyEqual(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 0.5), [ + 0.16, + ]); + shouldApproximatelyEqual(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 0.97), [ + 0.56, + ]); + shouldApproximatelyEqual(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 0.33), [ + 0.11, + ]); }); it('cubic-bezier(1, 0, 0.68, 0.28)', () => { @@ -441,9 +447,15 @@ describe('cubic-bezier conversion', () => { [1, 1], ]; - shouldApproximatelyEqual(getTimeGivenProgression(...equation, 0.08), [0.6]); - shouldApproximatelyEqual(getTimeGivenProgression(...equation, 0.5), [0.84]); - shouldApproximatelyEqual(getTimeGivenProgression(...equation, 0.94), [0.98]); + shouldApproximatelyEqual(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 0.08), [ + 0.6, + ]); + shouldApproximatelyEqual(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 0.5), [ + 0.84, + ]); + shouldApproximatelyEqual(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 0.94), [ + 0.98, + ]); }); it('cubic-bezier(0.4, 0, 0.6, 1)', () => { @@ -454,9 +466,15 @@ describe('cubic-bezier conversion', () => { [1, 1], ]; - shouldApproximatelyEqual(getTimeGivenProgression(...equation, 0.39), [0.43]); - shouldApproximatelyEqual(getTimeGivenProgression(...equation, 0.03), [0.11]); - shouldApproximatelyEqual(getTimeGivenProgression(...equation, 0.89), [0.78]); + shouldApproximatelyEqual(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 0.39), [ + 0.43, + ]); + shouldApproximatelyEqual(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 0.03), [ + 0.11, + ]); + shouldApproximatelyEqual(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 0.89), [ + 0.78, + ]); }); it('cubic-bezier(0, 0, 0.2, 1)', () => { @@ -467,9 +485,15 @@ describe('cubic-bezier conversion', () => { [1, 1], ]; - shouldApproximatelyEqual(getTimeGivenProgression(...equation, 0.95), [0.71]); - shouldApproximatelyEqual(getTimeGivenProgression(...equation, 0.1), [0.03]); - shouldApproximatelyEqual(getTimeGivenProgression(...equation, 0.7), [0.35]); + shouldApproximatelyEqual(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 0.95), [ + 0.71, + ]); + shouldApproximatelyEqual(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 0.1), [ + 0.03, + ]); + shouldApproximatelyEqual(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 0.7), [ + 0.35, + ]); }); it('cubic-bezier(0.32, 0.72, 0, 1) (with out of bounds progression)', () => { @@ -480,8 +504,8 @@ describe('cubic-bezier conversion', () => { [1, 1], ]; - expect(getTimeGivenProgression(...equation, 1.32)[0]).toBeUndefined(); - expect(getTimeGivenProgression(...equation, -0.32)[0]).toBeUndefined(); + expect(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 1.32)[0]).toBeUndefined(); + expect(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], -0.32)[0]).toBeUndefined(); }); it('cubic-bezier(0.21, 1.71, 0.88, 0.9) (multiple solutions)', () => { @@ -492,7 +516,10 @@ describe('cubic-bezier conversion', () => { [1, 1], ]; - shouldApproximatelyEqual(getTimeGivenProgression(...equation, 1.02), [0.35, 0.87]); + shouldApproximatelyEqual( + getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 1.02), + [0.35, 0.87] + ); }); it('cubic-bezier(0.32, 0.72, 0, 1) (with out of bounds progression)', () => { @@ -503,8 +530,8 @@ describe('cubic-bezier conversion', () => { [1, 1], ]; - expect(getTimeGivenProgression(...equation, 1.32)).toEqual([]); - expect(getTimeGivenProgression(...equation, -0.32)).toEqual([]); + expect(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], 1.32)).toEqual([]); + expect(getTimeGivenProgression(equation[0], equation[1], equation[2], equation[3], -0.32)).toEqual([]); }); }); }); diff --git a/core/src/utils/keyboard/test/keyboard.spec.ts b/core/src/utils/keyboard/test/keyboard.spec.ts index 52825703e3..424afdd839 100644 --- a/core/src/utils/keyboard/test/keyboard.spec.ts +++ b/core/src/utils/keyboard/test/keyboard.spec.ts @@ -16,8 +16,8 @@ const mockVisualViewport = ( win: Window, visualViewport: any = { width: 320, height: 568 }, layoutViewport = { innerWidth: 320, innerHeight: 568 } -): any => { - win.visualViewport = { +) => { + (win as any).visualViewport = { width: 320, height: 568, offsetTop: 0, @@ -29,26 +29,32 @@ const mockVisualViewport = ( onscroll: undefined, }; - win.visualViewport = Object.assign(win.visualViewport, visualViewport); + (win as any).visualViewport = Object.assign(win.visualViewport!, visualViewport); win = Object.assign(win, layoutViewport); - win.dispatchEvent = jest.fn(); + + const mockDispatchEvent = jest.fn(); + + win.dispatchEvent = mockDispatchEvent; trackViewportChanges(win); - return win; + return { + win, + mockDispatchEvent, + }; }; const mockCapacitor = (win: Window) => { - win.Capacitor = { + (win as any).Capacitor = { isPluginAvailable: () => false, }; }; const resizeVisualViewport = (win: Window, visualViewport: any = {}) => { - win.visualViewport = Object.assign(win.visualViewport, visualViewport); + (win as any).visualViewport = Object.assign((win as any).visualViewport, visualViewport); - if (win.visualViewport.onresize) { - win.visualViewport.onresize(); + if (win.visualViewport!.onresize) { + win.visualViewport!.onresize({} as any); } else { trackViewportChanges(win); } @@ -87,62 +93,64 @@ describe('Keyboard Assist Tests', () => { describe('setKeyboardOpen()', () => { it('should dispatch the keyboard open event on the window', () => { - window.dispatchEvent = jest.fn(); + const mockDispatchEvent = jest.fn(); + window.dispatchEvent = mockDispatchEvent; setKeyboardOpen(window); - expect(window.dispatchEvent.mock.calls.length).toEqual(1); - expect(window.dispatchEvent.mock.calls[0][0].type).toEqual(KEYBOARD_DID_OPEN); + expect(mockDispatchEvent.mock.calls.length).toEqual(1); + expect(mockDispatchEvent.mock.calls[0][0].type).toEqual(KEYBOARD_DID_OPEN); }); }); describe('setKeyboardClose()', () => { it('should dispatch the keyboard close event on the window', () => { - window.dispatchEvent = jest.fn(); + const mockDispatchEvent = jest.fn(); + window.dispatchEvent = mockDispatchEvent; setKeyboardClose(window); - expect(window.dispatchEvent.mock.calls.length).toEqual(1); - expect(window.dispatchEvent.mock.calls[0][0].type).toEqual(KEYBOARD_DID_CLOSE); + expect(mockDispatchEvent.mock.calls.length).toEqual(1); + expect(mockDispatchEvent.mock.calls[0][0].type).toEqual(KEYBOARD_DID_CLOSE); }); }); describe('keyboardDidOpen()', () => { beforeEach(() => { - resetKeyboardAssist(window); + resetKeyboardAssist(); mockVisualViewport(window); }); it('should return true when visual viewport height < layout viewport height and meets or exceeds the keyboard threshold', () => { resizeVisualViewport(window, { height: 200 }); - expect(keyboardDidOpen(window)).toEqual(true); + expect(keyboardDidOpen()).toEqual(true); }); it('should return true if the layout and visual viewports resize', () => { resizeLayoutViewport(window, { width: 320, height: 300 }); resizeVisualViewport(window, { width: 320, height: 300 }); - expect(keyboardDidOpen(window)).toEqual(true); + expect(keyboardDidOpen()).toEqual(true); }); it('should return false when visual viewport height < layout viewport heigh but does not meet the keyboard threshold', () => { resizeVisualViewport(window, { height: 500 }); - expect(keyboardDidOpen(window)).toEqual(false); + expect(keyboardDidOpen()).toEqual(false); }); it('should return false on orientation change', () => { resizeVisualViewport(window, { width: 320, height: 250 }); resizeVisualViewport(window, { width: 250, height: 320 }); - expect(keyboardDidOpen(window)).toEqual(false); + expect(keyboardDidOpen()).toEqual(false); }); it('should return false when both the visual and layout viewports change', () => { - resizeVisualViewport(window, { width: 250, height: 320 }, { innerWidth: 250, innerHeight: 320 }); + resizeVisualViewport(window, { width: 250, height: 320 }); - expect(keyboardDidOpen(window)).toEqual(false); + expect(keyboardDidOpen()).toEqual(false); }); it('should return true when the keyboard shows even if the user is zoomed in', () => { @@ -152,13 +160,13 @@ describe('Keyboard Assist Tests', () => { // User taps input and keyboard appears resizeVisualViewport(window, { width: 160, height: 184, scale: 2 }); - expect(keyboardDidOpen(window)).toEqual(true); + expect(keyboardDidOpen()).toEqual(true); }); }); describe('keyboardDidClose()', () => { beforeEach(() => { - resetKeyboardAssist(window); + resetKeyboardAssist(); mockVisualViewport(window); }); @@ -222,54 +230,66 @@ describe('Keyboard Assist Tests', () => { }); describe('Keyboard Assist Integration', () => { + let mockDispatchEvent: jest.Mock; + beforeEach(() => { - resetKeyboardAssist(window); - mockVisualViewport(window); + resetKeyboardAssist(); + mockDispatchEvent = mockVisualViewport(window).mockDispatchEvent; startKeyboardAssist(window); }); + afterEach(() => { + mockDispatchEvent.mockReset(); + }); + it('should properly set the keyboard to be open', () => { resizeVisualViewport(window, { width: 320, height: 350 }); - expect(window.dispatchEvent.mock.calls.length).toEqual(1); - expect(window.dispatchEvent.mock.calls[0][0].type).toEqual(KEYBOARD_DID_OPEN); + expect(mockDispatchEvent.mock.calls.length).toEqual(1); + expect(mockDispatchEvent.mock.calls[0][0].type).toEqual(KEYBOARD_DID_OPEN); }); it('should properly set the keyboard to be closed', () => { resizeVisualViewport(window, { width: 320, height: 350 }); resizeVisualViewport(window, { width: 320, height: 568 }); - expect(window.dispatchEvent.mock.calls.length).toEqual(2); - expect(window.dispatchEvent.mock.calls[1][0].type).toEqual(KEYBOARD_DID_CLOSE); + expect(mockDispatchEvent.mock.calls.length).toEqual(2); + expect(mockDispatchEvent.mock.calls[1][0].type).toEqual(KEYBOARD_DID_CLOSE); }); it('should properly set the keyboard to be resized', () => { resizeVisualViewport(window, { width: 320, height: 350 }); resizeVisualViewport(window, { width: 320, height: 360 }); - expect(window.dispatchEvent.mock.calls.length).toEqual(2); - expect(window.dispatchEvent.mock.calls[0][0].type).toEqual(KEYBOARD_DID_OPEN); - expect(window.dispatchEvent.mock.calls[1][0].type).toEqual(KEYBOARD_DID_OPEN); + expect(mockDispatchEvent.mock.calls.length).toEqual(2); + expect(mockDispatchEvent.mock.calls[0][0].type).toEqual(KEYBOARD_DID_OPEN); + expect(mockDispatchEvent.mock.calls[1][0].type).toEqual(KEYBOARD_DID_OPEN); }); it('should not set keyboard open on orientation change', () => { resizeVisualViewport(window, { width: 568, height: 320 }); - expect(window.dispatchEvent.mock.calls.length).toEqual(0); + expect(mockDispatchEvent.mock.calls.length).toEqual(0); }); }); describe('Keyboard Assist with Capacitor', () => { + let mockDispatchEvent: jest.Mock; + beforeEach(() => { - resetKeyboardAssist(window); + resetKeyboardAssist(); mockCapacitor(window); - mockVisualViewport(window); + mockDispatchEvent = mockVisualViewport(window).mockDispatchEvent; startKeyboardAssist(window); }); + afterEach(() => { + mockDispatchEvent.mockReset(); + }); + it('should attach visual viewport listeners when Capacitor is available but the Keyboard plugin is not', () => { resizeVisualViewport(window, { width: 320, height: 350 }); - expect(window.dispatchEvent.mock.calls.length).toEqual(1); - expect(window.dispatchEvent.mock.calls[0][0].type).toEqual(KEYBOARD_DID_OPEN); + expect(mockDispatchEvent.mock.calls.length).toEqual(1); + expect(mockDispatchEvent.mock.calls[0][0].type).toEqual(KEYBOARD_DID_OPEN); }); }); diff --git a/core/src/utils/sanitization/test/sanitization.spec.ts b/core/src/utils/sanitization/test/sanitization.spec.ts index 15aca07c8f..295dd30627 100644 --- a/core/src/utils/sanitization/test/sanitization.spec.ts +++ b/core/src/utils/sanitization/test/sanitization.spec.ts @@ -65,7 +65,7 @@ describe('sanitizeDOMString', () => { }); const enableSanitizer = (enable = true) => { - window.Ionic = {}; - window.Ionic.config = {}; - window.Ionic.config.sanitizerEnabled = enable; + (window as any).Ionic = {}; + (window as any).Ionic.config = {}; + (window as any).Ionic.config.sanitizerEnabled = enable; }; diff --git a/core/src/utils/test/aria.spec.ts b/core/src/utils/test/aria.spec.ts index e04706e994..66178021ee 100644 --- a/core/src/utils/test/aria.spec.ts +++ b/core/src/utils/test/aria.spec.ts @@ -1,8 +1,8 @@ import { newSpecPage } from '@stencil/core/testing'; -import { Item } from '../../components/item/item.tsx'; -import { Label } from '../../components/label/label.tsx'; -import { Toggle } from '../../components/toggle/toggle.tsx'; +import { Item } from '../../components/item/item'; +import { Label } from '../../components/label/label'; +import { Toggle } from '../../components/toggle/toggle'; import { getAriaLabel } from '../helpers'; describe('getAriaLabel()', () => { @@ -17,7 +17,7 @@ describe('getAriaLabel()', () => { `, }); - const toggle = page.body.querySelector('ion-toggle'); + const toggle = page.body.querySelector('ion-toggle')!; const { label, labelId, labelText } = getAriaLabel(toggle, 'ion-tg-0'); @@ -35,7 +35,7 @@ describe('getAriaLabel()', () => { `, }); - const toggle = page.body.querySelector('ion-toggle'); + const toggle = page.body.querySelector('ion-toggle')!; const { label, labelId, labelText } = getAriaLabel(toggle, 'ion-tg-0'); @@ -53,7 +53,7 @@ describe('getAriaLabel()', () => { `, }); - const toggle = page.body.querySelector('ion-toggle'); + const toggle = page.body.querySelector('ion-toggle')!; const { labelId, labelText } = getAriaLabel(toggle, 'ion-tg-0'); @@ -70,7 +70,7 @@ describe('getAriaLabel()', () => { `, }); - const toggle = page.body.querySelector('ion-toggle'); + const toggle = page.body.querySelector('ion-toggle')!; const { labelId, labelText } = getAriaLabel(toggle, 'ion-tg-0'); @@ -87,7 +87,7 @@ describe('getAriaLabel()', () => { `, }); - const toggle = page.body.querySelector('ion-toggle'); + const toggle = page.body.querySelector('ion-toggle')!; const { labelId, labelText } = getAriaLabel(toggle, 'ion-tg-0'); diff --git a/core/src/utils/test/hardware-back-button.spec.ts b/core/src/utils/test/hardware-back-button.spec.ts index b60c48a08d..a4e5bbb7c4 100644 --- a/core/src/utils/test/hardware-back-button.spec.ts +++ b/core/src/utils/test/hardware-back-button.spec.ts @@ -1,3 +1,4 @@ +import type { BackButtonEvent } from '../../../src/interface'; import { startHardwareBackButton } from '../hardware-back-button'; describe('Hardware Back Button', () => { @@ -5,7 +6,7 @@ describe('Hardware Back Button', () => { it('should call handler', () => { const cbSpy = jest.fn(); document.addEventListener('ionBackButton', (ev) => { - ev.detail.register(0, cbSpy); + (ev as BackButtonEvent).detail.register(0, cbSpy); }); dispatchBackButtonEvent(); @@ -16,8 +17,8 @@ describe('Hardware Back Button', () => { const cbSpy = jest.fn(); const cbSpyTwo = jest.fn(); document.addEventListener('ionBackButton', (ev) => { - ev.detail.register(100, cbSpy); - ev.detail.register(99, cbSpyTwo); + (ev as BackButtonEvent).detail.register(100, cbSpy); + (ev as BackButtonEvent).detail.register(99, cbSpyTwo); }); dispatchBackButtonEvent(); @@ -29,8 +30,8 @@ describe('Hardware Back Button', () => { const cbSpy = jest.fn(); const cbSpyTwo = jest.fn(); document.addEventListener('ionBackButton', (ev) => { - ev.detail.register(100, cbSpy); - ev.detail.register(100, cbSpyTwo); + (ev as BackButtonEvent).detail.register(100, cbSpy); + (ev as BackButtonEvent).detail.register(100, cbSpyTwo); }); dispatchBackButtonEvent(); @@ -39,13 +40,13 @@ describe('Hardware Back Button', () => { }); it('should call multiple callbacks', () => { - const cbSpy = (processNextHandler) => { + const cbSpy = (processNextHandler: () => void) => { processNextHandler(); }; const cbSpyTwo = jest.fn(); document.addEventListener('ionBackButton', (ev) => { - ev.detail.register(100, cbSpy); - ev.detail.register(99, cbSpyTwo); + (ev as BackButtonEvent).detail.register(100, cbSpy); + (ev as BackButtonEvent).detail.register(99, cbSpyTwo); }); dispatchBackButtonEvent(); diff --git a/core/src/utils/test/overlays/overlays.spec.ts b/core/src/utils/test/overlays/overlays.spec.ts index 3fecba0edd..d5b1442e3b 100644 --- a/core/src/utils/test/overlays/overlays.spec.ts +++ b/core/src/utils/test/overlays/overlays.spec.ts @@ -1,9 +1,8 @@ import { newSpecPage } from '@stencil/core/testing'; +import { Modal } from '../../../components/modal/modal'; import { Nav } from '../../../components/nav/nav'; import { RouterOutlet } from '../../../components/router-outlet/router-outlet'; -import { Modal } from '../../../components/modal/modal'; - import { setRootAriaHidden } from '../../overlays'; describe('setRootAriaHidden()', () => { @@ -15,7 +14,7 @@ describe('setRootAriaHidden()', () => { `, }); - const routerOutlet = page.body.querySelector('ion-router-outlet'); + const routerOutlet = page.body.querySelector('ion-router-outlet')!; expect(routerOutlet.hasAttribute('aria-hidden')).toEqual(false); @@ -34,7 +33,7 @@ describe('setRootAriaHidden()', () => { `, }); - const nav = page.body.querySelector('ion-nav'); + const nav = page.body.querySelector('ion-nav')!; expect(nav.hasAttribute('aria-hidden')).toEqual(false); @@ -54,8 +53,8 @@ describe('setRootAriaHidden()', () => { `, }); - const containerRoot = page.body.querySelector('#ion-view-container-root'); - const notContainerRoot = page.body.querySelector('#not-container-root'); + const containerRoot = page.body.querySelector('#ion-view-container-root')!; + const notContainerRoot = page.body.querySelector('#not-container-root')!; expect(containerRoot.hasAttribute('aria-hidden')).toEqual(false); expect(notContainerRoot.hasAttribute('aria-hidden')).toEqual(false); @@ -90,8 +89,8 @@ describe('setRootAriaHidden()', () => { `, }); - const routerOutlet = page.body.querySelector('ion-router-outlet'); - const modal = page.body.querySelector('ion-modal'); + const routerOutlet = page.body.querySelector('ion-router-outlet')!; + const modal = page.body.querySelector('ion-modal')!; await modal.present(); @@ -109,9 +108,9 @@ describe('setRootAriaHidden()', () => { `, }); - const routerOutlet = page.body.querySelector('ion-router-outlet'); - const modalOne = page.body.querySelector('ion-modal#one'); - const modalTwo = page.body.querySelector('ion-modal#two'); + const routerOutlet = page.body.querySelector('ion-router-outlet')!; + const modalOne = page.body.querySelector('ion-modal#one')!; + const modalTwo = page.body.querySelector('ion-modal#two')!; await modalOne.present(); diff --git a/core/src/utils/test/ready.spec.ts b/core/src/utils/test/ready.spec.ts index d5630ebf4a..fe1cfc3db5 100644 --- a/core/src/utils/test/ready.spec.ts +++ b/core/src/utils/test/ready.spec.ts @@ -12,7 +12,7 @@ describe('componentOnReady()', () => { ); const component = document.createElement('hello-world'); - componentOnReady(component, (el) => { + componentOnReady(component, (el: HTMLElement) => { expect(el).toBe(component); done(); }); @@ -39,7 +39,7 @@ describe('componentOnReady()', () => { ); const component = document.createElement('hello-world'); - componentOnReady(component, (el) => { + componentOnReady(component, (el: HTMLElement) => { expect(el).toBe(component); expect(cb).toHaveBeenCalledTimes(1); done(); diff --git a/core/tsconfig.json b/core/tsconfig.json index 862a6b84af..1dabfc83b5 100644 --- a/core/tsconfig.json +++ b/core/tsconfig.json @@ -37,9 +37,6 @@ "src", ], "exclude": [ - "node_modules", - "**/test/**/*.spec.ts", - "**/test/**/*.spec.tsx", - "**/test/**/e2e.ts" + "node_modules" ] }