├── .eslintrc.json ├── .github ├── FUNDING.yml └── workflows │ ├── main.yml │ └── pullrequest.yml ├── .gitignore ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── images ├── FormatSelection.png ├── Minimize.gif ├── Prettify.gif ├── after.png ├── before.png ├── logo.png ├── old_logo.png ├── screenshot.png └── settings.png ├── lib ├── XmlFormatter.CommandLine.deps.json ├── XmlFormatter.CommandLine.dll ├── XmlFormatter.CommandLine.exe ├── XmlFormatter.CommandLine.pdb ├── XmlFormatter.CommandLine.runtimeconfig.json ├── XmlFormatter.dll └── XmlFormatter.pdb ├── package.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── src ├── documentFilter.ts ├── documentHelper.ts ├── extension.ts ├── formatter.ts ├── formattingActionKind.ts ├── helper.ts ├── jsonInputDto.ts ├── logger.ts ├── notificationService.ts ├── prettyXmlFormattingEditProvider.ts ├── rangeFormatterProvider.ts ├── regexFormatter.ts ├── settings.ts ├── test │ └── runTest.ts └── updateNote.ts ├── tsconfig.json └── webpack.config.js /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "root": true, 3 | "parser": "@typescript-eslint/parser", 4 | "parserOptions": { 5 | "ecmaVersion": 6, 6 | "sourceType": "module" 7 | }, 8 | "plugins": [ 9 | "@typescript-eslint" 10 | ], 11 | "rules": { 12 | "@typescript-eslint/naming-convention": "warn", 13 | "@typescript-eslint/semi": "warn", 14 | "curly": "warn", 15 | "eqeqeq": "warn", 16 | "no-throw-literal": "warn", 17 | "semi": "off" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: prateekmahendrakar 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: prateek 10 | issuehunt: # Replace with a single IssueHunt username 11 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 12 | polar: # Replace with a single Polar username 13 | buy_me_a_coffee: pmahend1 14 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 15 | -------------------------------------------------------------------------------- /.github/workflows/main.yml: -------------------------------------------------------------------------------- 1 | name: Deploy CI 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | shouldPublishToVSMarketPlace: 7 | description: "Publish to Visual Studio MarketPlace?" 8 | type: boolean 9 | default: true 10 | shouldPublishToOpenVsx: 11 | description: "Publish to Open-VSX?" 12 | type: boolean 13 | default: true 14 | 15 | jobs: 16 | deploy: 17 | runs-on: windows-latest 18 | steps: 19 | - name: Checkout 20 | uses: actions/checkout@v4.2.2 21 | 22 | - name: Setup Node.js environment 23 | uses: actions/setup-node@v4.3.0 24 | with: 25 | node-version: 22 26 | 27 | - name: Setup pnpm 28 | uses: pnpm/action-setup@v4 29 | with: 30 | version: 10 31 | run_install: true 32 | 33 | - name: Install vsce and open vsx 34 | run: | 35 | pnpm add -g @vscode/vsce 36 | pnpm add -g ovsx 37 | 38 | - name: Pack vsix 39 | id: pack 40 | run: | 41 | vsce pack --no-dependencies 42 | $VsixName = Get-ChildItem -Filter *.vsix | Select-Object -First 1 -ExpandProperty Name 43 | Write-Host "`$VsixName = $VsixName" 44 | "VSIX_FILENAME=$VsixName" >> $env:GITHUB_OUTPUT 45 | 46 | - name: VSCE Publish 47 | if: ${{ inputs.shouldPublishToVSMarketPlace }} 48 | run: | 49 | Write-Host "Running vsce publish --packagePath ${{ steps.pack.outputs.VSIX_FILENAME }} --pat `$env:VSCE_PAT" 50 | vsce publish --packagePath ${{ steps.pack.outputs.VSIX_FILENAME }} --pat $env:VSCE_PAT 51 | env: 52 | VSCE_PAT: ${{ secrets.VSCE_PRETTYXML }} 53 | 54 | - name: Open VSX Publish 55 | if: ${{ inputs.shouldPublishToOpenVsx }} 56 | run: | 57 | Write-Host "Running npx ovsx publish --packagePath ${{ steps.pack.outputs.VSIX_FILENAME }} --pat `$env:OPEN_VSX_PAT" 58 | npx ovsx publish --packagePath ${{ steps.pack.outputs.VSIX_FILENAME }} --pat $env:OPEN_VSX_PAT 59 | env: 60 | OPEN_VSX_PAT: ${{ secrets.OPENVSX }} -------------------------------------------------------------------------------- /.github/workflows/pullrequest.yml: -------------------------------------------------------------------------------- 1 | name: Version Check 2 | 3 | on: 4 | pull_request: 5 | branches: 6 | - main 7 | workflow_dispatch: 8 | 9 | jobs: 10 | versioncheck: 11 | runs-on: windows-latest 12 | steps: 13 | - name: Checkout branch 14 | uses: actions/checkout@v4.2.2 15 | 16 | - name: "Get changed files" 17 | id: getChangedFiles 18 | uses: jitterbit/get-changed-files@v1 19 | with: 20 | format: "json" 21 | 22 | - name: "Verify ChangeLog.md and package.json files have changes" 23 | shell: pwsh 24 | run: | 25 | $fileFilters=@('package.json', 'CHANGELOG*') 26 | $changesJson='${{ steps.getChangedFiles.outputs.all }}' 27 | $changes=ConvertFrom-Json -InputObject $changesJson 28 | foreach ($filter in $fileFilters) { 29 | if ($changes -match $filter){ 30 | Write-Host "$filter file is modified." 31 | } else { 32 | throw [System.Exception]("Files with filter $filter are not modified. ❌") 33 | } 34 | } 35 | Write-Host "Pass ✅" 36 | 37 | - name: Get current version from package.json 38 | id: getpackageversion 39 | shell: pwsh 40 | run: | 41 | $package = Get-Content .\package.json | ConvertFrom-Json 42 | $version = $package.version 43 | Write-Host 'Current version from package.json: ' $version 44 | "VERSION=$version" >> $env:GITHUB_OUTPUT 45 | 46 | - name: Get published version from VS Code extension REST API 47 | id: getPublishedVersion 48 | shell: pwsh 49 | run: | 50 | $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]" 51 | $headers.Add("VSMarketplaceBadge", "1.0") 52 | $headers.Add("Accept", "application/json;api-version=3.0-preview.1") 53 | $headers.Add("Content-Type", "application/json") 54 | $body = "{`"filters`":[{`"criteria`":[{`"filterType`":7,`"value`":`"PrateekMahendrakar.PrettyXML`"},{`"filterType`":12,`"value`":4096}]}],`"flags`":914}" 55 | $response = Invoke-RestMethod 'https://marketplace.visualstudio.com/_apis/public/gallery/extensionquery' -Method Post -Headers $headers -Body $body 56 | $publishedVersion= ($response.results[0].extensions.versions.version).ToString() 57 | Write-Host 'Last Published version: '$publishedVersion 58 | "PUB_VERSION=$publishedVersion" >> $env:GITHUB_OUTPUT 59 | 60 | - name: Compare local version with marketplace version 61 | id: compare 62 | shell: pwsh 63 | run: | 64 | $localVersion = [System.Version]('${{ steps.getpackageversion.outputs.VERSION }}') 65 | $storeVersion = [System.Version]('${{ steps.getPublishedVersion.outputs.PUB_VERSION }}') 66 | 67 | if ($localVersion -gt $storeVersion) { 68 | Write-Host "Version in package.json is higher than latest published version" 69 | Write-Host "Pass" 70 | } 71 | else { 72 | throw [System.Exception]("Version can not be same as latest published version ❌! Update package version.") 73 | } 74 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/* 2 | out 3 | .vscode-test/ 4 | *.vsix 5 | *.DS_Store 6 | -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "dbaeumer.vscode-eslint", 6 | "connor4312.esbuild-problem-matchers" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Run Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "runtimeExecutable": "${execPath}", 13 | "args": [ 14 | "--extensionDevelopmentPath=${workspaceFolder}" 15 | ], 16 | "outFiles": [ 17 | "${workspaceFolder}/out/**/*.js" 18 | ], 19 | "preLaunchTask": "${defaultBuildTask}" 20 | }, 21 | { 22 | "name": "Extension Tests", 23 | "type": "extensionHost", 24 | "request": "launch", 25 | "runtimeExecutable": "${execPath}", 26 | "args": [ 27 | "--extensionDevelopmentPath=${workspaceFolder}", 28 | "--extensionTestsPath=${workspaceFolder}/out/test/suite/index" 29 | ], 30 | "outFiles": [ 31 | "${workspaceFolder}/out/test/**/*.js" 32 | ], 33 | "preLaunchTask": "${defaultBuildTask}" 34 | } 35 | ] 36 | } 37 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | // Place your settings in this file to overwrite default and user settings. 2 | { 3 | "files.exclude": { 4 | "out": false // set this to true to hide the "out" folder with the compiled JS files 5 | }, 6 | "search.exclude": { 7 | "out": true // set this to false to include "out" folder in search results 8 | }, 9 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts 10 | "typescript.tsc.autoDetect": "off" 11 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "type": "npm", 8 | "script": "watch", 9 | "problemMatcher": "$ts-checker-webpack-watch",//amodio.tsl-problem-matcher 10 | "isBackground": true, 11 | "label": "npm: watch", 12 | "presentation": { 13 | "reveal": "silent", 14 | "showReuseMessage": true, 15 | "panel": "dedicated" 16 | }, 17 | "group": { 18 | "kind": "build", 19 | "isDefault": true 20 | } 21 | } 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/test/** 4 | src/** 5 | .gitignore 6 | vsc-extension-quickstart.md 7 | **/tsconfig.json 8 | **/tslint.json 9 | **/.eslintrc.json 10 | **/*.map 11 | **/*.ts 12 | node_modules 13 | webpack.config.js 14 | *.yml 15 | .github/** 16 | images/old_logo.png -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## Stable 4 | 5 | ## 6.1.0: 21-May-2025 6 | 7 | - Fixed processing instruction not formatting correctly. 8 | - Package updates. 9 | - Added sponsor link. 10 | 11 | ## 6.0.0: 10-Apr-2025 12 | 13 | - Added format selection feature - **Beta**. 14 | ![Format Selection](./images/FormatSelection.png) 15 | - Package updates. 16 | 17 | ## 5.3.0: 20-Feb-2025 18 | 19 | - Added feature [Add empty line between elements if elements count is greater than 2](https://github.com/pmahend1/PrettyXML/issues/172) 20 | - Package updates to latest. 21 | 22 | ## 5.2.0: 26-Dec-2024 23 | 24 | - Added feature [Allow the user to specify which elements have attributes on separate lines](https://github.com/pmahend1/PrettyXML/issues/162) 25 | - Package updates to latest. 26 | 27 | ## 5.1.0: 29-Nov-2024 28 | 29 | - Fixes [Formatting doesn't seem to work when using with .xaml files.](https://github.com/pmahend1/PrettyXML/issues/167) 30 | - Yarn upgrades to latest. 31 | 32 | ## 5.0.3: 01-Sep-2024 33 | 34 | - Yarn upgrades. 35 | - Fixes [Regular Expression Denial of Service (ReDoS) in micromatch](https://nvd.nist.gov/vuln/detail/CVE-2024-4067) 36 | 37 | ## 5.0.1/5.0.2: 18-Jun-2024 38 | 39 | - Yarn upgrades. 40 | - Fixes [braces vulnerability](https://github.com/advisories/GHSA-grv7-fg5c-xmjg) 41 | 42 | ## 5.0.0: 11-May-2024 43 | 44 | - Updated Dotnet dependency to version 8. 45 | 46 | ## 4.5.1: 16-Apr-2024 47 | 48 | - Yarn upgrades. 49 | - Fixed shield.io badges for open-vsx. 50 | 51 | ## 4.5.0: 5-Apr-2024 52 | 53 | - Yarn upgrades. 54 | - Added funding info on repository. 55 | 56 | ## 4.4.1: 25-Feb-2024 57 | 58 | - **Attributes In Newline Threshold** setting information added. 59 | 60 | ## 4.4.0: 25-Feb-2024 61 | 62 | - **Attributes In Newline Threshold** setting added. 63 | 64 | ## 4.3.0: 23-Feb-2024 65 | 66 | - Fixed some CDATA and text formatting. 67 | - Yarn upgrades. 68 | 69 | ### 4.2.0: 04-Feb-2024 70 | 71 | - Added setting `addSpaceBeforeEndOfXmlDeclaration` 72 | 73 | ### 4.1.3: 03-Feb-2024 74 | 75 | - Fix for [#141: Some comments are lost after format](https://github.com/pmahend1/PrettyXML/issues/141). 76 | 77 | ### 4.1.2: 03-Feb-2024 78 | 79 | - Fixes [#139: "Position All Attributes On First Line" not work](https://github.com/pmahend1/PrettyXML/issues/139) 80 | 81 | ### 4.1.1: 01-Feb-2024 82 | 83 | - Fixes [#137: Apple Plist/MobileConfig files create error after first format](https://github.com/pmahend1/PrettyXML/issues/137). 84 | - Yarn upgrades. 85 | 86 | ### 4.1.0: 31-Jan-2024 87 | 88 | - Added [`AXAML`](https://docs.avaloniaui.net/docs/basics/user-interface/introduction-to-xaml) support for Avalonia. 89 | 90 | ### 4.0.0: 31-Jan-2024 91 | 92 | - Removed Newtonsoft.Json dependency. 93 | - Yarn upgrades. 94 | - Fixed an issue where errors where not shown to users. 95 | 96 | ### 3.8.0: 21-Dec-2023 97 | 98 | - Yarn upgrades 99 | - Added option to unescape `>` character in attribute values. 100 | 101 | ### 3.7.0: 10-Nov-2023 102 | 103 | - Yarn upgrades. 104 | - Review prompt won't show for the very first time. 105 | 106 | ### 3.6.0: 20-Sep-2023 107 | 108 | - Yarn upgrades. 109 | 110 | ### 3.5.0: 30-Jul-2023 111 | 112 | - Yarn upgrades. 113 | - Updated ReadMe to reflect latest settings. 114 | 115 | ### 3.4.0: 11-Jul-2023 116 | 117 | - Added setting to preserve whitespaces in comments. 118 | - Yarn upgrades. 119 | 120 | ### 3.3.0: 18-May-2023 121 | 122 | - Implemented optional logger. 123 | - Yarn upgrades. 124 | 125 | ### 3.2.0: 18-Apr-2023 126 | 127 | - Yarn upgrades. 128 | 129 | ### 3.1.0: 15-Mar-2023 130 | 131 | - Yarn upgrades. 132 | 133 | ### 3.0.1: 19-Dec-2022 134 | 135 | - Updated Settings screenshot. 136 | - Fixed shields.io badges. 137 | - YARN upgrades. 138 | - pullrequest.yml checks if changelog and package.json have changed. 139 | 140 | ### 3.0.0: 19-Oct-2022 141 | 142 | - Added Setting [**Position All Attributes On First Line**](https://github.com/pmahend1/PrettyXML/issues/104). 143 | - Removed [deprecated `set-output`](https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/) from GitHub actions. 144 | 145 | ### 2.4.0: 16-Oct-2022 146 | 147 | - Added ESBuild. 148 | - Yarn upgrades. 149 | 150 | ### 2.3.0: 20-Sep-2022 151 | 152 | - Yarn upgrades. 153 | 154 | ### 2.2.0: 07-Aug-2022 155 | 156 | - Yarn upgrades. 157 | 158 | ### 2.1.0: 13-Jul-2022 159 | 160 | - Yarn upgrades. 161 | 162 | ### 2.0.1: 20-Jun-2022 163 | 164 | - Updated ReadMe badges. 165 | - Yarn upgrades. 166 | 167 | ### 2.0.0 : 17-Jun-2022 168 | 169 | - Dependency updated to .Net 6 170 | - Position First Attribute On Same Line setting added. Default is `True`. 171 | `False` keeps all attributes on new lines. 172 | - Some notification service clean up. 173 | 174 | ### 1.6.1: 18-Apr-2022 175 | 176 | - Added `Don't show again` for review extension prompt since some people got annoyed being asked once in 15-30 days. 177 | 178 | ### 1.6.0: 18-Apr-2022 179 | 180 | - Removed Electron-Edge-JS dependency. 181 | - Added missing SVG support. 182 | 183 | ### 1.5.3: 04-Apr-2022 184 | 185 | - Module did not self-register error work-around added for electron-edge-js. 186 | 187 | ### 1.5.2: 01-Apr-2022 188 | 189 | - Fixed bug with Electron-Edge-JS module. 190 | 191 | ### 1.5.1: 27-Mar-2022 192 | 193 | - Fixed bug in release notes URL. 194 | 195 | ### 1.5.0: 27-Mar-2022 196 | 197 | - Yarn security upgrades. 198 | 199 | ### 1.4.0: 29-Jan-2022 200 | 201 | - Yarn security upgrades. 202 | 203 | ### 1.3.4: 27-Dec-2021 204 | 205 | - Fix for infinite formatting progress on errored XML file. [#88](https://github.com/pmahend1/PrettyXML/issues/88) 206 | 207 | ### 1.3.3: 23-Dec-2021 208 | 209 | - Missing release notes not displaying bugfix. 210 | 211 | ### 1.3.2: 23-Dec-2021 212 | 213 | - Missing release notes text added. 214 | 215 | ### 1.3.1: 22-Dec-2021 216 | 217 | - Fixed a bug where release notes information pop up isn't displaying. 218 | 219 | ### 1.3.0: 19-Dec-2021 220 | 221 | - Added review prompt 222 | - Fixed issue with what's new dialog logic. 223 | - Yarn upgrades. 224 | 225 | ### 1.2.1: 6-Dec-2021 226 | 227 | - Yarn upgrades. 228 | 229 | ### 1.2.0: 3-Oct-2021 230 | 231 | - New logo added. 232 | 233 | ### 1.1.2 : 3-Oct-2021 234 | 235 | - Fixed a bug where progress bar was not dismissing if there was a formatting error. 236 | 237 | ### 1.1.0 : 18-Sep-2021 238 | 239 | - Linux support added 240 | - Command line mode added internally as back-up in case electron-edge-js binary issue for NodeJs version. 241 | 242 | ### 1.0.2 : 12-Sep-2021 243 | 244 | - Fixed _on save_ which was running after the document save. 245 | 246 | ### 1.0.1 : 10-Sep-2021 247 | 248 | - Fixed a bug where _on save_ was triggering formatting command for non-xml documents . 249 | 250 | ### 1.0.0 : 9-Sep-2021 251 | 252 | - Document formatting provider added.🆕 253 | 254 | ## Preview 255 | 256 | ### 0.11.0 : 8-Aug-2021 257 | 258 | - Electron 13.1.7 specific build. 259 | 260 | ### 0.10.0 : 31-Jul-2021 261 | 262 | - Added setting `prettyxml.settings.allowWhiteSpaceUnicodesInAttributeValues` 263 | - Updated **Readme.md**. 264 | 265 | ### 0.9.0 : 30-Jul-2021 266 | 267 | - Added settings : 268 | - `prettyxml.settings.allowSingleQuoteInAttributeValue` 269 | - `prettyxml.settings.addSpaceBeforeSelfClosingTag` 270 | - `prettyxml.settings.wrapCommentTextWithSpaces` 271 | - Updated **Readme.md**. 272 | 273 | ### 0.8.1 274 | 275 | - Fix for [#66:The edge module has not been pre-compiled for node.js version v14.16.0](https://github.com/pmahend1/PrettyXML/issues/66) 276 | 277 | ### 0.7.3 278 | 279 | - Yarn security updates 280 | 281 | ### 0.7.2 282 | 283 | - Fixed XML value escape issue [#61: "&" in attributes are reformatted as "&"](https://github.com/pmahend1/PrettyXML/issues/61) 284 | 285 | ### 0.7.1 286 | 287 | - Electron-edge-js updated for NodeJs 12.18.3/Electron 11.2.1 288 | - Fixes [Issue#55: The edge module has not been pre-compiled for node.js version v12.18.3](https://github.com/pmahend1/PrettyXML/issues/55) 289 | 290 | ### 0.6.0 291 | 292 | - New Feature **Format On Save** added. 293 | 294 | ### 0.5.4 295 | 296 | - Yarn upgrade. 297 | - Updated banner color and theme. 298 | 299 | ### 0.5.3 300 | 301 | Typo fix in CI. 302 | 303 | ### 0.5.2 304 | 305 | Updated ReadMe with VSCodium and OpenVsx. 306 | 307 | ### 0.5.1 308 | 309 | Small fix to CI. 310 | 311 | ### 0.5.0 312 | 313 | Publish extension to [Open VSX](https://open-vsx.org/extension/PrateekMahendrakar/prettyxml) for [VSCodium](https://vscodium.com/) as well. 314 | 315 | ### 0.4.4 316 | 317 | Added reference to [PrettyXML.VSMac](https://github.com/pmahend1/PrettyXML.VSMac) in ReadMe. 318 | 319 | ### 0.4.3 320 | 321 | Fixes [Issue 39](https://github.com/pmahend1/PrettyXML/issues/39) 322 | 323 | ### 0.4.2 324 | 325 | Added CIs for PR version check and extension deployment. 326 | 327 | ### 0.3.0 328 | 329 | Added **PrettyXML: Minimize** command. 330 | 331 | ### 0.2.2 332 | 333 | - Updated packages 334 | - Fixes [Issue#20:Issue in formatting tag with no attributes and no childs but has separate end tag](https://github.com/pmahend1/PrettyXML/issues/20) 335 | 336 | ### 0.2.1 337 | 338 | Updated default for `prettyxml.settings.useSelfClosingTag` to `true`. 339 | 340 | ### 0.2.0 341 | 342 | Added Settings 343 | 344 | - Indent Space Length. 345 | - Use Single Quotes. 346 | - Use Self Closing Tags. 347 | 348 | ### 0.1.8 349 | 350 | Fixed Mac native node bindings not found issue. 351 | 352 | ### 0.1.5 353 | 354 | Notification progress bar while formatting. 355 | 356 | ### 0.1.2 357 | 358 | Reverted 0.1.0 & 0.1.1 changes 359 | 360 | ### 0.1.0 - 0.1.1 - Discontinued 361 | 362 | ~~Webpacked extension. 363 | Discontinued due to electron-edge-js native binaries linking issue~~ 364 | 365 | ### 0.0.10 366 | 367 | Changed keybinding to **Cmd+K L** for Mac and **Control+K L** for other platforms. 368 | 369 | **Fixes:** 370 | 371 | - [This extension stop native ctrl+p in vscode #7](https://github.com/pmahend1/PrettyXML/issues/7) 372 | 373 | ### 0.0.8 & 0.0.9 374 | 375 | Fixes [Issue 4- Rewrite & to & (Which break legal xml format)](https://github.com/pmahend1/PrettyXML/issues/4) 376 | 377 | ### 0.0.7 378 | 379 | Initial release 0.0.7 380 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Prateek Mahendrakar 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Pretty XML 2 | 3 | 4 | logo 5 | 6 | [What is it?](#what-is-it) 7 | 8 | [Features](#features) 9 | [1. Prettify XML (XML Formatting)](#1-prettify-xml-xml-formatting) 10 | [2. Pretty XML: Minimize](#2-pretty-xml-minimize) 11 | 12 | [Keyboard Shortcuts](#keyboard-shortcuts) 13 | 14 | [Settings](#settings) 15 | 16 | [Requirements](#requirements) 17 | 18 | [Installation](#installation) 19 | 20 | [Known Issues](#known-issues) 21 | 22 | [Change Log](CHANGELOG.md#change-log) 23 | 24 | [For more information](#for-more-information) 25 | 26 | ## What is it? 27 | 28 | Pretty XML is a XML formatter extension for Visual Studio Code and VSCodium. It formats XML documents just like Visual Studio on Windows. 29 | 30 | **Supported file extensions**: 31 | 32 | - xml 33 | - xaml 34 | - axml 35 | - xsd 36 | - xsl 37 | - plist 38 | - mobileconfig 39 | - config 40 | - csproj 41 | - svg 42 | - resx and all other XML type of files. 43 | 44 | There is also **Visual Studio for Mac** version of this extension. Check it out at [PrettyXML.VSMac](https://github.com/pmahend1/PrettyXML.VSMac) 45 | 46 | Suggestions, improvement PRs are welcome. 47 | 48 | [![License](https://img.shields.io/github/license/pmahend1/PrettyXML?style=for-the-badge&label=License&color=lightblue)](https://choosealicense.com/licenses/mit/)![Deploy](https://img.shields.io/github/actions/workflow/status/pmahend1/prettyxml/main.yml?branch=main&color=darkgreen&label=Deploy%20CI&style=for-the-badge&logo=github) 49 | 50 | 51 | [![Visual Studio Marketplace Version](https://img.shields.io/visual-studio-marketplace/v/PrateekMahendrakar.prettyxml?style=for-the-badge&color=blue&logo=visualstudiocode&logoColor=blue&label=Visual%20Studio%20MarketPlace)](https://marketplace.visualstudio.com/items?itemName=PrateekMahendrakar.prettyxml)![Visual Studio Marketplace Installs](https://img.shields.io/visual-studio-marketplace/i/PrateekMahendrakar.prettyxml?style=for-the-badge&color=blue)![Visual Studio Marketplace Downloads](https://img.shields.io/visual-studio-marketplace/d/PrateekMahendrakar.prettyxml?style=for-the-badge&color=blue)![Visual Studio Marketplace Rating](https://img.shields.io/visual-studio-marketplace/r/PrateekMahendrakar.prettyxml?style=for-the-badge&color=blue) 52 | 53 | 54 | [![Open VSX](https://img.shields.io/open-vsx/v/PrateekMahendrakar/prettyxml?color=darkcyan&logoColor=green&style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAZbSURBVFhHtZdpTFRXFMf/783AsO/KNiCLiIiC2ioatbVIi4paV2pso9ZGU5u2SdsPTTW1sZrYfjA2bWODhtimcQ0oLtVapYjWWkFUqOLKJsPmIAgIDAzM6zmXB1IZYEj0x4d599z3uOfe8z/n3iuhLzJiYhx9FswZBXfXAEnWOEga6ABNV69FsfbNU2RJEb+dnaCHNsXSaUJDU2XtsVN3UVDQSj0W0a/S+59JnuvX6+1jIzdC55gsyZKnan8uKBalHibTQfPdwq11O1Iq2cT2bgckz81fTtEFBR6GRvZTbS8EpbOzylxeuajuqy053BTrSjMP0kVFnH3RgzOSLLvKri5JOj/9gda8vCaZbLJY9ucw+OfjX8aml+IgSQPLRNJo/LXjo76gR1kIjmPe1TU03OztsWXSVLjbk0aJNaOjsT46BtGeXqI9EJLOYTn8/R1kVrstgouif+psZ6e2unDUaMWgKyIiRfvfulrxa7b8T+hWkTSyt+fqFWEyp5pq6xce+Oy8xTi3YCmCXVyFbVl4BMLd3ZFRWoSEwGBhK3hUi7o2E+43PBbtwbBz9/KXOc/VtlW0FKVmsxn779+B3tkFu19NgIZiHB8QhEOvJ+GfmmpM8BkmwvG4vQ2/lZWgU+kqBYOihTM5INurTatkzl+MfQlz8M21K0g+cxIB5MSi0JHYejUHD5404f0x4/CHoQwz/ALh5+SM9OL76pc2QLGXqRxwJvTLhst/I8bLB0dnz4extQU7b+YjmZa/ovkJEk8cQQHF/TVajQR9EEa6eSDHWKN+OTiKxUIODMLF6krEHTmAn+8UIu2NefgkZiImDfelMMhoMrfjgwtZOF9VgaVhEShpaoBi6/KrDOoAwxrYfesG5p7MQEuHGQ6kfl8nR9HHA27KvSTqamF9HeKG+wmB2sqADrwVPgrDHZ3UFkTMN1JIGB05wUR7eQvx5TysFo6+FxVN+5WCH6bPxLuUooyPgyNWjooSz8/SxwGuYvGBQbDXaDDdPxCTaUbrosb1FJvfy0tFqrXTbsd8P22meOf243qMoVrxir8eZwwPMMLVDZ/GTBBZtHnSFGyLmwZHbZfTvenjgBPN7Nu46dg0MU60/ZycMJ7SLNbbR7Q5xYobG2A08c7KK6FBEeW9iRxaGzUWl2qq0NjejtRbN8XMl1DGLAwJx7lKA1o7OsQ3venjQDPFOOFEOkLd3BDj7Q0/CgHnOC9/NzwArwAPzr8GyggPeodnm1FSJN45VlosCtPXVKpZH5zG1rCqgQYaYN35TDpbyJg7IhQBlN+lTY2iL8LdQzjJvBMxGsfLisUzF6knpAGuCYxCfzxrdn7P7Zs9ZfpZ+hUhC2pr3mWEUiw57t0sI2E6ae1E/U+m55TCG8Ie6eGFkw9KepaZV2OaX4AI17ZrucJmjX4dYDIrysVq3KqvVy0QQptFIhWbUOYpkZYsONZKmloFWcA/zYhHrI+PqBEbJk6Gq531giv3nOGs0EG72lXjQ6GHbkpoRvzBuuxMPDKZhC0pOARVLc2iaPFAe2fNxjwKnZZCuDpyDJXucCrhzuLdZ5GlTmnAvTO7yoAPx8aK5WT23rstttualhbR5vRcS2nKe4C3zgHpiUmY4D0M3xVcQ/zxdITt24OxB3/FHUpTa0jDtm9bpvHxPqS2++BCW3FG4nxRcPJJ1ddrjUgMCkY17QsXaHlnB4UIYa768zTl+1RKUwvezjyNMlW0A2GpfbSYHVhCDqSpNquwoLjEBpLSOd3G0QwXhoQJO8Pq58xgZxOOH+7JmMGwGI2LZKXD3FVRBoC1wPE9VHQXu2hP+OivLHx8MVvt7VolX6oXP97It3lwQUdHsyw1tVeozSFxlE5CjbQbdsMi3KWmpK2Y6+orZWNq6j3al+tUm83whpNHGcJwef7s0nmRkrZCYxrr96UVy6iqMimtrQdU+5DYnp8nqt2arDPIqjCoVttQTKb9MBja+GKi6PQh+XKg73JJkrtOnDbCy87pV0S1YSjQ7cigXL+ysiU3X1xMUJeSUtlRWv4mXST5zvZC4cE7S8oWGnf+Is5u6pUXaM2+UOWg990veXjqoNWE0Wo8PYk8BzjmFOpUS27Bqtod399jE9utX8/1eh1fGuxcnAOg1Trz6ZUPkGq/TdBpmzZEi8KpxmpnwXHMqatX5QX+A7NfiweMOpOSAAAAAElFTkSuQmCC)](https://open-vsx.org/extension/PrateekMahendrakar/prettyxml)![Open VSX Downloads](https://img.shields.io/open-vsx/dt/PrateekMahendrakar/prettyxml?color=darkcyan&style=for-the-badge)![Open VSX Rating](https://img.shields.io/open-vsx/rating/PrateekMahendrakar/prettyxml?color=darkcyan&style=for-the-badge) 55 | 56 | ![prettify gif.](./images/Prettify.gif) 57 | 58 | --- 59 | 60 | ## Features 61 | 62 | ### 1. Prettify XML (XML Formatting) 63 | 64 | Right Click and Select Prettify XML or use [shortcut](#keyboard-shortcuts) 65 | 66 | - Position each attribute on a separate line. 67 | - First attribute on same line as start element start tag. 68 | - All attributes indented aligning with first attribute. 69 | - If no child for an element then close inline end tag. 70 | - No empty lines. 71 | - Supports `'` and whitespace unicodes in attribute value for XAML parser compatibility. 72 | 73 | ### 1.a. Format Entire Document 74 | 75 | - Lets you format entire valid XML document. 76 | 77 | ### 1.b. Format Selection - Beta 78 | 79 | - Lets you format part of an XML document. XML can be partial and invalid. This is in beta, so feel free to submit pull request with improvements. 80 | 81 | ![Format Selection Screenshot](./images/FormatSelection.png) 82 | 83 | Before 84 | 85 | ![Before.](./images/before.png) 86 | 87 | After 88 | 89 | ![After.](./images/after.png) 90 | 91 | ### 2. Pretty XML: Minimize 92 | 93 | Minimizes XML. 94 | 95 | ![minimize gif.](./images/Minimize.gif) 96 | 97 | --- 98 | 99 | ## Keyboard Shortcuts 100 | 101 | | Command | Platform | Shortcut | 102 | | ------------------- | -------------- | ---------------- | 103 | | Prettify XML | Mac | **Cmd+K L** | 104 | | Prettify XML | Windows, Linux | **Control+K L** | 105 | | PrettyXML: Minimize | Mac | **Cmd+K \`** | 106 | | PrettyXML: Minimize | Windows, Linux | **Control+K \`** | 107 | 108 | > **Note** 109 | > 110 | > You can change these in **Preferences → Keyboard Shortcuts** if you want. 111 | 112 | --- 113 | 114 | ## Settings 115 | 116 | These will be for **Prettify XML** command. 117 | 118 | | Setting Key | Default Value | Description | 119 | |-------------------------------------------------------------------------------------------------------------------------------------------------|-----------------|------------------------------------------------------------------------------| 120 | | prettyxml.settings.indentSpaceLength | 4 | No. of spaces for indentation. | 121 | | prettyxml.settings.useSingleQuotes | false | Use ' instead of \" | 122 | | prettyxml.settings.useSelfClosingTag | true | If no child nodes then self closing tag /> | 123 | | prettyxml.settings.formatOnSave | false | Enable format on save | 124 | | prettyxml.settings.allowSingleQuoteInAttributeValue | true | Allows ' in attribute values instead of \' | 125 | | prettyxml.settings.addSpaceBeforeSelfClosingTag | true | Adds space before self closing tag | 126 | | prettyxml.settings.wrapCommentTextWithSpaces | true | Wraps comment text with a single space | 127 | | prettyxml.settings.allowWhiteSpaceUnicodesInAttributeValues | true | Allows white space unicodes in attribute values | 128 | | prettyxml.settings.positionFirstAttributeOnSameLine | true | Position first attribute on same line. | 129 | | prettyxml.settings.positionAllAttributesOnFirstLine | false | Position all attributes on first line | 130 | | prettyxml.settings.preserveWhiteSpacesInComment | false | Preserves whitespaces in a comment. | 131 | | prettyxml.settings.addSpaceBeforeEndOfXmlDeclaration | false | Add space before end of XML declaration. | 132 | | [prettyxml.settings.attributesInNewlineThreshold](#attributes-in-newline-threshold) | 1 | Attributes count threshold to position attributes in newlines. | 133 | | prettyxml.settings.enableLogs | false | Enables logs | 134 | | [prettyxml.settings.wildCardedExceptionsForPositionAllAttributesOnFirstLine](#wild-carded-exceptions-for-position-all-attributes-on-first-line) | Array\ | Wild card exceptions for elements to ignore positionAllAttributesOnFirstLine | 135 | | [prettyxml.settings.addEmptyLineBetweenElements](#add-empty-line-between-elements) | false | Add empty line between elements if the child count is greater than 2 | 136 | 137 | ![Settings Image.](./images/settings.png) 138 | 139 | ### Attributes In Newline Threshold 140 | 141 | Example: 142 | 143 | Value = 2 144 | 145 | #### Input#1 146 | 147 | ```xml 148 | 149 | ``` 150 | 151 | #### Output#1 152 | 153 | ```xml 154 | 155 | ``` 156 | 157 | #### Input#2 158 | 159 | ```xml 160 | 161 | ``` 162 | 163 | #### Output#2 164 | 165 | ```xml 166 | 169 | ``` 170 | 171 | ### Wild Carded Exceptions For Position All Attributes On First Line 172 | 173 | List of element names to ignore Position All Attributes On First Line setting. Include element names or patterns here. 174 | 175 | Example: 176 | 177 | ```json 178 | "prettyxml.settings.wildCardedExceptionsForPositionAllAttributesOnFirstLine": ["Content*"] 179 | ``` 180 | 181 | #### Input 182 | 183 | ```xml 184 | 185 | 187 | 191 | 192 | ``` 193 | 194 | #### Ouput 195 | 196 | ```xml 197 | 198 | 201 | 204 | 205 | ``` 206 | 207 | ### Add Empty Line Between Elements 208 | 209 | If enabled, and child elements count is greater than 2 then adds empty line between elements. 210 | 211 | > [!NOTE] 212 | > Please note it wont add empty element before first element and after last element. 213 | 214 | #### Input 1 215 | 216 | ```xml 217 | 218 | Text1 219 | Text2 220 | Text3 221 | 222 | ``` 223 | 224 | #### Output 1 225 | 226 | ```xml 227 | 228 | Text1 229 | 230 | Text2 231 | 232 | Text3 233 | 234 | ``` 235 | 236 | --- 237 | 238 | ## Requirements 239 | 240 | - [**DotNet 8** or later](https://dotnet.microsoft.com/en-us/download/dotnet) installed on your machine and should be accessible through terminal. 241 | - Install [Muhammad-Sammy C#](https://open-vsx.org/extension/muhammad-sammy/csharp) or [Microsoft C#](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp) extension. 242 | - Visual Studio Code/VSCodium 1.59 or higher. 243 | 244 | --- 245 | 246 | ## Installation 247 | 248 | Visual Studio Code - [Visual Studio MarketPlace](https://marketplace.visualstudio.com/items?itemName=PrateekMahendrakar.prettyxml) 249 | 250 | For VSCodium - [open-vsx.org](https://open-vsx.org/extension/PrateekMahendrakar/prettyxml) 251 | 252 | --- 253 | 254 | ## Known Issues 255 | 256 | - Limited DTD support. 257 | - Formats valid XML files only. Syntax errors are displayed. 258 | 259 | Issues can be reported at [issues section](https://github.com/pmahend1/PrettyXML/issues) 260 | 261 | --- 262 | 263 | ### For more information 264 | 265 | - [Source Code](https://github.com/pmahend1/prettyxml) 266 | - If you want to support this project, 267 | [buy-me-coffee](https://www.buymeacoffee.com/pmahend1) 268 | -------------------------------------------------------------------------------- /images/FormatSelection.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmahend1/PrettyXML/612e1737586fb1da6fc83f627d1e9c8e848426a4/images/FormatSelection.png -------------------------------------------------------------------------------- /images/Minimize.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmahend1/PrettyXML/612e1737586fb1da6fc83f627d1e9c8e848426a4/images/Minimize.gif -------------------------------------------------------------------------------- /images/Prettify.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmahend1/PrettyXML/612e1737586fb1da6fc83f627d1e9c8e848426a4/images/Prettify.gif -------------------------------------------------------------------------------- /images/after.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmahend1/PrettyXML/612e1737586fb1da6fc83f627d1e9c8e848426a4/images/after.png -------------------------------------------------------------------------------- /images/before.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmahend1/PrettyXML/612e1737586fb1da6fc83f627d1e9c8e848426a4/images/before.png -------------------------------------------------------------------------------- /images/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmahend1/PrettyXML/612e1737586fb1da6fc83f627d1e9c8e848426a4/images/logo.png -------------------------------------------------------------------------------- /images/old_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmahend1/PrettyXML/612e1737586fb1da6fc83f627d1e9c8e848426a4/images/old_logo.png -------------------------------------------------------------------------------- /images/screenshot.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmahend1/PrettyXML/612e1737586fb1da6fc83f627d1e9c8e848426a4/images/screenshot.png -------------------------------------------------------------------------------- /images/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmahend1/PrettyXML/612e1737586fb1da6fc83f627d1e9c8e848426a4/images/settings.png -------------------------------------------------------------------------------- /lib/XmlFormatter.CommandLine.deps.json: -------------------------------------------------------------------------------- 1 | { 2 | "runtimeTarget": { 3 | "name": ".NETCoreApp,Version=v8.0", 4 | "signature": "" 5 | }, 6 | "compilationOptions": {}, 7 | "targets": { 8 | ".NETCoreApp,Version=v8.0": { 9 | "XmlFormatter.CommandLine/1.0.0": { 10 | "dependencies": { 11 | "XmlFormatter": "1.0.0" 12 | }, 13 | "runtime": { 14 | "XmlFormatter.CommandLine.dll": {} 15 | } 16 | }, 17 | "XmlFormatter/1.0.0": { 18 | "runtime": { 19 | "XmlFormatter.dll": { 20 | "assemblyVersion": "1.0.0.0", 21 | "fileVersion": "1.0.0.0" 22 | } 23 | } 24 | } 25 | } 26 | }, 27 | "libraries": { 28 | "XmlFormatter.CommandLine/1.0.0": { 29 | "type": "project", 30 | "serviceable": false, 31 | "sha512": "" 32 | }, 33 | "XmlFormatter/1.0.0": { 34 | "type": "project", 35 | "serviceable": false, 36 | "sha512": "" 37 | } 38 | } 39 | } -------------------------------------------------------------------------------- /lib/XmlFormatter.CommandLine.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmahend1/PrettyXML/612e1737586fb1da6fc83f627d1e9c8e848426a4/lib/XmlFormatter.CommandLine.dll -------------------------------------------------------------------------------- /lib/XmlFormatter.CommandLine.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmahend1/PrettyXML/612e1737586fb1da6fc83f627d1e9c8e848426a4/lib/XmlFormatter.CommandLine.exe -------------------------------------------------------------------------------- /lib/XmlFormatter.CommandLine.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmahend1/PrettyXML/612e1737586fb1da6fc83f627d1e9c8e848426a4/lib/XmlFormatter.CommandLine.pdb -------------------------------------------------------------------------------- /lib/XmlFormatter.CommandLine.runtimeconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "runtimeOptions": { 3 | "tfm": "net8.0", 4 | "framework": { 5 | "name": "Microsoft.NETCore.App", 6 | "version": "8.0.0" 7 | }, 8 | "configProperties": { 9 | "System.Reflection.Metadata.MetadataUpdater.IsSupported": false, 10 | "System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false 11 | } 12 | } 13 | } -------------------------------------------------------------------------------- /lib/XmlFormatter.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmahend1/PrettyXML/612e1737586fb1da6fc83f627d1e9c8e848426a4/lib/XmlFormatter.dll -------------------------------------------------------------------------------- /lib/XmlFormatter.pdb: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pmahend1/PrettyXML/612e1737586fb1da6fc83f627d1e9c8e848426a4/lib/XmlFormatter.pdb -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "prettyxml", 3 | "displayName": "Pretty XML", 4 | "author": { 5 | "name": "Prateek Mahendrakar" 6 | }, 7 | "sponsor": { 8 | "url": "https://buymeacoffee.com/pmahend1" 9 | }, 10 | "readme": "https://github.com/pmahend1/PrettyXML/blob/main/README.md", 11 | "description": "XML formatter extension for Visual Studio Code. Formats XML documents just like Visual Studio.", 12 | "version": "6.1.0", 13 | "publisher": "PrateekMahendrakar", 14 | "repository": { 15 | "url": "https://github.com/pmahend1/prettyxml.git" 16 | }, 17 | "icon": "images/logo.png", 18 | "license": "MIT", 19 | "bugs": "https://github.com/pmahend1/prettyxml/issues", 20 | "preview": false, 21 | "galleryBanner": { 22 | "color": "#445678", 23 | "theme": "dark" 24 | }, 25 | "markdown": "standard", 26 | "keywords": [ 27 | "xml", 28 | "xaml", 29 | "xsd", 30 | "xsl", 31 | "plist", 32 | "mobileconfig", 33 | "config", 34 | "csproj", 35 | "axml", 36 | "resx", 37 | "formatter" 38 | ], 39 | "engines": { 40 | "vscode": "^1.99.1" 41 | }, 42 | "categories": [ 43 | "Formatters" 44 | ], 45 | "activationEvents": [ 46 | "onLanguage:xml", 47 | "workspaceContains:**/*.xml", 48 | "workspaceContains:**/*.xaml" 49 | ], 50 | "main": "./out/extension.js", 51 | "contributes": { 52 | "commands": [ 53 | { 54 | "command": "prettyxml.prettifyxml", 55 | "title": "Prettify XML" 56 | }, 57 | { 58 | "command": "prettyxml.minimizexml", 59 | "title": "Pretty XML: Minimize" 60 | } 61 | ], 62 | "keybindings": [ 63 | { 64 | "command": "prettyxml.prettifyxml", 65 | "key": "ctrl+k l", 66 | "when": "!isMac" 67 | }, 68 | { 69 | "command": "prettyxml.prettifyxml", 70 | "key": "cmd+k l", 71 | "when": "isMac" 72 | }, 73 | { 74 | "command": "prettyxml.minimizexml", 75 | "key": "ctrl+k `", 76 | "when": "!isMac" 77 | }, 78 | { 79 | "command": "prettyxml.minimizexml", 80 | "key": "cmd+k `", 81 | "when": "isMac" 82 | } 83 | ], 84 | "languages": [ 85 | { 86 | "id": "xml", 87 | "extensions": [ 88 | ".config", 89 | ".csproj", 90 | ".xml", 91 | ".xsd", 92 | ".xsl", 93 | ".plist", 94 | ".mobileconfig", 95 | ".xaml", 96 | ".axml", 97 | ".axaml", 98 | ".resx", 99 | ".svg" 100 | ] 101 | } 102 | ], 103 | "menus": { 104 | "editor/context": [ 105 | { 106 | "command": "prettyxml.prettifyxml", 107 | "group": "1_modification@100", 108 | "when": "editorLangId == 'xml' || editorLangId == 'xaml'" 109 | } 110 | ] 111 | }, 112 | "configuration": [ 113 | { 114 | "title": "PrettyXML Settings", 115 | "properties": { 116 | "prettyxml.settings.indentSpaceLength": { 117 | "type": "number", 118 | "default": 4, 119 | "enum": [ 120 | 2, 121 | 4, 122 | 8 123 | ], 124 | "markdownDescription": "No. of spaces for indentation. *Default* is *4*" 125 | }, 126 | "prettyxml.settings.useSingleQuotes": { 127 | "type": "boolean", 128 | "markdownDescription": "Use apostrophe `'` instead of quotes `\"`. *Default* is *Unchecked* \n\n **Checked** : `Attribute='Value'` \n\n **Unchecked** : `Attribute=\"Value\"`", 129 | "default": false 130 | }, 131 | "prettyxml.settings.useSelfClosingTag": { 132 | "type": "boolean", 133 | "markdownDescription": "If no child nodes then use self closing tag `/>`. *Default* is *Checked* \n\n **Checked** : `` → `` \n\n **Unchecked** : `` → `` ", 134 | "default": true 135 | }, 136 | "prettyxml.settings.formatOnSave": { 137 | "type": "boolean", 138 | "markdownDescription": "Enable format on save. *Default* is *Unchecked*", 139 | "default": false 140 | }, 141 | "prettyxml.settings.allowSingleQuoteInAttributeValue": { 142 | "type": "boolean", 143 | "markdownDescription": "Allow single quote in attribute values. Ignored if *Use Single Quotes* is *Checked*. *Default* is *Checked* \n\n **Checked** : `Attribute=\"Value'has'apostrphoes\"` \n\n **Unchecked** : `Attribute=\"Value'has'apostrphoes\"` \n\n ", 144 | "default": true 145 | }, 146 | "prettyxml.settings.addSpaceBeforeSelfClosingTag": { 147 | "type": "boolean", 148 | "markdownDescription": "Add space before self closing tag. *Default* is *Checked* \n\n **Checked** : `` \n\n **Unchecked** : `` ", 149 | "default": true 150 | }, 151 | "prettyxml.settings.wrapCommentTextWithSpaces": { 152 | "type": "boolean", 153 | "markdownDescription": "Wrap Comment text with spaces. Ignored if *Preserve White Spaces In Comment* is *Checked*. *Default* is *Checked* \n\n **Checked** : `` \n\n **Unchecked** : `` ", 154 | "default": true 155 | }, 156 | "prettyxml.settings.allowWhiteSpaceUnicodesInAttributeValues": { 157 | "type": "boolean", 158 | "markdownDescription": "Allow unicode whitespace characters in attribute values. *Default* is *Checked* \n\n **Checked** : \n\n ` ` → ` ` \n\n ` ` or ` ` → ` ` \n\n `>` → `>` \n\n **Unchecked** :\n\n ` ` → new line \n\n ` ` or ` ` → tab \n\n > → `>`", 159 | "default": true 160 | }, 161 | "prettyxml.settings.positionFirstAttributeOnSameLine": { 162 | "type": "boolean", 163 | "markdownDescription": "Position first attribute on same line. *Unchecked* on this setting will be ignored if *Position All Attributes On First Line*=*Checked*. *Default* is *Checked* \n\n **Checked** : \n\n `` \n\n **Unchecked** : \n\n ``", 179 | "default": false 180 | }, 181 | "prettyxml.settings.addSpaceBeforeEndOfXmlDeclaration": { 182 | "type": "boolean", 183 | "markdownDescription": "Adds space before end of XML declaration. Default is *Unchecked* \n\n **Checked** : \n\n `` \n\n **Unchecked** : \n\n ``", 184 | "default": false 185 | }, 186 | "prettyxml.settings.attributesInNewlineThreshold": { 187 | "type": "number", 188 | "default": 1, 189 | "enum": [ 190 | 1, 191 | 2, 192 | 3, 193 | 4, 194 | 5, 195 | 6, 196 | 7, 197 | 8, 198 | 9 199 | ], 200 | "markdownDescription": "Attributes count threshold to position attributes in newlines. Default is *1*. This setting only works when **Position first attribute on same line** is enabled.\n\nFor example if threshold=2, all attributes will be on same line if an element has only 2 attributes,\n\notherwise each attribute will be placed on newline.\n\nMore Info: [GitHub](https://github.com/pmahend1/PrettyXML?tab=readme-ov-file#attributes-in-newline-threshold)" 201 | }, 202 | "prettyxml.settings.addEmptyLineBetweenElements": { 203 | "type": "boolean", 204 | "markdownDescription": "Add empty line between elements if element count is greater than 2. Default is *Unchecked*", 205 | "default": false 206 | }, 207 | "prettyxml.settings.enableLogs": { 208 | "type": "boolean", 209 | "markdownDescription": "Enable console local logs.", 210 | "default": false 211 | } 212 | } 213 | } 214 | ] 215 | }, 216 | "scripts": { 217 | "compile": "webpack --mode development", 218 | "watch": "webpack --mode development --watch", 219 | "vscode:prepublish": "npm run package", 220 | "package": "webpack --mode production --devtool hidden-source-map", 221 | "compile-tests": "tsc -p . --outDir out", 222 | "pretest": "npm run compile-tests", 223 | "test": "vscode-test" 224 | }, 225 | "devDependencies": { 226 | "@types/glob": "^8.1.0", 227 | "@types/mocha": "^10.0.10", 228 | "@types/node": "^22.14.0", 229 | "@types/vscode": "^1.99.1", 230 | "@typescript-eslint/eslint-plugin": "^8.32.1", 231 | "@typescript-eslint/parser": "8.29.1", 232 | "@vscode/test-electron": "^2.5.2", 233 | "esbuild": "^0.25.4", 234 | "eslint": "^9.27.0", 235 | "glob": "^11.0.2", 236 | "mocha": "^11.4.0", 237 | "ts-loader": "^9.5.2", 238 | "typescript": "^5.8.3", 239 | "webpack": "^5.99.9", 240 | "webpack-cli": "^6.0.1" 241 | }, 242 | "dependencies": { 243 | "child_process": "^1.0.2", 244 | "compare-versions": "^6.1.1", 245 | "fs": "0.0.1-security", 246 | "path": "^0.12.7" 247 | } 248 | } 249 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | child_process: 12 | specifier: ^1.0.2 13 | version: 1.0.2 14 | compare-versions: 15 | specifier: ^6.1.1 16 | version: 6.1.1 17 | fs: 18 | specifier: 0.0.1-security 19 | version: 0.0.1-security 20 | path: 21 | specifier: ^0.12.7 22 | version: 0.12.7 23 | devDependencies: 24 | '@types/glob': 25 | specifier: ^8.1.0 26 | version: 8.1.0 27 | '@types/mocha': 28 | specifier: ^10.0.10 29 | version: 10.0.10 30 | '@types/node': 31 | specifier: ^22.14.0 32 | version: 22.14.0 33 | '@types/vscode': 34 | specifier: ^1.99.1 35 | version: 1.99.1 36 | '@typescript-eslint/eslint-plugin': 37 | specifier: ^8.32.1 38 | version: 8.32.1(@typescript-eslint/parser@8.29.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0)(typescript@5.8.3) 39 | '@typescript-eslint/parser': 40 | specifier: 8.29.1 41 | version: 8.29.1(eslint@9.27.0)(typescript@5.8.3) 42 | '@vscode/test-electron': 43 | specifier: ^2.5.2 44 | version: 2.5.2 45 | esbuild: 46 | specifier: ^0.25.4 47 | version: 0.25.4 48 | eslint: 49 | specifier: ^9.27.0 50 | version: 9.27.0 51 | glob: 52 | specifier: ^11.0.2 53 | version: 11.0.2 54 | mocha: 55 | specifier: ^11.4.0 56 | version: 11.4.0 57 | ts-loader: 58 | specifier: ^9.5.2 59 | version: 9.5.2(typescript@5.8.3)(webpack@5.99.9) 60 | typescript: 61 | specifier: ^5.8.3 62 | version: 5.8.3 63 | webpack: 64 | specifier: ^5.99.9 65 | version: 5.99.9(esbuild@0.25.4)(webpack-cli@6.0.1) 66 | webpack-cli: 67 | specifier: ^6.0.1 68 | version: 6.0.1(webpack@5.99.9) 69 | 70 | packages: 71 | 72 | '@discoveryjs/json-ext@0.6.3': 73 | resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} 74 | engines: {node: '>=14.17.0'} 75 | 76 | '@esbuild/aix-ppc64@0.25.4': 77 | resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} 78 | engines: {node: '>=18'} 79 | cpu: [ppc64] 80 | os: [aix] 81 | 82 | '@esbuild/android-arm64@0.25.4': 83 | resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} 84 | engines: {node: '>=18'} 85 | cpu: [arm64] 86 | os: [android] 87 | 88 | '@esbuild/android-arm@0.25.4': 89 | resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} 90 | engines: {node: '>=18'} 91 | cpu: [arm] 92 | os: [android] 93 | 94 | '@esbuild/android-x64@0.25.4': 95 | resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} 96 | engines: {node: '>=18'} 97 | cpu: [x64] 98 | os: [android] 99 | 100 | '@esbuild/darwin-arm64@0.25.4': 101 | resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} 102 | engines: {node: '>=18'} 103 | cpu: [arm64] 104 | os: [darwin] 105 | 106 | '@esbuild/darwin-x64@0.25.4': 107 | resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} 108 | engines: {node: '>=18'} 109 | cpu: [x64] 110 | os: [darwin] 111 | 112 | '@esbuild/freebsd-arm64@0.25.4': 113 | resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} 114 | engines: {node: '>=18'} 115 | cpu: [arm64] 116 | os: [freebsd] 117 | 118 | '@esbuild/freebsd-x64@0.25.4': 119 | resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} 120 | engines: {node: '>=18'} 121 | cpu: [x64] 122 | os: [freebsd] 123 | 124 | '@esbuild/linux-arm64@0.25.4': 125 | resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} 126 | engines: {node: '>=18'} 127 | cpu: [arm64] 128 | os: [linux] 129 | 130 | '@esbuild/linux-arm@0.25.4': 131 | resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} 132 | engines: {node: '>=18'} 133 | cpu: [arm] 134 | os: [linux] 135 | 136 | '@esbuild/linux-ia32@0.25.4': 137 | resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} 138 | engines: {node: '>=18'} 139 | cpu: [ia32] 140 | os: [linux] 141 | 142 | '@esbuild/linux-loong64@0.25.4': 143 | resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} 144 | engines: {node: '>=18'} 145 | cpu: [loong64] 146 | os: [linux] 147 | 148 | '@esbuild/linux-mips64el@0.25.4': 149 | resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} 150 | engines: {node: '>=18'} 151 | cpu: [mips64el] 152 | os: [linux] 153 | 154 | '@esbuild/linux-ppc64@0.25.4': 155 | resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} 156 | engines: {node: '>=18'} 157 | cpu: [ppc64] 158 | os: [linux] 159 | 160 | '@esbuild/linux-riscv64@0.25.4': 161 | resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} 162 | engines: {node: '>=18'} 163 | cpu: [riscv64] 164 | os: [linux] 165 | 166 | '@esbuild/linux-s390x@0.25.4': 167 | resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} 168 | engines: {node: '>=18'} 169 | cpu: [s390x] 170 | os: [linux] 171 | 172 | '@esbuild/linux-x64@0.25.4': 173 | resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} 174 | engines: {node: '>=18'} 175 | cpu: [x64] 176 | os: [linux] 177 | 178 | '@esbuild/netbsd-arm64@0.25.4': 179 | resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} 180 | engines: {node: '>=18'} 181 | cpu: [arm64] 182 | os: [netbsd] 183 | 184 | '@esbuild/netbsd-x64@0.25.4': 185 | resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} 186 | engines: {node: '>=18'} 187 | cpu: [x64] 188 | os: [netbsd] 189 | 190 | '@esbuild/openbsd-arm64@0.25.4': 191 | resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} 192 | engines: {node: '>=18'} 193 | cpu: [arm64] 194 | os: [openbsd] 195 | 196 | '@esbuild/openbsd-x64@0.25.4': 197 | resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} 198 | engines: {node: '>=18'} 199 | cpu: [x64] 200 | os: [openbsd] 201 | 202 | '@esbuild/sunos-x64@0.25.4': 203 | resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} 204 | engines: {node: '>=18'} 205 | cpu: [x64] 206 | os: [sunos] 207 | 208 | '@esbuild/win32-arm64@0.25.4': 209 | resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} 210 | engines: {node: '>=18'} 211 | cpu: [arm64] 212 | os: [win32] 213 | 214 | '@esbuild/win32-ia32@0.25.4': 215 | resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} 216 | engines: {node: '>=18'} 217 | cpu: [ia32] 218 | os: [win32] 219 | 220 | '@esbuild/win32-x64@0.25.4': 221 | resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} 222 | engines: {node: '>=18'} 223 | cpu: [x64] 224 | os: [win32] 225 | 226 | '@eslint-community/eslint-utils@4.5.1': 227 | resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} 228 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 229 | peerDependencies: 230 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 231 | 232 | '@eslint-community/eslint-utils@4.7.0': 233 | resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} 234 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 235 | peerDependencies: 236 | eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 237 | 238 | '@eslint-community/regexpp@4.12.1': 239 | resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} 240 | engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} 241 | 242 | '@eslint/config-array@0.20.0': 243 | resolution: {integrity: sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==} 244 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 245 | 246 | '@eslint/config-helpers@0.2.1': 247 | resolution: {integrity: sha512-RI17tsD2frtDu/3dmI7QRrD4bedNKPM08ziRYaC5AhkGrzIAJelm9kJU1TznK+apx6V+cqRz8tfpEeG3oIyjxw==} 248 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 249 | 250 | '@eslint/core@0.14.0': 251 | resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} 252 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 253 | 254 | '@eslint/eslintrc@3.3.1': 255 | resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} 256 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 257 | 258 | '@eslint/js@9.27.0': 259 | resolution: {integrity: sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==} 260 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 261 | 262 | '@eslint/object-schema@2.1.6': 263 | resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} 264 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 265 | 266 | '@eslint/plugin-kit@0.3.1': 267 | resolution: {integrity: sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==} 268 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 269 | 270 | '@humanfs/core@0.19.1': 271 | resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} 272 | engines: {node: '>=18.18.0'} 273 | 274 | '@humanfs/node@0.16.6': 275 | resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} 276 | engines: {node: '>=18.18.0'} 277 | 278 | '@humanwhocodes/module-importer@1.0.1': 279 | resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} 280 | engines: {node: '>=12.22'} 281 | 282 | '@humanwhocodes/retry@0.3.1': 283 | resolution: {integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==} 284 | engines: {node: '>=18.18'} 285 | 286 | '@humanwhocodes/retry@0.4.2': 287 | resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} 288 | engines: {node: '>=18.18'} 289 | 290 | '@isaacs/cliui@8.0.2': 291 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 292 | engines: {node: '>=12'} 293 | 294 | '@jridgewell/gen-mapping@0.3.8': 295 | resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} 296 | engines: {node: '>=6.0.0'} 297 | 298 | '@jridgewell/resolve-uri@3.1.2': 299 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 300 | engines: {node: '>=6.0.0'} 301 | 302 | '@jridgewell/set-array@1.2.1': 303 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 304 | engines: {node: '>=6.0.0'} 305 | 306 | '@jridgewell/source-map@0.3.6': 307 | resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} 308 | 309 | '@jridgewell/sourcemap-codec@1.5.0': 310 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 311 | 312 | '@jridgewell/trace-mapping@0.3.25': 313 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 314 | 315 | '@nodelib/fs.scandir@2.1.5': 316 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 317 | engines: {node: '>= 8'} 318 | 319 | '@nodelib/fs.stat@2.0.5': 320 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 321 | engines: {node: '>= 8'} 322 | 323 | '@nodelib/fs.walk@1.2.8': 324 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 325 | engines: {node: '>= 8'} 326 | 327 | '@pkgjs/parseargs@0.11.0': 328 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 329 | engines: {node: '>=14'} 330 | 331 | '@types/eslint-scope@3.7.7': 332 | resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} 333 | 334 | '@types/eslint@9.6.1': 335 | resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} 336 | 337 | '@types/estree@1.0.7': 338 | resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} 339 | 340 | '@types/glob@8.1.0': 341 | resolution: {integrity: sha512-IO+MJPVhoqz+28h1qLAcBEH2+xHMK6MTyHJc7MTnnYb6wsoLR29POVGJ7LycmVXIqyy/4/2ShP5sUwTXuOwb/w==} 342 | 343 | '@types/json-schema@7.0.15': 344 | resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} 345 | 346 | '@types/minimatch@5.1.2': 347 | resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} 348 | 349 | '@types/mocha@10.0.10': 350 | resolution: {integrity: sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q==} 351 | 352 | '@types/node@22.14.0': 353 | resolution: {integrity: sha512-Kmpl+z84ILoG+3T/zQFyAJsU6EPTmOCj8/2+83fSN6djd6I4o7uOuGIH6vq3PrjY5BGitSbFuMN18j3iknubbA==} 354 | 355 | '@types/vscode@1.99.1': 356 | resolution: {integrity: sha512-cQlqxHZ040ta6ovZXnXRxs3fJiTmlurkIWOfZVcLSZPcm9J4ikFpXuB7gihofGn5ng+kDVma5EmJIclfk0trPQ==} 357 | 358 | '@typescript-eslint/eslint-plugin@8.32.1': 359 | resolution: {integrity: sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg==} 360 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 361 | peerDependencies: 362 | '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 363 | eslint: ^8.57.0 || ^9.0.0 364 | typescript: '>=4.8.4 <5.9.0' 365 | 366 | '@typescript-eslint/parser@8.29.1': 367 | resolution: {integrity: sha512-zczrHVEqEaTwh12gWBIJWj8nx+ayDcCJs06yoNMY0kwjMWDM6+kppljY+BxWI06d2Ja+h4+WdufDcwMnnMEWmg==} 368 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 369 | peerDependencies: 370 | eslint: ^8.57.0 || ^9.0.0 371 | typescript: '>=4.8.4 <5.9.0' 372 | 373 | '@typescript-eslint/scope-manager@8.29.1': 374 | resolution: {integrity: sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==} 375 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 376 | 377 | '@typescript-eslint/scope-manager@8.32.1': 378 | resolution: {integrity: sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA==} 379 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 380 | 381 | '@typescript-eslint/type-utils@8.32.1': 382 | resolution: {integrity: sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA==} 383 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 384 | peerDependencies: 385 | eslint: ^8.57.0 || ^9.0.0 386 | typescript: '>=4.8.4 <5.9.0' 387 | 388 | '@typescript-eslint/types@8.29.1': 389 | resolution: {integrity: sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==} 390 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 391 | 392 | '@typescript-eslint/types@8.32.1': 393 | resolution: {integrity: sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg==} 394 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 395 | 396 | '@typescript-eslint/typescript-estree@8.29.1': 397 | resolution: {integrity: sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==} 398 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 399 | peerDependencies: 400 | typescript: '>=4.8.4 <5.9.0' 401 | 402 | '@typescript-eslint/typescript-estree@8.32.1': 403 | resolution: {integrity: sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg==} 404 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 405 | peerDependencies: 406 | typescript: '>=4.8.4 <5.9.0' 407 | 408 | '@typescript-eslint/utils@8.32.1': 409 | resolution: {integrity: sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA==} 410 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 411 | peerDependencies: 412 | eslint: ^8.57.0 || ^9.0.0 413 | typescript: '>=4.8.4 <5.9.0' 414 | 415 | '@typescript-eslint/visitor-keys@8.29.1': 416 | resolution: {integrity: sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==} 417 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 418 | 419 | '@typescript-eslint/visitor-keys@8.32.1': 420 | resolution: {integrity: sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w==} 421 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 422 | 423 | '@vscode/test-electron@2.5.2': 424 | resolution: {integrity: sha512-8ukpxv4wYe0iWMRQU18jhzJOHkeGKbnw7xWRX3Zw1WJA4cEKbHcmmLPdPrPtL6rhDcrlCZN+xKRpv09n4gRHYg==} 425 | engines: {node: '>=16'} 426 | 427 | '@webassemblyjs/ast@1.14.1': 428 | resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} 429 | 430 | '@webassemblyjs/floating-point-hex-parser@1.13.2': 431 | resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} 432 | 433 | '@webassemblyjs/helper-api-error@1.13.2': 434 | resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} 435 | 436 | '@webassemblyjs/helper-buffer@1.14.1': 437 | resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} 438 | 439 | '@webassemblyjs/helper-numbers@1.13.2': 440 | resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} 441 | 442 | '@webassemblyjs/helper-wasm-bytecode@1.13.2': 443 | resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} 444 | 445 | '@webassemblyjs/helper-wasm-section@1.14.1': 446 | resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} 447 | 448 | '@webassemblyjs/ieee754@1.13.2': 449 | resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} 450 | 451 | '@webassemblyjs/leb128@1.13.2': 452 | resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} 453 | 454 | '@webassemblyjs/utf8@1.13.2': 455 | resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} 456 | 457 | '@webassemblyjs/wasm-edit@1.14.1': 458 | resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} 459 | 460 | '@webassemblyjs/wasm-gen@1.14.1': 461 | resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} 462 | 463 | '@webassemblyjs/wasm-opt@1.14.1': 464 | resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} 465 | 466 | '@webassemblyjs/wasm-parser@1.14.1': 467 | resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} 468 | 469 | '@webassemblyjs/wast-printer@1.14.1': 470 | resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} 471 | 472 | '@webpack-cli/configtest@3.0.1': 473 | resolution: {integrity: sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==} 474 | engines: {node: '>=18.12.0'} 475 | peerDependencies: 476 | webpack: ^5.82.0 477 | webpack-cli: 6.x.x 478 | 479 | '@webpack-cli/info@3.0.1': 480 | resolution: {integrity: sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==} 481 | engines: {node: '>=18.12.0'} 482 | peerDependencies: 483 | webpack: ^5.82.0 484 | webpack-cli: 6.x.x 485 | 486 | '@webpack-cli/serve@3.0.1': 487 | resolution: {integrity: sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==} 488 | engines: {node: '>=18.12.0'} 489 | peerDependencies: 490 | webpack: ^5.82.0 491 | webpack-cli: 6.x.x 492 | webpack-dev-server: '*' 493 | peerDependenciesMeta: 494 | webpack-dev-server: 495 | optional: true 496 | 497 | '@xtuc/ieee754@1.2.0': 498 | resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} 499 | 500 | '@xtuc/long@4.2.2': 501 | resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} 502 | 503 | acorn-jsx@5.3.2: 504 | resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} 505 | peerDependencies: 506 | acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 507 | 508 | acorn@8.14.1: 509 | resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} 510 | engines: {node: '>=0.4.0'} 511 | hasBin: true 512 | 513 | agent-base@7.1.3: 514 | resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} 515 | engines: {node: '>= 14'} 516 | 517 | ajv-formats@2.1.1: 518 | resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} 519 | peerDependencies: 520 | ajv: ^8.0.0 521 | peerDependenciesMeta: 522 | ajv: 523 | optional: true 524 | 525 | ajv-keywords@5.1.0: 526 | resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} 527 | peerDependencies: 528 | ajv: ^8.8.2 529 | 530 | ajv@6.12.6: 531 | resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} 532 | 533 | ajv@8.17.1: 534 | resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} 535 | 536 | ansi-regex@5.0.1: 537 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 538 | engines: {node: '>=8'} 539 | 540 | ansi-regex@6.1.0: 541 | resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} 542 | engines: {node: '>=12'} 543 | 544 | ansi-styles@4.3.0: 545 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 546 | engines: {node: '>=8'} 547 | 548 | ansi-styles@6.2.1: 549 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 550 | engines: {node: '>=12'} 551 | 552 | argparse@2.0.1: 553 | resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 554 | 555 | balanced-match@1.0.2: 556 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 557 | 558 | brace-expansion@1.1.11: 559 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} 560 | 561 | brace-expansion@2.0.1: 562 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 563 | 564 | braces@3.0.3: 565 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 566 | engines: {node: '>=8'} 567 | 568 | browser-stdout@1.3.1: 569 | resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} 570 | 571 | browserslist@4.24.4: 572 | resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} 573 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 574 | hasBin: true 575 | 576 | buffer-from@1.1.2: 577 | resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} 578 | 579 | callsites@3.1.0: 580 | resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} 581 | engines: {node: '>=6'} 582 | 583 | camelcase@6.3.0: 584 | resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} 585 | engines: {node: '>=10'} 586 | 587 | caniuse-lite@1.0.30001712: 588 | resolution: {integrity: sha512-MBqPpGYYdQ7/hfKiet9SCI+nmN5/hp4ZzveOJubl5DTAMa5oggjAuoi0Z4onBpKPFI2ePGnQuQIzF3VxDjDJig==} 589 | 590 | chalk@4.1.2: 591 | resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} 592 | engines: {node: '>=10'} 593 | 594 | chalk@5.4.1: 595 | resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} 596 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 597 | 598 | child_process@1.0.2: 599 | resolution: {integrity: sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==} 600 | 601 | chokidar@4.0.3: 602 | resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} 603 | engines: {node: '>= 14.16.0'} 604 | 605 | chrome-trace-event@1.0.4: 606 | resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} 607 | engines: {node: '>=6.0'} 608 | 609 | cli-cursor@5.0.0: 610 | resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} 611 | engines: {node: '>=18'} 612 | 613 | cli-spinners@2.9.2: 614 | resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} 615 | engines: {node: '>=6'} 616 | 617 | cliui@8.0.1: 618 | resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} 619 | engines: {node: '>=12'} 620 | 621 | clone-deep@4.0.1: 622 | resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} 623 | engines: {node: '>=6'} 624 | 625 | color-convert@2.0.1: 626 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 627 | engines: {node: '>=7.0.0'} 628 | 629 | color-name@1.1.4: 630 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 631 | 632 | colorette@2.0.20: 633 | resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} 634 | 635 | commander@12.1.0: 636 | resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} 637 | engines: {node: '>=18'} 638 | 639 | commander@2.20.3: 640 | resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} 641 | 642 | compare-versions@6.1.1: 643 | resolution: {integrity: sha512-4hm4VPpIecmlg59CHXnRDnqGplJFrbLG4aFEl5vl6cK1u76ws3LLvX7ikFnTDl5vo39sjWD6AaDPYodJp/NNHg==} 644 | 645 | concat-map@0.0.1: 646 | resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} 647 | 648 | core-util-is@1.0.3: 649 | resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} 650 | 651 | cross-spawn@7.0.6: 652 | resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} 653 | engines: {node: '>= 8'} 654 | 655 | debug@4.4.0: 656 | resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} 657 | engines: {node: '>=6.0'} 658 | peerDependencies: 659 | supports-color: '*' 660 | peerDependenciesMeta: 661 | supports-color: 662 | optional: true 663 | 664 | debug@4.4.1: 665 | resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} 666 | engines: {node: '>=6.0'} 667 | peerDependencies: 668 | supports-color: '*' 669 | peerDependenciesMeta: 670 | supports-color: 671 | optional: true 672 | 673 | decamelize@4.0.0: 674 | resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} 675 | engines: {node: '>=10'} 676 | 677 | deep-is@0.1.4: 678 | resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} 679 | 680 | diff@7.0.0: 681 | resolution: {integrity: sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw==} 682 | engines: {node: '>=0.3.1'} 683 | 684 | eastasianwidth@0.2.0: 685 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 686 | 687 | electron-to-chromium@1.5.135: 688 | resolution: {integrity: sha512-8gXUdEmvb+WCaYUhA0Svr08uSeRjM2w3x5uHOc1QbaEVzJXB8rgm5eptieXzyKoVEtinLvW6MtTcurA65PeS1Q==} 689 | 690 | emoji-regex@10.4.0: 691 | resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} 692 | 693 | emoji-regex@8.0.0: 694 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 695 | 696 | emoji-regex@9.2.2: 697 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 698 | 699 | enhanced-resolve@5.18.1: 700 | resolution: {integrity: sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==} 701 | engines: {node: '>=10.13.0'} 702 | 703 | envinfo@7.14.0: 704 | resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} 705 | engines: {node: '>=4'} 706 | hasBin: true 707 | 708 | es-module-lexer@1.6.0: 709 | resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} 710 | 711 | esbuild@0.25.4: 712 | resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} 713 | engines: {node: '>=18'} 714 | hasBin: true 715 | 716 | escalade@3.2.0: 717 | resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} 718 | engines: {node: '>=6'} 719 | 720 | escape-string-regexp@4.0.0: 721 | resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} 722 | engines: {node: '>=10'} 723 | 724 | eslint-scope@5.1.1: 725 | resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} 726 | engines: {node: '>=8.0.0'} 727 | 728 | eslint-scope@8.3.0: 729 | resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} 730 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 731 | 732 | eslint-visitor-keys@3.4.3: 733 | resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} 734 | engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} 735 | 736 | eslint-visitor-keys@4.2.0: 737 | resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} 738 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 739 | 740 | eslint@9.27.0: 741 | resolution: {integrity: sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==} 742 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 743 | hasBin: true 744 | peerDependencies: 745 | jiti: '*' 746 | peerDependenciesMeta: 747 | jiti: 748 | optional: true 749 | 750 | espree@10.3.0: 751 | resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} 752 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 753 | 754 | esquery@1.6.0: 755 | resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} 756 | engines: {node: '>=0.10'} 757 | 758 | esrecurse@4.3.0: 759 | resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} 760 | engines: {node: '>=4.0'} 761 | 762 | estraverse@4.3.0: 763 | resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} 764 | engines: {node: '>=4.0'} 765 | 766 | estraverse@5.3.0: 767 | resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} 768 | engines: {node: '>=4.0'} 769 | 770 | esutils@2.0.3: 771 | resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} 772 | engines: {node: '>=0.10.0'} 773 | 774 | events@3.3.0: 775 | resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} 776 | engines: {node: '>=0.8.x'} 777 | 778 | fast-deep-equal@3.1.3: 779 | resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 780 | 781 | fast-glob@3.3.3: 782 | resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} 783 | engines: {node: '>=8.6.0'} 784 | 785 | fast-json-stable-stringify@2.1.0: 786 | resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} 787 | 788 | fast-levenshtein@2.0.6: 789 | resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} 790 | 791 | fast-uri@3.0.6: 792 | resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==} 793 | 794 | fastest-levenshtein@1.0.16: 795 | resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} 796 | engines: {node: '>= 4.9.1'} 797 | 798 | fastq@1.19.1: 799 | resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} 800 | 801 | file-entry-cache@8.0.0: 802 | resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} 803 | engines: {node: '>=16.0.0'} 804 | 805 | fill-range@7.1.1: 806 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 807 | engines: {node: '>=8'} 808 | 809 | find-up@4.1.0: 810 | resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} 811 | engines: {node: '>=8'} 812 | 813 | find-up@5.0.0: 814 | resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} 815 | engines: {node: '>=10'} 816 | 817 | flat-cache@4.0.1: 818 | resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} 819 | engines: {node: '>=16'} 820 | 821 | flat@5.0.2: 822 | resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} 823 | hasBin: true 824 | 825 | flatted@3.3.3: 826 | resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} 827 | 828 | foreground-child@3.3.1: 829 | resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} 830 | engines: {node: '>=14'} 831 | 832 | fs@0.0.1-security: 833 | resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} 834 | 835 | function-bind@1.1.2: 836 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 837 | 838 | get-caller-file@2.0.5: 839 | resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} 840 | engines: {node: 6.* || 8.* || >= 10.*} 841 | 842 | get-east-asian-width@1.3.0: 843 | resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} 844 | engines: {node: '>=18'} 845 | 846 | glob-parent@5.1.2: 847 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 848 | engines: {node: '>= 6'} 849 | 850 | glob-parent@6.0.2: 851 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 852 | engines: {node: '>=10.13.0'} 853 | 854 | glob-to-regexp@0.4.1: 855 | resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 856 | 857 | glob@10.4.5: 858 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 859 | hasBin: true 860 | 861 | glob@11.0.2: 862 | resolution: {integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==} 863 | engines: {node: 20 || >=22} 864 | hasBin: true 865 | 866 | globals@14.0.0: 867 | resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} 868 | engines: {node: '>=18'} 869 | 870 | graceful-fs@4.2.11: 871 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 872 | 873 | graphemer@1.4.0: 874 | resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} 875 | 876 | has-flag@4.0.0: 877 | resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} 878 | engines: {node: '>=8'} 879 | 880 | hasown@2.0.2: 881 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 882 | engines: {node: '>= 0.4'} 883 | 884 | he@1.2.0: 885 | resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} 886 | hasBin: true 887 | 888 | http-proxy-agent@7.0.2: 889 | resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} 890 | engines: {node: '>= 14'} 891 | 892 | https-proxy-agent@7.0.6: 893 | resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} 894 | engines: {node: '>= 14'} 895 | 896 | ignore@5.3.2: 897 | resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 898 | engines: {node: '>= 4'} 899 | 900 | ignore@7.0.4: 901 | resolution: {integrity: sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A==} 902 | engines: {node: '>= 4'} 903 | 904 | immediate@3.0.6: 905 | resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} 906 | 907 | import-fresh@3.3.1: 908 | resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} 909 | engines: {node: '>=6'} 910 | 911 | import-local@3.2.0: 912 | resolution: {integrity: sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==} 913 | engines: {node: '>=8'} 914 | hasBin: true 915 | 916 | imurmurhash@0.1.4: 917 | resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} 918 | engines: {node: '>=0.8.19'} 919 | 920 | inherits@2.0.3: 921 | resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} 922 | 923 | inherits@2.0.4: 924 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 925 | 926 | interpret@3.1.1: 927 | resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} 928 | engines: {node: '>=10.13.0'} 929 | 930 | is-core-module@2.16.1: 931 | resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} 932 | engines: {node: '>= 0.4'} 933 | 934 | is-extglob@2.1.1: 935 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 936 | engines: {node: '>=0.10.0'} 937 | 938 | is-fullwidth-code-point@3.0.0: 939 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 940 | engines: {node: '>=8'} 941 | 942 | is-glob@4.0.3: 943 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 944 | engines: {node: '>=0.10.0'} 945 | 946 | is-interactive@2.0.0: 947 | resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} 948 | engines: {node: '>=12'} 949 | 950 | is-number@7.0.0: 951 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 952 | engines: {node: '>=0.12.0'} 953 | 954 | is-plain-obj@2.1.0: 955 | resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} 956 | engines: {node: '>=8'} 957 | 958 | is-plain-object@2.0.4: 959 | resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} 960 | engines: {node: '>=0.10.0'} 961 | 962 | is-unicode-supported@0.1.0: 963 | resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} 964 | engines: {node: '>=10'} 965 | 966 | is-unicode-supported@1.3.0: 967 | resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} 968 | engines: {node: '>=12'} 969 | 970 | is-unicode-supported@2.1.0: 971 | resolution: {integrity: sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==} 972 | engines: {node: '>=18'} 973 | 974 | isarray@1.0.0: 975 | resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} 976 | 977 | isexe@2.0.0: 978 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 979 | 980 | isobject@3.0.1: 981 | resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} 982 | engines: {node: '>=0.10.0'} 983 | 984 | jackspeak@3.4.3: 985 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 986 | 987 | jackspeak@4.1.0: 988 | resolution: {integrity: sha512-9DDdhb5j6cpeitCbvLO7n7J4IxnbM6hoF6O1g4HQ5TfhvvKN8ywDM7668ZhMHRqVmxqhps/F6syWK2KcPxYlkw==} 989 | engines: {node: 20 || >=22} 990 | 991 | jest-worker@27.5.1: 992 | resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} 993 | engines: {node: '>= 10.13.0'} 994 | 995 | js-yaml@4.1.0: 996 | resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 997 | hasBin: true 998 | 999 | json-buffer@3.0.1: 1000 | resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} 1001 | 1002 | json-parse-even-better-errors@2.3.1: 1003 | resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 1004 | 1005 | json-schema-traverse@0.4.1: 1006 | resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} 1007 | 1008 | json-schema-traverse@1.0.0: 1009 | resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} 1010 | 1011 | json-stable-stringify-without-jsonify@1.0.1: 1012 | resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} 1013 | 1014 | jszip@3.10.1: 1015 | resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} 1016 | 1017 | keyv@4.5.4: 1018 | resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 1019 | 1020 | kind-of@6.0.3: 1021 | resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} 1022 | engines: {node: '>=0.10.0'} 1023 | 1024 | levn@0.4.1: 1025 | resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} 1026 | engines: {node: '>= 0.8.0'} 1027 | 1028 | lie@3.3.0: 1029 | resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} 1030 | 1031 | loader-runner@4.3.0: 1032 | resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} 1033 | engines: {node: '>=6.11.5'} 1034 | 1035 | locate-path@5.0.0: 1036 | resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} 1037 | engines: {node: '>=8'} 1038 | 1039 | locate-path@6.0.0: 1040 | resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} 1041 | engines: {node: '>=10'} 1042 | 1043 | lodash.merge@4.6.2: 1044 | resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} 1045 | 1046 | log-symbols@4.1.0: 1047 | resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} 1048 | engines: {node: '>=10'} 1049 | 1050 | log-symbols@6.0.0: 1051 | resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} 1052 | engines: {node: '>=18'} 1053 | 1054 | lru-cache@10.4.3: 1055 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 1056 | 1057 | lru-cache@11.1.0: 1058 | resolution: {integrity: sha512-QIXZUBJUx+2zHUdQujWejBkcD9+cs94tLn0+YL8UrCh+D5sCXZ4c7LaEH48pNwRY3MLDgqUFyhlCyjJPf1WP0A==} 1059 | engines: {node: 20 || >=22} 1060 | 1061 | merge-stream@2.0.0: 1062 | resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} 1063 | 1064 | merge2@1.4.1: 1065 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 1066 | engines: {node: '>= 8'} 1067 | 1068 | micromatch@4.0.8: 1069 | resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} 1070 | engines: {node: '>=8.6'} 1071 | 1072 | mime-db@1.52.0: 1073 | resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} 1074 | engines: {node: '>= 0.6'} 1075 | 1076 | mime-types@2.1.35: 1077 | resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} 1078 | engines: {node: '>= 0.6'} 1079 | 1080 | mimic-function@5.0.1: 1081 | resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} 1082 | engines: {node: '>=18'} 1083 | 1084 | minimatch@10.0.1: 1085 | resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} 1086 | engines: {node: 20 || >=22} 1087 | 1088 | minimatch@3.1.2: 1089 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} 1090 | 1091 | minimatch@5.1.6: 1092 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 1093 | engines: {node: '>=10'} 1094 | 1095 | minimatch@9.0.5: 1096 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 1097 | engines: {node: '>=16 || 14 >=14.17'} 1098 | 1099 | minipass@7.1.2: 1100 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 1101 | engines: {node: '>=16 || 14 >=14.17'} 1102 | 1103 | mocha@11.4.0: 1104 | resolution: {integrity: sha512-O6oi5Y9G6uu8f9iqXR6iKNLWHLRex3PKbmHynfpmUnMJJGrdgXh8ZmS85Ei5KR2Gnl+/gQ9s+Ktv5CqKybNw4A==} 1105 | engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} 1106 | hasBin: true 1107 | 1108 | ms@2.1.3: 1109 | resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} 1110 | 1111 | natural-compare@1.4.0: 1112 | resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} 1113 | 1114 | neo-async@2.6.2: 1115 | resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} 1116 | 1117 | node-releases@2.0.19: 1118 | resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} 1119 | 1120 | onetime@7.0.0: 1121 | resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} 1122 | engines: {node: '>=18'} 1123 | 1124 | optionator@0.9.4: 1125 | resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} 1126 | engines: {node: '>= 0.8.0'} 1127 | 1128 | ora@8.2.0: 1129 | resolution: {integrity: sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw==} 1130 | engines: {node: '>=18'} 1131 | 1132 | p-limit@2.3.0: 1133 | resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} 1134 | engines: {node: '>=6'} 1135 | 1136 | p-limit@3.1.0: 1137 | resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} 1138 | engines: {node: '>=10'} 1139 | 1140 | p-locate@4.1.0: 1141 | resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} 1142 | engines: {node: '>=8'} 1143 | 1144 | p-locate@5.0.0: 1145 | resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} 1146 | engines: {node: '>=10'} 1147 | 1148 | p-try@2.2.0: 1149 | resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} 1150 | engines: {node: '>=6'} 1151 | 1152 | package-json-from-dist@1.0.1: 1153 | resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} 1154 | 1155 | pako@1.0.11: 1156 | resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} 1157 | 1158 | parent-module@1.0.1: 1159 | resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} 1160 | engines: {node: '>=6'} 1161 | 1162 | path-exists@4.0.0: 1163 | resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} 1164 | engines: {node: '>=8'} 1165 | 1166 | path-key@3.1.1: 1167 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 1168 | engines: {node: '>=8'} 1169 | 1170 | path-parse@1.0.7: 1171 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 1172 | 1173 | path-scurry@1.11.1: 1174 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 1175 | engines: {node: '>=16 || 14 >=14.18'} 1176 | 1177 | path-scurry@2.0.0: 1178 | resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} 1179 | engines: {node: 20 || >=22} 1180 | 1181 | path@0.12.7: 1182 | resolution: {integrity: sha512-aXXC6s+1w7otVF9UletFkFcDsJeO7lSZBPUQhtb5O0xJe8LtYhj/GxldoL09bBj9+ZmE2hNoHqQSFMN5fikh4Q==} 1183 | 1184 | picocolors@1.1.1: 1185 | resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} 1186 | 1187 | picomatch@2.3.1: 1188 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1189 | engines: {node: '>=8.6'} 1190 | 1191 | pkg-dir@4.2.0: 1192 | resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} 1193 | engines: {node: '>=8'} 1194 | 1195 | prelude-ls@1.2.1: 1196 | resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} 1197 | engines: {node: '>= 0.8.0'} 1198 | 1199 | process-nextick-args@2.0.1: 1200 | resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} 1201 | 1202 | process@0.11.10: 1203 | resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} 1204 | engines: {node: '>= 0.6.0'} 1205 | 1206 | punycode@2.3.1: 1207 | resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} 1208 | engines: {node: '>=6'} 1209 | 1210 | queue-microtask@1.2.3: 1211 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 1212 | 1213 | randombytes@2.1.0: 1214 | resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} 1215 | 1216 | readable-stream@2.3.8: 1217 | resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} 1218 | 1219 | readdirp@4.1.2: 1220 | resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} 1221 | engines: {node: '>= 14.18.0'} 1222 | 1223 | rechoir@0.8.0: 1224 | resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} 1225 | engines: {node: '>= 10.13.0'} 1226 | 1227 | require-directory@2.1.1: 1228 | resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} 1229 | engines: {node: '>=0.10.0'} 1230 | 1231 | require-from-string@2.0.2: 1232 | resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} 1233 | engines: {node: '>=0.10.0'} 1234 | 1235 | resolve-cwd@3.0.0: 1236 | resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} 1237 | engines: {node: '>=8'} 1238 | 1239 | resolve-from@4.0.0: 1240 | resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} 1241 | engines: {node: '>=4'} 1242 | 1243 | resolve-from@5.0.0: 1244 | resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} 1245 | engines: {node: '>=8'} 1246 | 1247 | resolve@1.22.10: 1248 | resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} 1249 | engines: {node: '>= 0.4'} 1250 | hasBin: true 1251 | 1252 | restore-cursor@5.1.0: 1253 | resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} 1254 | engines: {node: '>=18'} 1255 | 1256 | reusify@1.1.0: 1257 | resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} 1258 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1259 | 1260 | run-parallel@1.2.0: 1261 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1262 | 1263 | safe-buffer@5.1.2: 1264 | resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} 1265 | 1266 | safe-buffer@5.2.1: 1267 | resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} 1268 | 1269 | schema-utils@4.3.2: 1270 | resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} 1271 | engines: {node: '>= 10.13.0'} 1272 | 1273 | semver@7.7.1: 1274 | resolution: {integrity: sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==} 1275 | engines: {node: '>=10'} 1276 | hasBin: true 1277 | 1278 | semver@7.7.2: 1279 | resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==} 1280 | engines: {node: '>=10'} 1281 | hasBin: true 1282 | 1283 | serialize-javascript@6.0.2: 1284 | resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} 1285 | 1286 | setimmediate@1.0.5: 1287 | resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} 1288 | 1289 | shallow-clone@3.0.1: 1290 | resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} 1291 | engines: {node: '>=8'} 1292 | 1293 | shebang-command@2.0.0: 1294 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1295 | engines: {node: '>=8'} 1296 | 1297 | shebang-regex@3.0.0: 1298 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1299 | engines: {node: '>=8'} 1300 | 1301 | signal-exit@4.1.0: 1302 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1303 | engines: {node: '>=14'} 1304 | 1305 | source-map-support@0.5.21: 1306 | resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} 1307 | 1308 | source-map@0.6.1: 1309 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1310 | engines: {node: '>=0.10.0'} 1311 | 1312 | source-map@0.7.4: 1313 | resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} 1314 | engines: {node: '>= 8'} 1315 | 1316 | stdin-discarder@0.2.2: 1317 | resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} 1318 | engines: {node: '>=18'} 1319 | 1320 | string-width@4.2.3: 1321 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1322 | engines: {node: '>=8'} 1323 | 1324 | string-width@5.1.2: 1325 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1326 | engines: {node: '>=12'} 1327 | 1328 | string-width@7.2.0: 1329 | resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} 1330 | engines: {node: '>=18'} 1331 | 1332 | string_decoder@1.1.1: 1333 | resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} 1334 | 1335 | strip-ansi@6.0.1: 1336 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1337 | engines: {node: '>=8'} 1338 | 1339 | strip-ansi@7.1.0: 1340 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1341 | engines: {node: '>=12'} 1342 | 1343 | strip-json-comments@3.1.1: 1344 | resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} 1345 | engines: {node: '>=8'} 1346 | 1347 | supports-color@7.2.0: 1348 | resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1349 | engines: {node: '>=8'} 1350 | 1351 | supports-color@8.1.1: 1352 | resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} 1353 | engines: {node: '>=10'} 1354 | 1355 | supports-preserve-symlinks-flag@1.0.0: 1356 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1357 | engines: {node: '>= 0.4'} 1358 | 1359 | tapable@2.2.1: 1360 | resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 1361 | engines: {node: '>=6'} 1362 | 1363 | terser-webpack-plugin@5.3.14: 1364 | resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} 1365 | engines: {node: '>= 10.13.0'} 1366 | peerDependencies: 1367 | '@swc/core': '*' 1368 | esbuild: '*' 1369 | uglify-js: '*' 1370 | webpack: ^5.1.0 1371 | peerDependenciesMeta: 1372 | '@swc/core': 1373 | optional: true 1374 | esbuild: 1375 | optional: true 1376 | uglify-js: 1377 | optional: true 1378 | 1379 | terser@5.39.0: 1380 | resolution: {integrity: sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==} 1381 | engines: {node: '>=10'} 1382 | hasBin: true 1383 | 1384 | to-regex-range@5.0.1: 1385 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1386 | engines: {node: '>=8.0'} 1387 | 1388 | ts-api-utils@2.1.0: 1389 | resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} 1390 | engines: {node: '>=18.12'} 1391 | peerDependencies: 1392 | typescript: '>=4.8.4' 1393 | 1394 | ts-loader@9.5.2: 1395 | resolution: {integrity: sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==} 1396 | engines: {node: '>=12.0.0'} 1397 | peerDependencies: 1398 | typescript: '*' 1399 | webpack: ^5.0.0 1400 | 1401 | type-check@0.4.0: 1402 | resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} 1403 | engines: {node: '>= 0.8.0'} 1404 | 1405 | typescript@5.8.3: 1406 | resolution: {integrity: sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==} 1407 | engines: {node: '>=14.17'} 1408 | hasBin: true 1409 | 1410 | undici-types@6.21.0: 1411 | resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} 1412 | 1413 | update-browserslist-db@1.1.3: 1414 | resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} 1415 | hasBin: true 1416 | peerDependencies: 1417 | browserslist: '>= 4.21.0' 1418 | 1419 | uri-js@4.4.1: 1420 | resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} 1421 | 1422 | util-deprecate@1.0.2: 1423 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1424 | 1425 | util@0.10.4: 1426 | resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==} 1427 | 1428 | watchpack@2.4.2: 1429 | resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} 1430 | engines: {node: '>=10.13.0'} 1431 | 1432 | webpack-cli@6.0.1: 1433 | resolution: {integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==} 1434 | engines: {node: '>=18.12.0'} 1435 | hasBin: true 1436 | peerDependencies: 1437 | webpack: ^5.82.0 1438 | webpack-bundle-analyzer: '*' 1439 | webpack-dev-server: '*' 1440 | peerDependenciesMeta: 1441 | webpack-bundle-analyzer: 1442 | optional: true 1443 | webpack-dev-server: 1444 | optional: true 1445 | 1446 | webpack-merge@6.0.1: 1447 | resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} 1448 | engines: {node: '>=18.0.0'} 1449 | 1450 | webpack-sources@3.2.3: 1451 | resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} 1452 | engines: {node: '>=10.13.0'} 1453 | 1454 | webpack@5.99.9: 1455 | resolution: {integrity: sha512-brOPwM3JnmOa+7kd3NsmOUOwbDAj8FT9xDsG3IW0MgbN9yZV7Oi/s/+MNQ/EcSMqw7qfoRyXPoeEWT8zLVdVGg==} 1456 | engines: {node: '>=10.13.0'} 1457 | hasBin: true 1458 | peerDependencies: 1459 | webpack-cli: '*' 1460 | peerDependenciesMeta: 1461 | webpack-cli: 1462 | optional: true 1463 | 1464 | which@2.0.2: 1465 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1466 | engines: {node: '>= 8'} 1467 | hasBin: true 1468 | 1469 | wildcard@2.0.1: 1470 | resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} 1471 | 1472 | word-wrap@1.2.5: 1473 | resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} 1474 | engines: {node: '>=0.10.0'} 1475 | 1476 | workerpool@6.5.1: 1477 | resolution: {integrity: sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==} 1478 | 1479 | wrap-ansi@7.0.0: 1480 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1481 | engines: {node: '>=10'} 1482 | 1483 | wrap-ansi@8.1.0: 1484 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1485 | engines: {node: '>=12'} 1486 | 1487 | y18n@5.0.8: 1488 | resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} 1489 | engines: {node: '>=10'} 1490 | 1491 | yargs-parser@21.1.1: 1492 | resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} 1493 | engines: {node: '>=12'} 1494 | 1495 | yargs-unparser@2.0.0: 1496 | resolution: {integrity: sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==} 1497 | engines: {node: '>=10'} 1498 | 1499 | yargs@17.7.2: 1500 | resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} 1501 | engines: {node: '>=12'} 1502 | 1503 | yocto-queue@0.1.0: 1504 | resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} 1505 | engines: {node: '>=10'} 1506 | 1507 | snapshots: 1508 | 1509 | '@discoveryjs/json-ext@0.6.3': {} 1510 | 1511 | '@esbuild/aix-ppc64@0.25.4': 1512 | optional: true 1513 | 1514 | '@esbuild/android-arm64@0.25.4': 1515 | optional: true 1516 | 1517 | '@esbuild/android-arm@0.25.4': 1518 | optional: true 1519 | 1520 | '@esbuild/android-x64@0.25.4': 1521 | optional: true 1522 | 1523 | '@esbuild/darwin-arm64@0.25.4': 1524 | optional: true 1525 | 1526 | '@esbuild/darwin-x64@0.25.4': 1527 | optional: true 1528 | 1529 | '@esbuild/freebsd-arm64@0.25.4': 1530 | optional: true 1531 | 1532 | '@esbuild/freebsd-x64@0.25.4': 1533 | optional: true 1534 | 1535 | '@esbuild/linux-arm64@0.25.4': 1536 | optional: true 1537 | 1538 | '@esbuild/linux-arm@0.25.4': 1539 | optional: true 1540 | 1541 | '@esbuild/linux-ia32@0.25.4': 1542 | optional: true 1543 | 1544 | '@esbuild/linux-loong64@0.25.4': 1545 | optional: true 1546 | 1547 | '@esbuild/linux-mips64el@0.25.4': 1548 | optional: true 1549 | 1550 | '@esbuild/linux-ppc64@0.25.4': 1551 | optional: true 1552 | 1553 | '@esbuild/linux-riscv64@0.25.4': 1554 | optional: true 1555 | 1556 | '@esbuild/linux-s390x@0.25.4': 1557 | optional: true 1558 | 1559 | '@esbuild/linux-x64@0.25.4': 1560 | optional: true 1561 | 1562 | '@esbuild/netbsd-arm64@0.25.4': 1563 | optional: true 1564 | 1565 | '@esbuild/netbsd-x64@0.25.4': 1566 | optional: true 1567 | 1568 | '@esbuild/openbsd-arm64@0.25.4': 1569 | optional: true 1570 | 1571 | '@esbuild/openbsd-x64@0.25.4': 1572 | optional: true 1573 | 1574 | '@esbuild/sunos-x64@0.25.4': 1575 | optional: true 1576 | 1577 | '@esbuild/win32-arm64@0.25.4': 1578 | optional: true 1579 | 1580 | '@esbuild/win32-ia32@0.25.4': 1581 | optional: true 1582 | 1583 | '@esbuild/win32-x64@0.25.4': 1584 | optional: true 1585 | 1586 | '@eslint-community/eslint-utils@4.5.1(eslint@9.27.0)': 1587 | dependencies: 1588 | eslint: 9.27.0 1589 | eslint-visitor-keys: 3.4.3 1590 | 1591 | '@eslint-community/eslint-utils@4.7.0(eslint@9.27.0)': 1592 | dependencies: 1593 | eslint: 9.27.0 1594 | eslint-visitor-keys: 3.4.3 1595 | 1596 | '@eslint-community/regexpp@4.12.1': {} 1597 | 1598 | '@eslint/config-array@0.20.0': 1599 | dependencies: 1600 | '@eslint/object-schema': 2.1.6 1601 | debug: 4.4.0(supports-color@8.1.1) 1602 | minimatch: 3.1.2 1603 | transitivePeerDependencies: 1604 | - supports-color 1605 | 1606 | '@eslint/config-helpers@0.2.1': {} 1607 | 1608 | '@eslint/core@0.14.0': 1609 | dependencies: 1610 | '@types/json-schema': 7.0.15 1611 | 1612 | '@eslint/eslintrc@3.3.1': 1613 | dependencies: 1614 | ajv: 6.12.6 1615 | debug: 4.4.0(supports-color@8.1.1) 1616 | espree: 10.3.0 1617 | globals: 14.0.0 1618 | ignore: 5.3.2 1619 | import-fresh: 3.3.1 1620 | js-yaml: 4.1.0 1621 | minimatch: 3.1.2 1622 | strip-json-comments: 3.1.1 1623 | transitivePeerDependencies: 1624 | - supports-color 1625 | 1626 | '@eslint/js@9.27.0': {} 1627 | 1628 | '@eslint/object-schema@2.1.6': {} 1629 | 1630 | '@eslint/plugin-kit@0.3.1': 1631 | dependencies: 1632 | '@eslint/core': 0.14.0 1633 | levn: 0.4.1 1634 | 1635 | '@humanfs/core@0.19.1': {} 1636 | 1637 | '@humanfs/node@0.16.6': 1638 | dependencies: 1639 | '@humanfs/core': 0.19.1 1640 | '@humanwhocodes/retry': 0.3.1 1641 | 1642 | '@humanwhocodes/module-importer@1.0.1': {} 1643 | 1644 | '@humanwhocodes/retry@0.3.1': {} 1645 | 1646 | '@humanwhocodes/retry@0.4.2': {} 1647 | 1648 | '@isaacs/cliui@8.0.2': 1649 | dependencies: 1650 | string-width: 5.1.2 1651 | string-width-cjs: string-width@4.2.3 1652 | strip-ansi: 7.1.0 1653 | strip-ansi-cjs: strip-ansi@6.0.1 1654 | wrap-ansi: 8.1.0 1655 | wrap-ansi-cjs: wrap-ansi@7.0.0 1656 | 1657 | '@jridgewell/gen-mapping@0.3.8': 1658 | dependencies: 1659 | '@jridgewell/set-array': 1.2.1 1660 | '@jridgewell/sourcemap-codec': 1.5.0 1661 | '@jridgewell/trace-mapping': 0.3.25 1662 | 1663 | '@jridgewell/resolve-uri@3.1.2': {} 1664 | 1665 | '@jridgewell/set-array@1.2.1': {} 1666 | 1667 | '@jridgewell/source-map@0.3.6': 1668 | dependencies: 1669 | '@jridgewell/gen-mapping': 0.3.8 1670 | '@jridgewell/trace-mapping': 0.3.25 1671 | 1672 | '@jridgewell/sourcemap-codec@1.5.0': {} 1673 | 1674 | '@jridgewell/trace-mapping@0.3.25': 1675 | dependencies: 1676 | '@jridgewell/resolve-uri': 3.1.2 1677 | '@jridgewell/sourcemap-codec': 1.5.0 1678 | 1679 | '@nodelib/fs.scandir@2.1.5': 1680 | dependencies: 1681 | '@nodelib/fs.stat': 2.0.5 1682 | run-parallel: 1.2.0 1683 | 1684 | '@nodelib/fs.stat@2.0.5': {} 1685 | 1686 | '@nodelib/fs.walk@1.2.8': 1687 | dependencies: 1688 | '@nodelib/fs.scandir': 2.1.5 1689 | fastq: 1.19.1 1690 | 1691 | '@pkgjs/parseargs@0.11.0': 1692 | optional: true 1693 | 1694 | '@types/eslint-scope@3.7.7': 1695 | dependencies: 1696 | '@types/eslint': 9.6.1 1697 | '@types/estree': 1.0.7 1698 | 1699 | '@types/eslint@9.6.1': 1700 | dependencies: 1701 | '@types/estree': 1.0.7 1702 | '@types/json-schema': 7.0.15 1703 | 1704 | '@types/estree@1.0.7': {} 1705 | 1706 | '@types/glob@8.1.0': 1707 | dependencies: 1708 | '@types/minimatch': 5.1.2 1709 | '@types/node': 22.14.0 1710 | 1711 | '@types/json-schema@7.0.15': {} 1712 | 1713 | '@types/minimatch@5.1.2': {} 1714 | 1715 | '@types/mocha@10.0.10': {} 1716 | 1717 | '@types/node@22.14.0': 1718 | dependencies: 1719 | undici-types: 6.21.0 1720 | 1721 | '@types/vscode@1.99.1': {} 1722 | 1723 | '@typescript-eslint/eslint-plugin@8.32.1(@typescript-eslint/parser@8.29.1(eslint@9.27.0)(typescript@5.8.3))(eslint@9.27.0)(typescript@5.8.3)': 1724 | dependencies: 1725 | '@eslint-community/regexpp': 4.12.1 1726 | '@typescript-eslint/parser': 8.29.1(eslint@9.27.0)(typescript@5.8.3) 1727 | '@typescript-eslint/scope-manager': 8.32.1 1728 | '@typescript-eslint/type-utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) 1729 | '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) 1730 | '@typescript-eslint/visitor-keys': 8.32.1 1731 | eslint: 9.27.0 1732 | graphemer: 1.4.0 1733 | ignore: 7.0.4 1734 | natural-compare: 1.4.0 1735 | ts-api-utils: 2.1.0(typescript@5.8.3) 1736 | typescript: 5.8.3 1737 | transitivePeerDependencies: 1738 | - supports-color 1739 | 1740 | '@typescript-eslint/parser@8.29.1(eslint@9.27.0)(typescript@5.8.3)': 1741 | dependencies: 1742 | '@typescript-eslint/scope-manager': 8.29.1 1743 | '@typescript-eslint/types': 8.29.1 1744 | '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.8.3) 1745 | '@typescript-eslint/visitor-keys': 8.29.1 1746 | debug: 4.4.0(supports-color@8.1.1) 1747 | eslint: 9.27.0 1748 | typescript: 5.8.3 1749 | transitivePeerDependencies: 1750 | - supports-color 1751 | 1752 | '@typescript-eslint/scope-manager@8.29.1': 1753 | dependencies: 1754 | '@typescript-eslint/types': 8.29.1 1755 | '@typescript-eslint/visitor-keys': 8.29.1 1756 | 1757 | '@typescript-eslint/scope-manager@8.32.1': 1758 | dependencies: 1759 | '@typescript-eslint/types': 8.32.1 1760 | '@typescript-eslint/visitor-keys': 8.32.1 1761 | 1762 | '@typescript-eslint/type-utils@8.32.1(eslint@9.27.0)(typescript@5.8.3)': 1763 | dependencies: 1764 | '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) 1765 | '@typescript-eslint/utils': 8.32.1(eslint@9.27.0)(typescript@5.8.3) 1766 | debug: 4.4.1 1767 | eslint: 9.27.0 1768 | ts-api-utils: 2.1.0(typescript@5.8.3) 1769 | typescript: 5.8.3 1770 | transitivePeerDependencies: 1771 | - supports-color 1772 | 1773 | '@typescript-eslint/types@8.29.1': {} 1774 | 1775 | '@typescript-eslint/types@8.32.1': {} 1776 | 1777 | '@typescript-eslint/typescript-estree@8.29.1(typescript@5.8.3)': 1778 | dependencies: 1779 | '@typescript-eslint/types': 8.29.1 1780 | '@typescript-eslint/visitor-keys': 8.29.1 1781 | debug: 4.4.0(supports-color@8.1.1) 1782 | fast-glob: 3.3.3 1783 | is-glob: 4.0.3 1784 | minimatch: 9.0.5 1785 | semver: 7.7.1 1786 | ts-api-utils: 2.1.0(typescript@5.8.3) 1787 | typescript: 5.8.3 1788 | transitivePeerDependencies: 1789 | - supports-color 1790 | 1791 | '@typescript-eslint/typescript-estree@8.32.1(typescript@5.8.3)': 1792 | dependencies: 1793 | '@typescript-eslint/types': 8.32.1 1794 | '@typescript-eslint/visitor-keys': 8.32.1 1795 | debug: 4.4.1 1796 | fast-glob: 3.3.3 1797 | is-glob: 4.0.3 1798 | minimatch: 9.0.5 1799 | semver: 7.7.2 1800 | ts-api-utils: 2.1.0(typescript@5.8.3) 1801 | typescript: 5.8.3 1802 | transitivePeerDependencies: 1803 | - supports-color 1804 | 1805 | '@typescript-eslint/utils@8.32.1(eslint@9.27.0)(typescript@5.8.3)': 1806 | dependencies: 1807 | '@eslint-community/eslint-utils': 4.7.0(eslint@9.27.0) 1808 | '@typescript-eslint/scope-manager': 8.32.1 1809 | '@typescript-eslint/types': 8.32.1 1810 | '@typescript-eslint/typescript-estree': 8.32.1(typescript@5.8.3) 1811 | eslint: 9.27.0 1812 | typescript: 5.8.3 1813 | transitivePeerDependencies: 1814 | - supports-color 1815 | 1816 | '@typescript-eslint/visitor-keys@8.29.1': 1817 | dependencies: 1818 | '@typescript-eslint/types': 8.29.1 1819 | eslint-visitor-keys: 4.2.0 1820 | 1821 | '@typescript-eslint/visitor-keys@8.32.1': 1822 | dependencies: 1823 | '@typescript-eslint/types': 8.32.1 1824 | eslint-visitor-keys: 4.2.0 1825 | 1826 | '@vscode/test-electron@2.5.2': 1827 | dependencies: 1828 | http-proxy-agent: 7.0.2 1829 | https-proxy-agent: 7.0.6 1830 | jszip: 3.10.1 1831 | ora: 8.2.0 1832 | semver: 7.7.1 1833 | transitivePeerDependencies: 1834 | - supports-color 1835 | 1836 | '@webassemblyjs/ast@1.14.1': 1837 | dependencies: 1838 | '@webassemblyjs/helper-numbers': 1.13.2 1839 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 1840 | 1841 | '@webassemblyjs/floating-point-hex-parser@1.13.2': {} 1842 | 1843 | '@webassemblyjs/helper-api-error@1.13.2': {} 1844 | 1845 | '@webassemblyjs/helper-buffer@1.14.1': {} 1846 | 1847 | '@webassemblyjs/helper-numbers@1.13.2': 1848 | dependencies: 1849 | '@webassemblyjs/floating-point-hex-parser': 1.13.2 1850 | '@webassemblyjs/helper-api-error': 1.13.2 1851 | '@xtuc/long': 4.2.2 1852 | 1853 | '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} 1854 | 1855 | '@webassemblyjs/helper-wasm-section@1.14.1': 1856 | dependencies: 1857 | '@webassemblyjs/ast': 1.14.1 1858 | '@webassemblyjs/helper-buffer': 1.14.1 1859 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 1860 | '@webassemblyjs/wasm-gen': 1.14.1 1861 | 1862 | '@webassemblyjs/ieee754@1.13.2': 1863 | dependencies: 1864 | '@xtuc/ieee754': 1.2.0 1865 | 1866 | '@webassemblyjs/leb128@1.13.2': 1867 | dependencies: 1868 | '@xtuc/long': 4.2.2 1869 | 1870 | '@webassemblyjs/utf8@1.13.2': {} 1871 | 1872 | '@webassemblyjs/wasm-edit@1.14.1': 1873 | dependencies: 1874 | '@webassemblyjs/ast': 1.14.1 1875 | '@webassemblyjs/helper-buffer': 1.14.1 1876 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 1877 | '@webassemblyjs/helper-wasm-section': 1.14.1 1878 | '@webassemblyjs/wasm-gen': 1.14.1 1879 | '@webassemblyjs/wasm-opt': 1.14.1 1880 | '@webassemblyjs/wasm-parser': 1.14.1 1881 | '@webassemblyjs/wast-printer': 1.14.1 1882 | 1883 | '@webassemblyjs/wasm-gen@1.14.1': 1884 | dependencies: 1885 | '@webassemblyjs/ast': 1.14.1 1886 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 1887 | '@webassemblyjs/ieee754': 1.13.2 1888 | '@webassemblyjs/leb128': 1.13.2 1889 | '@webassemblyjs/utf8': 1.13.2 1890 | 1891 | '@webassemblyjs/wasm-opt@1.14.1': 1892 | dependencies: 1893 | '@webassemblyjs/ast': 1.14.1 1894 | '@webassemblyjs/helper-buffer': 1.14.1 1895 | '@webassemblyjs/wasm-gen': 1.14.1 1896 | '@webassemblyjs/wasm-parser': 1.14.1 1897 | 1898 | '@webassemblyjs/wasm-parser@1.14.1': 1899 | dependencies: 1900 | '@webassemblyjs/ast': 1.14.1 1901 | '@webassemblyjs/helper-api-error': 1.13.2 1902 | '@webassemblyjs/helper-wasm-bytecode': 1.13.2 1903 | '@webassemblyjs/ieee754': 1.13.2 1904 | '@webassemblyjs/leb128': 1.13.2 1905 | '@webassemblyjs/utf8': 1.13.2 1906 | 1907 | '@webassemblyjs/wast-printer@1.14.1': 1908 | dependencies: 1909 | '@webassemblyjs/ast': 1.14.1 1910 | '@xtuc/long': 4.2.2 1911 | 1912 | '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': 1913 | dependencies: 1914 | webpack: 5.99.9(esbuild@0.25.4)(webpack-cli@6.0.1) 1915 | webpack-cli: 6.0.1(webpack@5.99.9) 1916 | 1917 | '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': 1918 | dependencies: 1919 | webpack: 5.99.9(esbuild@0.25.4)(webpack-cli@6.0.1) 1920 | webpack-cli: 6.0.1(webpack@5.99.9) 1921 | 1922 | '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.99.9)': 1923 | dependencies: 1924 | webpack: 5.99.9(esbuild@0.25.4)(webpack-cli@6.0.1) 1925 | webpack-cli: 6.0.1(webpack@5.99.9) 1926 | 1927 | '@xtuc/ieee754@1.2.0': {} 1928 | 1929 | '@xtuc/long@4.2.2': {} 1930 | 1931 | acorn-jsx@5.3.2(acorn@8.14.1): 1932 | dependencies: 1933 | acorn: 8.14.1 1934 | 1935 | acorn@8.14.1: {} 1936 | 1937 | agent-base@7.1.3: {} 1938 | 1939 | ajv-formats@2.1.1(ajv@8.17.1): 1940 | optionalDependencies: 1941 | ajv: 8.17.1 1942 | 1943 | ajv-keywords@5.1.0(ajv@8.17.1): 1944 | dependencies: 1945 | ajv: 8.17.1 1946 | fast-deep-equal: 3.1.3 1947 | 1948 | ajv@6.12.6: 1949 | dependencies: 1950 | fast-deep-equal: 3.1.3 1951 | fast-json-stable-stringify: 2.1.0 1952 | json-schema-traverse: 0.4.1 1953 | uri-js: 4.4.1 1954 | 1955 | ajv@8.17.1: 1956 | dependencies: 1957 | fast-deep-equal: 3.1.3 1958 | fast-uri: 3.0.6 1959 | json-schema-traverse: 1.0.0 1960 | require-from-string: 2.0.2 1961 | 1962 | ansi-regex@5.0.1: {} 1963 | 1964 | ansi-regex@6.1.0: {} 1965 | 1966 | ansi-styles@4.3.0: 1967 | dependencies: 1968 | color-convert: 2.0.1 1969 | 1970 | ansi-styles@6.2.1: {} 1971 | 1972 | argparse@2.0.1: {} 1973 | 1974 | balanced-match@1.0.2: {} 1975 | 1976 | brace-expansion@1.1.11: 1977 | dependencies: 1978 | balanced-match: 1.0.2 1979 | concat-map: 0.0.1 1980 | 1981 | brace-expansion@2.0.1: 1982 | dependencies: 1983 | balanced-match: 1.0.2 1984 | 1985 | braces@3.0.3: 1986 | dependencies: 1987 | fill-range: 7.1.1 1988 | 1989 | browser-stdout@1.3.1: {} 1990 | 1991 | browserslist@4.24.4: 1992 | dependencies: 1993 | caniuse-lite: 1.0.30001712 1994 | electron-to-chromium: 1.5.135 1995 | node-releases: 2.0.19 1996 | update-browserslist-db: 1.1.3(browserslist@4.24.4) 1997 | 1998 | buffer-from@1.1.2: {} 1999 | 2000 | callsites@3.1.0: {} 2001 | 2002 | camelcase@6.3.0: {} 2003 | 2004 | caniuse-lite@1.0.30001712: {} 2005 | 2006 | chalk@4.1.2: 2007 | dependencies: 2008 | ansi-styles: 4.3.0 2009 | supports-color: 7.2.0 2010 | 2011 | chalk@5.4.1: {} 2012 | 2013 | child_process@1.0.2: {} 2014 | 2015 | chokidar@4.0.3: 2016 | dependencies: 2017 | readdirp: 4.1.2 2018 | 2019 | chrome-trace-event@1.0.4: {} 2020 | 2021 | cli-cursor@5.0.0: 2022 | dependencies: 2023 | restore-cursor: 5.1.0 2024 | 2025 | cli-spinners@2.9.2: {} 2026 | 2027 | cliui@8.0.1: 2028 | dependencies: 2029 | string-width: 4.2.3 2030 | strip-ansi: 6.0.1 2031 | wrap-ansi: 7.0.0 2032 | 2033 | clone-deep@4.0.1: 2034 | dependencies: 2035 | is-plain-object: 2.0.4 2036 | kind-of: 6.0.3 2037 | shallow-clone: 3.0.1 2038 | 2039 | color-convert@2.0.1: 2040 | dependencies: 2041 | color-name: 1.1.4 2042 | 2043 | color-name@1.1.4: {} 2044 | 2045 | colorette@2.0.20: {} 2046 | 2047 | commander@12.1.0: {} 2048 | 2049 | commander@2.20.3: {} 2050 | 2051 | compare-versions@6.1.1: {} 2052 | 2053 | concat-map@0.0.1: {} 2054 | 2055 | core-util-is@1.0.3: {} 2056 | 2057 | cross-spawn@7.0.6: 2058 | dependencies: 2059 | path-key: 3.1.1 2060 | shebang-command: 2.0.0 2061 | which: 2.0.2 2062 | 2063 | debug@4.4.0(supports-color@8.1.1): 2064 | dependencies: 2065 | ms: 2.1.3 2066 | optionalDependencies: 2067 | supports-color: 8.1.1 2068 | 2069 | debug@4.4.1: 2070 | dependencies: 2071 | ms: 2.1.3 2072 | 2073 | decamelize@4.0.0: {} 2074 | 2075 | deep-is@0.1.4: {} 2076 | 2077 | diff@7.0.0: {} 2078 | 2079 | eastasianwidth@0.2.0: {} 2080 | 2081 | electron-to-chromium@1.5.135: {} 2082 | 2083 | emoji-regex@10.4.0: {} 2084 | 2085 | emoji-regex@8.0.0: {} 2086 | 2087 | emoji-regex@9.2.2: {} 2088 | 2089 | enhanced-resolve@5.18.1: 2090 | dependencies: 2091 | graceful-fs: 4.2.11 2092 | tapable: 2.2.1 2093 | 2094 | envinfo@7.14.0: {} 2095 | 2096 | es-module-lexer@1.6.0: {} 2097 | 2098 | esbuild@0.25.4: 2099 | optionalDependencies: 2100 | '@esbuild/aix-ppc64': 0.25.4 2101 | '@esbuild/android-arm': 0.25.4 2102 | '@esbuild/android-arm64': 0.25.4 2103 | '@esbuild/android-x64': 0.25.4 2104 | '@esbuild/darwin-arm64': 0.25.4 2105 | '@esbuild/darwin-x64': 0.25.4 2106 | '@esbuild/freebsd-arm64': 0.25.4 2107 | '@esbuild/freebsd-x64': 0.25.4 2108 | '@esbuild/linux-arm': 0.25.4 2109 | '@esbuild/linux-arm64': 0.25.4 2110 | '@esbuild/linux-ia32': 0.25.4 2111 | '@esbuild/linux-loong64': 0.25.4 2112 | '@esbuild/linux-mips64el': 0.25.4 2113 | '@esbuild/linux-ppc64': 0.25.4 2114 | '@esbuild/linux-riscv64': 0.25.4 2115 | '@esbuild/linux-s390x': 0.25.4 2116 | '@esbuild/linux-x64': 0.25.4 2117 | '@esbuild/netbsd-arm64': 0.25.4 2118 | '@esbuild/netbsd-x64': 0.25.4 2119 | '@esbuild/openbsd-arm64': 0.25.4 2120 | '@esbuild/openbsd-x64': 0.25.4 2121 | '@esbuild/sunos-x64': 0.25.4 2122 | '@esbuild/win32-arm64': 0.25.4 2123 | '@esbuild/win32-ia32': 0.25.4 2124 | '@esbuild/win32-x64': 0.25.4 2125 | 2126 | escalade@3.2.0: {} 2127 | 2128 | escape-string-regexp@4.0.0: {} 2129 | 2130 | eslint-scope@5.1.1: 2131 | dependencies: 2132 | esrecurse: 4.3.0 2133 | estraverse: 4.3.0 2134 | 2135 | eslint-scope@8.3.0: 2136 | dependencies: 2137 | esrecurse: 4.3.0 2138 | estraverse: 5.3.0 2139 | 2140 | eslint-visitor-keys@3.4.3: {} 2141 | 2142 | eslint-visitor-keys@4.2.0: {} 2143 | 2144 | eslint@9.27.0: 2145 | dependencies: 2146 | '@eslint-community/eslint-utils': 4.5.1(eslint@9.27.0) 2147 | '@eslint-community/regexpp': 4.12.1 2148 | '@eslint/config-array': 0.20.0 2149 | '@eslint/config-helpers': 0.2.1 2150 | '@eslint/core': 0.14.0 2151 | '@eslint/eslintrc': 3.3.1 2152 | '@eslint/js': 9.27.0 2153 | '@eslint/plugin-kit': 0.3.1 2154 | '@humanfs/node': 0.16.6 2155 | '@humanwhocodes/module-importer': 1.0.1 2156 | '@humanwhocodes/retry': 0.4.2 2157 | '@types/estree': 1.0.7 2158 | '@types/json-schema': 7.0.15 2159 | ajv: 6.12.6 2160 | chalk: 4.1.2 2161 | cross-spawn: 7.0.6 2162 | debug: 4.4.0(supports-color@8.1.1) 2163 | escape-string-regexp: 4.0.0 2164 | eslint-scope: 8.3.0 2165 | eslint-visitor-keys: 4.2.0 2166 | espree: 10.3.0 2167 | esquery: 1.6.0 2168 | esutils: 2.0.3 2169 | fast-deep-equal: 3.1.3 2170 | file-entry-cache: 8.0.0 2171 | find-up: 5.0.0 2172 | glob-parent: 6.0.2 2173 | ignore: 5.3.2 2174 | imurmurhash: 0.1.4 2175 | is-glob: 4.0.3 2176 | json-stable-stringify-without-jsonify: 1.0.1 2177 | lodash.merge: 4.6.2 2178 | minimatch: 3.1.2 2179 | natural-compare: 1.4.0 2180 | optionator: 0.9.4 2181 | transitivePeerDependencies: 2182 | - supports-color 2183 | 2184 | espree@10.3.0: 2185 | dependencies: 2186 | acorn: 8.14.1 2187 | acorn-jsx: 5.3.2(acorn@8.14.1) 2188 | eslint-visitor-keys: 4.2.0 2189 | 2190 | esquery@1.6.0: 2191 | dependencies: 2192 | estraverse: 5.3.0 2193 | 2194 | esrecurse@4.3.0: 2195 | dependencies: 2196 | estraverse: 5.3.0 2197 | 2198 | estraverse@4.3.0: {} 2199 | 2200 | estraverse@5.3.0: {} 2201 | 2202 | esutils@2.0.3: {} 2203 | 2204 | events@3.3.0: {} 2205 | 2206 | fast-deep-equal@3.1.3: {} 2207 | 2208 | fast-glob@3.3.3: 2209 | dependencies: 2210 | '@nodelib/fs.stat': 2.0.5 2211 | '@nodelib/fs.walk': 1.2.8 2212 | glob-parent: 5.1.2 2213 | merge2: 1.4.1 2214 | micromatch: 4.0.8 2215 | 2216 | fast-json-stable-stringify@2.1.0: {} 2217 | 2218 | fast-levenshtein@2.0.6: {} 2219 | 2220 | fast-uri@3.0.6: {} 2221 | 2222 | fastest-levenshtein@1.0.16: {} 2223 | 2224 | fastq@1.19.1: 2225 | dependencies: 2226 | reusify: 1.1.0 2227 | 2228 | file-entry-cache@8.0.0: 2229 | dependencies: 2230 | flat-cache: 4.0.1 2231 | 2232 | fill-range@7.1.1: 2233 | dependencies: 2234 | to-regex-range: 5.0.1 2235 | 2236 | find-up@4.1.0: 2237 | dependencies: 2238 | locate-path: 5.0.0 2239 | path-exists: 4.0.0 2240 | 2241 | find-up@5.0.0: 2242 | dependencies: 2243 | locate-path: 6.0.0 2244 | path-exists: 4.0.0 2245 | 2246 | flat-cache@4.0.1: 2247 | dependencies: 2248 | flatted: 3.3.3 2249 | keyv: 4.5.4 2250 | 2251 | flat@5.0.2: {} 2252 | 2253 | flatted@3.3.3: {} 2254 | 2255 | foreground-child@3.3.1: 2256 | dependencies: 2257 | cross-spawn: 7.0.6 2258 | signal-exit: 4.1.0 2259 | 2260 | fs@0.0.1-security: {} 2261 | 2262 | function-bind@1.1.2: {} 2263 | 2264 | get-caller-file@2.0.5: {} 2265 | 2266 | get-east-asian-width@1.3.0: {} 2267 | 2268 | glob-parent@5.1.2: 2269 | dependencies: 2270 | is-glob: 4.0.3 2271 | 2272 | glob-parent@6.0.2: 2273 | dependencies: 2274 | is-glob: 4.0.3 2275 | 2276 | glob-to-regexp@0.4.1: {} 2277 | 2278 | glob@10.4.5: 2279 | dependencies: 2280 | foreground-child: 3.3.1 2281 | jackspeak: 3.4.3 2282 | minimatch: 9.0.5 2283 | minipass: 7.1.2 2284 | package-json-from-dist: 1.0.1 2285 | path-scurry: 1.11.1 2286 | 2287 | glob@11.0.2: 2288 | dependencies: 2289 | foreground-child: 3.3.1 2290 | jackspeak: 4.1.0 2291 | minimatch: 10.0.1 2292 | minipass: 7.1.2 2293 | package-json-from-dist: 1.0.1 2294 | path-scurry: 2.0.0 2295 | 2296 | globals@14.0.0: {} 2297 | 2298 | graceful-fs@4.2.11: {} 2299 | 2300 | graphemer@1.4.0: {} 2301 | 2302 | has-flag@4.0.0: {} 2303 | 2304 | hasown@2.0.2: 2305 | dependencies: 2306 | function-bind: 1.1.2 2307 | 2308 | he@1.2.0: {} 2309 | 2310 | http-proxy-agent@7.0.2: 2311 | dependencies: 2312 | agent-base: 7.1.3 2313 | debug: 4.4.0(supports-color@8.1.1) 2314 | transitivePeerDependencies: 2315 | - supports-color 2316 | 2317 | https-proxy-agent@7.0.6: 2318 | dependencies: 2319 | agent-base: 7.1.3 2320 | debug: 4.4.0(supports-color@8.1.1) 2321 | transitivePeerDependencies: 2322 | - supports-color 2323 | 2324 | ignore@5.3.2: {} 2325 | 2326 | ignore@7.0.4: {} 2327 | 2328 | immediate@3.0.6: {} 2329 | 2330 | import-fresh@3.3.1: 2331 | dependencies: 2332 | parent-module: 1.0.1 2333 | resolve-from: 4.0.0 2334 | 2335 | import-local@3.2.0: 2336 | dependencies: 2337 | pkg-dir: 4.2.0 2338 | resolve-cwd: 3.0.0 2339 | 2340 | imurmurhash@0.1.4: {} 2341 | 2342 | inherits@2.0.3: {} 2343 | 2344 | inherits@2.0.4: {} 2345 | 2346 | interpret@3.1.1: {} 2347 | 2348 | is-core-module@2.16.1: 2349 | dependencies: 2350 | hasown: 2.0.2 2351 | 2352 | is-extglob@2.1.1: {} 2353 | 2354 | is-fullwidth-code-point@3.0.0: {} 2355 | 2356 | is-glob@4.0.3: 2357 | dependencies: 2358 | is-extglob: 2.1.1 2359 | 2360 | is-interactive@2.0.0: {} 2361 | 2362 | is-number@7.0.0: {} 2363 | 2364 | is-plain-obj@2.1.0: {} 2365 | 2366 | is-plain-object@2.0.4: 2367 | dependencies: 2368 | isobject: 3.0.1 2369 | 2370 | is-unicode-supported@0.1.0: {} 2371 | 2372 | is-unicode-supported@1.3.0: {} 2373 | 2374 | is-unicode-supported@2.1.0: {} 2375 | 2376 | isarray@1.0.0: {} 2377 | 2378 | isexe@2.0.0: {} 2379 | 2380 | isobject@3.0.1: {} 2381 | 2382 | jackspeak@3.4.3: 2383 | dependencies: 2384 | '@isaacs/cliui': 8.0.2 2385 | optionalDependencies: 2386 | '@pkgjs/parseargs': 0.11.0 2387 | 2388 | jackspeak@4.1.0: 2389 | dependencies: 2390 | '@isaacs/cliui': 8.0.2 2391 | 2392 | jest-worker@27.5.1: 2393 | dependencies: 2394 | '@types/node': 22.14.0 2395 | merge-stream: 2.0.0 2396 | supports-color: 8.1.1 2397 | 2398 | js-yaml@4.1.0: 2399 | dependencies: 2400 | argparse: 2.0.1 2401 | 2402 | json-buffer@3.0.1: {} 2403 | 2404 | json-parse-even-better-errors@2.3.1: {} 2405 | 2406 | json-schema-traverse@0.4.1: {} 2407 | 2408 | json-schema-traverse@1.0.0: {} 2409 | 2410 | json-stable-stringify-without-jsonify@1.0.1: {} 2411 | 2412 | jszip@3.10.1: 2413 | dependencies: 2414 | lie: 3.3.0 2415 | pako: 1.0.11 2416 | readable-stream: 2.3.8 2417 | setimmediate: 1.0.5 2418 | 2419 | keyv@4.5.4: 2420 | dependencies: 2421 | json-buffer: 3.0.1 2422 | 2423 | kind-of@6.0.3: {} 2424 | 2425 | levn@0.4.1: 2426 | dependencies: 2427 | prelude-ls: 1.2.1 2428 | type-check: 0.4.0 2429 | 2430 | lie@3.3.0: 2431 | dependencies: 2432 | immediate: 3.0.6 2433 | 2434 | loader-runner@4.3.0: {} 2435 | 2436 | locate-path@5.0.0: 2437 | dependencies: 2438 | p-locate: 4.1.0 2439 | 2440 | locate-path@6.0.0: 2441 | dependencies: 2442 | p-locate: 5.0.0 2443 | 2444 | lodash.merge@4.6.2: {} 2445 | 2446 | log-symbols@4.1.0: 2447 | dependencies: 2448 | chalk: 4.1.2 2449 | is-unicode-supported: 0.1.0 2450 | 2451 | log-symbols@6.0.0: 2452 | dependencies: 2453 | chalk: 5.4.1 2454 | is-unicode-supported: 1.3.0 2455 | 2456 | lru-cache@10.4.3: {} 2457 | 2458 | lru-cache@11.1.0: {} 2459 | 2460 | merge-stream@2.0.0: {} 2461 | 2462 | merge2@1.4.1: {} 2463 | 2464 | micromatch@4.0.8: 2465 | dependencies: 2466 | braces: 3.0.3 2467 | picomatch: 2.3.1 2468 | 2469 | mime-db@1.52.0: {} 2470 | 2471 | mime-types@2.1.35: 2472 | dependencies: 2473 | mime-db: 1.52.0 2474 | 2475 | mimic-function@5.0.1: {} 2476 | 2477 | minimatch@10.0.1: 2478 | dependencies: 2479 | brace-expansion: 2.0.1 2480 | 2481 | minimatch@3.1.2: 2482 | dependencies: 2483 | brace-expansion: 1.1.11 2484 | 2485 | minimatch@5.1.6: 2486 | dependencies: 2487 | brace-expansion: 2.0.1 2488 | 2489 | minimatch@9.0.5: 2490 | dependencies: 2491 | brace-expansion: 2.0.1 2492 | 2493 | minipass@7.1.2: {} 2494 | 2495 | mocha@11.4.0: 2496 | dependencies: 2497 | browser-stdout: 1.3.1 2498 | chokidar: 4.0.3 2499 | debug: 4.4.0(supports-color@8.1.1) 2500 | diff: 7.0.0 2501 | escape-string-regexp: 4.0.0 2502 | find-up: 5.0.0 2503 | glob: 10.4.5 2504 | he: 1.2.0 2505 | js-yaml: 4.1.0 2506 | log-symbols: 4.1.0 2507 | minimatch: 5.1.6 2508 | ms: 2.1.3 2509 | picocolors: 1.1.1 2510 | serialize-javascript: 6.0.2 2511 | strip-json-comments: 3.1.1 2512 | supports-color: 8.1.1 2513 | workerpool: 6.5.1 2514 | yargs: 17.7.2 2515 | yargs-parser: 21.1.1 2516 | yargs-unparser: 2.0.0 2517 | 2518 | ms@2.1.3: {} 2519 | 2520 | natural-compare@1.4.0: {} 2521 | 2522 | neo-async@2.6.2: {} 2523 | 2524 | node-releases@2.0.19: {} 2525 | 2526 | onetime@7.0.0: 2527 | dependencies: 2528 | mimic-function: 5.0.1 2529 | 2530 | optionator@0.9.4: 2531 | dependencies: 2532 | deep-is: 0.1.4 2533 | fast-levenshtein: 2.0.6 2534 | levn: 0.4.1 2535 | prelude-ls: 1.2.1 2536 | type-check: 0.4.0 2537 | word-wrap: 1.2.5 2538 | 2539 | ora@8.2.0: 2540 | dependencies: 2541 | chalk: 5.4.1 2542 | cli-cursor: 5.0.0 2543 | cli-spinners: 2.9.2 2544 | is-interactive: 2.0.0 2545 | is-unicode-supported: 2.1.0 2546 | log-symbols: 6.0.0 2547 | stdin-discarder: 0.2.2 2548 | string-width: 7.2.0 2549 | strip-ansi: 7.1.0 2550 | 2551 | p-limit@2.3.0: 2552 | dependencies: 2553 | p-try: 2.2.0 2554 | 2555 | p-limit@3.1.0: 2556 | dependencies: 2557 | yocto-queue: 0.1.0 2558 | 2559 | p-locate@4.1.0: 2560 | dependencies: 2561 | p-limit: 2.3.0 2562 | 2563 | p-locate@5.0.0: 2564 | dependencies: 2565 | p-limit: 3.1.0 2566 | 2567 | p-try@2.2.0: {} 2568 | 2569 | package-json-from-dist@1.0.1: {} 2570 | 2571 | pako@1.0.11: {} 2572 | 2573 | parent-module@1.0.1: 2574 | dependencies: 2575 | callsites: 3.1.0 2576 | 2577 | path-exists@4.0.0: {} 2578 | 2579 | path-key@3.1.1: {} 2580 | 2581 | path-parse@1.0.7: {} 2582 | 2583 | path-scurry@1.11.1: 2584 | dependencies: 2585 | lru-cache: 10.4.3 2586 | minipass: 7.1.2 2587 | 2588 | path-scurry@2.0.0: 2589 | dependencies: 2590 | lru-cache: 11.1.0 2591 | minipass: 7.1.2 2592 | 2593 | path@0.12.7: 2594 | dependencies: 2595 | process: 0.11.10 2596 | util: 0.10.4 2597 | 2598 | picocolors@1.1.1: {} 2599 | 2600 | picomatch@2.3.1: {} 2601 | 2602 | pkg-dir@4.2.0: 2603 | dependencies: 2604 | find-up: 4.1.0 2605 | 2606 | prelude-ls@1.2.1: {} 2607 | 2608 | process-nextick-args@2.0.1: {} 2609 | 2610 | process@0.11.10: {} 2611 | 2612 | punycode@2.3.1: {} 2613 | 2614 | queue-microtask@1.2.3: {} 2615 | 2616 | randombytes@2.1.0: 2617 | dependencies: 2618 | safe-buffer: 5.2.1 2619 | 2620 | readable-stream@2.3.8: 2621 | dependencies: 2622 | core-util-is: 1.0.3 2623 | inherits: 2.0.4 2624 | isarray: 1.0.0 2625 | process-nextick-args: 2.0.1 2626 | safe-buffer: 5.1.2 2627 | string_decoder: 1.1.1 2628 | util-deprecate: 1.0.2 2629 | 2630 | readdirp@4.1.2: {} 2631 | 2632 | rechoir@0.8.0: 2633 | dependencies: 2634 | resolve: 1.22.10 2635 | 2636 | require-directory@2.1.1: {} 2637 | 2638 | require-from-string@2.0.2: {} 2639 | 2640 | resolve-cwd@3.0.0: 2641 | dependencies: 2642 | resolve-from: 5.0.0 2643 | 2644 | resolve-from@4.0.0: {} 2645 | 2646 | resolve-from@5.0.0: {} 2647 | 2648 | resolve@1.22.10: 2649 | dependencies: 2650 | is-core-module: 2.16.1 2651 | path-parse: 1.0.7 2652 | supports-preserve-symlinks-flag: 1.0.0 2653 | 2654 | restore-cursor@5.1.0: 2655 | dependencies: 2656 | onetime: 7.0.0 2657 | signal-exit: 4.1.0 2658 | 2659 | reusify@1.1.0: {} 2660 | 2661 | run-parallel@1.2.0: 2662 | dependencies: 2663 | queue-microtask: 1.2.3 2664 | 2665 | safe-buffer@5.1.2: {} 2666 | 2667 | safe-buffer@5.2.1: {} 2668 | 2669 | schema-utils@4.3.2: 2670 | dependencies: 2671 | '@types/json-schema': 7.0.15 2672 | ajv: 8.17.1 2673 | ajv-formats: 2.1.1(ajv@8.17.1) 2674 | ajv-keywords: 5.1.0(ajv@8.17.1) 2675 | 2676 | semver@7.7.1: {} 2677 | 2678 | semver@7.7.2: {} 2679 | 2680 | serialize-javascript@6.0.2: 2681 | dependencies: 2682 | randombytes: 2.1.0 2683 | 2684 | setimmediate@1.0.5: {} 2685 | 2686 | shallow-clone@3.0.1: 2687 | dependencies: 2688 | kind-of: 6.0.3 2689 | 2690 | shebang-command@2.0.0: 2691 | dependencies: 2692 | shebang-regex: 3.0.0 2693 | 2694 | shebang-regex@3.0.0: {} 2695 | 2696 | signal-exit@4.1.0: {} 2697 | 2698 | source-map-support@0.5.21: 2699 | dependencies: 2700 | buffer-from: 1.1.2 2701 | source-map: 0.6.1 2702 | 2703 | source-map@0.6.1: {} 2704 | 2705 | source-map@0.7.4: {} 2706 | 2707 | stdin-discarder@0.2.2: {} 2708 | 2709 | string-width@4.2.3: 2710 | dependencies: 2711 | emoji-regex: 8.0.0 2712 | is-fullwidth-code-point: 3.0.0 2713 | strip-ansi: 6.0.1 2714 | 2715 | string-width@5.1.2: 2716 | dependencies: 2717 | eastasianwidth: 0.2.0 2718 | emoji-regex: 9.2.2 2719 | strip-ansi: 7.1.0 2720 | 2721 | string-width@7.2.0: 2722 | dependencies: 2723 | emoji-regex: 10.4.0 2724 | get-east-asian-width: 1.3.0 2725 | strip-ansi: 7.1.0 2726 | 2727 | string_decoder@1.1.1: 2728 | dependencies: 2729 | safe-buffer: 5.1.2 2730 | 2731 | strip-ansi@6.0.1: 2732 | dependencies: 2733 | ansi-regex: 5.0.1 2734 | 2735 | strip-ansi@7.1.0: 2736 | dependencies: 2737 | ansi-regex: 6.1.0 2738 | 2739 | strip-json-comments@3.1.1: {} 2740 | 2741 | supports-color@7.2.0: 2742 | dependencies: 2743 | has-flag: 4.0.0 2744 | 2745 | supports-color@8.1.1: 2746 | dependencies: 2747 | has-flag: 4.0.0 2748 | 2749 | supports-preserve-symlinks-flag@1.0.0: {} 2750 | 2751 | tapable@2.2.1: {} 2752 | 2753 | terser-webpack-plugin@5.3.14(esbuild@0.25.4)(webpack@5.99.9): 2754 | dependencies: 2755 | '@jridgewell/trace-mapping': 0.3.25 2756 | jest-worker: 27.5.1 2757 | schema-utils: 4.3.2 2758 | serialize-javascript: 6.0.2 2759 | terser: 5.39.0 2760 | webpack: 5.99.9(esbuild@0.25.4)(webpack-cli@6.0.1) 2761 | optionalDependencies: 2762 | esbuild: 0.25.4 2763 | 2764 | terser@5.39.0: 2765 | dependencies: 2766 | '@jridgewell/source-map': 0.3.6 2767 | acorn: 8.14.1 2768 | commander: 2.20.3 2769 | source-map-support: 0.5.21 2770 | 2771 | to-regex-range@5.0.1: 2772 | dependencies: 2773 | is-number: 7.0.0 2774 | 2775 | ts-api-utils@2.1.0(typescript@5.8.3): 2776 | dependencies: 2777 | typescript: 5.8.3 2778 | 2779 | ts-loader@9.5.2(typescript@5.8.3)(webpack@5.99.9): 2780 | dependencies: 2781 | chalk: 4.1.2 2782 | enhanced-resolve: 5.18.1 2783 | micromatch: 4.0.8 2784 | semver: 7.7.1 2785 | source-map: 0.7.4 2786 | typescript: 5.8.3 2787 | webpack: 5.99.9(esbuild@0.25.4)(webpack-cli@6.0.1) 2788 | 2789 | type-check@0.4.0: 2790 | dependencies: 2791 | prelude-ls: 1.2.1 2792 | 2793 | typescript@5.8.3: {} 2794 | 2795 | undici-types@6.21.0: {} 2796 | 2797 | update-browserslist-db@1.1.3(browserslist@4.24.4): 2798 | dependencies: 2799 | browserslist: 4.24.4 2800 | escalade: 3.2.0 2801 | picocolors: 1.1.1 2802 | 2803 | uri-js@4.4.1: 2804 | dependencies: 2805 | punycode: 2.3.1 2806 | 2807 | util-deprecate@1.0.2: {} 2808 | 2809 | util@0.10.4: 2810 | dependencies: 2811 | inherits: 2.0.3 2812 | 2813 | watchpack@2.4.2: 2814 | dependencies: 2815 | glob-to-regexp: 0.4.1 2816 | graceful-fs: 4.2.11 2817 | 2818 | webpack-cli@6.0.1(webpack@5.99.9): 2819 | dependencies: 2820 | '@discoveryjs/json-ext': 0.6.3 2821 | '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) 2822 | '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) 2823 | '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.99.9) 2824 | colorette: 2.0.20 2825 | commander: 12.1.0 2826 | cross-spawn: 7.0.6 2827 | envinfo: 7.14.0 2828 | fastest-levenshtein: 1.0.16 2829 | import-local: 3.2.0 2830 | interpret: 3.1.1 2831 | rechoir: 0.8.0 2832 | webpack: 5.99.9(esbuild@0.25.4)(webpack-cli@6.0.1) 2833 | webpack-merge: 6.0.1 2834 | 2835 | webpack-merge@6.0.1: 2836 | dependencies: 2837 | clone-deep: 4.0.1 2838 | flat: 5.0.2 2839 | wildcard: 2.0.1 2840 | 2841 | webpack-sources@3.2.3: {} 2842 | 2843 | webpack@5.99.9(esbuild@0.25.4)(webpack-cli@6.0.1): 2844 | dependencies: 2845 | '@types/eslint-scope': 3.7.7 2846 | '@types/estree': 1.0.7 2847 | '@types/json-schema': 7.0.15 2848 | '@webassemblyjs/ast': 1.14.1 2849 | '@webassemblyjs/wasm-edit': 1.14.1 2850 | '@webassemblyjs/wasm-parser': 1.14.1 2851 | acorn: 8.14.1 2852 | browserslist: 4.24.4 2853 | chrome-trace-event: 1.0.4 2854 | enhanced-resolve: 5.18.1 2855 | es-module-lexer: 1.6.0 2856 | eslint-scope: 5.1.1 2857 | events: 3.3.0 2858 | glob-to-regexp: 0.4.1 2859 | graceful-fs: 4.2.11 2860 | json-parse-even-better-errors: 2.3.1 2861 | loader-runner: 4.3.0 2862 | mime-types: 2.1.35 2863 | neo-async: 2.6.2 2864 | schema-utils: 4.3.2 2865 | tapable: 2.2.1 2866 | terser-webpack-plugin: 5.3.14(esbuild@0.25.4)(webpack@5.99.9) 2867 | watchpack: 2.4.2 2868 | webpack-sources: 3.2.3 2869 | optionalDependencies: 2870 | webpack-cli: 6.0.1(webpack@5.99.9) 2871 | transitivePeerDependencies: 2872 | - '@swc/core' 2873 | - esbuild 2874 | - uglify-js 2875 | 2876 | which@2.0.2: 2877 | dependencies: 2878 | isexe: 2.0.0 2879 | 2880 | wildcard@2.0.1: {} 2881 | 2882 | word-wrap@1.2.5: {} 2883 | 2884 | workerpool@6.5.1: {} 2885 | 2886 | wrap-ansi@7.0.0: 2887 | dependencies: 2888 | ansi-styles: 4.3.0 2889 | string-width: 4.2.3 2890 | strip-ansi: 6.0.1 2891 | 2892 | wrap-ansi@8.1.0: 2893 | dependencies: 2894 | ansi-styles: 6.2.1 2895 | string-width: 5.1.2 2896 | strip-ansi: 7.1.0 2897 | 2898 | y18n@5.0.8: {} 2899 | 2900 | yargs-parser@21.1.1: {} 2901 | 2902 | yargs-unparser@2.0.0: 2903 | dependencies: 2904 | camelcase: 6.3.0 2905 | decamelize: 4.0.0 2906 | flat: 5.0.2 2907 | is-plain-obj: 2.1.0 2908 | 2909 | yargs@17.7.2: 2910 | dependencies: 2911 | cliui: 8.0.1 2912 | escalade: 3.2.0 2913 | get-caller-file: 2.0.5 2914 | require-directory: 2.1.1 2915 | string-width: 4.2.3 2916 | y18n: 5.0.8 2917 | yargs-parser: 21.1.1 2918 | 2919 | yocto-queue@0.1.0: {} 2920 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | onlyBuiltDependencies: 2 | - esbuild 3 | -------------------------------------------------------------------------------- /src/documentFilter.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | export class DocumentFilter implements vscode.DocumentFilter 3 | { 4 | language?: string; 5 | 6 | scheme?: string; 7 | 8 | pattern?: vscode.GlobPattern; 9 | 10 | constructor(language?: string, scheme?: string, pattern?: vscode.GlobPattern) 11 | { 12 | this.language = language ?? undefined; 13 | this.scheme = scheme ?? undefined; 14 | this.pattern = pattern ?? undefined; 15 | } 16 | } -------------------------------------------------------------------------------- /src/documentHelper.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/naming-convention */ 2 | // imports 3 | import * as vscode from "vscode"; 4 | import { DocumentFilter } from "./documentFilter"; 5 | import { Logger } from "./logger"; 6 | 7 | 8 | 9 | export class DocumentHelper { 10 | constructor() { 11 | 12 | } 13 | 14 | 15 | public static get Editor() { 16 | return vscode.window.activeTextEditor; 17 | } 18 | 19 | //get Range of the active document in editor 20 | public static getEditorRange(): vscode.Range { 21 | Logger.instance.info("getEditorRange start"); 22 | if (this.Editor) { 23 | //get editor text 24 | let document = this.Editor.document; 25 | var start = new vscode.Position(0, 0); 26 | var lastButOne = document.lineAt(document.lineCount - 1); 27 | var end = new vscode.Position(document.lineCount, lastButOne.range.end.character); 28 | var ranger = new vscode.Range(start, end); 29 | Logger.instance.info("getEditorRange end"); 30 | return ranger; 31 | } 32 | else { 33 | Logger.instance.warning("Editor null. Returning 0 range"); 34 | Logger.instance.info("getEditorRange end"); 35 | return new vscode.Range(0, 0, 0, 0); 36 | } 37 | 38 | } 39 | 40 | //get Range of a document 41 | public static getDocumentRange(document: vscode.TextDocument): vscode.Range { 42 | Logger.instance.info("getDocumentRange start"); 43 | if (document) { 44 | var start = new vscode.Position(0, 0); 45 | var lastButOne = document.lineAt(document.lineCount - 1); 46 | var end = new vscode.Position(document.lineCount, lastButOne.range.end.character); 47 | var ranger = new vscode.Range(start, end); 48 | Logger.instance.info("getDocumentRange end"); 49 | return ranger; 50 | } 51 | else { 52 | Logger.instance.warning("document null. Returning empty range"); 53 | Logger.instance.info("getDocumentRange end"); 54 | return new vscode.Range(0, 0, 0, 0); 55 | } 56 | } 57 | 58 | public static getDocumentText(): string { 59 | if (this.Editor) { 60 | return this.Editor.document.getText(); 61 | } 62 | else { 63 | throw new Error("Editor not found!"); 64 | } 65 | } 66 | 67 | public static replaceTextForRange(range: vscode.Range, newText: string) { 68 | Logger.instance.info("replaceTextForRange start"); 69 | if (this.Editor) { 70 | this.Editor.edit(editBuilder => { 71 | editBuilder.replace(range, newText); 72 | Logger.instance.info("Editor.edit.editBuilder.replace..."); 73 | }); 74 | } else { 75 | Logger.instance.warning("Editor is null"); 76 | } 77 | Logger.instance.info("replaceTextForRange end"); 78 | } 79 | 80 | public static replaceDocumentText(newText: string) { 81 | Logger.instance.info("replaceDocumentText start"); 82 | if (this.Editor) { 83 | var range = this.getEditorRange(); 84 | this.Editor.edit(editBuilder => { 85 | editBuilder.replace(range, newText); 86 | Logger.instance.info("Editor.edit.editBuilder.replace..."); 87 | }); 88 | } else { 89 | Logger.instance.warning("Editor is null"); 90 | } 91 | Logger.instance.info("replaceDocumentText end"); 92 | } 93 | 94 | public static createLanguageDocumentFilters(language: string): vscode.DocumentFilter[] { 95 | var filters = [new DocumentFilter(language, 'file'), new DocumentFilter(language, 'untitled')]; 96 | return filters; 97 | } 98 | } -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | import { DocumentHelper } from "./documentHelper"; 3 | import { Formatter } from "./formatter"; 4 | import { PrettyXmlFormattingEditProvider } from "./prettyXmlFormattingEditProvider"; 5 | import { NotificationService } from "./notificationService"; 6 | import { replaceDocumentTextWithProgressForCallback } from "./helper"; 7 | import { Logger } from "./logger"; 8 | import { RangeFormatterProvider } from "./rangeFormatterProvider"; 9 | 10 | let formatter: Formatter; 11 | let notificationService: NotificationService; 12 | export const prettyxml = "prettyxml"; 13 | 14 | //extension activate 15 | export function activate(context: vscode.ExtensionContext): void { 16 | try { 17 | 18 | formatter = new Formatter(context); 19 | notificationService = new NotificationService(context); 20 | 21 | notificationService.notifyWhatsNewInUpdateAsync(); 22 | notificationService.handleReviewPromptAsync(); 23 | 24 | vscode.workspace.onDidChangeConfiguration((configChangeEvent: vscode.ConfigurationChangeEvent) => { 25 | Logger.instance.info("workspace.onDidChangeConfiguration start"); 26 | formatter.loadSettings(); 27 | Logger.instance.info("workspace.onDidChangeConfiguration end"); 28 | }); 29 | 30 | let prettifyXmlCommand = vscode.commands.registerTextEditorCommand(`${prettyxml}.prettifyxml`, () => replaceDocumentTextWithProgressForCallback("Formatting...", formatter.formatXml())); 31 | 32 | let minimizeXmlCommand = vscode.commands.registerTextEditorCommand(`${prettyxml}.minimizexml`, () => replaceDocumentTextWithProgressForCallback("Minimizing...", formatter.minimizeXml())); 33 | 34 | vscode.workspace.onWillSaveTextDocument(async (willSaveEvent) => { 35 | Logger.instance.info("vscode.workspace.onWillSaveTextDocument start"); 36 | try { 37 | var languageId = willSaveEvent?.document?.languageId; 38 | if (languageId) { 39 | if (languageId === "xml" || languageId === "xsd" || languageId === "xaml") { 40 | let prettyXmlConfig = vscode.workspace.getConfiguration(`${prettyxml}.settings`); 41 | let formatOnSave = prettyXmlConfig.get("formatOnSave") ?? false; 42 | if (formatOnSave) { 43 | willSaveEvent.waitUntil(replaceDocumentTextWithProgressForCallback("Formatting...", formatter.formatXml())); 44 | } 45 | } 46 | } 47 | else { 48 | Logger.instance.warning("Invalid languageId"); 49 | } 50 | } 51 | catch (error) { 52 | if (error instanceof Error) { 53 | Logger.instance.error(error); 54 | vscode.window.showErrorMessage(error.message); 55 | console.error(error); 56 | } 57 | } 58 | Logger.instance.info("vscode.workspace.onWillSaveTextDocument end"); 59 | }); 60 | 61 | const xmlXsdDocSelector = [ 62 | ...DocumentHelper.createLanguageDocumentFilters("xml"), 63 | ...DocumentHelper.createLanguageDocumentFilters("xsd"), 64 | ...DocumentHelper.createLanguageDocumentFilters("xaml"), 65 | ]; 66 | const xmlFormattingEditProvider = new PrettyXmlFormattingEditProvider(formatter); 67 | 68 | let documentFormatterProvider = vscode.languages.registerDocumentFormattingEditProvider(xmlXsdDocSelector, xmlFormattingEditProvider); 69 | 70 | const rangeFormatterProvider = new RangeFormatterProvider(formatter.settings); 71 | const selectionFormatter = vscode.languages.registerDocumentRangeFormattingEditProvider(xmlXsdDocSelector, rangeFormatterProvider); 72 | 73 | //subscribe commands 74 | context.subscriptions.push(prettifyXmlCommand, 75 | minimizeXmlCommand, 76 | documentFormatterProvider, 77 | selectionFormatter); 78 | } 79 | catch (error) { 80 | if (error instanceof Error) { 81 | vscode.window.showErrorMessage(error.message); 82 | Logger.instance.error(error); 83 | } 84 | else if (typeof error === "string") { 85 | vscode.window.showErrorMessage(error); 86 | Logger.instance.warning(error); 87 | } 88 | console.error(error); 89 | } 90 | } 91 | 92 | //extension deactivate 93 | export function deactivate() { 94 | Logger.instance.info("Extension dectivated"); 95 | } 96 | -------------------------------------------------------------------------------- /src/formatter.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | import { DocumentHelper } from "./documentHelper"; 3 | import { defaultSettings, Settings } from "./settings"; 4 | import * as childProcess from "child_process"; 5 | import * as path from "path"; 6 | import { JsonInputDto } from "./jsonInputDto"; 7 | import { FormattingActionKind } from "./formattingActionKind"; 8 | import { Logger } from "./logger"; 9 | import { prettyxml } from "./extension"; 10 | 11 | export class Formatter { 12 | private extensionContext: vscode.ExtensionContext; 13 | private dllPath: string = ""; 14 | 15 | public settings: Settings = defaultSettings; 16 | constructor(context: vscode.ExtensionContext) { 17 | this.extensionContext = context; 18 | this.initialize(); 19 | this.loadSettings(); 20 | } 21 | 22 | private initialize() { 23 | try { 24 | 25 | let extPath: string = this.extensionContext.extensionPath; 26 | //extension path was not found 27 | if (extPath === "") { 28 | vscode.window.showErrorMessage('Error in finding extension path'); 29 | Logger.instance.warning("Error in finding extension path. Throwing error from initialize"); 30 | throw new Error('Error in finding extension path'); 31 | } 32 | this.dllPath = path.join(this.extensionContext.extensionPath, "lib", "XmlFormatter.CommandLine.dll"); 33 | 34 | Logger.instance.info(`dllPath : ${this.dllPath}`); 35 | } 36 | catch (error) { 37 | if (error instanceof Error) { 38 | Logger.instance.error(error); 39 | throw error; 40 | } 41 | } 42 | } 43 | 44 | public loadSettings() { 45 | //get settings 46 | Logger.instance.info("loadSettings start"); 47 | let prettyXmlConfig = vscode.workspace.getConfiguration(`${prettyxml}.settings`); 48 | 49 | let spacelength = prettyXmlConfig.get('indentSpaceLength'); 50 | let usesinglequotes = prettyXmlConfig.get('useSingleQuotes'); 51 | let useselfclosetag = prettyXmlConfig.get('useSelfClosingTag'); 52 | let formatOnSave = prettyXmlConfig.get('formatOnSave'); 53 | let allowSingleQuoteInAttributeValue = prettyXmlConfig.get('allowSingleQuoteInAttributeValue'); 54 | let addSpaceBeforeSelfClosingTag = prettyXmlConfig.get('addSpaceBeforeSelfClosingTag'); 55 | let wrapCommentTextWithSpaces = prettyXmlConfig.get('wrapCommentTextWithSpaces'); 56 | let allowWhiteSpaceUnicodesInAttributeValues = prettyXmlConfig.get('allowWhiteSpaceUnicodesInAttributeValues'); 57 | let positionFirstAttributeOnSameLine = prettyXmlConfig.get('positionFirstAttributeOnSameLine'); 58 | let positionAllAttributesOnFirstLine = prettyXmlConfig.get('positionAllAttributesOnFirstLine'); 59 | let preserveWhiteSpacesInComment = prettyXmlConfig.get('preserveWhiteSpacesInComment'); 60 | let addSpaceBeforeEndOfXmlDeclaration = prettyXmlConfig.get('addSpaceBeforeEndOfXmlDeclaration'); 61 | let attributesInNewlineThreshold = prettyXmlConfig.get("attributesInNewlineThreshold"); 62 | let wildCardedExceptionsForPositionAllAttributesOnFirstLine = prettyXmlConfig.get>("wildCardedExceptionsForPositionAllAttributesOnFirstLine"); 63 | let addEmptyLineBetweenElements = prettyXmlConfig.get("addEmptyLineBetweenElements"); 64 | let enableLogs = prettyXmlConfig.get("enableLogs"); 65 | Logger.instance.updateConfiguration(enableLogs); 66 | 67 | this.settings = new Settings(spacelength, 68 | usesinglequotes, 69 | useselfclosetag, 70 | formatOnSave, 71 | allowSingleQuoteInAttributeValue, 72 | addSpaceBeforeSelfClosingTag, 73 | wrapCommentTextWithSpaces, 74 | allowWhiteSpaceUnicodesInAttributeValues, 75 | positionFirstAttributeOnSameLine, 76 | positionAllAttributesOnFirstLine, 77 | preserveWhiteSpacesInComment, 78 | addSpaceBeforeEndOfXmlDeclaration, 79 | attributesInNewlineThreshold, 80 | wildCardedExceptionsForPositionAllAttributesOnFirstLine, 81 | addEmptyLineBetweenElements, 82 | enableLogs); 83 | 84 | Logger.instance.info(`Settings : ${JSON.stringify(this.settings)}`); 85 | 86 | Logger.instance.info("loadSettings end"); 87 | } 88 | 89 | public async formatXml(docText: string = ""): Promise { 90 | Logger.instance.info("formatXml start"); 91 | let formattedString: string = ""; 92 | 93 | if (!docText) { 94 | Logger.instance.warning("docText is null. Fetching from DocumentHelper"); 95 | docText = DocumentHelper.getDocumentText(); 96 | } 97 | 98 | if (docText) { 99 | formattedString = await this.formatWithCommandLine(docText, FormattingActionKind.format); 100 | Logger.instance.info(`Formatted text: ${formattedString}`); 101 | Logger.instance.info("formatXml end"); 102 | return formattedString; 103 | } 104 | else { 105 | Logger.instance.warning("Document text is not valid!. Throwing error from formatXml"); 106 | throw new Error("Document text is not valid!"); 107 | } 108 | } 109 | 110 | async minimizeXml(): Promise { 111 | Logger.instance.info("minimizeXml start"); 112 | let minimizedXmlText: string = ""; 113 | var docText = DocumentHelper.getDocumentText(); 114 | if (docText) { 115 | minimizedXmlText = await this.formatWithCommandLine(docText, FormattingActionKind.minimize); 116 | Logger.instance.info(`minimizedXmlText: ${minimizedXmlText}`); 117 | return minimizedXmlText; 118 | } 119 | else { 120 | Logger.instance.warning("Document text is invalid!. Throwing error from minimizeXml"); 121 | throw new Error('Document text is invalid!'); 122 | } 123 | } 124 | 125 | public async formatWithCommandLine(docText: string, actionKind: FormattingActionKind): Promise { 126 | try { 127 | Logger.instance.info("formatWithCommandLine start"); 128 | var jsinput: JsonInputDto = new JsonInputDto(docText, actionKind, this.settings); 129 | var inputstr = JSON.stringify(jsinput); 130 | Logger.instance.info(`converted input to json ${inputstr}`); 131 | const cli = childProcess.spawn('dotnet', [this.dllPath], { stdio: ['pipe'] }); 132 | 133 | Logger.instance.info(`Starting dotnet childProcess at ${this.dllPath} `); 134 | let stdOutData = ""; 135 | let stdErrData = ""; 136 | 137 | cli.stdout.setEncoding("utf8"); 138 | cli.stdout.on("data", data => { 139 | stdOutData += data; 140 | }); 141 | 142 | cli.stderr.setEncoding("utf8"); 143 | cli.stderr.on("data", data => { 144 | stdErrData += data; 145 | }); 146 | 147 | let promise = new Promise((resolve, reject) => { 148 | cli.on("close", (exitCode: Number) => { 149 | if (exitCode !== 0) { 150 | Logger.instance.warning(`childProcess errored with exitCode ${exitCode}`); 151 | reject(stdErrData); 152 | } 153 | else { 154 | Logger.instance.info(`childProcess stdOutData: ${stdOutData}`); 155 | resolve(stdOutData); 156 | } 157 | }); 158 | }); 159 | 160 | cli.stdin.end(inputstr, "utf-8"); 161 | return promise; 162 | } 163 | catch (error) { 164 | if (error instanceof Error) { 165 | Logger.instance.error(error); 166 | } 167 | else if (typeof error === "string") { 168 | Logger.instance.warning(error); 169 | } 170 | Logger.instance.warning("Error formatting with command line. Make sure you have dotnet 6+ installed and it is added to PATH."); 171 | throw new Error('Error formatting with command line. Make sure you have dotnet 6+ installed and it is added to PATH.'); 172 | } 173 | } 174 | } 175 | -------------------------------------------------------------------------------- /src/formattingActionKind.ts: -------------------------------------------------------------------------------- 1 | export enum FormattingActionKind 2 | { 3 | unsupported = "Unsupported", 4 | format = "Format", 5 | minimize = "Minimize", 6 | } -------------------------------------------------------------------------------- /src/helper.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | import { DocumentHelper } from "./documentHelper"; 3 | import { Logger } from "./logger"; 4 | 5 | export function replaceDocumentTextWithProgressForCallback(progressText: string, task: Thenable): Thenable { 6 | Logger.instance.info("replaceDocumentTextWithProgressForCallback start"); 7 | var progressOptions = { 8 | location: vscode.ProgressLocation.Notification, 9 | title: "Pretty XML", 10 | cancellable: false, 11 | }; 12 | 13 | var progressPromise = vscode.window.withProgress(progressOptions, (progress) => { 14 | var promise = new Promise((resolve, reject) => { 15 | progress.report({ message: progressText, increment: 0 }); 16 | 17 | setTimeout(() => { 18 | progress.report({ message: progressText, increment: 25 }); 19 | }, 50); 20 | 21 | setTimeout(async () => { 22 | try { 23 | var newText = await task; 24 | progress.report({ message: progressText, increment: 75 }); 25 | 26 | DocumentHelper.replaceDocumentText(newText); 27 | progress.report({ message: progressText, increment: 100 }); 28 | resolve(); 29 | } 30 | catch (error) { 31 | if (typeof error === "string") { 32 | Logger.instance.warning(`Errored with ${error}`); 33 | if (error.includes("System.Xml.XmlException: Unexpected end of file has occurred.")) { 34 | var userReadableErrorMessage = error.replace("System.Xml.XmlException: Unexpected end of file has occurred.","").replace("Unhandled exception. System.Xml.XmlException: ","").replace("Unhandled exception. ", ""); 35 | vscode.window.showErrorMessage(userReadableErrorMessage); 36 | } else { 37 | vscode.window.showErrorMessage(error); 38 | } 39 | } 40 | reject(error); 41 | } 42 | }, 100); 43 | }); 44 | 45 | return promise; 46 | }); 47 | Logger.instance.info("replaceDocumentTextWithProgressForCallback end"); 48 | return progressPromise; 49 | } 50 | 51 | -------------------------------------------------------------------------------- /src/jsonInputDto.ts: -------------------------------------------------------------------------------- 1 | import { FormattingActionKind } from "./formattingActionKind"; 2 | import { Settings } from "./settings"; 3 | 4 | export class JsonInputDto { 5 | xmlString: string; 6 | formattingOptions: Settings; 7 | actionKind: FormattingActionKind; 8 | 9 | constructor(xmlString: string, actionKind: FormattingActionKind, formattingOptions?: Settings) { 10 | this.xmlString = xmlString; 11 | this.actionKind = actionKind; 12 | this.formattingOptions = formattingOptions ?? new Settings(); 13 | } 14 | } -------------------------------------------------------------------------------- /src/logger.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | 3 | export interface ILogger { 4 | info(message: string): void; 5 | error(error: Error): void; 6 | warning(message: string): void; 7 | debug(message: string): void; 8 | outputChannel: vscode.OutputChannel; 9 | updateConfiguration(isEnabled: boolean): void; 10 | } 11 | 12 | enum LogLevel { 13 | error = "ERROR", 14 | warning = "WARNING", 15 | info = "INFO", 16 | debug = "DEBUG", 17 | } 18 | 19 | function isString(value: unknown): value is string { 20 | return Object.prototype.toString.call(value) === '[object String]'; 21 | } 22 | 23 | export class Logger implements ILogger { 24 | private static _instance: Logger; 25 | 26 | public static get instance() { 27 | if (!Logger._instance) { 28 | Logger._instance = new Logger(); 29 | } 30 | 31 | return Logger._instance; 32 | } 33 | 34 | private constructor() { 35 | this.outputChannel = vscode.window.createOutputChannel("PrettyXML"); 36 | this.updateConfiguration(); 37 | } 38 | 39 | private enableLogs?: boolean; 40 | public outputChannel: vscode.OutputChannel; 41 | 42 | public error(error: Error): void { 43 | if (error !== null) { 44 | this.log(LogLevel.error, error.stack ?? `${error.name} : ${error.message}`); 45 | } 46 | } 47 | 48 | public info(message: string): void { 49 | this.log(LogLevel.info, message); 50 | } 51 | 52 | public debug(message: string): void { 53 | this.log(LogLevel.debug, message); 54 | } 55 | 56 | public warning(message: string): void { 57 | this.log(LogLevel.warning, message); 58 | } 59 | 60 | private log(logLevel: LogLevel, message: string, data?: unknown): void { 61 | if (this.enableLogs) { 62 | this.appendLine( 63 | `[ ${logLevel} - ${new Date().toLocaleTimeString()}] ${message}` 64 | ); 65 | if (data) { 66 | this.appendLine(Logger.data2String(data)); 67 | } 68 | } 69 | } 70 | 71 | public updateConfiguration(isEnabled: boolean = false) { 72 | this.enableLogs = isEnabled; 73 | } 74 | 75 | private appendLine(value = '') { 76 | return this.outputChannel.appendLine(value); 77 | } 78 | 79 | private append(value: string) { 80 | return this.outputChannel.append(value); 81 | } 82 | 83 | private show() { 84 | this.outputChannel.show(); 85 | } 86 | 87 | private static data2String(data: unknown): string { 88 | if (data instanceof Error) { 89 | if (isString(data.stack)) { 90 | return data.stack; 91 | } 92 | return (data as Error).message; 93 | } 94 | if (isString(data)) { 95 | return data; 96 | } 97 | return JSON.stringify(data, undefined, 2); 98 | } 99 | } -------------------------------------------------------------------------------- /src/notificationService.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from "vscode"; 2 | import * as compareVersions from "compare-versions"; 3 | import { Logger } from "./logger"; 4 | 5 | export class NotificationService { 6 | private context: vscode.ExtensionContext; 7 | public readonly storageKeyPrefix: string; 8 | private readonly lastRatingPromptDateKey: string; 9 | 10 | private readonly versionKey: string; 11 | 12 | private readonly currentVersion: string; 13 | 14 | constructor(context: vscode.ExtensionContext) { 15 | this.context = context; 16 | this.storageKeyPrefix = this.context.extension.id + "."; 17 | this.lastRatingPromptDateKey = `${this.storageKeyPrefix}lastRatingPromptDate`; 18 | this.versionKey = `${this.storageKeyPrefix}version`; 19 | this.currentVersion = this.context.extension.packageJSON.version; 20 | } 21 | 22 | private checkIfEligibleToShowUpdateNote(): boolean { 23 | Logger.instance.info("checkIfEligibleToShowUpdateNote start"); 24 | let shouldDisplay: boolean = true; 25 | try { 26 | var lastVersionShown = this.context.globalState.get(this.versionKey) as string; 27 | 28 | if (lastVersionShown) { 29 | if (compareVersions.compare(this.currentVersion, lastVersionShown, '<=')) { 30 | shouldDisplay = false; 31 | } 32 | } 33 | } 34 | catch (error) { 35 | if (error instanceof Error) { 36 | Logger.instance.error(error); 37 | console.error(error); 38 | } 39 | } 40 | Logger.instance.info("checkIfEligibleToShowUpdateNote end"); 41 | return shouldDisplay; 42 | } 43 | 44 | public async notifyWhatsNewInUpdateAsync(): Promise { 45 | Logger.instance.info("notifyWhatsNewInUpdateAsync start"); 46 | try { 47 | let shouldDisplay: boolean = this.checkIfEligibleToShowUpdateNote(); 48 | if (shouldDisplay) { 49 | let notes: string = `Pretty XML updated to version ${this.currentVersion}.\n [See what's new](https://github.com/pmahend1/PrettyXML/blob/main/CHANGELOG.md)`; 50 | if (notes !== "") { 51 | await vscode.window.showInformationMessage(notes); 52 | this.context.globalState.update(this.versionKey, this.currentVersion); 53 | } 54 | } 55 | } 56 | catch (error) { 57 | if (error instanceof Error) { 58 | Logger.instance.error(error); 59 | console.error(error); 60 | } 61 | } 62 | Logger.instance.info("notifyWhatsNewInUpdateAsync end"); 63 | } 64 | 65 | public async promptForReviewAsync(): Promise { 66 | Logger.instance.info("promptForReviewAsync start"); 67 | try { 68 | let shouldDisplayPrompt = this.shouldOpenRatingPrompt(); 69 | if (shouldDisplayPrompt) { 70 | var text = "Loving Pretty XML extension? Would you like to rate and review?"; 71 | var selection = await vscode.window.showInformationMessage(text, "Sure", "Later", "Don't show again"); 72 | if (selection) { 73 | if (selection === "Sure") { 74 | var appName = vscode.env.appName.toLowerCase(); 75 | let vsCodeReviewUri: vscode.Uri = vscode.Uri.parse("https://marketplace.visualstudio.com/items?itemName=PrateekMahendrakar.prettyxml&ssr=false#review-details"); 76 | 77 | if (appName.includes("codium")) { 78 | var codiumReviewUri = vscode.Uri.parse("https://open-vsx.org/extension/PrateekMahendrakar/prettyxml/reviews"); 79 | vscode.env.openExternal(codiumReviewUri); 80 | } 81 | else { 82 | vscode.env.openExternal(vsCodeReviewUri); 83 | } 84 | //cant check if they really reviewed 85 | //remind them after 30 days 86 | var plus30days = new Date(); 87 | plus30days.setDate(plus30days.getDate() + 30); 88 | 89 | this.context.globalState.update(this.lastRatingPromptDateKey, plus30days); 90 | } 91 | else if (selection === "Later") { 92 | this.context.globalState.update(this.lastRatingPromptDateKey, new Date()); 93 | } 94 | else if (selection === "Don't show again") { 95 | var oneYear = new Date(); 96 | oneYear.setDate(oneYear.getDate() + 365); 97 | 98 | this.context.globalState.update(this.lastRatingPromptDateKey, oneYear); 99 | } 100 | } 101 | } 102 | } 103 | catch (error) { 104 | if (error instanceof Error) { 105 | Logger.instance.error(error); 106 | console.error(error); 107 | } 108 | } 109 | Logger.instance.info("promptForReviewAsync end"); 110 | } 111 | 112 | private shouldOpenRatingPrompt(): boolean { 113 | Logger.instance.info("shouldOpenRatingPrompt start"); 114 | var lastPromptDateJunk = this.context.globalState.get(this.lastRatingPromptDateKey) as Date; 115 | var minus15days = new Date(); 116 | minus15days.setDate(minus15days.getDate() - 15); 117 | 118 | if (lastPromptDateJunk) { 119 | var lastPromptDate = new Date(lastPromptDateJunk.toString()); 120 | Logger.instance.info("shouldOpenRatingPrompt end"); 121 | return lastPromptDate < minus15days; 122 | } 123 | else { 124 | Logger.instance.info("shouldOpenRatingPrompt end"); 125 | return true; 126 | } 127 | 128 | } 129 | 130 | public async handleReviewPromptAsync() { 131 | Logger.instance.info("handleReviewPromptAsync start"); 132 | let lastUsedDateKey = `${this.storageKeyPrefix}.lastUsedDate`; 133 | let lastUsedDate = this.context.globalState.get(lastUsedDateKey) as Date; 134 | 135 | if (lastUsedDate) { 136 | var delayedLastDate = new Date(lastUsedDate); 137 | delayedLastDate.setHours(delayedLastDate.getHours() + 2); 138 | if (new Date() >= delayedLastDate) { 139 | await this.promptForReviewAsync(); 140 | } 141 | } 142 | this.context.globalState.update(lastUsedDateKey, new Date()); 143 | Logger.instance.info("handleReviewPromptAsync end"); 144 | } 145 | } -------------------------------------------------------------------------------- /src/prettyXmlFormattingEditProvider.ts: -------------------------------------------------------------------------------- 1 | import { 2 | CancellationToken, 3 | DocumentFormattingEditProvider, 4 | FormattingOptions, 5 | ProviderResult, 6 | Range, 7 | TextDocument, 8 | TextEdit 9 | } from "vscode"; 10 | import * as vscode from "vscode"; 11 | import { DocumentHelper } from "./documentHelper"; 12 | import { Formatter } from "./formatter"; 13 | import { Logger } from "./logger"; 14 | 15 | export class PrettyXmlFormattingEditProvider implements DocumentFormattingEditProvider { 16 | private formatter: Formatter; 17 | constructor(formatter: Formatter) { 18 | this.formatter = formatter; 19 | } 20 | 21 | provideDocumentFormattingEdits(document: TextDocument, options: FormattingOptions, token: CancellationToken): ProviderResult { 22 | Logger.instance.info("provideDocumentFormattingEdits start"); 23 | let documentRange: Range = DocumentHelper.getDocumentRange(document); 24 | 25 | let docText = document?.getText(); 26 | 27 | if (!docText) { 28 | Logger.instance.warning("docText is null. returning empty []"); 29 | return []; 30 | } 31 | 32 | token.onCancellationRequested((e: any, thisArgs?: any, disposables?: any) => { 33 | if (token.isCancellationRequested) { 34 | Logger.instance.warning("token.onCancellationRequested. Returning []"); 35 | return []; 36 | } 37 | }); 38 | return new Promise(async (resolve) => { 39 | try { 40 | var progressOptions = { 41 | location: vscode.ProgressLocation.Notification, 42 | title: "Pretty XML", 43 | cancellable: true, 44 | }; 45 | 46 | var formattedText = await vscode.window.withProgress(progressOptions, (progress, token) => { 47 | token.onCancellationRequested((e: any, thisArgs?: any, disposables?: any) => { 48 | if (token.isCancellationRequested) { 49 | Logger.instance.warning("vscode.window.withProgress.token.onCancellationRequested. Returning []"); 50 | return []; 51 | } 52 | }); 53 | var promise = new Promise(async (resolve, reject) => { 54 | progress.report({ message: "Formatting...", increment: 0 }); 55 | 56 | setTimeout(() => { 57 | progress.report({ message: "Formatting...", increment: 25 }); 58 | 59 | }, 50); 60 | 61 | setTimeout(async () => { 62 | try { 63 | var formattedText = await this.formatter.formatXml(docText); 64 | progress.report({ message: "Formatting...", increment: 75 }); 65 | resolve(formattedText); 66 | 67 | progress.report({ message: "Formatting...", increment: 100 }); 68 | } 69 | catch (error) { 70 | reject(error); //log in outer catch block 71 | } 72 | }, 100); 73 | }); 74 | 75 | return promise; 76 | }); 77 | const replacer = TextEdit.replace(documentRange, formattedText); 78 | Logger.instance.info("provideDocumentFormattingEdits start"); 79 | return resolve([replacer]); 80 | } 81 | catch (error) { 82 | var errorMessage: string = ""; 83 | if (typeof error === "string") { 84 | errorMessage = error; 85 | Logger.instance.warning(errorMessage); 86 | } 87 | else if (error instanceof Error) { 88 | Logger.instance.error(error); 89 | errorMessage = error.message; 90 | } 91 | vscode.window.showErrorMessage(errorMessage); 92 | 93 | return resolve([]); 94 | } 95 | }); 96 | } 97 | } -------------------------------------------------------------------------------- /src/rangeFormatterProvider.ts: -------------------------------------------------------------------------------- 1 | import { CancellationToken, DocumentRangeFormattingEditProvider, FormattingOptions, ProviderResult, Range, TextDocument, TextEdit } from "vscode"; 2 | import { TextXmlFormatter } from "./regexFormatter"; 3 | import { Settings } from "./settings"; 4 | 5 | export class RangeFormatterProvider implements DocumentRangeFormattingEditProvider { 6 | 7 | private settings: Settings; 8 | constructor(settings: Settings) { 9 | this.settings = settings; 10 | } 11 | provideDocumentRangeFormattingEdits(document: TextDocument, range: Range, options: FormattingOptions, token: CancellationToken): ProviderResult { 12 | if (document) { 13 | var text = document.getText(range); 14 | if (text) { 15 | var regexFormatter = new TextXmlFormatter(this.settings); 16 | var formattedText = regexFormatter.formatXmlPretty(text); 17 | const replacer = TextEdit.replace(range, formattedText); 18 | return [replacer] 19 | } 20 | } 21 | return []; 22 | } 23 | provideDocumentRangesFormattingEdits?(document: TextDocument, ranges: Range[], options: FormattingOptions, token: CancellationToken): ProviderResult { 24 | if (document) { 25 | var edits = new Array(); 26 | for (let i = 0; i < ranges.length; i++) { 27 | const range = ranges[i]; 28 | var text = document.getText(range); 29 | if (text) { 30 | var regexFormatter = new TextXmlFormatter(this.settings); 31 | var formattedText = regexFormatter.formatXmlPretty(text); 32 | const replacer = TextEdit.replace(range, formattedText); 33 | edits.push(replacer); 34 | } 35 | } 36 | return edits; 37 | } 38 | return []; 39 | } 40 | } -------------------------------------------------------------------------------- /src/regexFormatter.ts: -------------------------------------------------------------------------------- 1 | import { Settings } from "./settings"; 2 | 3 | export class TextXmlFormatter { 4 | 5 | private settings: Settings; 6 | constructor(settings: Settings) { 7 | this.settings = settings; 8 | } 9 | public formatXmlPretty(xml: string): string { 10 | const tagRegex = /(<\?xml[^?>]*\?>|]*>|||<\/?[^>]+?>)/gs; 11 | 12 | let startIndent = 0; 13 | let formatted: string[] = []; 14 | 15 | if (xml.startsWith(" ")) { 16 | const firstTagIndex = xml.indexOf("<"); 17 | if (firstTagIndex > 0) { 18 | startIndent = firstTagIndex; 19 | } 20 | } 21 | const indentSize = this.settings.indentLength ?? 4; 22 | let indentLevel = startIndent / indentSize; 23 | 24 | let lastIndex = 0; 25 | const matches = [...xml.matchAll(tagRegex)]; 26 | var i = 0; 27 | for (const match of matches) { 28 | const [tag] = match; 29 | const index = match.index ?? 0; 30 | 31 | // Handle text between tags 32 | const text = xml.slice(lastIndex, index).trim(); 33 | if (text) { 34 | let n = i === 0 && indentLevel > 0 ? indentLevel - 1 : indentLevel; 35 | formatted.push(' '.repeat(n * indentSize) + text); 36 | } 37 | i++; 38 | if (tag.startsWith(''); 45 | 46 | const formattedTag = this.formatTagWithAttributes(tag, indentLevel * indentSize); 47 | formatted.push(' '.repeat(indentLevel * indentSize) + formattedTag); 48 | 49 | if (!isSelfClosing) { 50 | indentLevel++; 51 | } 52 | } 53 | 54 | lastIndex = match.index! + tag.length; 55 | } 56 | 57 | // Remaining text after last tag 58 | const trailing = xml.slice(lastIndex).trim(); 59 | if (trailing) { 60 | formatted.push(' '.repeat(indentLevel * indentSize) + trailing); 61 | } 62 | 63 | return formatted.join('\n'); 64 | } 65 | 66 | public formatTagWithAttributes(tag: string, baseIndent: number): string { 67 | const tagRegex = /^<([^\s/>]+)((?:\s+[^\s=]+(?:=(?:"[^"]*"|'[^']*'|[^\s"'=<>`]+))?)*)\s*(\/?)>$/; 68 | 69 | const match = tag.match(tagRegex); 70 | if (!match) return tag; 71 | 72 | const [, tagName, attrs, selfClosing] = match; 73 | 74 | const attrRegex = /([^\s=]+(?:=(?:"[^"]*"|'[^']*'|[^\s"'=<>`]+))?)/g; 75 | const childNodeMatches = [...attrs.matchAll(attrRegex)]; 76 | if (childNodeMatches.length === 0) { 77 | return `<${tagName}${selfClosing ? ' />' : '>'}`; 78 | } 79 | 80 | const alignIndent = baseIndent + `<${tagName} `.length; 81 | const alignedAttrs: string[] = []; 82 | 83 | alignedAttrs.push(childNodeMatches[0][0]); // first attribute inline 84 | 85 | let isSelfClosing = false; 86 | for (let i = 1; i < childNodeMatches.length; i++) { 87 | if (childNodeMatches[i][0].endsWith('/') === false) { 88 | alignedAttrs.push(' '.repeat(alignIndent) + childNodeMatches[i][0]); 89 | } else { 90 | isSelfClosing = true; 91 | } 92 | } 93 | 94 | // Append closing directly to last line 95 | alignedAttrs[alignedAttrs.length - 1] += isSelfClosing ? '/>' : '>'; 96 | 97 | return `<${tagName} ${alignedAttrs.join('\n')}`; 98 | } 99 | } -------------------------------------------------------------------------------- /src/settings.ts: -------------------------------------------------------------------------------- 1 | export interface ISettings { 2 | indentLength: number; 3 | useSingleQuotes: boolean; 4 | useSelfClosingTags: boolean; 5 | formatOnSave: boolean; 6 | allowSingleQuoteInAttributeValue: boolean; 7 | addSpaceBeforeSelfClosingTag: boolean; 8 | wrapCommentTextWithSpaces: boolean; 9 | allowWhiteSpaceUnicodesInAttributeValues: boolean; 10 | positionFirstAttributeOnSameLine: boolean; 11 | positionAllAttributesOnFirstLine: boolean; 12 | preserveWhiteSpacesInComment: boolean; 13 | addSpaceBeforeEndOfXmlDeclaration: boolean; 14 | attributesInNewlineThreshold: number; 15 | wildCardedExceptionsForPositionAllAttributesOnFirstLine?: [string]; 16 | addEmptyLineBetweenElements: boolean; 17 | enableLogs: boolean; 18 | } 19 | 20 | export const defaultSettings: ISettings = { 21 | indentLength: 4, 22 | useSingleQuotes: false, 23 | useSelfClosingTags: true, 24 | formatOnSave: false, 25 | allowSingleQuoteInAttributeValue: true, 26 | addSpaceBeforeSelfClosingTag: true, 27 | wrapCommentTextWithSpaces: true, 28 | allowWhiteSpaceUnicodesInAttributeValues: true, 29 | positionFirstAttributeOnSameLine: true, 30 | positionAllAttributesOnFirstLine: false, 31 | preserveWhiteSpacesInComment: false, 32 | addSpaceBeforeEndOfXmlDeclaration: false, 33 | attributesInNewlineThreshold: 1, 34 | wildCardedExceptionsForPositionAllAttributesOnFirstLine: undefined, 35 | addEmptyLineBetweenElements: false, 36 | enableLogs: false 37 | }; 38 | 39 | export class Settings { 40 | indentLength?: number; 41 | useSingleQuotes?: boolean; 42 | useSelfClosingTags?: boolean; 43 | formatOnSave?: boolean; 44 | allowSingleQuoteInAttributeValue?: boolean; 45 | addSpaceBeforeSelfClosingTag?: boolean; 46 | wrapCommentTextWithSpaces?: boolean; 47 | allowWhiteSpaceUnicodesInAttributeValues?: boolean; 48 | positionFirstAttributeOnSameLine?: boolean; 49 | positionAllAttributesOnFirstLine?: boolean; 50 | preserveWhiteSpacesInComment?: boolean; 51 | addSpaceBeforeEndOfXmlDeclaration: boolean; 52 | attributesInNewlineThreshold: number; 53 | wildCardedExceptionsForPositionAllAttributesOnFirstLine?: string[]; 54 | addEmptyLineBetweenElements?: boolean; 55 | enableLogs?: boolean; 56 | 57 | constructor(indentLengh?: number, 58 | useSingleQuotes?: boolean, 59 | useSelfClosingTags?: boolean, 60 | formatOnSave?: boolean, 61 | allowSingleQuoteInAttributeValue?: boolean, 62 | addSpaceBeforeSelfClosingTag?: boolean, 63 | wrapCommentTextWithSpaces?: boolean, 64 | allowWhiteSpaceUnicodesInAttributeValues?: boolean, 65 | positionFirstAttributeOnSameLine?: boolean, 66 | positionAllAttributesOnFirstLine?: boolean, 67 | preserveWhiteSpacesInComment?: boolean, 68 | addSpaceBeforeEndOfXmlDeclaration?: boolean, 69 | attributesInNewlineThreshold?: number, 70 | wildCardedExceptionsForPositionAllAttributesOnFirstLine?: string[], 71 | addEmptyLineBetweenElements?: boolean, 72 | enableLogs?: boolean) { 73 | this.indentLength = indentLengh ?? defaultSettings.indentLength; 74 | this.useSingleQuotes = useSingleQuotes ?? defaultSettings.useSingleQuotes; 75 | this.useSelfClosingTags = useSelfClosingTags ?? defaultSettings.useSelfClosingTags; 76 | this.formatOnSave = formatOnSave ?? defaultSettings.formatOnSave; 77 | this.allowSingleQuoteInAttributeValue = allowSingleQuoteInAttributeValue ?? defaultSettings.allowSingleQuoteInAttributeValue; 78 | this.addSpaceBeforeSelfClosingTag = addSpaceBeforeSelfClosingTag ?? defaultSettings.addSpaceBeforeSelfClosingTag; 79 | this.wrapCommentTextWithSpaces = wrapCommentTextWithSpaces ?? defaultSettings.wrapCommentTextWithSpaces; 80 | this.allowWhiteSpaceUnicodesInAttributeValues = allowWhiteSpaceUnicodesInAttributeValues ?? defaultSettings.allowWhiteSpaceUnicodesInAttributeValues; 81 | this.positionFirstAttributeOnSameLine = positionFirstAttributeOnSameLine ?? defaultSettings.positionFirstAttributeOnSameLine; 82 | this.positionAllAttributesOnFirstLine = positionAllAttributesOnFirstLine ?? defaultSettings.positionAllAttributesOnFirstLine; 83 | this.preserveWhiteSpacesInComment = preserveWhiteSpacesInComment ?? defaultSettings.preserveWhiteSpacesInComment; 84 | this.addSpaceBeforeEndOfXmlDeclaration = addSpaceBeforeEndOfXmlDeclaration ?? defaultSettings.addSpaceBeforeEndOfXmlDeclaration; 85 | this.attributesInNewlineThreshold = attributesInNewlineThreshold ?? defaultSettings.attributesInNewlineThreshold; 86 | this.wildCardedExceptionsForPositionAllAttributesOnFirstLine = wildCardedExceptionsForPositionAllAttributesOnFirstLine; 87 | this.addEmptyLineBetweenElements = addEmptyLineBetweenElements ?? defaultSettings.addEmptyLineBetweenElements; 88 | this.enableLogs = enableLogs ?? defaultSettings.enableLogs; 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /src/test/runTest.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import * as vscodeTest from '@vscode/test-electron' 3 | 4 | async function main() { 5 | try { 6 | // The folder containing the Extension Manifest package.json 7 | // Passed to `--extensionDevelopmentPath` 8 | const extensionDevelopmentPath = path.resolve(__dirname, '../../'); 9 | 10 | // The path to test runner 11 | // Passed to --extensionTestsPath 12 | const extensionTestsPath = path.resolve(__dirname, './suite/index'); 13 | 14 | // Download VS Code, unzip it and run the integration test 15 | await vscodeTest.runTests({ extensionDevelopmentPath, extensionTestsPath }); 16 | } catch (err) { 17 | console.error('Failed to run tests'); 18 | process.exit(1); 19 | } 20 | } 21 | 22 | main(); 23 | -------------------------------------------------------------------------------- /src/updateNote.ts: -------------------------------------------------------------------------------- 1 | export class UpdateNote 2 | { 3 | public version: string = ""; 4 | public updateNotes: string = ""; 5 | } -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "ES2018", 5 | "outDir": "out", 6 | "lib": [ 7 | "ES2018" 8 | ], 9 | "sourceMap": true, 10 | "rootDir": "src", 11 | "strict": true /* enable all strict type-checking options */ 12 | /* Additional Checks */ 13 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 14 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 15 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 16 | }, 17 | "exclude": [ 18 | "node_modules", 19 | ".vscode-test" 20 | ] 21 | } 22 | -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | 3 | 'use strict'; 4 | 5 | const path = require('path'); 6 | 7 | /**@type {import('webpack').Configuration}*/ 8 | const config = { 9 | target: 'node', // vscode extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/ 10 | 11 | entry: { 12 | extension: './src/extension.ts' 13 | },// the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/ 14 | output: { 15 | // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/ 16 | path: path.resolve(__dirname, 'out'), 17 | filename: '[name].js', 18 | libraryTarget: 'commonjs2', 19 | devtoolModuleFilenameTemplate: '../[resource-path]' 20 | }, 21 | devtool: 'source-map', 22 | externals: { 23 | vscode: 'commonjs vscode' // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/ 24 | }, 25 | resolve: { 26 | // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader 27 | extensions: ['.ts', '.js'] 28 | }, 29 | module: { 30 | rules: [{ 31 | test: /\.ts$/, 32 | exclude: /node_modules/, 33 | use: [{ 34 | loader: 'ts-loader' 35 | }] 36 | }] 37 | } 38 | }; 39 | module.exports = config; --------------------------------------------------------------------------------