From 6c8b5059d569a158a4d0e0b8edc965af1c62dfd6 Mon Sep 17 00:00:00 2001 From: glen2223 <33450392+glenn2223@users.noreply.github.com> Date: Fri, 11 Oct 2024 00:05:46 +0100 Subject: [PATCH 1/8] Fixed testing, added new tests (+ formatting) ### Updated - `fdir` to `6.4.0` [Changelog][cl:fd] - `sass-embedded` to `1.79.4` [Changelog][cl:fd] - Various dev dependency updates _(nothing user facing)_ ### Other - Fixed broken tests and added added several new tests - Added test badge to README - Code formatting and linting [cl:fd]: https://github.com/thecodrr/fdir/releases [cl:se]: https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md --- .github/workflows/test.yml | 37 + .gitignore | 6 +- .prettierrc | 3 +- .vscode/launch.json | 12 +- .vscode/settings.json | 11 +- .vscodeignore | 3 +- CHANGELOG.md | 11 +- README.md | 6 +- package-lock.json | 1536 ++++++++++++++++++++------------ package.json | 26 +- rollup.config.ts | 25 +- src/Helpers/Autoprefix.test.ts | 69 ++ src/Helpers/Autoprefix.ts | 11 +- src/Helpers/FileHelper.test.ts | 29 + src/Helpers/SassHelper.test.ts | 28 + src/Helpers/SassHelper.ts | 167 ++-- src/VsCode/StatusbarUi.ts | 51 +- src/appModel.ts | 558 +++++++----- src/extension.test.ts | 76 ++ src/test/clean.js | 40 + src/test/extension.test.ts | 72 -- src/test/index.ts | 47 +- src/test/runTest.ts | 9 +- src/test/tsconfig.json | 20 - src/tsconfig.rollup.json | 22 + src/tsconfig.tests.json | 20 + tsconfig.json | 20 +- 27 files changed, 1899 insertions(+), 1016 deletions(-) create mode 100644 .github/workflows/test.yml create mode 100644 src/Helpers/Autoprefix.test.ts create mode 100644 src/Helpers/FileHelper.test.ts create mode 100644 src/Helpers/SassHelper.test.ts create mode 100644 src/extension.test.ts create mode 100644 src/test/clean.js delete mode 100644 src/test/extension.test.ts delete mode 100644 src/test/tsconfig.json create mode 100644 src/tsconfig.rollup.json create mode 100644 src/tsconfig.tests.json diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..189ba3c --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,37 @@ +name: Tests + +on: + pull_request: + branches: + - "**" + +jobs: + build: + strategy: + matrix: + os: [macos-latest, ubuntu-latest, windows-latest] + runs-on: ${{ matrix.os }} + steps: + - name: Install Node.js + uses: actions/setup-node@v4 + with: + node-version: 20.x + + - name: Install the package dependencies + run: npm ci + + - name: Test extension + if: runner.os == 'Linux' + run: xvfb-run -a npm test + + - name: Test extension + if: runner.os != 'Linux' + run: npm test + + - name: Ensure prePUblish script is working + if: runner.os != 'Linux' + run: npm run prePublish + + - name: Ensure prePUblish script is working + if: runner.os == 'Linux' + run: xvfb-run -a npm run prePublish diff --git a/.gitignore b/.gitignore index fe94435..24b7eca 100644 --- a/.gitignore +++ b/.gitignore @@ -7,4 +7,8 @@ Gemfile.lock Gemfile .vscode-test .vscode/*.dict -*.vsix \ No newline at end of file +*.vsix + +#Ignore test output (but not the SASS files) +src/test/sample/* +!src/test/sample/*.scss \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index 55ea2b2..a4e2d23 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,4 +1,5 @@ { "tabWidth": 4, - "useTabs": false + "useTabs": false, + "printWidth": 80 } diff --git a/.vscode/launch.json b/.vscode/launch.json index ac2815b..4764d71 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,9 +12,9 @@ ], "sourceMaps": true, "outFiles": [ - "${workspaceRoot}/out/src/**/*.js" + "${workspaceRoot}/lib/**/*" ], - "preLaunchTask": "pack" + "preLaunchTask": "npm: vscode:prepublish" }, { "name": "Launch Tests", @@ -23,14 +23,14 @@ "runtimeExecutable": "${execPath}", "args": [ "--extensionDevelopmentPath=${workspaceRoot}", - "--extensionTestsPath=${workspaceRoot}/out/test/index", - "./assets/" + "--extensionTestsPath=${workspaceRoot}/out/test", + "${workspaceRoot}/src/test/sample" ], "sourceMaps": true, + "preLaunchTask": "npm: pretest", "outFiles": [ - "${workspaceRoot}/out/test/**/*.js" + "${workspaceRoot}/**/*.{t,j}s" ], - "preLaunchTask": "npm: pretest" } ] } \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json index 54629bf..0bbb063 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,5 +14,14 @@ "[NoFormat]": { "editor.formatOnPaste": false, "editor.formatOnSave": false + }, + "explorer.fileNesting.enabled": true, + "explorer.fileNesting.patterns": { + "*.ts": "${capture}.js, ${capture}.test.ts", + "*.js": "${capture}.js.map, ${capture}.min.js, ${capture}.d.ts", + "*.jsx": "${capture}.js", + "*.tsx": "${capture}.ts", + "tsconfig.json": "tsconfig.*.json", + "package.json": "package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb" } -} +} \ No newline at end of file diff --git a/.vscodeignore b/.vscodeignore index 93fec2d..5e27db6 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -8,8 +8,7 @@ assets/** dist/** images/Screenshot/** node_modules/** -out/announcement/** -out/test/** +out/** src/** **/*.map diff --git a/CHANGELOG.md b/CHANGELOG.md index 49a3264..3df2ccb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,16 +37,22 @@ All notable changes to this project will be documented in this file. ### Changed -- Switched from `sass@1.69.5` to `sass-embedded@1.79.3` - as mentioned above +- Switched from `sass@1.69.5` to `sass-embedded@1.79.4` - as mentioned above ### Updated - `autoprefixer` to `10.4.20` [Changelog][cl:fd] -- `fdir` to `6.3.0` [Changelog][cl:fd] +- `fdir` to `6.4.0` [Changelog][cl:fd] - `picomatch` to `4.0.2` [Changelog][cl:pm] - `postcss` to `8.4.47` [Changelog][cl:pc] - Various dev dependency updates _(nothing user facing)_ +### Other + +- Fixed broken tests and added added several new tests +- Added test badge to README +- Code formatting and linting + ## [6.1.2] - 2023-11-22 [Compare to previous release][comp:6.1.2] @@ -843,3 +849,4 @@ All notable changes to this project will be documented in this file. [cl:pc]: https://github.com/postcss/postcss/blob/main/CHANGELOG.md [cl:pm]: https://github.com/micromatch/picomatch/blob/master/CHANGELOG.md [cl:sa]: https://github.com/sass/dart-sass/blob/main/CHANGELOG.md +[cl:se]: https://github.com/sass/embedded-host-node/blob/main/CHANGELOG.md diff --git a/README.md b/README.md index 8edce6e..25d21ed 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,10 @@ # Live Sass Compiler -[![VSCode Marketplace Badge](https://img.shields.io/vscode-marketplace/v/glenn2223.live-sass.svg?label=VSCode%20Marketplace&style=flat-square)](https://marketplace.visualstudio.com/items?itemName=glenn2223.live-sass) [![Total Install](https://img.shields.io/vscode-marketplace/d/glenn2223.live-sass.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=glenn2223.live-sass) [![Average Rating Badge](https://img.shields.io/vscode-marketplace/r/glenn2223.live-sass.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=glenn2223.live-sass) [![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/glenn2223/vscode-live-sass-compiler/) +[![Icon for GitHub actions workflow status](https://img.shields.io/github/actions/workflow/status/glenn2223/vscode-live-sass-compiler/test.yml?style=for-the-badge&label=Test)](https://github.com/glenn2223/vscode-live-sass-compiler/actions/workflows/test.yml) +[![VSCode Marketplace Badge](https://img.shields.io/vscode-marketplace/v/glenn2223.live-sass.svg?label=VSCode%20Marketplace&style=flat-square)](https://marketplace.visualstudio.com/items?itemName=glenn2223.live-sass) +[![Total Install](https://img.shields.io/vscode-marketplace/d/glenn2223.live-sass.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=glenn2223.live-sass) +[![Average Rating Badge](https://img.shields.io/vscode-marketplace/r/glenn2223.live-sass.svg?style=flat-square)](https://marketplace.visualstudio.com/items?itemName=glenn2223.live-sass) +[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg?style=flat-square)](https://github.com/glenn2223/vscode-live-sass-compiler/) [](https://youtu.be/9J__JAgQbS0) diff --git a/package-lock.json b/package-lock.json index f6d94ac..28bbade 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,38 +10,45 @@ "license": "MIT", "dependencies": { "autoprefixer": "^10.4.20", - "fdir": "^6.3.0", + "fdir": "^6.4.0", "picomatch": "^4.0.2", "postcss": "^8.4.47", - "sass-embedded": "^1.79.3" + "sass-embedded": "^1.79.4" }, "devDependencies": { - "@rollup/plugin-commonjs": "^26.0.1", + "@rollup/plugin-commonjs": "^28.0.0", "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-node-resolve": "^15.3.0", "@rollup/plugin-terser": "^0.4.4", - "@rollup/plugin-typescript": "^11.1.6", - "@types/mocha": "^10.0.8", + "@rollup/plugin-typescript": "^12.1.0", + "@types/mocha": "^10.0.9", "@types/node": "^17.0.45", "@types/picomatch": "^3.0.1", "@types/vscode": "1.74", "@typescript-eslint/eslint-plugin": "^7.18.0", "@typescript-eslint/parser": "^7.18.0", + "@vscode/test-cli": "^0.0.10", + "@vscode/test-electron": "^2.4.1", "eslint": "^8.57.1", "mocha": "^10.7.3", - "rollup": "^4.22.4", + "rollup": "^4.24.0", "tslib": "^2.7.0", - "typescript": "^5.6.2", - "vscode-test": "^1.6.1" + "typescript": "^5.6.3" }, "engines": { "vscode": "^1.74.0" } }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, "node_modules/@bufbuild/protobuf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.1.0.tgz", - "integrity": "sha512-+2Mx67Y3skJ4NCD/qNSdBJNWtu6x6Qr53jeNg+QcwiL6mt0wK+3jwHH2x1p7xaYH6Ve2JKOVn0OxU35WsmqI9A==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.2.0.tgz", + "integrity": "sha512-+imAQkHf7U/Rwvu0wk1XWgsP3WnpCWmK7B48f0XqSNzgk64+grljTKC7pnO/xBiEMUziF7vKRfbBnOQhg126qQ==" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -222,6 +229,15 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", @@ -326,17 +342,18 @@ } }, "node_modules/@rollup/plugin-commonjs": { - "version": "26.0.1", - "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-26.0.1.tgz", - "integrity": "sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==", + "version": "28.0.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.0.tgz", + "integrity": "sha512-BJcu+a+Mpq476DMXG+hevgPSl56bkUoi88dKT8t3RyUp8kGuOh+2bU8Gs7zXDlu+fyZggnJ+iOBGrb/O1SorYg==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", - "glob": "^10.4.1", + "fdir": "^6.1.1", "is-reference": "1.2.1", - "magic-string": "^0.30.3" + "magic-string": "^0.30.3", + "picomatch": "^2.3.1" }, "engines": { "node": ">=16.0.0 || 14 >= 14.17" @@ -350,6 +367,18 @@ } } }, + "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@rollup/plugin-json": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", @@ -371,15 +400,14 @@ } }, "node_modules/@rollup/plugin-node-resolve": { - "version": "15.2.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.2.3.tgz", - "integrity": "sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==", + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.0.tgz", + "integrity": "sha512-9eO5McEICxMzJpDW9OnMYSv4Sta3hmt7VtBFz5zR9273suNOydOyq/FrGeGy+KsTRFm8w0SLVhzig2ILFT63Ag==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", - "is-builtin-module": "^3.2.1", "is-module": "^1.0.0", "resolve": "^1.22.1" }, @@ -418,9 +446,9 @@ } }, "node_modules/@rollup/plugin-typescript": { - "version": "11.1.6", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.6.tgz", - "integrity": "sha512-R92yOmIACgYdJ7dJ97p4K69I8gg6IEHt8M7dUBxN3W6nrO8uUxX5ixl0yU/N3aZTi8WhPuICvOHXQvF6FaykAA==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.0.tgz", + "integrity": "sha512-Kzs8KGJofe7cfTRODsnG1jNGxSvU8gVoNNd7Z/QaY25AYwe2LSSUpx/kPxqF38NYkpR8de3m51r9uwJpDlz6dg==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.1.0", @@ -444,9 +472,9 @@ } }, "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.2.tgz", + "integrity": "sha512-/FIdS3PyZ39bjZlwqFnWqCOVnW7o963LtKMwQOD0NhQqw22gSr2YY1afu3FxRip4ZCZNsD5jq6Aaz6QV3D/Njw==", "dev": true, "dependencies": { "@types/estree": "^1.0.0", @@ -478,9 +506,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.24.0.tgz", + "integrity": "sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==", "cpu": [ "arm" ], @@ -491,9 +519,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.24.0.tgz", + "integrity": "sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==", "cpu": [ "arm64" ], @@ -504,9 +532,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.24.0.tgz", + "integrity": "sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==", "cpu": [ "arm64" ], @@ -517,9 +545,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.24.0.tgz", + "integrity": "sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==", "cpu": [ "x64" ], @@ -530,9 +558,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.24.0.tgz", + "integrity": "sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==", "cpu": [ "arm" ], @@ -543,9 +571,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.24.0.tgz", + "integrity": "sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==", "cpu": [ "arm" ], @@ -556,9 +584,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.24.0.tgz", + "integrity": "sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==", "cpu": [ "arm64" ], @@ -569,9 +597,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.24.0.tgz", + "integrity": "sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==", "cpu": [ "arm64" ], @@ -582,9 +610,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.24.0.tgz", + "integrity": "sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==", "cpu": [ "ppc64" ], @@ -595,9 +623,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.24.0.tgz", + "integrity": "sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==", "cpu": [ "riscv64" ], @@ -608,9 +636,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.24.0.tgz", + "integrity": "sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==", "cpu": [ "s390x" ], @@ -621,9 +649,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.24.0.tgz", + "integrity": "sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==", "cpu": [ "x64" ], @@ -634,9 +662,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.24.0.tgz", + "integrity": "sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==", "cpu": [ "x64" ], @@ -647,9 +675,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.24.0.tgz", + "integrity": "sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==", "cpu": [ "arm64" ], @@ -660,9 +688,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.24.0.tgz", + "integrity": "sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==", "cpu": [ "ia32" ], @@ -673,9 +701,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.24.0.tgz", + "integrity": "sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==", "cpu": [ "x64" ], @@ -685,25 +713,22 @@ "win32" ] }, - "node_modules/@tootallnate/once": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", - "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/@types/estree": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", + "dev": true + }, "node_modules/@types/mocha": { - "version": "10.0.8", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.8.tgz", - "integrity": "sha512-HfMcUmy9hTMJh66VNcmeC9iVErIZJli2bszuXc6julh5YGuRb/W5OnkHjwLNYdFlMis0sY3If5SEAp+PktdJjw==", + "version": "10.0.9", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.9.tgz", + "integrity": "sha512-sicdRoWtYevwxjOHNMPTl3vSfJM6oyW8o1wXeI7uww6b6xHg8eBznQDNSGBCDJmsE8UMxP05JgZRtsKbTqt//Q==", "dev": true }, "node_modules/@types/node": { @@ -921,6 +946,45 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, + "node_modules/@vscode/test-cli": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/@vscode/test-cli/-/test-cli-0.0.10.tgz", + "integrity": "sha512-B0mMH4ia+MOOtwNiLi79XhA+MLmUItIC8FckEuKrVAVriIuSWjt7vv4+bF8qVFiNFe4QRfzPaIZk39FZGWEwHA==", + "dev": true, + "dependencies": { + "@types/mocha": "^10.0.2", + "c8": "^9.1.0", + "chokidar": "^3.5.3", + "enhanced-resolve": "^5.15.0", + "glob": "^10.3.10", + "minimatch": "^9.0.3", + "mocha": "^10.2.0", + "supports-color": "^9.4.0", + "yargs": "^17.7.2" + }, + "bin": { + "vscode-test": "out/bin.mjs" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@vscode/test-electron": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@vscode/test-electron/-/test-electron-2.4.1.tgz", + "integrity": "sha512-Gc6EdaLANdktQ1t+zozoBVRynfIsMKMc94Svu1QreOBC8y76x4tvaK32TljrLi1LI2+PK58sDVbL7ALdqf3VRQ==", + "dev": true, + "dependencies": { + "http-proxy-agent": "^7.0.2", + "https-proxy-agent": "^7.0.5", + "jszip": "^3.10.1", + "ora": "^7.0.1", + "semver": "^7.6.2" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/acorn": { "version": "8.12.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", @@ -943,15 +1007,15 @@ } }, "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "dependencies": { - "debug": "4" + "debug": "^4.3.4" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 14" } }, "node_modules/ajv": { @@ -1085,27 +1149,25 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, - "node_modules/binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==", + "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, - "dependencies": { - "buffers": "~0.1.1", - "chainsaw": "~0.1.0" - }, - "engines": { - "node": "*" - } + "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/binary-extensions": { "version": "2.3.0", @@ -1119,11 +1181,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bluebird": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.4.7.tgz", - "integrity": "sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==", - "dev": true + "node_modules/bl": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", + "dev": true, + "dependencies": { + "buffer": "^6.0.3", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } }, "node_modules/brace-expansion": { "version": "2.0.1", @@ -1153,9 +1234,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.23.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", - "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", + "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", "funding": [ { "type": "opencollective", @@ -1171,8 +1252,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001646", - "electron-to-chromium": "^1.5.4", + "caniuse-lite": "^1.0.30001663", + "electron-to-chromium": "^1.5.28", "node-releases": "^2.0.18", "update-browserslist-db": "^1.1.0" }, @@ -1183,6 +1264,30 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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.2.1" + } + }, "node_modules/buffer-builder": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", @@ -1194,34 +1299,29 @@ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, - "node_modules/buffer-indexof-polyfill": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/buffer-indexof-polyfill/-/buffer-indexof-polyfill-1.0.2.tgz", - "integrity": "sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "dev": true, - "engines": { - "node": ">=0.2.0" - } - }, - "node_modules/builtin-modules": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", - "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "node_modules/c8": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/c8/-/c8-9.1.0.tgz", + "integrity": "sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg==", "dev": true, - "engines": { - "node": ">=6" + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@istanbuljs/schema": "^0.1.3", + "find-up": "^5.0.0", + "foreground-child": "^3.1.1", + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", + "test-exclude": "^6.0.0", + "v8-to-istanbul": "^9.0.0", + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "bin": { + "c8": "bin/c8.js" + }, + "engines": { + "node": ">=14.14.0" } }, "node_modules/callsites": { @@ -1246,9 +1346,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001662", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001662.tgz", - "integrity": "sha512-sgMUVwLmGseH8ZIrm1d51UbrhqMCH3jvS7gF/M6byuHOnKyLOBL7W8yz5V02OHwgLGA36o/AFhWzzh4uc5aqTA==", + "version": "1.0.30001667", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001667.tgz", + "integrity": "sha512-7LTwJjcRkzKFmtqGsibMeuXmvFDfZq/nzIjnmgCGzKKRVzjD72selLDK1oPF/Oxzmt4fNcPvTDvGqSDG4tCALw==", "funding": [ { "type": "opencollective", @@ -1264,18 +1364,6 @@ } ] }, - "node_modules/chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==", - "dev": true, - "dependencies": { - "traverse": ">=0.3.0 <0.4" - }, - "engines": { - "node": "*" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1292,6 +1380,18 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -1316,27 +1416,45 @@ "fsevents": "~2.3.2" } }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "is-glob": "^4.0.1" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">= 6" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" } }, "node_modules/cliui/node_modules/emoji-regex": { @@ -1417,6 +1535,12 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -1514,15 +1638,6 @@ "node": ">=6.0.0" } }, - "node_modules/duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -1530,9 +1645,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.5.27", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.27.tgz", - "integrity": "sha512-o37j1vZqCoEgBuWWXLHQgTN/KDKe7zwpiY5CPeq2RvUqOyJw9xnrULzZAEVQ5p4h+zjMk7hgtOoPdnLxr7m/jw==" + "version": "1.5.36", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz", + "integrity": "sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -1540,6 +1655,19 @@ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", "dev": true }, + "node_modules/enhanced-resolve": { + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -1564,6 +1692,7 @@ "version": "8.57.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", @@ -1653,6 +1782,18 @@ "concat-map": "0.0.1" } }, + "node_modules/eslint/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1752,18 +1893,6 @@ "node": ">=8.6.0" } }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -1786,9 +1915,9 @@ } }, "node_modules/fdir": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.3.0.tgz", - "integrity": "sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.0.tgz", + "integrity": "sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==", "peerDependencies": { "picomatch": "^3 || ^4" }, @@ -1915,126 +2044,54 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/fstream": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz", - "integrity": "sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==", - "deprecated": "This package is no longer supported.", + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - }, - "engines": { - "node": ">=0.6" + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fstream/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "engines": { + "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/fstream/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fstream/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/fstream/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "deprecated": "Rimraf versions prior to v4 are no longer supported", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "dev": true, - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "bin": { + "glob": "dist/esm/bin.mjs" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { - "is-glob": "^4.0.3" + "is-glob": "^4.0.1" }, "engines": { - "node": ">=10.13.0" + "node": ">= 6" } }, "node_modules/globals": { @@ -2113,33 +2170,58 @@ "he": "bin/he" } }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, "node_modules/http-proxy-agent": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", - "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" + "agent-base": "^7.1.0", + "debug": "^4.3.4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", + "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", "dev": true, "dependencies": { - "agent-base": "6", + "agent-base": "^7.0.2", "debug": "4" }, "engines": { - "node": ">= 6" + "node": ">= 14" } }, + "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.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -2149,6 +2231,12 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, "node_modules/immutable": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", @@ -2208,21 +2296,6 @@ "node": ">=8" } }, - "node_modules/is-builtin-module": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz", - "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==", - "dev": true, - "dependencies": { - "builtin-modules": "^3.3.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-core-module": { "version": "2.15.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", @@ -2268,6 +2341,18 @@ "node": ">=0.10.0" } }, + "node_modules/is-interactive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", @@ -2334,6 +2419,54 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", + "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jackspeak": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", @@ -2379,6 +2512,18 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/jszip": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.10.1.tgz", + "integrity": "sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==", + "dev": true, + "dependencies": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "setimmediate": "^1.0.5" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -2401,11 +2546,14 @@ "node": ">= 0.8.0" } }, - "node_modules/listenercount": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", - "integrity": "sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==", - "dev": true + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dev": true, + "dependencies": { + "immediate": "~3.0.5" + } }, "node_modules/locate-path": { "version": "6.0.0", @@ -2459,6 +2607,21 @@ "@jridgewell/sourcemap-codec": "^1.5.0" } }, + "node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -2493,6 +2656,15 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/minimatch": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", @@ -2508,15 +2680,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -2526,18 +2689,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "dev": true, - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, "node_modules/mocha": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.7.3.tgz", @@ -2573,6 +2724,23 @@ "node": ">= 14.0.0" } }, + "node_modules/mocha/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/mocha/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, "node_modules/mocha/node_modules/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", @@ -2605,6 +2773,20 @@ "node": ">=10" } }, + "node_modules/mocha/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/mocha/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -2620,6 +2802,50 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/mocha/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/mocha/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -2680,6 +2906,21 @@ "wrappy": "1" } }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -2697,6 +2938,119 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-7.0.1.tgz", + "integrity": "sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==", + "dev": true, + "dependencies": { + "chalk": "^5.3.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.9.0", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.3.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "string-width": "^6.1.0", + "strip-ansi": "^7.1.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/emoji-regex": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", + "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", + "dev": true + }, + "node_modules/ora/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/log-symbols": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/string-width": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-6.1.0.tgz", + "integrity": "sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==", + "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^10.2.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -2728,9 +3082,15 @@ } }, "node_modules/package-json-from-dist": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", - "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, "node_modules/parent-module": { @@ -2919,12 +3279,6 @@ "util-deprecate": "~1.0.1" } }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -2984,6 +3338,28 @@ "node": ">=4" } }, + "node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", @@ -3054,12 +3430,12 @@ } }, "node_modules/rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", + "version": "4.24.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.24.0.tgz", + "integrity": "sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==", "dev": true, "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -3069,31 +3445,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", + "@rollup/rollup-android-arm-eabi": "4.24.0", + "@rollup/rollup-android-arm64": "4.24.0", + "@rollup/rollup-darwin-arm64": "4.24.0", + "@rollup/rollup-darwin-x64": "4.24.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.24.0", + "@rollup/rollup-linux-arm-musleabihf": "4.24.0", + "@rollup/rollup-linux-arm64-gnu": "4.24.0", + "@rollup/rollup-linux-arm64-musl": "4.24.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.24.0", + "@rollup/rollup-linux-riscv64-gnu": "4.24.0", + "@rollup/rollup-linux-s390x-gnu": "4.24.0", + "@rollup/rollup-linux-x64-gnu": "4.24.0", + "@rollup/rollup-linux-x64-musl": "4.24.0", + "@rollup/rollup-win32-arm64-msvc": "4.24.0", + "@rollup/rollup-win32-ia32-msvc": "4.24.0", + "@rollup/rollup-win32-x64-msvc": "4.24.0", "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -3126,29 +3496,15 @@ } }, "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/sass-embedded": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.3.tgz", - "integrity": "sha512-zUve2qCn6uSOMZnZazLzrDWq//OQWFle5G45vJjv3B/ADIA3TXVgqHqN3u7D2vGajOGREz0HN5nhliSoKmQqZA==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.79.4.tgz", + "integrity": "sha512-3AATrtStMgxYjkit02/Ix8vx/P7qderYG6DHjmehfk5jiw53OaWVScmcGJSwp/d77kAkxDQ+Y0r+79VynGmrkw==", "dependencies": { "@bufbuild/protobuf": "^2.0.0", "buffer-builder": "^0.2.0", @@ -3165,32 +3521,32 @@ "node": ">=16.0.0" }, "optionalDependencies": { - "sass-embedded-android-arm": "1.79.3", - "sass-embedded-android-arm64": "1.79.3", - "sass-embedded-android-ia32": "1.79.3", - "sass-embedded-android-riscv64": "1.79.3", - "sass-embedded-android-x64": "1.79.3", - "sass-embedded-darwin-arm64": "1.79.3", - "sass-embedded-darwin-x64": "1.79.3", - "sass-embedded-linux-arm": "1.79.3", - "sass-embedded-linux-arm64": "1.79.3", - "sass-embedded-linux-ia32": "1.79.3", - "sass-embedded-linux-musl-arm": "1.79.3", - "sass-embedded-linux-musl-arm64": "1.79.3", - "sass-embedded-linux-musl-ia32": "1.79.3", - "sass-embedded-linux-musl-riscv64": "1.79.3", - "sass-embedded-linux-musl-x64": "1.79.3", - "sass-embedded-linux-riscv64": "1.79.3", - "sass-embedded-linux-x64": "1.79.3", - "sass-embedded-win32-arm64": "1.79.3", - "sass-embedded-win32-ia32": "1.79.3", - "sass-embedded-win32-x64": "1.79.3" + "sass-embedded-android-arm": "1.79.4", + "sass-embedded-android-arm64": "1.79.4", + "sass-embedded-android-ia32": "1.79.4", + "sass-embedded-android-riscv64": "1.79.4", + "sass-embedded-android-x64": "1.79.4", + "sass-embedded-darwin-arm64": "1.79.4", + "sass-embedded-darwin-x64": "1.79.4", + "sass-embedded-linux-arm": "1.79.4", + "sass-embedded-linux-arm64": "1.79.4", + "sass-embedded-linux-ia32": "1.79.4", + "sass-embedded-linux-musl-arm": "1.79.4", + "sass-embedded-linux-musl-arm64": "1.79.4", + "sass-embedded-linux-musl-ia32": "1.79.4", + "sass-embedded-linux-musl-riscv64": "1.79.4", + "sass-embedded-linux-musl-x64": "1.79.4", + "sass-embedded-linux-riscv64": "1.79.4", + "sass-embedded-linux-x64": "1.79.4", + "sass-embedded-win32-arm64": "1.79.4", + "sass-embedded-win32-ia32": "1.79.4", + "sass-embedded-win32-x64": "1.79.4" } }, "node_modules/sass-embedded-android-arm": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.3.tgz", - "integrity": "sha512-rrdaVDkKBLUqzdqlBFamUbeuLG+8r/QLXHIgz4qPhIDqceJH6ds0Vzrae9Ef6DhYfMatOg2xiScdatwQ8Yl/hA==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.79.4.tgz", + "integrity": "sha512-YOVpDGDcwWUQvktpJhYo4zOkknDpdX6ALpaeHDTX6GBUvnZfx+Widh76v+QFUhiJQ/I/hndXg1jv/PKilOHRrw==", "cpu": [ "arm" ], @@ -3203,9 +3559,9 @@ } }, "node_modules/sass-embedded-android-arm64": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.3.tgz", - "integrity": "sha512-Wqm/WKHIDQl7w7eIQRO/GQ7EXfnwNpipCyJL7Xtb15vSAV64J4/0D/esy6GOPlVG+qcu8/XN8NV7Bf5wZ2ExUw==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.79.4.tgz", + "integrity": "sha512-0JAZ8TtXYv9yI3Yasaq03xvo7DLJOmD+Exb30oJKxXcWTAV9TB0ZWKoIRsFxbCyPxyn7ouxkaCEXQtaTRKrmfw==", "cpu": [ "arm64" ], @@ -3218,9 +3574,9 @@ } }, "node_modules/sass-embedded-android-ia32": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.3.tgz", - "integrity": "sha512-6rDmH0O7hjBP04/xBAFzSYYMU/7MrQYCak4541BZIbIfa2uw0x/8+mB7lZjdgFsBrFjcpdVCPhZPUE6Y50c00A==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.79.4.tgz", + "integrity": "sha512-IjO3RoyvNN84ZyfAR5s/a8TIdNPfClb7CLGrswB3BN/NElYIJUJMVHD6+Y8W9QwBIZ8DrK1IdLFSTV8nn82xMA==", "cpu": [ "ia32" ], @@ -3233,9 +3589,9 @@ } }, "node_modules/sass-embedded-android-riscv64": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.3.tgz", - "integrity": "sha512-B/PgB0AfTCvOlF1g89raJTwTXIUQUM3OXDWqEKIlJEZM1Yao91i8ZkyrFkDMzT4G5sETy4o8pgK+qE9+7bFlug==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.79.4.tgz", + "integrity": "sha512-uOT8nXmKxSwuIdcqvElVWBFcm/+YcIvmwfoKbpuuSOSxUe9eqFzxo+fk7ILhynzf6FBlvRUH5DcjGj+sXtCc3w==", "cpu": [ "riscv64" ], @@ -3248,9 +3604,9 @@ } }, "node_modules/sass-embedded-android-x64": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.3.tgz", - "integrity": "sha512-a5cpo9Yw4xnX32Uo3WfMZLaTVnI/h2n7U3K3eTygyj707yhGkUB0i+qxldzCw8MmKivIu9irG6O4kmnRjW6f7g==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.79.4.tgz", + "integrity": "sha512-W2FQoj3Z2J2DirNs3xSBVvrhMuqLnsqvOPulxOkhL/074+faKOZZnPx2tZ5zsHbY97SonciiU0SV0mm98xI42w==", "cpu": [ "x64" ], @@ -3263,9 +3619,9 @@ } }, "node_modules/sass-embedded-darwin-arm64": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.3.tgz", - "integrity": "sha512-imafD0nlVz5FJhqBqxUbG5rK4E3cu1GxhMZ5VhKm0k4t5jFQo+3OjN7sHT4Ee2Mk1g8sjr5dtq5enDU4fs6lXA==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.79.4.tgz", + "integrity": "sha512-pcYtbN1VUAAcfgyHeX8ySndDWGjIvcq6rldduktPbGGuAlEWFDfnwjTbv0hS945ggdzZ6TFnaFlLEDr0SjKzBA==", "cpu": [ "arm64" ], @@ -3278,9 +3634,9 @@ } }, "node_modules/sass-embedded-darwin-x64": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.3.tgz", - "integrity": "sha512-pjciT1FcMUMA4rWdpyZYSwMOvxk5JP7R6vy7TzvqkUEqXxP9FTflYnAiwgYUDVTpngHHqRxTjdyW+e+h2L9dHw==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.79.4.tgz", + "integrity": "sha512-ir8CFTfc4JLx/qCP8LK1/3pWv35nRyAQkUK7lBIKM6hWzztt64gcno9rZIk4SpHr7Z/Bp1IYWWRS4ZT+4HmsbA==", "cpu": [ "x64" ], @@ -3293,9 +3649,9 @@ } }, "node_modules/sass-embedded-linux-arm": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.3.tgz", - "integrity": "sha512-n0bDtzABPE5YaL9wSLxNPiQMl1zArsGblHJyED6fEHz41m+OkCTopfO8IVjcf+MBrK/j11gonxiIGWO+fNOxvg==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.79.4.tgz", + "integrity": "sha512-H/XEE3rY7c+tY0qDaELjPjC6VheAhBo1tPJQ6UHoBEf8xrbT/RT3dWiIS8grp9Vk54RCn05BEB/+POaljvvKGA==", "cpu": [ "arm" ], @@ -3308,9 +3664,9 @@ } }, "node_modules/sass-embedded-linux-arm64": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.3.tgz", - "integrity": "sha512-ODo8ghwk6KHxchgwxq4CwgfYwWdreEbsQoukeEgRKxHcuLB9XF6tol9pGlfrc8sYox48Vp5WDCZuzgoo6rJ6tg==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.79.4.tgz", + "integrity": "sha512-XIVn2mCuA422SR2kmKjF6jhjMs1Vrt1DbZ/ktSp+eR0sU4ugu2htg45GajiUFSKKRj7Sc+cBdThq1zPPsDLf1w==", "cpu": [ "arm64" ], @@ -3323,9 +3679,9 @@ } }, "node_modules/sass-embedded-linux-ia32": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.3.tgz", - "integrity": "sha512-oC3rUyIE6mEm2etsc4CuNu6IVmB6CoSM4KsubxzCD3S37QFXq8wYbI0t9iiDdTkKb5Iu+vUyhn+tYJRVHg0tvw==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.79.4.tgz", + "integrity": "sha512-3nqZxV4nuUTb1ahLexVl4hsnx1KKwiGdHEf1xHWTZai6fYFMcwyNPrHySCQzFHqb5xiqSpPzzrKjuDhF6+guuQ==", "cpu": [ "ia32" ], @@ -3338,9 +3694,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.3.tgz", - "integrity": "sha512-TOUYMtDs9xoMsJSEEr7NjtcVCqVpg1eSOQHXXruJ1kiYfxwmHrCYTjTLoefbZ29mWqIq8NUaXJG4rZNDK6NzRA==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.79.4.tgz", + "integrity": "sha512-HnbU1DEiQdUayioNzxh2WlbTEgQRBPTgIIvof8J63QLmVItUqE7EkWYkSUy4RhO+8NsuN9wzGmGTzFBvTImU7g==", "cpu": [ "arm" ], @@ -3353,9 +3709,9 @@ } }, "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.3.tgz", - "integrity": "sha512-Q9/5lsrK/JnQci3DwxZ9PGIIrRxuo/bySv+gbyVp8Kb7gdkZcEsY7HkxaBJfwVEwpZSGAyCviyZDHDMILjliOw==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.79.4.tgz", + "integrity": "sha512-C6qX06waPEfDgOHR8jXoYxl0EtIXOyBDyyonrLO3StRjWjGx7XMQj2hA/KXSsV+Hr71fBOsaViosqWXPzTbEiQ==", "cpu": [ "arm64" ], @@ -3368,9 +3724,9 @@ } }, "node_modules/sass-embedded-linux-musl-ia32": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.3.tgz", - "integrity": "sha512-T2uERh3gs9eWUzdkDadPuYbelQJQLZyX8myutUd4fxyrQ7ToQRBwcMoynEjl48DBHnM0oRiJUHrV9uFuJ+fmRA==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.79.4.tgz", + "integrity": "sha512-y5b0fdOPWyhj4c+mc88GvQiC5onRH1V0iNaWNjsiZ+L4hHje6T98nDLrCJn0fz5GQnXjyLCLZduMWbfV0QjHGg==", "cpu": [ "ia32" ], @@ -3383,9 +3739,9 @@ } }, "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.3.tgz", - "integrity": "sha512-XTuYtTBPFeEjydS2GsIUkMztzXIiz13noknE7m1yAbVxOchu9jD9FCLAdK9pVPPki+9BiLSxsutYwOcQn8atqQ==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.79.4.tgz", + "integrity": "sha512-G2M5ADMV9SqnkwpM0S+UzDz7xR2njCOhofku/sDMZABzAjQQWTsAykKoGmzlT98fTw2HbNhb6u74umf2WLhCfw==", "cpu": [ "riscv64" ], @@ -3398,9 +3754,9 @@ } }, "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.3.tgz", - "integrity": "sha512-gDHfaPlxT/XQTMbfb2y+U6zDMuI8pfapVXTYlUrgYhKH2KoICclIvahhjFii5i5+1dHpfGzjgYKBqI3nvZsYFg==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.79.4.tgz", + "integrity": "sha512-kQm8dCU3DXf7DtUGWYPiPs03KJYKvFeiZJHhSx993DCM8D2b0wCXWky0S0Z46gf1sEur0SN4Lvnt1WczTqxIBw==", "cpu": [ "x64" ], @@ -3413,9 +3769,9 @@ } }, "node_modules/sass-embedded-linux-riscv64": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.3.tgz", - "integrity": "sha512-NONTa//1ZfxA87+Zjp3rabL+Z9gM67FJBdktRKXXMBAce5i8eCj/eqJGUOGPjYxtvxtQw77cex0qMr9SZnX6ww==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.79.4.tgz", + "integrity": "sha512-GaTI/mXYWYSzG5wxtM4H2cozLpATyh+4l+rO9FFKOL8e1sUOLAzTeRdU2nSBYCuRqsxRuTZIwCXhSz9Q3NRuNA==", "cpu": [ "riscv64" ], @@ -3428,9 +3784,9 @@ } }, "node_modules/sass-embedded-linux-x64": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.3.tgz", - "integrity": "sha512-drlUqMMw222+f/T5sNrIAv+z0vQwLkO4zAlDmf4biLdWIloPP/3plTodAkMyfagNcvA8jG2jN414pJXBI3zK6w==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.79.4.tgz", + "integrity": "sha512-f9laGkqHgC01h99Qt4LsOV+OLMffjvUcTu14hYWqMS9QVX5a4ihMwpf1NoAtTUytb7cVF3rYY/NVGuXt6G3ppQ==", "cpu": [ "x64" ], @@ -3443,9 +3799,9 @@ } }, "node_modules/sass-embedded-win32-arm64": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.3.tgz", - "integrity": "sha512-gYz0IUb0fLkHUbhq+HR52wvQfG75Zu1s48/v48TqC+b04H/01k2eiawp/Ec1f+lhpIL/pr5+n5jWR6CjkxPdnQ==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.79.4.tgz", + "integrity": "sha512-cidBvtaA2cJ6dNlwQEa8qak+ezypurzKs0h0QAHLH324+j/6Jum7LCnQhZRPYJBFjHl+WYd7KwzPnJ2X5USWnQ==", "cpu": [ "arm64" ], @@ -3458,9 +3814,9 @@ } }, "node_modules/sass-embedded-win32-ia32": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.3.tgz", - "integrity": "sha512-fbDTyzbqRc+xCWZ+YHSDt2WvGk5PW2K0SjyHuwes/Fls1+wdO4iHIukE/pD+HSWytYrtCqhe7EFq5Ug5HxGTLg==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.79.4.tgz", + "integrity": "sha512-hexdmNTIZGTKNTzlMcdvEXzYuxOJcY89zqgsf45aQ2YMy4y2M8dTOxRI/Vz7p4iRxVp1Jow6LCtaLHrNI2Ordg==", "cpu": [ "ia32" ], @@ -3473,9 +3829,9 @@ } }, "node_modules/sass-embedded-win32-x64": { - "version": "1.79.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.3.tgz", - "integrity": "sha512-vvfr6wyCaHvdQbGS8UkYab6DXc1FKJRYFT5aFE3QTVqbzCqmJ5tf80E4+gvB99nljLtMjwKR1d332iWI9KDLhw==", + "version": "1.79.4", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.79.4.tgz", + "integrity": "sha512-73yrpiWIbti6DkxhWURklkgSLYKfU9itDmvHxB+oYSb4vQveIApqTwSyTOuIUb/6Da/EsgEpdJ4Lbj4sLaMZWA==", "cpu": [ "x64" ], @@ -3603,6 +3959,21 @@ "source-map": "^0.6.0" } }, + "node_modules/stdin-discarder": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stdin-discarder/-/stdin-discarder-0.1.0.tgz", + "integrity": "sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==", + "dev": true, + "dependencies": { + "bl": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -3612,12 +3983,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -3721,15 +4086,15 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -3744,10 +4109,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/terser": { - "version": "5.33.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.33.0.tgz", - "integrity": "sha512-JuPVaB7s1gdFKPKTelwUyRq5Sid2A3Gko2S0PncwdBq7kN9Ti9HPWDQ06MPsEDGsZeVESjKEnyGy68quBk1w6g==", + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.34.1.tgz", + "integrity": "sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", @@ -3762,6 +4136,63 @@ "node": ">=10" } }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/test-exclude/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -3780,15 +4211,6 @@ "node": ">=8.0" } }, - "node_modules/traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==", - "dev": true, - "engines": { - "node": "*" - } - }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -3831,9 +4253,9 @@ } }, "node_modules/typescript": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.2.tgz", - "integrity": "sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==", + "version": "5.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz", + "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -3843,28 +4265,10 @@ "node": ">=14.17" } }, - "node_modules/unzipper": { - "version": "0.10.14", - "resolved": "https://registry.npmjs.org/unzipper/-/unzipper-0.10.14.tgz", - "integrity": "sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.17", - "binary": "~0.3.0", - "bluebird": "~3.4.1", - "buffer-indexof-polyfill": "~1.0.0", - "duplexer2": "~0.1.4", - "fstream": "^1.0.12", - "graceful-fs": "^4.2.2", - "listenercount": "~1.0.1", - "readable-stream": "~2.3.6", - "setimmediate": "~1.0.4" - } - }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "funding": [ { "type": "opencollective", @@ -3880,8 +4284,8 @@ } ], "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -3905,27 +4309,25 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" - }, - "node_modules/vscode-test": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.6.1.tgz", - "integrity": "sha512-086q88T2ca1k95mUzffvbzb7esqQNvJgiwY4h29ukPhFo8u+vXOOmelUoU5EQUHs3Of8+JuQ3oGdbVCqaxuTXA==", - "deprecated": "This package has been renamed to @vscode/test-electron, please update to the new name", + "node_modules/v8-to-istanbul": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", + "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "dependencies": { - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "rimraf": "^3.0.2", - "unzipper": "^0.10.11" + "@jridgewell/trace-mapping": "^0.3.12", + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^2.0.0" }, "engines": { - "node": ">=8.9.3" + "node": ">=10.12.0" } }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==" + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4066,30 +4468,30 @@ } }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "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": ">=10" + "node": ">=12" } }, "node_modules/yargs-unparser": { diff --git a/package.json b/package.json index b1fdc87..1bd4f04 100644 --- a/package.json +++ b/package.json @@ -305,37 +305,39 @@ }, "homepage": "https://glenn2223.github.io/vscode-live-sass-compiler/", "scripts": { - "vscode:prepublish": "npm run rollup", - "pretest": "npm run rollup && tsc -p ./src/test/", + "vscode:prepublish": "node ./src/test/clean.js out && npm run lint && npm run rollup", + "pretest": "node ./src/test/clean.js out && tsc -p ./src/tsconfig.tests.json && npm run rollup-testing", "test": "node ./out/test/runTest.js", "lint": "eslint -c .eslintrc.js --ext .ts ./src/", - "rollup": "rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript" + "rollup": "rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript", + "rollup-testing": "rollup --config rollup.config.ts --configPlugin @rollup/plugin-typescript --testing" }, "dependencies": { "autoprefixer": "^10.4.20", - "fdir": "^6.3.0", + "fdir": "^6.4.0", "picomatch": "^4.0.2", "postcss": "^8.4.47", - "sass-embedded": "^1.79.3" + "sass-embedded": "^1.79.4" }, "devDependencies": { - "@rollup/plugin-commonjs": "^26.0.1", + "@rollup/plugin-commonjs": "^28.0.0", "@rollup/plugin-json": "^6.1.0", - "@rollup/plugin-node-resolve": "^15.2.3", + "@rollup/plugin-node-resolve": "^15.3.0", "@rollup/plugin-terser": "^0.4.4", - "@rollup/plugin-typescript": "^11.1.6", - "@types/mocha": "^10.0.8", + "@rollup/plugin-typescript": "^12.1.0", + "@types/mocha": "^10.0.9", "@types/node": "^17.0.45", "@types/picomatch": "^3.0.1", "@types/vscode": "1.74", "@typescript-eslint/eslint-plugin": "^7.18.0", "@typescript-eslint/parser": "^7.18.0", + "@vscode/test-cli": "^0.0.10", + "@vscode/test-electron": "^2.4.1", "eslint": "^8.57.1", "mocha": "^10.7.3", - "rollup": "^4.22.4", + "rollup": "^4.24.0", "tslib": "^2.7.0", - "typescript": "^5.6.2", - "vscode-test": "^1.6.1" + "typescript": "^5.6.3" }, "announcement": { "onVersion": "6.1.2", diff --git a/rollup.config.ts b/rollup.config.ts index 50bfa63..13d8819 100644 --- a/rollup.config.ts +++ b/rollup.config.ts @@ -4,6 +4,9 @@ import typescript from "@rollup/plugin-typescript"; import terser from "@rollup/plugin-terser"; import json from "@rollup/plugin-json"; import commonjs from "@rollup/plugin-commonjs"; +import { argv } from "process"; + +const isTest = argv.includes("--testing"); export default { input: "src/extension.ts", @@ -12,21 +15,23 @@ export default { { file: "out/extension.js", format: "cjs", - sourcemap: false, + sourcemap: isTest, compact: true, - plugins: [{ - name: "navigtorFix", - renderChunk(code) { - return { - code: `var navigator=null!==navigator&&void 0!==navigator?navigator:navigator={userAgent:null};${code}`, - map: null, - }; + plugins: [ + { + name: "navigtorFix", + renderChunk(code) { + return { + code: `var navigator=null!==navigator&&void 0!==navigator?navigator:navigator={userAgent:null};${code}`, + map: null, + }; + }, }, - }], + ], }, ], plugins: [ - typescript({ sourceMap: false }), + typescript({ sourceMap: isTest, tsconfig: "src/tsconfig.rollup.json" }), json(), terser({ format: { comments: false } }), commonjs({ diff --git a/src/Helpers/Autoprefix.test.ts b/src/Helpers/Autoprefix.test.ts new file mode 100644 index 0000000..56804f8 --- /dev/null +++ b/src/Helpers/Autoprefix.test.ts @@ -0,0 +1,69 @@ +import * as assert from "assert"; +import { autoprefix } from "./Autoprefix"; + +suite("Autocomplete Tests", function () { + test("Simple test", async () => { + const input = ".test{display:flex}", + expected = ".test{display:-ms-flexbox;display:flex}", + actualObj = await autoprefix( + input, + undefined, + "input.scss", + ["IE 10"], + false + ); + + assert.equal(actualObj.css, expected); + }); + + test("Dated prefix not required (we have good support now)", async () => { + const input = ".test{display:flex}", + expected = ".test{display:flex}", + actualObj = await autoprefix( + input, + undefined, + "input.scss", + true, + false + ); + + assert.equal(actualObj.css, expected); + }); + + test("Auto removes dead prefixes", async () => { + const input = ` +a { + -webkit-border-radius: 5px; + border-radius: 5px; +}`, + expected = ` +a { + border-radius: 5px; +}`, + actualObj = await autoprefix( + input, + undefined, + "input.scss", + true, + false + ); + + assert.equal(actualObj.css, expected); + }); + + test("Incorrect list item throws", () => { + assert.rejects( + () => + autoprefix( + ".test{display:flex}", + undefined, + "input.scss", + ["IE10"], + false + ), + { + message: /IE10/, + } + ); + }); +}); diff --git a/src/Helpers/Autoprefix.ts b/src/Helpers/Autoprefix.ts index 5aba2b1..999dd8e 100644 --- a/src/Helpers/Autoprefix.ts +++ b/src/Helpers/Autoprefix.ts @@ -1,6 +1,5 @@ import autoprefixer from "autoprefixer"; import postcss from "postcss"; -import * as vscode from "vscode"; import { OutputWindow } from "../VsCode/OutputWindow"; import { OutputLevel } from "../Enums/OutputLevel"; @@ -8,7 +7,6 @@ import { OutputLevel } from "../Enums/OutputLevel"; * Autoprefix CSS properties */ export async function autoprefix( - folder: vscode.WorkspaceFolder | undefined, css: string, map: string | undefined, savePath: string, @@ -61,7 +59,9 @@ export async function autoprefix( body.push(warn.text); OutputWindow.Show( - warn.type === "warning" ? OutputLevel.Warning : OutputLevel.Error, + warn.type === "warning" + ? OutputLevel.Warning + : OutputLevel.Error, `Autoprefix ${warn.type || "error"}`, body ); @@ -79,9 +79,10 @@ export async function autoprefix( OutputWindow.Show( OutputLevel.Trace, - `Restored BROWSERSLIST_DISABLE_CACHE to: ${oldBrowserlistCache ?? "UNDEFINED" + `Restored BROWSERSLIST_DISABLE_CACHE to: ${ + oldBrowserlistCache ?? "UNDEFINED" }` ); } } -} \ No newline at end of file +} diff --git a/src/Helpers/FileHelper.test.ts b/src/Helpers/FileHelper.test.ts new file mode 100644 index 0000000..2bc078d --- /dev/null +++ b/src/Helpers/FileHelper.test.ts @@ -0,0 +1,29 @@ +import * as assert from "assert"; +import { FileHelper } from "./FileHelper"; +import { statSync } from "fs"; + +suite("FileHelper Tests", function () { + test("Create file doesn't reject", () => { + assert.doesNotReject(() => + FileHelper.writeToOneFile( + "./doesntRejectFile.css", + ".test{display:flex}" + ) + ); + }); + + test("File exists", async () => { + await FileHelper.writeToOneFile( + "./existsFile.css", + ".test{display:flex}" + ); + + assert.ok(statSync("./existsFile.css").isFile()); + }); + + test("Can create directory", () => { + FileHelper.MakeDirIfNotAvailable("./createDir"); + + assert.ok(statSync("./createDir").isDirectory()); + }); +}); diff --git a/src/Helpers/SassHelper.test.ts b/src/Helpers/SassHelper.test.ts new file mode 100644 index 0000000..b5b10f6 --- /dev/null +++ b/src/Helpers/SassHelper.test.ts @@ -0,0 +1,28 @@ +import * as assert from "assert"; +import { SassHelper } from "./SassHelper"; + +suite("SassHelper Tests", function () { + console.log("Current dir:", __dirname); + + test("Simple compressed test", async () => { + const input = "../../src/test/sample/css/sample.css", + expected = ".Sample{color:#000}", + actualObj = await SassHelper.compileOneAsync(input, "input.scss", { + style: "compressed", + }); + + assert.equal(actualObj.result?.css, expected); + }); + + test("Simple expanded test", async () => { + const input = "../../src/test/sample/css/sample.css", + expected = `.Sample { + color: #000; +} `, + actualObj = await SassHelper.compileOneAsync(input, "input.scss", { + style: "expanded", + }); + + assert.equal(actualObj.result?.css, expected); + }); +}); diff --git a/src/Helpers/SassHelper.ts b/src/Helpers/SassHelper.ts index 7d70b8a..3957aaa 100644 --- a/src/Helpers/SassHelper.ts +++ b/src/Helpers/SassHelper.ts @@ -10,46 +10,6 @@ import { Logger, Options, SourceSpan, compileAsync } from "sass-embedded"; import { ISassCompileResult } from "../Interfaces/ISassCompileResult"; export class SassHelper { - private static parsePath(importUrl: string, cb: (newPath: string) => T): T | null { - if (workspace.workspaceFolders) { - const normalisedUrl = importUrl.replace(/\\/g, "/"), - urlParts = normalisedUrl - .substring(1) - .split("/") - .filter((x) => x.length > 0); - - if (normalisedUrl.startsWith("~") && normalisedUrl.indexOf("/") > -1) { - for (let i = 0; i < workspace.workspaceFolders.length; i++) { - const workingPath = [workspace.workspaceFolders[i].uri.fsPath, "node_modules"] - .concat(...urlParts.slice(0, -1)) - .join("/"); - - if (existsSync(workingPath)) { - return cb(workingPath + path.sep + urlParts.slice(-1).join(path.sep)); - } - } - } else if (normalisedUrl.startsWith("/")) { - for (let i = 0; i < workspace.workspaceFolders.length; i++) { - const folder = workspace.workspaceFolders[i], - rootIsWorkspace = SettingsHelper.getConfigSettings( - "rootIsWorkspace", - folder - ); - - if (rootIsWorkspace) { - const filePath = [folder.uri.fsPath, normalisedUrl.substring(1)].join("/"); - - if (existsSync(filePath.substring(0, filePath.lastIndexOf("/")))) { - return cb(filePath); - } - } - } - } - } - - return null; - } - private static readonly loggerProperty: Logger = { warn: ( message: string, @@ -62,7 +22,13 @@ export class SassHelper { OutputWindow.Show( OutputLevel.Warning, "Warning:", - [message].concat(this.format(options.span, options.stack, options.deprecation)) + [message].concat( + this.format( + options.span, + options.stack, + options.deprecation + ) + ) ); }, debug: (message: string, options: { span?: SourceSpan }) => { @@ -85,7 +51,10 @@ export class SassHelper { importers: [ { findFileUrl: (importUrl) => - SassHelper.parsePath(importUrl, (newPath) => pathToFileURL(newPath)), + // @ts-ignore: 2322 + SassHelper.parsePath(importUrl, (newPath) => + pathToFileURL(newPath) + ), }, ], logger: SassHelper.loggerProperty, @@ -111,18 +80,18 @@ export class SassHelper { const { css, sourceMap } = await compileAsync(SassPath, options); if (sourceMap) { - sourceMap.sources = sourceMap.sources.map( - (sourcePath) => - path.relative(path.join(targetCssUri, "../"), fileURLToPath(sourcePath)) + sourceMap.sources = sourceMap.sources.map((sourcePath) => + path.relative( + path.join(targetCssUri, "../"), + fileURLToPath(sourcePath) + ) ); } return { result: { css: css, - map: sourceMap - ? JSON.stringify(sourceMap) - : undefined, + map: sourceMap ? JSON.stringify(sourceMap) : undefined, }, errorString: null, }; @@ -135,6 +104,67 @@ export class SassHelper { } } + private static parsePath( + importUrl: string, + cb: (newPath: string) => T + ): T | null { + if (workspace.workspaceFolders) { + const normalisedUrl = importUrl.replace(/\\/g, "/"), + urlParts = normalisedUrl + .substring(1) + .split("/") + .filter((x) => x.length > 0); + + if ( + normalisedUrl.startsWith("~") && + normalisedUrl.indexOf("/") > -1 + ) { + for (let i = 0; i < workspace.workspaceFolders.length; i++) { + const workingPath = [ + workspace.workspaceFolders[i].uri.fsPath, + "node_modules", + ] + .concat(...urlParts.slice(0, -1)) + .join("/"); + + if (existsSync(workingPath)) { + return cb( + workingPath + + path.sep + + urlParts.slice(-1).join(path.sep) + ); + } + } + } else if (normalisedUrl.startsWith("/")) { + for (let i = 0; i < workspace.workspaceFolders.length; i++) { + const folder = workspace.workspaceFolders[i], + rootIsWorkspace = + SettingsHelper.getConfigSettings( + "rootIsWorkspace", + folder + ); + + if (rootIsWorkspace) { + const filePath = [ + folder.uri.fsPath, + normalisedUrl.substring(1), + ].join("/"); + + if ( + existsSync( + filePath.substring(0, filePath.lastIndexOf("/")) + ) + ) { + return cb(filePath); + } + } + } + } + } + + return null; + } + private static format( span: SourceSpan | undefined | null, stack?: string, @@ -147,14 +177,18 @@ export class SassHelper { stringArray.push(stack); } } else { - stringArray.push(this.charOfLength(span.start.line.toString().length, "╷")); + stringArray.push( + this.charOfLength(span.start.line.toString().length, "╷") + ); let lineNumber = span.start.line; do { stringArray.push( - `${lineNumber} |${span.context?.split("\n")[lineNumber - span.start.line] ?? - span.text.split("\n")[lineNumber - span.start.line] + `${lineNumber} |${ + span.context?.split("\n")[ + lineNumber - span.start.line + ] ?? span.text.split("\n")[lineNumber - span.start.line] }` ); @@ -162,25 +196,40 @@ export class SassHelper { } while (lineNumber < span.end.line); stringArray.push( - this.charOfLength(span.start.line.toString().length, this.addUnderLine(span)) + this.charOfLength( + span.start.line.toString().length, + this.addUnderLine(span) + ) ); - stringArray.push(this.charOfLength(span.start.line.toString().length, "╵")); + stringArray.push( + this.charOfLength(span.start.line.toString().length, "╵") + ); if (span.url) { // possibly include `,${span.end.line}:${span.end.column}`, if VS Code ever supports it - stringArray.push(`${span.url.toString()}:${span.start.line}:${span.start.column}`); + stringArray.push( + `${span.url.toString()}:${span.start.line}:${ + span.start.column + }` + ); } } if (deprecated === true) { - stringArray.push("THIS IS DEPRECATED AND WILL BE REMOVED IN SASS 2.0"); + stringArray.push( + "THIS IS DEPRECATED AND WILL BE REMOVED IN SASS 2.0" + ); } return stringArray; } - private static charOfLength(charCount: number, suffix?: string, char = " "): string { + private static charOfLength( + charCount: number, + suffix?: string, + char = " " + ): string { if (charCount < 0) { return suffix ?? ""; } @@ -202,7 +251,11 @@ export class SassHelper { } else { outString += this.charOfLength(span.start.column - 2, "^") + - this.charOfLength(span.end.column - span.start.column - 1, "^", "."); + this.charOfLength( + span.end.column - span.start.column - 1, + "^", + "." + ); } return outString; diff --git a/src/VsCode/StatusbarUi.ts b/src/VsCode/StatusbarUi.ts index 92185ef..b512a15 100644 --- a/src/VsCode/StatusbarUi.ts +++ b/src/VsCode/StatusbarUi.ts @@ -18,7 +18,10 @@ export class StatusBarUi { } static init(watchOnLaunch: boolean): void { - StatusBarUi.customMessage("Starting...", "Initializing... switching state in 1 second"); + StatusBarUi.customMessage( + "Starting...", + "Initializing... switching state in 1 second" + ); setTimeout(function () { watchOnLaunch ? StatusBarUi.watching() : StatusBarUi.notWatching(); @@ -26,12 +29,16 @@ export class StatusBarUi { } static watching(): void { - OutputWindow.Show(OutputLevel.Trace, "Changing status bar to: Watching"); + OutputWindow.Show( + OutputLevel.Trace, + "Changing status bar to: Watching" + ); StatusBarUi.statusBarItem.text = `$(telescope) Watching...`; StatusBarUi.statusBarItem.color = "inherit"; StatusBarUi.statusBarItem.command = "liveSass.command.donotWatchMySass"; - StatusBarUi.statusBarItem.tooltip = "Stop live compilation of SASS or SCSS to CSS"; + StatusBarUi.statusBarItem.tooltip = + "Stop live compilation of SASS or SCSS to CSS"; } static notWatching(): void { @@ -43,7 +50,8 @@ export class StatusBarUi { StatusBarUi.statusBarItem.text = `$(eye) Watch Sass`; StatusBarUi.statusBarItem.color = "inherit"; StatusBarUi.statusBarItem.command = "liveSass.command.watchMySass"; - StatusBarUi.statusBarItem.tooltip = "live compilation of SASS or SCSS to CSS"; + StatusBarUi.statusBarItem.tooltip = + "live compilation of SASS or SCSS to CSS"; } static working(workingMsg = "Working on it..."): void { @@ -59,7 +67,10 @@ export class StatusBarUi { iconName = "pulse", command: string | undefined = undefined ): void { - OutputWindow.Show(OutputLevel.Trace, `Changing status bar to: "${text}"`); + OutputWindow.Show( + OutputLevel.Trace, + `Changing status bar to: "${text}"` + ); let icon = ""; if (iconName) { @@ -73,16 +84,21 @@ export class StatusBarUi { // Quick status bar messages after compile success or error static compilationSuccess(isWatching: boolean): void { - OutputWindow.Show(OutputLevel.Trace, "Changing status bar to: Success", [ - "Registered timeout to switch state back", - ]); + OutputWindow.Show( + OutputLevel.Trace, + "Changing status bar to: Success", + ["Registered timeout to switch state back"] + ); StatusBarUi.statusBarItem.text = `$(check) Success`; StatusBarUi.statusBarItem.color = "#33ff00"; StatusBarUi.statusBarItem.command = "liveSass.command.openOutputWindow"; setTimeout(function () { - OutputWindow.Show(OutputLevel.Trace, "Firing timeout function to switch back"); + OutputWindow.Show( + OutputLevel.Trace, + "Firing timeout function to switch back" + ); StatusBarUi.statusBarItem.color = "inherit"; if (isWatching) { @@ -94,7 +110,12 @@ export class StatusBarUi { } static compilationError(isWatching: boolean): void { - OutputWindow.Show(OutputLevel.Trace, "Changing status bar to: Error", null, false); + OutputWindow.Show( + OutputLevel.Trace, + "Changing status bar to: Error", + null, + false + ); StatusBarUi.statusBarItem.text = `$(x) Error`; StatusBarUi.statusBarItem.color = "#ff0033"; @@ -109,7 +130,10 @@ export class StatusBarUi { ); setTimeout(function () { - OutputWindow.Show(OutputLevel.Trace, "Firing timeout function to switch back"); + OutputWindow.Show( + OutputLevel.Trace, + "Firing timeout function to switch back" + ); StatusBarUi.statusBarItem.color = "inherit"; StatusBarUi.watching(); @@ -124,6 +148,9 @@ export class StatusBarUi { static dispose(): void { StatusBarUi.statusBarItem.dispose(); - OutputWindow.Show(OutputLevel.Trace, "Disposing Live SASS status bar item"); + OutputWindow.Show( + OutputLevel.Trace, + "Disposing Live SASS status bar item" + ); } } diff --git a/src/appModel.ts b/src/appModel.ts index 9c01f5e..3257bb5 100644 --- a/src/appModel.ts +++ b/src/appModel.ts @@ -26,7 +26,8 @@ export class AppModel { constructor(workplaceState: vscode.Memento) { OutputWindow.Show(OutputLevel.Trace, "Constructing app model"); - this.isWatching = SettingsHelper.getConfigSettings("watchOnLaunch"); + this.isWatching = + SettingsHelper.getConfigSettings("watchOnLaunch"); this._logger = new ErrorLogger(workplaceState); @@ -40,7 +41,8 @@ export class AppModel { } async StartWatching(): Promise { - const compileOnWatch = SettingsHelper.getConfigSettings("compileOnWatch"); + const compileOnWatch = + SettingsHelper.getConfigSettings("compileOnWatch"); if (!this.isWatching) { this.isWatching = !this.isWatching; @@ -150,7 +152,10 @@ export class AppModel { * Compiles the currently active file */ async compileCurrentFile(): Promise { - OutputWindow.Show(OutputLevel.Trace, "Starting to compile current file"); + OutputWindow.Show( + OutputLevel.Trace, + "Starting to compile current file" + ); try { if (!vscode.window.activeTextEditor) { @@ -175,9 +180,13 @@ export class AppModel { switch (sassFileType) { case SassConfirmationType.PartialFile: - OutputWindow.Show(OutputLevel.Debug, "Can't process partial Sass", [ - "The file currently open in the editor window is a partial sass file, these aren't processed singly", - ]); + OutputWindow.Show( + OutputLevel.Debug, + "Can't process partial Sass", + [ + "The file currently open in the editor window is a partial sass file, these aren't processed singly", + ] + ); StatusBarUi.customMessage( "Can't process partial Sass", @@ -206,9 +215,11 @@ export class AppModel { } StatusBarUi.working("Processing single file..."); - OutputWindow.Show(OutputLevel.Debug, "Processing the current file", [ - `Path: ${sassPath}`, - ]); + OutputWindow.Show( + OutputLevel.Debug, + "Processing the current file", + [`Path: ${sassPath}`] + ); await this.handleSingleFile(workspaceFolder, sassPath); } catch (err) { @@ -244,10 +255,13 @@ export class AppModel { const currentFile = textDocument.fileName; const workspaceFolder = AppModel.getWorkspaceFolder( - currentFile, - !this.isWatching - ), - sassFileType = this.confirmSassType(currentFile, workspaceFolder); + currentFile, + !this.isWatching + ), + sassFileType = this.confirmSassType( + currentFile, + workspaceFolder + ); if (sassFileType == SassConfirmationType.NotSass) { return; @@ -341,7 +355,7 @@ export class AppModel { "formats", workspaceFolder ); - + return await Promise.all( formats.map(async (format, index) => { OutputWindow.Show( @@ -389,7 +403,7 @@ export class AppModel { "Starting compilation of file", `Path: ${sassPath}`, ]); - + const paths = this.generateCssAndMapUri(sassPath, format, folder); if (paths === null) { @@ -399,8 +413,11 @@ export class AppModel { const options = SassHelper.toSassOptions(format); const generateMap = - format.generateMap ?? - SettingsHelper.getConfigSettings("generateMap", folder), + format.generateMap ?? + SettingsHelper.getConfigSettings( + "generateMap", + folder + ), compileResult = await SassHelper.compileOneAsync( sassPath, paths.css, @@ -445,7 +462,6 @@ export class AppModel { try { const autoprefixerResult = await autoprefix( - folder, css, map, paths.css, @@ -483,7 +499,8 @@ export class AppModel { fileResolvers.forEach((fileResolver) => { if (fileResolver.Exception) { OutputWindow.Show(OutputLevel.Error, "Error:", [ - fileResolver.Exception.errno?.toString() ?? "UNKNOWN ERR NUMBER", + fileResolver.Exception.errno?.toString() ?? + "UNKNOWN ERR NUMBER", fileResolver.Exception.path ?? "UNKNOWN PATH", fileResolver.Exception.message, ]); @@ -559,14 +576,18 @@ export class AppModel { ]); const workspacePath = workspaceRoot.uri.fsPath; - let generatedUri = null; + let generatedUri: string | null = null; // NOTE: If all SavePath settings are `NULL`, CSS Uri will be same location as SASS if (format.savePath) { - OutputWindow.Show(OutputLevel.Trace, "Using `savePath` setting", [ - "This format has a `savePath`, using this (takes precedence if others are present)", - `savePath: ${format.savePath}`, - ]); + OutputWindow.Show( + OutputLevel.Trace, + "Using `savePath` setting", + [ + "This format has a `savePath`, using this (takes precedence if others are present)", + `savePath: ${format.savePath}`, + ] + ); if (format.savePath.startsWith("~")) { OutputWindow.Show( @@ -601,7 +622,10 @@ export class AppModel { format.savePathReplacementPairs && format.savePath.startsWith("~") ) { - OutputWindow.Show(OutputLevel.Trace, `New path: ${generatedUri}`); + OutputWindow.Show( + OutputLevel.Trace, + `New path: ${generatedUri}` + ); } else { OutputWindow.Show( OutputLevel.Trace, @@ -641,7 +665,10 @@ export class AppModel { ) { const value = format.savePathReplacementPairs[key]; - if (typeof value === "string" || value instanceof String) { + if ( + typeof value === "string" || + value instanceof String + ) { OutputWindow.Show( OutputLevel.Trace, `Applying: ${key} => ${value}`, @@ -671,7 +698,10 @@ export class AppModel { path.join(workspacePath, generatedUri) ); - OutputWindow.Show(OutputLevel.Trace, `New path: ${generatedUri}`); + OutputWindow.Show( + OutputLevel.Trace, + `New path: ${generatedUri}` + ); filePath = path.join( workspacePath, @@ -745,11 +775,17 @@ export class AppModel { const isPartial = picomatch( AppModel.stripAnyLeadingSlashes( - SettingsHelper.getConfigSettings("partialsList", workspaceFolder) + SettingsHelper.getConfigSettings( + "partialsList", + workspaceFolder + ) ), { ignore: AppModel.stripAnyLeadingSlashes( - SettingsHelper.getConfigSettings("excludeList", workspaceFolder) + SettingsHelper.getConfigSettings( + "excludeList", + workspaceFolder + ) ), dot: true, nocase: true, @@ -771,29 +807,35 @@ export class AppModel { sassPath: string, workspaceFolder?: vscode.WorkspaceFolder ): Promise { - OutputWindow.Show(OutputLevel.Trace, "Checking SASS path isn't excluded", [ - `Path: ${sassPath}`, - ]); + OutputWindow.Show( + OutputLevel.Trace, + "Checking SASS path isn't excluded", + [`Path: ${sassPath}`] + ); if (workspaceFolder) { - const includeItems = SettingsHelper.getConfigSettings( - "includeItems", - workspaceFolder - ), + const includeItems = SettingsHelper.getConfigSettings< + string[] | null + >("includeItems", workspaceFolder), excludeItems = AppModel.stripAnyLeadingSlashes( - SettingsHelper.getConfigSettings("excludeList", workspaceFolder) + SettingsHelper.getConfigSettings( + "excludeList", + workspaceFolder + ) ), - forceBaseDirectory = SettingsHelper.getConfigSettings( - "forceBaseDirectory", - workspaceFolder - ); + forceBaseDirectory = SettingsHelper.getConfigSettings< + string | null + >("forceBaseDirectory", workspaceFolder); let fileList = ["**/*.s[ac]ss"]; if (includeItems && includeItems.length) { fileList = AppModel.stripAnyLeadingSlashes( includeItems.concat( - SettingsHelper.getConfigSettings("partialsList", workspaceFolder) + SettingsHelper.getConfigSettings( + "partialsList", + workspaceFolder + ) ) ); } @@ -851,9 +893,17 @@ export class AppModel { ); } - OutputWindow.Show(OutputLevel.Trace, "Searching folder", null, false); + OutputWindow.Show( + OutputLevel.Trace, + "Searching folder", + null, + false + ); - const searchLogs: Map = new Map(), + const searchLogs: Map = new Map< + string, + string[] + >(), isMatch = picomatch(fileList, { ignore: excludeItems, dot: true, @@ -872,12 +922,17 @@ export class AppModel { filePath.toLowerCase().endsWith(".sass") ) .filter((filePath) => { - const result = isMatch(path.relative(basePath, filePath)); + const result = isMatch( + path.relative(basePath, filePath) + ); searchLogs.set(`Path: ${filePath}`, [ ` isMatch: ${result}`, ` - Base path: ${basePath}`, - ` - Rela path: ${path.relative(basePath, filePath)}`, + ` - Rela path: ${path.relative( + basePath, + filePath + )}`, ]); return result; @@ -886,9 +941,13 @@ export class AppModel { const result = path .toNamespacedPath(filePath) - .localeCompare(path.toNamespacedPath(sassPath), undefined, { - sensitivity: "accent", - }) === 0; + .localeCompare( + path.toNamespacedPath(sassPath), + undefined, + { + sensitivity: "accent", + } + ) === 0; searchLogs .get(`Path: ${filePath}`) @@ -905,7 +964,12 @@ export class AppModel { .withPromise() ).files; - OutputWindow.Show(OutputLevel.Trace, "Search results", undefined, false); + OutputWindow.Show( + OutputLevel.Trace, + "Search results", + undefined, + false + ); searchLogs.forEach((logs, key) => { OutputWindow.Show(OutputLevel.Trace, key, logs, false); @@ -915,7 +979,10 @@ export class AppModel { // If doesn't include true then it's not been found if (searchFileCount > 0) { - OutputWindow.Show(OutputLevel.Trace, "File found, not excluded"); + OutputWindow.Show( + OutputLevel.Trace, + "File found, not excluded" + ); return false; } else { @@ -955,62 +1022,98 @@ export class AppModel { ) { ( await Promise.all( - vscode.workspace.workspaceFolders.map(async (folder, index) => { - OutputWindow.Show( - OutputLevel.Trace, - `Checking folder ${index + 1} of ${vscode.workspace.workspaceFolders!.length - }`, - [`Folder: ${folder.name}`] - ); - - const includeItems = SettingsHelper.getConfigSettings( - "includeItems", - folder - ), - forceBaseDirectory = SettingsHelper.getConfigSettings( - "forceBaseDirectory", - folder - ); - - let basePath = folder.uri.fsPath, - excludedItems = isDebugging - ? ["**/node_modules/**", ".vscode/**"] - : SettingsHelper.getConfigSettings("excludeList", folder); - - if (queryPattern) { - queryPattern = AppModel.stripAnyLeadingSlashes( - Array.isArray(queryPattern) ? queryPattern : [queryPattern] - ); - } else if (includeItems && includeItems.length) { - queryPattern = AppModel.stripAnyLeadingSlashes(includeItems); - + vscode.workspace.workspaceFolders.map( + async (folder, index) => { OutputWindow.Show( OutputLevel.Trace, - "Query pattern overwritten", - [`New pattern(s): "${includeItems.join('" , "')}"`] + `Checking folder ${index + 1} of ${ + vscode.workspace.workspaceFolders!.length + }`, + [`Folder: ${folder.name}`] ); - } - excludedItems = AppModel.stripAnyLeadingSlashes(excludedItems); + const includeItems = + SettingsHelper.getConfigSettings< + string[] | null + >("includeItems", folder), + forceBaseDirectory = + SettingsHelper.getConfigSettings< + string | null + >("forceBaseDirectory", folder); + + let basePath = folder.uri.fsPath, + excludedItems = isDebugging + ? ["**/node_modules/**", ".vscode/**"] + : SettingsHelper.getConfigSettings< + string[] + >("excludeList", folder); + + if (queryPattern) { + queryPattern = AppModel.stripAnyLeadingSlashes( + Array.isArray(queryPattern) + ? queryPattern + : [queryPattern] + ); + } else if (includeItems && includeItems.length) { + queryPattern = + AppModel.stripAnyLeadingSlashes( + includeItems + ); - if (forceBaseDirectory && forceBaseDirectory.length > 1) { - OutputWindow.Show( - OutputLevel.Trace, - "`forceBaseDirectory` setting found, checking validity" - ); + OutputWindow.Show( + OutputLevel.Trace, + "Query pattern overwritten", + [ + `New pattern(s): "${includeItems.join( + '" , "' + )}"`, + ] + ); + } - basePath = path.resolve( - basePath, - AppModel.stripLeadingSlash(forceBaseDirectory) - ); + excludedItems = + AppModel.stripAnyLeadingSlashes(excludedItems); - try { - if (!(await fs.promises.stat(basePath)).isDirectory()) { + if ( + forceBaseDirectory && + forceBaseDirectory.length > 1 + ) { + OutputWindow.Show( + OutputLevel.Trace, + "`forceBaseDirectory` setting found, checking validity" + ); + + basePath = path.resolve( + basePath, + AppModel.stripLeadingSlash( + forceBaseDirectory + ) + ); + + try { + if ( + !( + await fs.promises.stat(basePath) + ).isDirectory() + ) { + OutputWindow.Show( + OutputLevel.Critical, + "Error with your `forceBaseDirectory` setting", + [ + `Path is not a folder: ${basePath}`, + `Setting: "${forceBaseDirectory}"`, + `Workspace folder: ${folder.name}`, + ] + ); + + return null; + } + } catch { OutputWindow.Show( OutputLevel.Critical, "Error with your `forceBaseDirectory` setting", [ - `Path is not a folder: ${basePath}`, + `Can not find path: ${basePath}`, `Setting: "${forceBaseDirectory}"`, `Workspace folder: ${folder.name}`, ] @@ -1018,62 +1121,59 @@ export class AppModel { return null; } - } catch { + OutputWindow.Show( - OutputLevel.Critical, - "Error with your `forceBaseDirectory` setting", - [ - `Can not find path: ${basePath}`, - `Setting: "${forceBaseDirectory}"`, - `Workspace folder: ${folder.name}`, - ] + OutputLevel.Trace, + "No problem with path, changing from workspace folder", + [`New folder: ${basePath}`] ); + } else { + OutputWindow.Show( + OutputLevel.Trace, + "No base folder override found. Keeping workspace folder" + ); + } - return null; + if (!isDebugging) { + // Add partials to excludedItems + excludedItems.push( + ...AppModel.stripAnyLeadingSlashes( + SettingsHelper.getConfigSettings< + string[] + >("partialsList", folder) + ) + ); } - OutputWindow.Show( - OutputLevel.Trace, - "No problem with path, changing from workspace folder", - [`New folder: ${basePath}`] - ); - } else { - OutputWindow.Show( - OutputLevel.Trace, - "No base folder override found. Keeping workspace folder" + const isMatch = picomatch( + queryPattern || ["**/*.s[ac]ss"], + { + ignore: excludedItems, + dot: true, + nocase: true, + } ); - } - if (!isDebugging) { - // Add partials to excludedItems - excludedItems.push( - ...AppModel.stripAnyLeadingSlashes( - SettingsHelper.getConfigSettings("partialsList", folder) + return new fdir({ + includeBasePath: true, + resolvePaths: true, + suppressErrors: true, + }) + .filter( + (filePath) => + filePath + .toLowerCase() + .endsWith(".scss") || + filePath.toLowerCase().endsWith(".sass") ) - ); + .filter((filePath) => + isMatch(path.relative(basePath, filePath)) + ) + .withBasePath() + .crawl(basePath) + .withPromise(); } - - const isMatch = picomatch(queryPattern || ["**/*.s[ac]ss"], { - ignore: excludedItems, - dot: true, - nocase: true, - }); - - return new fdir({ - includeBasePath: true, - resolvePaths: true, - suppressErrors: true, - }) - .filter( - (filePath) => - filePath.toLowerCase().endsWith(".scss") || - filePath.toLowerCase().endsWith(".sass") - ) - .filter((filePath) => isMatch(path.relative(basePath, filePath))) - .withBasePath() - .crawl(basePath) - .withPromise(); - }) + ) ) ).forEach((files) => { files?.forEach((file) => { @@ -1093,7 +1193,10 @@ export class AppModel { } } - OutputWindow.Show(OutputLevel.Trace, `Found ${fileList.length} SASS files`); + OutputWindow.Show( + OutputLevel.Trace, + `Found ${fileList.length} SASS files` + ); return fileList; } @@ -1135,14 +1238,20 @@ export class AppModel { OutputWindow.Show(OutputLevel.Critical, "Not a Sass file", [ "The file currently open in the editor window isn't a sass file", ]); - } else if (await this.isSassFileExcluded(sassPath, workspaceFolder)) { + } else if ( + await this.isSassFileExcluded(sassPath, workspaceFolder) + ) { OutputWindow.Show(OutputLevel.Critical, "File excluded", [ "The file is excluded based on your settings, please check your configuration", ]); } else { - OutputWindow.Show(OutputLevel.Critical, "File should get processed", [ - "If the file isn't being processed, run `liveSass.command.debugFileList`", - ]); + OutputWindow.Show( + OutputLevel.Critical, + "File should get processed", + [ + "If the file isn't being processed, run `liveSass.command.debugFileList`", + ] + ); } } catch (err) { const sassPath = vscode.window.activeTextEditor @@ -1200,75 +1309,90 @@ export class AppModel { }); await Promise.all( - vscode.workspace.workspaceFolders!.map(async (folder, index) => { - const folderOutput: string[] = []; - - folderOutput.push( - "--------------------", - `Checking workspace folder ${index + 1} of ${workspaceCount}`, - `Path: ${folder.uri.fsPath}`, - "--------------------" - ); + vscode.workspace.workspaceFolders!.map( + async (folder, index) => { + const folderOutput: string[] = []; + + folderOutput.push( + "--------------------", + `Checking workspace folder ${ + index + 1 + } of ${workspaceCount}`, + `Path: ${folder.uri.fsPath}`, + "--------------------" + ); - const exclusionList = SettingsHelper.getConfigSettings( - "excludeList", - folder - ); + const exclusionList = + SettingsHelper.getConfigSettings( + "excludeList", + folder + ); - folderOutput.push( - "--------------------", - "Current Include/Exclude Settings", - "--------------------", - `Include: [ ${SettingsHelper.getConfigSettings( - "includeItems", - folder - )?.join(", ") ?? "NULL" - } ]`, - `Exclude: [ ${exclusionList.join(", ")} ]` - ); + folderOutput.push( + "--------------------", + "Current Include/Exclude Settings", + "--------------------", + `Include: [ ${ + SettingsHelper.getConfigSettings< + string[] | null + >("includeItems", folder)?.join(", ") ?? + "NULL" + } ]`, + `Exclude: [ ${exclusionList.join(", ")} ]` + ); - folderOutput.push( - "--------------------", - "Included SASS Files", - "--------------------" - ); - (await this.getSassFiles()).map((file) => { - folderOutput.push(file); - }); - - folderOutput.push( - "--------------------", - "Included Partial SASS Files", - "--------------------" - ); - ( - await this.getSassFiles( - SettingsHelper.getConfigSettings("partialsList", folder), - true - ) - ).map((file) => { - folderOutput.push(file); - }); - - folderOutput.push( - "--------------------", - "Excluded SASS Files", - "--------------------" - ); - if (exclusionList.length > 0) { - (await this.getSassFiles(exclusionList, true)).map((file) => { + folderOutput.push( + "--------------------", + "Included SASS Files", + "--------------------" + ); + (await this.getSassFiles()).map((file) => { folderOutput.push(file); }); - } else { - folderOutput.push("NONE"); - } - outputInfo.push(...folderOutput); - }) + folderOutput.push( + "--------------------", + "Included Partial SASS Files", + "--------------------" + ); + ( + await this.getSassFiles( + SettingsHelper.getConfigSettings( + "partialsList", + folder + ), + true + ) + ).map((file) => { + folderOutput.push(file); + }); + + folderOutput.push( + "--------------------", + "Excluded SASS Files", + "--------------------" + ); + if (exclusionList.length > 0) { + ( + await this.getSassFiles(exclusionList, true) + ).map((file) => { + folderOutput.push(file); + }); + } else { + folderOutput.push("NONE"); + } + + outputInfo.push(...folderOutput); + } + ) ); } - OutputWindow.Show(OutputLevel.Critical, "Extension Info", outputInfo); + OutputWindow.Show( + OutputLevel.Critical, + "Extension Info", + outputInfo + ); } catch (err) { const sassPath = vscode.window.activeTextEditor ? vscode.window.activeTextEditor.document.fileName @@ -1314,7 +1438,10 @@ export class AppModel { }); } - private static getWorkspaceFolder(filePath: string, suppressOutput = false) { + private static getWorkspaceFolder( + filePath: string, + suppressOutput = false + ) { const workspaceFolder = vscode.workspace.getWorkspaceFolder( vscode.Uri.file(filePath) ); @@ -1323,10 +1450,15 @@ export class AppModel { const filename = filePath.toLowerCase(); if (workspaceFolder) { - OutputWindow.Show(OutputLevel.Trace, "Found the workspace folder", [ - `Workspace Name: ${workspaceFolder.name}`, - ]); - } else if (filename.endsWith(".sass") || filename.endsWith(".scss")) { + OutputWindow.Show( + OutputLevel.Trace, + "Found the workspace folder", + [`Workspace Name: ${workspaceFolder.name}`] + ); + } else if ( + filename.endsWith(".sass") || + filename.endsWith(".scss") + ) { OutputWindow.Show( OutputLevel.Warning, "Warning: File is not in a workspace", diff --git a/src/extension.test.ts b/src/extension.test.ts new file mode 100644 index 0000000..d7854f2 --- /dev/null +++ b/src/extension.test.ts @@ -0,0 +1,76 @@ +import * as assert from "assert"; +import * as vscode from "vscode"; + +suite("Extension Tests", function () { + const ext = vscode.extensions.getExtension("glenn2223.live-sass"); + + test("Is present", () => { + assert.ok(ext); + }); + + test("Is active", () => { + assert.ok(ext?.isActive); + }); + + test("All live sass commands registered", async () => { + const expectedCommands = [ + "liveSass.command.watchMySass", + "liveSass.command.donotWatchMySass", + "liveSass.command.compileCurrentSass", + "liveSass.command.oneTimeCompileSass", + "liveSass.command.openOutputWindow", + "liveSass.command.createIssue", + "liveSass.command.debugInclusion", + "liveSass.command.debugFileList", + "liveSass.command.showOutputOn.trace", + "liveSass.command.showOutputOn.debug", + "liveSass.command.showOutputOn.information", + "liveSass.command.showOutputOn.warning", + "liveSass.command.showOutputOn.error", + "liveSass.command.showOutputOn.none", + ], + actualCommands = await vscode.commands.getCommands(true); + const foundLiveServerCommands = actualCommands.filter((value) => { + return ( + expectedCommands.indexOf(value) >= 0 || + value.startsWith("liveSass.command.") + ); + }); + + assert.deepEqual( + foundLiveServerCommands.sort(), + expectedCommands.sort() + ); + }); + + test("VS Code save generates files", async () => { + const expectedFiles = [ + vscode.Uri.file("css/sample.scss"), + vscode.Uri.file("css/sample.css.map"), + vscode.Uri.file("css/sample.css"), + ].map((file) => + vscode.Uri.joinPath( + vscode.workspace.workspaceFolders![0].uri, + file.path + ).path.toLowerCase() + ), + // Open a file + doc = await vscode.window.showTextDocument( + ( + await vscode.workspace.findFiles("css/**") + )[0] + ); + + // Save the file + if (!(await doc.document.save())) { + assert.ok(false, "Save failed"); + } + + // Get the folders files + const actualFiles = (await vscode.workspace.findFiles("css/**")).map( + (file) => file.path.toLowerCase() + ); + + assert.deepEqual(actualFiles.sort(), expectedFiles.sort()); + }); +}); diff --git a/src/test/clean.js b/src/test/clean.js new file mode 100644 index 0000000..4087ed2 --- /dev/null +++ b/src/test/clean.js @@ -0,0 +1,40 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +var fs = require("fs"); + +function deleteFolderRecursive(path) { + if (!fs.existsSync(path)) { + return console.log(`${path} does not exist!`); + } + + if (fs.existsSync(path) && fs.lstatSync(path).isDirectory()) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + fs.readdirSync(path).forEach(function (file, _index) { + var curPath = path + "/" + file; + + if (fs.lstatSync(curPath).isDirectory()) { + // recurse + deleteFolderRecursive(curPath); + } else { + // delete file + fs.unlinkSync(curPath); + } + }); + + console.log(`Deleting directory "${path}"...`); + fs.rmdirSync(path); + } +} + +var pathArgs = process.argv.slice(2); + +if (pathArgs.length < 1) { + return console.warn( + "Please enter paths as arguments, for the folders you want to delete recursively. \nExample script invokation: node scripts/clean.js ./release" + ); +} + +console.log("Cleaning working tree..."); + +pathArgs.forEach((pathToDelete) => deleteFolderRecursive(pathToDelete)); + +console.log("Successfully cleaned working tree!"); diff --git a/src/test/extension.test.ts b/src/test/extension.test.ts deleted file mode 100644 index 1afdd9a..0000000 --- a/src/test/extension.test.ts +++ /dev/null @@ -1,72 +0,0 @@ -import * as assert from "assert"; -import * as vscode from "vscode"; - -suite("Extension Tests", function () { - test("Extension should be present", () => { - assert.ok(vscode.extensions.getExtension("glenn2223.live-sass")); - }); - - test("Extension should activate", () => { - assert.ok(vscode.extensions.getExtension("glenn2223.live-sass").isActive); - }); - - test("should register all live sass commands", async () => { - const commands = await vscode.commands.getCommands(true); - const COMMANDS = [ - "liveSass.command.watchMySass", - "liveSass.command.donotWatchMySass", - "liveSass.command.compileCurrentSass", - "liveSass.command.oneTimeCompileSass", - "liveSass.command.openOutputWindow", - "liveSass.command.createIssue", - "liveSass.command.debugInclusion", - "liveSass.command.debugFileList", - "liveSass.command.showOutputOn.trace", - "liveSass.command.showOutputOn.debug", - "liveSass.command.showOutputOn.information", - "liveSass.command.showOutputOn.warning", - "liveSass.command.showOutputOn.error", - "liveSass.command.showOutputOn.none", - ]; - const foundLiveServerCommands = commands.filter((value) => { - return COMMANDS.indexOf(value) >= 0 || value.startsWith("liveSass.command."); - }); - assert.strictEqual(foundLiveServerCommands.length, COMMANDS.length); - }); - - test("Save should ouput default files", async () => { - const actual = [ - vscode.Uri.file("css/sample.scss"), - vscode.Uri.file("css/sample.css"), - vscode.Uri.file("css/sample.css.map"), - ].map( - (file) => - vscode.Uri.joinPath(vscode.workspace.workspaceFolders[0].uri, file.path).path - ), - doc = await vscode.workspace.openTextDocument( - ( - await vscode.workspace.findFiles("css/**") - )[0] - ); - - await vscode.commands.executeCommand("liveSass.command.watchMySass"); - - if (!(await doc.save())) { - assert.ok(false, "Save failed"); - } - - await new Promise((resolve) => setTimeout(resolve, 1000)); - - const docs = (await vscode.workspace.findFiles("css/**")).map((file) => file.path); - - console.log("Docs:", docs); - - assert.strictEqual(docs, actual); - }); - - // TODO: increase tests for the following - // testing forceBaseDirectory - // testing autoprefixer - // more known features - // (so future changes don't break something they shouldn't) -}); diff --git a/src/test/index.ts b/src/test/index.ts index e99e661..69c3c16 100644 --- a/src/test/index.ts +++ b/src/test/index.ts @@ -1,6 +1,6 @@ import * as path from "path"; -import * as Mocha from "mocha"; -import * as glob from "glob"; +import Mocha from "mocha"; +import { glob } from "glob"; export function run(): Promise { // Create the mocha test @@ -9,30 +9,29 @@ export function run(): Promise { color: true, }); - const testsRoot = path.resolve(__dirname, ".."); + const testsRoot = path.resolve(__dirname, "../.."); return new Promise((c, e) => { - glob("**/**.test.js", { cwd: testsRoot }, (err, files) => { - if (err) { - return e(err); - } - - // Add files to the test suite - files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); + glob("**/**.test.js", { cwd: testsRoot }) + .then((files) => { + // Add files to the test suite + files.forEach((f) => mocha.addFile(path.resolve(testsRoot, f))); - try { - // Run the mocha test - mocha.run((failures) => { - if (failures > 0) { - e(new Error(`${failures} tests failed.`)); - } else { - c(); - } - }); - } catch (err) { - console.error(err); - e(err); - } - }); + try { + // Run the mocha test + mocha.run((failures) => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + e(err); + } + }) + .catch((err) => { + return e(err); + }); }); } diff --git a/src/test/runTest.ts b/src/test/runTest.ts index 62e6c74..847e1db 100644 --- a/src/test/runTest.ts +++ b/src/test/runTest.ts @@ -1,13 +1,14 @@ import * as path from "path"; -import { runTests } from "vscode-test"; +import { runTests } from "@vscode/test-electron"; async function main() { try { - const extensionDevelopmentPath = path.resolve(__dirname, ".."); - const extensionTestsPath = __dirname; - const testWorkspace = path.resolve(__dirname, "../../src/test/sample"); + const extensionDevelopmentPath = path.resolve(__dirname, "../.."), + extensionTestsPath = __dirname, + testWorkspace = path.resolve(__dirname, "../../src/test/sample"); + // Download VS Code, unzip it and run the integration test await runTests({ extensionDevelopmentPath, extensionTestsPath, diff --git a/src/test/tsconfig.json b/src/test/tsconfig.json deleted file mode 100644 index 317e0f7..0000000 --- a/src/test/tsconfig.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "es6", - "outDir": "../../out/test", - "lib": [ - "es6", - "es5" - ], - "sourceMap": true, - "rootDir": "./" - }, - - "include": ["./*"], - "exclude": [ - "node_modules", - "lib", - "_site" - ] -} \ No newline at end of file diff --git a/src/tsconfig.rollup.json b/src/tsconfig.rollup.json new file mode 100644 index 0000000..46403c1 --- /dev/null +++ b/src/tsconfig.rollup.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "module": "ESNext", + "target": "es6", + "outDir": "../out", + "lib": [ + "es6", + "es5" + ], + "sourceMap": true, + "esModuleInterop": true, + "strict": true, + "moduleResolution": "node", + "rootDir": "./", + }, + "include": [ + "./extension.ts" + ], + "exclude": [ + "node_modules", + ] +} \ No newline at end of file diff --git a/src/tsconfig.tests.json b/src/tsconfig.tests.json new file mode 100644 index 0000000..3dded3f --- /dev/null +++ b/src/tsconfig.tests.json @@ -0,0 +1,20 @@ +{ + "compilerOptions": { + "module": "commonjs", + "target": "es2020", + "lib": [ + "es2020" + ], + "sourceMap": true, + "outDir": "../out", + "rootDir": "./", + "esModuleInterop": true, + }, + "include": [ + "./test/*.ts", + "./**/*.test.ts", + ], + "exclude": [ + "node_modules", + ] +} \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 1e51906..4924e52 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,14 +2,22 @@ "compilerOptions": { "module": "ESNext", "target": "es6", - "outDir": "out", - "lib": ["es6", "es5"], + "lib": [ + "es6", + "es5" + ], "sourceMap": true, - "rootDir": "./", "esModuleInterop": true, "strict": true, "moduleResolution": "node" }, - - "exclude": ["node_modules", "lib", "_site", "./src/test/**/*"] -} + "include": [ + "./*.ts" + ], + "exclude": [ + "node_modules", + "lib", + "_site", + "./src/**/*" + ] +} \ No newline at end of file From 3b83e115d915291411f9d473594d7d2ea14c86a0 Mon Sep 17 00:00:00 2001 From: glen2223 <33450392+glenn2223@users.noreply.github.com> Date: Fri, 11 Oct 2024 00:11:59 +0100 Subject: [PATCH 2/8] Add missing: actions/checkout Added a missing call for `actions/checkout@v4` --- .github/workflows/test.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 189ba3c..4bdf05d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,6 +12,8 @@ jobs: os: [macos-latest, ubuntu-latest, windows-latest] runs-on: ${{ matrix.os }} steps: + - uses: actions/checkout@v4 + - name: Install Node.js uses: actions/setup-node@v4 with: From 097f54fe984b5933810f75291bfb09aff93af5a7 Mon Sep 17 00:00:00 2001 From: glen2223 <33450392+glenn2223@users.noreply.github.com> Date: Fri, 11 Oct 2024 00:33:37 +0100 Subject: [PATCH 3/8] Test tweaking --- .github/workflows/test.yml | 7 ++++--- src/Helpers/SassHelper.test.ts | 4 ++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4bdf05d..bfbac57 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -12,7 +12,8 @@ jobs: os: [macos-latest, ubuntu-latest, windows-latest] runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 - name: Install Node.js uses: actions/setup-node@v4 @@ -30,10 +31,10 @@ jobs: if: runner.os != 'Linux' run: npm test - - name: Ensure prePUblish script is working + - name: Ensure prePublish script is working if: runner.os != 'Linux' run: npm run prePublish - - name: Ensure prePUblish script is working + - name: Ensure prePublish script is working if: runner.os == 'Linux' run: xvfb-run -a npm run prePublish diff --git a/src/Helpers/SassHelper.test.ts b/src/Helpers/SassHelper.test.ts index b5b10f6..333feee 100644 --- a/src/Helpers/SassHelper.test.ts +++ b/src/Helpers/SassHelper.test.ts @@ -11,6 +11,8 @@ suite("SassHelper Tests", function () { style: "compressed", }); + assert.equal(actualObj.errorString, null); + assert.equal(actualObj.result?.css, expected); }); @@ -23,6 +25,8 @@ suite("SassHelper Tests", function () { style: "expanded", }); + assert.equal(actualObj.errorString, null); + assert.equal(actualObj.result?.css, expected); }); }); From 7d6f2e144528256e7dde27942f523c3a2111593d Mon Sep 17 00:00:00 2001 From: glen2223 <33450392+glenn2223@users.noreply.github.com> Date: Fri, 11 Oct 2024 00:38:22 +0100 Subject: [PATCH 4/8] Test tweaks --- src/Helpers/SassHelper.test.ts | 8 ++++++++ src/Helpers/SassHelper.ts | 5 ++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/Helpers/SassHelper.test.ts b/src/Helpers/SassHelper.test.ts index 333feee..664cc94 100644 --- a/src/Helpers/SassHelper.test.ts +++ b/src/Helpers/SassHelper.test.ts @@ -11,6 +11,10 @@ suite("SassHelper Tests", function () { style: "compressed", }); + if (actualObj.errorString) { + console.log("Compile error:", actualObj.errorString); + } + assert.equal(actualObj.errorString, null); assert.equal(actualObj.result?.css, expected); @@ -25,6 +29,10 @@ suite("SassHelper Tests", function () { style: "expanded", }); + if (actualObj.errorString) { + console.log("Compile error:", actualObj.errorString); + } + assert.equal(actualObj.errorString, null); assert.equal(actualObj.result?.css, expected); diff --git a/src/Helpers/SassHelper.ts b/src/Helpers/SassHelper.ts index 3957aaa..d5abbec 100644 --- a/src/Helpers/SassHelper.ts +++ b/src/Helpers/SassHelper.ts @@ -97,7 +97,10 @@ export class SassHelper { }; } catch (err) { if (err instanceof Error) { - return { result: null, errorString: err.message }; + return { + result: null, + errorString: err.name + ": " + err.message, + }; } return { result: null, errorString: "Unexpected error" }; From 2ab851436227012a22aaa7c89e8045704592ce5f Mon Sep 17 00:00:00 2001 From: glen2223 <33450392+glenn2223@users.noreply.github.com> Date: Fri, 11 Oct 2024 01:02:51 +0100 Subject: [PATCH 5/8] Test tweaks --- src/Helpers/SassHelper.test.ts | 24 ++++++++++++++++++++++++ src/Helpers/SassHelper.ts | 4 +++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/Helpers/SassHelper.test.ts b/src/Helpers/SassHelper.test.ts index 664cc94..ff99da5 100644 --- a/src/Helpers/SassHelper.test.ts +++ b/src/Helpers/SassHelper.test.ts @@ -1,5 +1,27 @@ import * as assert from "assert"; import { SassHelper } from "./SassHelper"; +import { Logger } from "sass-embedded"; + +const loggerProperty: Logger = { + warn: (message, options) => { + console.warn( + "Warning:", + [message].concat( + SassHelper.format( + options.span, + options.stack, + options.deprecation + ) + ) + ); + }, + debug: (message, options) => { + console.debug( + "Debug info:", + [message].concat(SassHelper.format(options.span)) + ); + }, +}; suite("SassHelper Tests", function () { console.log("Current dir:", __dirname); @@ -9,6 +31,7 @@ suite("SassHelper Tests", function () { expected = ".Sample{color:#000}", actualObj = await SassHelper.compileOneAsync(input, "input.scss", { style: "compressed", + logger: loggerProperty, }); if (actualObj.errorString) { @@ -27,6 +50,7 @@ suite("SassHelper Tests", function () { } `, actualObj = await SassHelper.compileOneAsync(input, "input.scss", { style: "expanded", + logger: loggerProperty, }); if (actualObj.errorString) { diff --git a/src/Helpers/SassHelper.ts b/src/Helpers/SassHelper.ts index d5abbec..4723c7e 100644 --- a/src/Helpers/SassHelper.ts +++ b/src/Helpers/SassHelper.ts @@ -97,6 +97,8 @@ export class SassHelper { }; } catch (err) { if (err instanceof Error) { + console.log("Error:", err.message, err); + return { result: null, errorString: err.name + ": " + err.message, @@ -168,7 +170,7 @@ export class SassHelper { return null; } - private static format( + static format( span: SourceSpan | undefined | null, stack?: string, deprecated?: boolean From baac4c4ed2cbb078195503bc1018b9e93b37b28c Mon Sep 17 00:00:00 2001 From: glen2223 <33450392+glenn2223@users.noreply.github.com> Date: Fri, 18 Oct 2024 22:17:27 +0100 Subject: [PATCH 6/8] Final test fixes --- .github/workflows/test.yml | 7 +++++-- src/Helpers/SassHelper.test.ts | 12 ++++++++---- src/extension.test.ts | 14 ++++++++++++++ 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index bfbac57..0f45bad 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -5,6 +5,9 @@ on: branches: - "**" + # ALLOW MANUAL RUNS + workflow_dispatch: + jobs: build: strategy: @@ -33,8 +36,8 @@ jobs: - name: Ensure prePublish script is working if: runner.os != 'Linux' - run: npm run prePublish + run: npm run vscode:prepublish - name: Ensure prePublish script is working if: runner.os == 'Linux' - run: xvfb-run -a npm run prePublish + run: xvfb-run -a npm run vscode:prepublish diff --git a/src/Helpers/SassHelper.test.ts b/src/Helpers/SassHelper.test.ts index ff99da5..3a76839 100644 --- a/src/Helpers/SassHelper.test.ts +++ b/src/Helpers/SassHelper.test.ts @@ -1,6 +1,7 @@ import * as assert from "assert"; -import { SassHelper } from "./SassHelper"; import { Logger } from "sass-embedded"; +import path from "path"; +import { SassHelper } from "./SassHelper"; const loggerProperty: Logger = { warn: (message, options) => { @@ -24,10 +25,13 @@ const loggerProperty: Logger = { }; suite("SassHelper Tests", function () { - console.log("Current dir:", __dirname); + const filePath = path.resolve( + __dirname, + "../../src/test/sample/css/sample.scss" + ); test("Simple compressed test", async () => { - const input = "../../src/test/sample/css/sample.css", + const input = filePath, expected = ".Sample{color:#000}", actualObj = await SassHelper.compileOneAsync(input, "input.scss", { style: "compressed", @@ -44,7 +48,7 @@ suite("SassHelper Tests", function () { }); test("Simple expanded test", async () => { - const input = "../../src/test/sample/css/sample.css", + const input = filePath, expected = `.Sample { color: #000; } `, diff --git a/src/extension.test.ts b/src/extension.test.ts index d7854f2..0e25b48 100644 --- a/src/extension.test.ts +++ b/src/extension.test.ts @@ -61,16 +61,30 @@ suite("Extension Tests", function () { )[0] ); + doc.edit((edit) => { + edit.insert(new vscode.Position(2, 1), " "); + }); + // Save the file if (!(await doc.document.save())) { assert.ok(false, "Save failed"); } + // Wait .2 seconds to allow save success + await new Promise((resolve) => setTimeout(resolve, 200)); + // Get the folders files const actualFiles = (await vscode.workspace.findFiles("css/**")).map( (file) => file.path.toLowerCase() ); assert.deepEqual(actualFiles.sort(), expectedFiles.sort()); + + // Revert change + await doc.edit((edit) => + edit.replace(new vscode.Range(2, 0, 2, 2), "}") + ); + + await doc.document.save(); }); }); From 2f0796ef10c944110cdc622a632cca7cfb336027 Mon Sep 17 00:00:00 2001 From: glen2223 <33450392+glenn2223@users.noreply.github.com> Date: Fri, 18 Oct 2024 22:28:52 +0100 Subject: [PATCH 7/8] Removed test actual typo --- src/Helpers/SassHelper.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Helpers/SassHelper.test.ts b/src/Helpers/SassHelper.test.ts index 3a76839..f816c2b 100644 --- a/src/Helpers/SassHelper.test.ts +++ b/src/Helpers/SassHelper.test.ts @@ -51,7 +51,7 @@ suite("SassHelper Tests", function () { const input = filePath, expected = `.Sample { color: #000; -} `, +}`, actualObj = await SassHelper.compileOneAsync(input, "input.scss", { style: "expanded", logger: loggerProperty, From 94ce36e94d7bfbdf09421718655d45315619de3f Mon Sep 17 00:00:00 2001 From: glen2223 <33450392+glenn2223@users.noreply.github.com> Date: Fri, 18 Oct 2024 22:38:56 +0100 Subject: [PATCH 8/8] Corrections & more time - Corrected internal VS task - Gave more time to a test, so it can succeed --- .vscode/launch.json | 2 +- src/extension.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.vscode/launch.json b/.vscode/launch.json index 4764d71..8c841c6 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -12,7 +12,7 @@ ], "sourceMaps": true, "outFiles": [ - "${workspaceRoot}/lib/**/*" + "${workspaceRoot}/**/*.{t,j}s" ], "preLaunchTask": "npm: vscode:prepublish" }, diff --git a/src/extension.test.ts b/src/extension.test.ts index 0e25b48..2137b11 100644 --- a/src/extension.test.ts +++ b/src/extension.test.ts @@ -70,8 +70,8 @@ suite("Extension Tests", function () { assert.ok(false, "Save failed"); } - // Wait .2 seconds to allow save success - await new Promise((resolve) => setTimeout(resolve, 200)); + // Wait .4 seconds to allow save success + await new Promise((resolve) => setTimeout(resolve, 400)); // Get the folders files const actualFiles = (await vscode.workspace.findFiles("css/**")).map(