├── .gitignore ├── .vscode-test.js ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── LICENSE.txt ├── README.md ├── icon ├── icon.png ├── icon.svg └── render.sh ├── images ├── copy.min.svg ├── copy.svg ├── edit.min.svg ├── edit.svg ├── minify.sh ├── svgo.json ├── view-icon.min.svg └── view-icon.svg ├── package.json ├── readme-files ├── example-view.png ├── example.png ├── mediainfo-download.png ├── mediainfo-get-path.png ├── path-env-dialog.png ├── path-env-edit-path.png └── path-env-settings.png ├── src ├── command-names.ts ├── config-interface.ts ├── extension.ts ├── html.ts ├── icons.ts ├── lazy.ts ├── media-info.ts ├── properties-view-provider.ts ├── static-view.ts ├── table-row.ts ├── test │ ├── extension.test.ts │ ├── index.ts │ ├── test-file-100.txt │ ├── test-file-1000.txt │ ├── test-file-999.txt │ └── url.d.ts └── util.ts ├── styles └── default.css ├── tsconfig.json ├── vite.config.ts └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules 3 | .vscode-test/ 4 | .vsix 5 | -------------------------------------------------------------------------------- /.vscode-test.js: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('@vscode/test-cli'); 2 | 3 | module.exports = defineConfig({ files: 'out/*.test.js' }); 4 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | { 3 | "version": "0.1.0", 4 | "configurations": [ 5 | { 6 | "name": "Extension", 7 | "type": "extensionHost", 8 | "request": "launch", 9 | "runtimeExecutable": "${execPath}", 10 | "args": [ 11 | "--disable-extensions", 12 | "--extensionDevelopmentPath=${workspaceFolder}" 13 | ], 14 | "sourceMaps": true, 15 | "outFiles": [ 16 | "${workspaceFolder}/out/**/*.js" 17 | ], 18 | }, 19 | { 20 | "name": "Extension Tests", 21 | "type": "extensionHost", 22 | "request": "launch", 23 | "runtimeExecutable": "${execPath}", 24 | "args": [ 25 | "--disable-extensions", 26 | "--extensionDevelopmentPath=${workspaceFolder}", 27 | "--extensionTestsPath=${workspaceFolder}/out/test/index" 28 | ], 29 | "sourceMaps": true, 30 | "outFiles": [ 31 | "${workspaceFolder}/out/test/**/*.js" 32 | ], 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.useTabStops": true, 3 | "typescript.format.placeOpenBraceOnNewLineForControlBlocks": true, 4 | "typescript.format.placeOpenBraceOnNewLineForFunctions": true, 5 | "typescript.tsdk": "node_modules\\typescript\\lib", 6 | 7 | "files.exclude": { 8 | "out": false // set this to true to hide the "out" folder with the compiled JS files 9 | }, 10 | "search.exclude": { 11 | "out": true // set this to false to include "out" folder in search results 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.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": "$tsc-watch", 10 | "isBackground": true, 11 | "presentation": { 12 | "reveal": "never" 13 | }, 14 | "group": { 15 | "kind": "build", 16 | "isDefault": true 17 | } 18 | } 19 | ] 20 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | .vscode-test/** 3 | out/test/** 4 | out/**/*.map 5 | src/** 6 | .gitignore 7 | tsconfig.json 8 | vsc-extension-quickstart.md 9 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | ## [1.2.0] - 2024-03-14 4 | 5 | - Added: 6 | - View can now show data for non-text files. 7 | - Hover on row highlights the row. 8 | - Fixed: 9 | - Bytes no longer show `i` prefix in kibi size mode (e.g. `5 iB` => `5 B`). 10 | - Make lines between rows less distracting by reducing their opacity. 11 | 12 | ## [1.1.0] - 2023-09-22 13 | 14 | - Added: 15 | - Setting for kibi/kilo file sizes (`sizeMode`). 16 | - Real path, shown if path contains symbolic links. 17 | - Unix style file permissions, might only show useful information on Unix systems. (Contributions by [@krisk1958](https://github.com/krisk1958)) 18 | - Changed: 19 | - File sizes are formatted with current locale. 20 | Exact byte size should now also contain thousands separators. 21 | 22 | ## [1.0.0] - 2022-02-11 23 | 24 | - Added: 25 | - View that can be shown in the panel or sidebars. Default location: "Explorer" 26 | - Support for virtual file systems (available information will be limited). 27 | 28 | ## [0.5.0] - 2020-05-01 29 | 30 | - Added: 31 | - Extension-internal media type lookup via the [`mime`](https://www.npmjs.com/package/mime) package. 32 | - Removed: 33 | - Dependency on external utility `xdg-mime` for media type lookup. 34 | - Extension option `queryMIME`, 35 | - Changed: 36 | - Renamed row `MIME Type` to `Media Type`. 37 | 38 | ## [0.4.1] - 2020-05-01 39 | 40 | - No functional changes. Publishes missing read-me/changelog adjustments for changes of v.0.4.0. 41 | 42 | ## [0.4.0] - 2020-05-01 43 | 44 | - Added: 45 | - Display relative time after timestamps. 46 | - Option for turning off the relative time display (`disableRelativeTimestamps`). 47 | - Directory path link which should open the folder in the default file manager. 48 | - Edit button which tries to open the file in VS Code (previously the functionality of the full path link). 49 | - Tooltips for buttons. 50 | - Changed: 51 | - Full path link now opens the file with the default application. 52 | - CSS for styling: Class `copy-button` renamed to `icon-button`, which is used for both edit and copy. 53 | - Fixed: 54 | - Being unable to use command on user settings file. 55 | 56 | ## [0.3.4] - 2020-02-03 57 | 58 | - Fixed: fs.stat with options argument not working in remote environment due to an outdated polyfill used by vscode-server. 59 | 60 | ## [0.3.3] - 2019-07-25 61 | 62 | - Fixed: fs.stat throwing for undefined options argument. 63 | 64 | ## [0.3.2] - 2019-03-18 65 | 66 | - Fixed: 67 | - Webview not working on Windows due to different file system path syntax. 68 | - File link on Windows, also due to path syntax. 69 | - Tab name showing not only file name on Windows, also due to path syntax. 70 | - Added: 71 | - Line-break opportunities in paths to allow the table to shrink horizontally. 72 | 73 | ## [0.3.1] - 2019-03-18 74 | 75 | - Switch from deprecated `vscode.previewHtml` command to webview API. (This change should not have any noticeable effect.) 76 | 77 | ## [0.3.0] - 2019-03-01 78 | 79 | - Added: 80 | - Row for full file path with link to file. 81 | - Copy button for name, directory and path values. 82 | - Option for defining a custom table style. 83 | - Section explaining how to set up Mediainfo support on Windows. 84 | - Changed: 85 | - Table style to be less noisy. 86 | 87 | ## [0.2.0] - 2018-05-26 88 | 89 | - Added optional support for: 90 | - [`xdg-mime`](https://www.freedesktop.org/wiki/Software/xdg-utils) - Queries the MIME type. 91 | - [`mediainfo`](https://mediaarea.net/en/MediaInfo) - Queries media information of images, audio and video. 92 | 93 | ## [0.1.0] - 2017-11-30 94 | 95 | - Initial release 96 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Harald Brunner 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # File Properties Viewer 2 | 3 | This is an extension for [Visual Studio Code](https://code.visualstudio.com/) which adds a view, command and related context menu entries for displaying file system properties of a given file. It shows file size and timestamps like the creation date. 4 | 5 | ## Features 6 | 7 | ### View 8 | 9 | The view can by default be found in the "Explorer" section of the side bar. It can be dragged to its own section, the bottom panel or the side panel. This view updates as the opened file changes. 10 | 11 | ![Example view](./readme-files/example-view.png) 12 | 13 | ### Command 14 | 15 | The command can be invoked via command palette, keyboard shortcut or from either the tab context menu, or the project explorer file context menu. 16 | 17 | A similar view will be opened for the respective file. This view is always associated with a specific file: 18 | 19 | ![Example output](./readme-files/example.png) 20 | 21 | ### Media Information 22 | 23 | The [`Media Type`](https://en.wikipedia.org/wiki/Media_type) is determined based on the file name only. Results may be inaccurate if the same file extension is used by multiple file types. Uncommon types may also not be recognized. 24 | 25 | Additional information can be provided by the following applications: 26 | 27 | - [`mediainfo`](https://mediaarea.net/en/MediaInfo) - Queries media information of images, audio and video. 28 | 29 | If the applications are available in the `PATH`, they will be called unless they are explicitly disabled via the settings. See the [installation on Windows section](#installing-utility-applications-on-windows) for some help with setting that up. 30 | 31 | ## Extension Settings 32 | 33 | This extension has the following settings (`filePropertiesViewer.`): 34 | 35 | - `sizeMode`: Whether to show file sizes in kibi (factor 1024) or kilo (factor 1000). 36 | - `dateTimeFormat`: Sets a custom date/time format for the timestamps. 37 | - `disableRelativeTimestamps`: Turns off relative timestamp display. 38 | - `queryMediaInfo`: Whether media information via mediainfo should be requested. 39 | - `outputStylePath`: Sets a path to a CSS file used for styling the output table. 40 | The default style can be found [here](./styles/default.css). 41 | The following classes are used within the table: 42 | - `icon-button`: Used on the edit and copy buttons. Has an `svg` as immediate child. 43 | - `column-header-row`: The very top row. 44 | - `column-header-cell`: Cells in top row. 45 | - `property-row`: Row with property and value. 46 | - `key-cell`: Cell in property column. 47 | - `value-cell`: Cell of value column. 48 | - `indent-`: Defined on property cell, number `` increases for nested property rows. 49 | - `group-row`: Top level group row (e.g. `Media Info`). 50 | - `group-cell`: Cell of group row (spans both columns). 51 | - `sub-group-row`: Second level group row (e.g. `Media Info` > `Image`) 52 | - `sub-group-cell`: Cell of sub-group row (spans both columns). 53 | 54 | The root element has a `data-view` attribute whose value will be either `static` or `command` depending on how the view was displayed. 55 | 56 | ## Installing Utility Applications on Windows 57 | 58 | ### MediaInfo 59 | 60 | 1. Download the **CLI** for the respective architecture from the [Windows download section](https://mediaarea.net/en/MediaInfo/Download/Windows):
61 | ![MediaInfo download options](./readme-files/mediainfo-download.png) 62 | 2. Extract the archive to a directory and copy its location from the address bar of the explorer. The directory should contain the `MediaInfo.exe` application:
63 | ![Getting the MediaInfo path](./readme-files/mediainfo-get-path.png) 64 | 3. Add the copied location to the `PATH` environment variable. (See [respective subsection](#adding-directories-to-the-path-environment-variable).) 65 | 66 | ### Adding directories to the `PATH` environment variable 67 | 68 | The `PATH` variable is used by the operating system to resolve names of executables if no absolute or relative path is provided. It is a semi-colon separated list of directories in which the operating system will look for applications. 69 | 70 | Depending on the version of Windows this process can differ. Search online if this outline is not helpful to you; there exist guides for all versions (and other languages). 71 | 72 | 1. Search for "environment variables" from the start menu. There should be an option to change those for the current user.
73 | ![Control panel option for environment variables](./readme-files/path-env-settings.png) 74 | 2. In the list of variables for your user find the one called `Path` (casing does not matter). Create it if it does not exist, click "Edit" otherwise.
75 | ![Environment variables dialog](./readme-files/path-env-dialog.png) 76 | 3. Click the "New" button to add a new directory path to the variable. Paste or type the directory location you want to add.
77 | ![Path edit dialog](./readme-files/path-env-edit-path.png) 78 | 4. "OK" all the dialogs. 79 | 5. Restart VS Code to have it load the updated variable. 80 | -------------------------------------------------------------------------------- /icon/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunnerh/file-properties-viewer/8d2ff1e35cdfb5cf77ffdb6d756f92b0cc7bd804/icon/icon.png -------------------------------------------------------------------------------- /icon/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 42 | 49 | 56 | 63 | 70 | 77 | 84 | 85 | 87 | 88 | 90 | image/svg+xml 91 | 93 | 94 | 95 | 96 | 97 | 102 | 105 | 111 | 117 | 118 | i 129 | 130 | 131 | -------------------------------------------------------------------------------- /icon/render.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | # ImageMagick 4 | convert -background none icon.svg -density 2048 -resize 128 icon.png -------------------------------------------------------------------------------- /images/copy.min.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /images/copy.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 42 | 47 | 48 | 50 | 51 | 53 | image/svg+xml 54 | 56 | 57 | 58 | 59 | 60 | 65 | 68 | 74 | 80 | 86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /images/edit.min.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /images/edit.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 21 | 42 | 47 | 48 | 50 | 51 | 53 | image/svg+xml 54 | 56 | 57 | 58 | 59 | 60 | 65 | 68 | 76 | 82 | 83 | 84 | 85 | -------------------------------------------------------------------------------- /images/minify.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/zsh 2 | 3 | for img in *.svg; do 4 | if [[ ! $img =~ ".min.svg" ]]; then 5 | svgo --config=svgo.json $img -o ${img:r}.min.svg 6 | # svgo --config=svgo.json $img --datauri=base64 -o ${img:r}.min.uri 7 | fi 8 | done 9 | -------------------------------------------------------------------------------- /images/svgo.json: -------------------------------------------------------------------------------- 1 | { 2 | "plugins": [ 3 | { "removeViewBox": false }, 4 | { "removeDimensions": true } 5 | ] 6 | } -------------------------------------------------------------------------------- /images/view-icon.min.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /images/view-icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 17 | 19 | 48 | 52 | 53 | 55 | 56 | 58 | image/svg+xml 59 | 61 | 62 | 63 | 64 | 78 | 128 | 132 | 137 | 142 | 143 | 144 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "file-properties-viewer", 3 | "displayName": "File Properties Viewer", 4 | "description": "Shows file properties like size, various time stamps and media type.", 5 | "version": "1.2.0", 6 | "publisher": "brunnerh", 7 | "license": "MIT", 8 | "icon": "icon/icon.png", 9 | "homepage": "https://github.com/brunnerh/file-properties-viewer", 10 | "repository": { 11 | "type": "git", 12 | "url": "https://github.com/brunnerh/file-properties-viewer.git" 13 | }, 14 | "engines": { 15 | "vscode": "^1.87.0" 16 | }, 17 | "categories": [ 18 | "Other" 19 | ], 20 | "keywords": [ 21 | "file", 22 | "properties", 23 | "size", 24 | "date", 25 | "media info", 26 | "mime", 27 | "creation date", 28 | "modification date", 29 | "access date" 30 | ], 31 | "activationEvents": [], 32 | "main": "./out/extension", 33 | "contributes": { 34 | "commands": [ 35 | { 36 | "command": "filePropertiesViewer.viewProperties", 37 | "title": "View File Properties" 38 | } 39 | ], 40 | "configuration": { 41 | "type": "object", 42 | "title": "File Properties Viewer Configuration", 43 | "properties": { 44 | "filePropertiesViewer.sizeMode": { 45 | "type": "string", 46 | "enum": [ 47 | "kibi", 48 | "kilo" 49 | ], 50 | "default": "kilo", 51 | "description": "Whether to show file sizes in kibi (factor 1024) or kilo (factor 1000)." 52 | }, 53 | "filePropertiesViewer.dateTimeFormat": { 54 | "type": [ 55 | "string", 56 | "null" 57 | ], 58 | "default": null, 59 | "description": "Sets a custom date/time format. See https://www.npmjs.com/package/dateformat#mask-options for the available mask options. If null the default locale string conversion is used." 60 | }, 61 | "filePropertiesViewer.queryMediaInfo": { 62 | "type": "boolean", 63 | "default": true, 64 | "description": "Whether media information via mediainfo should be requested." 65 | }, 66 | "filePropertiesViewer.outputStylePath": { 67 | "type": [ 68 | "string", 69 | "null" 70 | ], 71 | "default": null, 72 | "description": "Sets a path to a CSS file used for styling the output table. See extension page for more info." 73 | }, 74 | "filePropertiesViewer.disableRelativeTimestamps": { 75 | "type": "boolean", 76 | "default": false, 77 | "description": "Turns off relative timestamp display." 78 | } 79 | } 80 | }, 81 | "menus": { 82 | "commandPalette": [ 83 | { 84 | "command": "filePropertiesViewer.viewProperties" 85 | } 86 | ], 87 | "editor/title/context": [ 88 | { 89 | "command": "filePropertiesViewer.viewProperties" 90 | } 91 | ], 92 | "explorer/context": [ 93 | { 94 | "command": "filePropertiesViewer.viewProperties" 95 | } 96 | ] 97 | }, 98 | "views": { 99 | "explorer": [ 100 | { 101 | "type": "webview", 102 | "id": "filePropertiesViewer.view", 103 | "name": "Properties", 104 | "contextualTitle": "File Properties Viewer", 105 | "icon": "images/view-icon.min.svg" 106 | } 107 | ] 108 | } 109 | }, 110 | "scripts": { 111 | "vscode:prepublish": "npm run compile", 112 | "compile": "vite build", 113 | "watch": "vite build --watch", 114 | "test": "npm run compile && vscode-test", 115 | "minify:images": "pushd images; ./minify.sh; popd" 116 | }, 117 | "devDependencies": { 118 | "@types/dateformat": "^5.0.2", 119 | "@types/mime": "^3.0.4", 120 | "@types/mocha": "^9.1.0", 121 | "@types/node": "^18", 122 | "@types/vscode": "^1.75.0", 123 | "@types/xml2js": "^0.4.2", 124 | "@vscode/test-cli": "^0.0.8", 125 | "@vscode/test-electron": "^2.3.9", 126 | "dateformat": "5.0.3", 127 | "mime": "^4.0.1", 128 | "mocha": "10.3.0", 129 | "svgo": "^2.8.0", 130 | "typescript": "5", 131 | "vite": "^5.1.7", 132 | "xml2js": "^0.6.2" 133 | }, 134 | "dependencies": {} 135 | } 136 | -------------------------------------------------------------------------------- /readme-files/example-view.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunnerh/file-properties-viewer/8d2ff1e35cdfb5cf77ffdb6d756f92b0cc7bd804/readme-files/example-view.png -------------------------------------------------------------------------------- /readme-files/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunnerh/file-properties-viewer/8d2ff1e35cdfb5cf77ffdb6d756f92b0cc7bd804/readme-files/example.png -------------------------------------------------------------------------------- /readme-files/mediainfo-download.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunnerh/file-properties-viewer/8d2ff1e35cdfb5cf77ffdb6d756f92b0cc7bd804/readme-files/mediainfo-download.png -------------------------------------------------------------------------------- /readme-files/mediainfo-get-path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunnerh/file-properties-viewer/8d2ff1e35cdfb5cf77ffdb6d756f92b0cc7bd804/readme-files/mediainfo-get-path.png -------------------------------------------------------------------------------- /readme-files/path-env-dialog.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunnerh/file-properties-viewer/8d2ff1e35cdfb5cf77ffdb6d756f92b0cc7bd804/readme-files/path-env-dialog.png -------------------------------------------------------------------------------- /readme-files/path-env-edit-path.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunnerh/file-properties-viewer/8d2ff1e35cdfb5cf77ffdb6d756f92b0cc7bd804/readme-files/path-env-edit-path.png -------------------------------------------------------------------------------- /readme-files/path-env-settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brunnerh/file-properties-viewer/8d2ff1e35cdfb5cf77ffdb6d756f92b0cc7bd804/readme-files/path-env-settings.png -------------------------------------------------------------------------------- /src/command-names.ts: -------------------------------------------------------------------------------- 1 | export const viewProperties = "filePropertiesViewer.viewProperties"; -------------------------------------------------------------------------------- /src/config-interface.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | 3 | export const sectionName = 'filePropertiesViewer'; 4 | 5 | export class Config 6 | { 7 | static get section(): vscode.WorkspaceConfiguration & TypedConfig 8 | { 9 | return vscode.workspace.getConfiguration(sectionName); 10 | } 11 | } 12 | 13 | interface TypedConfig 14 | { 15 | get(item: 'sizeMode'): SizeMode; 16 | get(item: 'dateTimeFormat'): string | null; 17 | get(item: 'queryMediaInfo'): boolean; 18 | get(item: 'outputStylePath'): string | null; 19 | get(item: 'disableRelativeTimestamps'): boolean; 20 | } 21 | 22 | export type SizeMode = 'kilo' | 'kibi'; 23 | -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | import * as vscode from 'vscode'; 4 | import { viewPropertiesCommand } from './properties-view-provider'; 5 | import { viewProperties } from './command-names'; 6 | import { StaticViewProvider } from './static-view'; 7 | 8 | export function activate(context: vscode.ExtensionContext) 9 | { 10 | context.subscriptions.push( 11 | vscode.commands.registerCommand(viewProperties, viewPropertiesCommand), 12 | new StaticViewProvider(context.extensionUri).register(), 13 | ); 14 | } 15 | 16 | export function deactivate() 17 | { 18 | } -------------------------------------------------------------------------------- /src/html.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Escapes angle brackets and quotes. 3 | * @param str The string to escape. 4 | */ 5 | export function escape(str: string) 6 | { 7 | return str 8 | .replace(//g, '>') 10 | .replace(/"/g, '"'); 11 | } 12 | 13 | /** 14 | * Class for wrapping raw HTML values. 15 | * These will not be escaped by {@link html}. 16 | */ 17 | export class HtmlString 18 | { 19 | /** 20 | * Creates a new instance of the HtmlString class. 21 | * @param content The HTML content. 22 | */ 23 | constructor(public content: string) { } 24 | 25 | toString() 26 | { 27 | return this.content; 28 | } 29 | } 30 | 31 | /** 32 | * Creates a raw HTML string. 33 | * @param str The HTML content. 34 | */ 35 | export const raw = (str: string) => new HtmlString(str); 36 | 37 | /** Type of objects that can be inserted into a tagged HTML template. */ 38 | export type HtmlValue = string | number | HtmlString; 39 | 40 | /** 41 | * Tagged template string function for creating HTML, automatically escaping all inputs. 42 | * If an input should not be escaped use {@link raw} 43 | */ 44 | export const html = ( 45 | strings: TemplateStringsArray, 46 | ...values: (HtmlValue | HtmlValue[])[] 47 | ): HtmlString => 48 | { 49 | const out: HtmlValue[] = []; 50 | let stringIndex = 0; 51 | let valueIndex = 0; 52 | for (let i = 0; i < strings.length + values.length; i++) 53 | { 54 | if (i % 2 == 0) 55 | { 56 | out.push(strings[stringIndex++]); 57 | } 58 | else 59 | { 60 | const value = values[valueIndex++]; 61 | 62 | const pushValue = (single: HtmlValue) => 63 | out.push(single instanceof HtmlString ? single.content : escape(single.toString())); 64 | 65 | if (Array.isArray(value)) 66 | value.forEach(pushValue); 67 | else 68 | pushValue(value) 69 | } 70 | } 71 | 72 | return raw(out.join('')); 73 | } -------------------------------------------------------------------------------- /src/icons.ts: -------------------------------------------------------------------------------- 1 | import * as fs from 'fs'; 2 | import { readFile } from 'fs'; 3 | import * as p from 'path'; 4 | import { promisify } from 'util'; 5 | import { lazy } from './lazy'; 6 | 7 | /** 8 | * Loads contents of an SVG. Automatically uses min version if available (.min.svg). 9 | * @param relativePath Path to SVG source file. 10 | */ 11 | const svg = async (relativePath: string) => 12 | { 13 | const path = p.join(__dirname, relativePath); 14 | const base = path.split('.').slice(0, -1).join('.'); 15 | const minPath = base + '.min.svg'; 16 | const loadPath = fs.existsSync(minPath) ? minPath : path; 17 | 18 | const buffer = await promisify(readFile)(loadPath); 19 | 20 | return buffer.toString(); 21 | } 22 | 23 | class Icons 24 | { 25 | @lazy 26 | get copy() { return svg('../images/copy.svg') } 27 | 28 | @lazy 29 | get edit() { return svg('../images/edit.svg') } 30 | } 31 | 32 | export const icons = new Icons(); -------------------------------------------------------------------------------- /src/lazy.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Decorator for a get-only property to turn it into a automatically caching property. 3 | */ 4 | export const lazy = (target: any, propertyKey: string | symbol, propertyDescriptor: PropertyDescriptor) => 5 | { 6 | const defineHidden = (target: any, key: string) => 7 | Object.defineProperty(target, key, { 8 | writable: true, 9 | enumerable: false, 10 | }); 11 | 12 | const valueKey = `__${String(propertyKey)}_value`; 13 | const hasValueKey = `__${String(propertyKey)}_has_value`; 14 | 15 | return { 16 | get: function(this: any) 17 | { 18 | if (this[hasValueKey] !== true) 19 | { 20 | defineHidden(this, valueKey); 21 | defineHidden(this, hasValueKey); 22 | 23 | this[valueKey] = propertyDescriptor.get!.bind(this)(); 24 | this[hasValueKey] = true; 25 | } 26 | 27 | return this[valueKey]; 28 | } 29 | }; 30 | } -------------------------------------------------------------------------------- /src/media-info.ts: -------------------------------------------------------------------------------- 1 | export interface MediaInfoContainer 2 | { 3 | MediaInfo: MediaInfo; 4 | } 5 | 6 | export interface MediaInfo 7 | { 8 | media: [Media]; 9 | } 10 | 11 | export interface Media 12 | { 13 | track: Track[]; 14 | } 15 | 16 | export interface Track 17 | { 18 | $: { type: 'General' | 'Audio' | 'Video' | 'Image' | 'Text' }; 19 | } 20 | 21 | export interface GeneralTrack extends Track 22 | { 23 | $: { type: 'General' } 24 | ImageCount?: [string]; 25 | AudioCount?: [string]; 26 | VideoCount?: [string]; 27 | TextCount?: [string]; 28 | FileExtension?: [string]; 29 | Format?: [string]; 30 | FileSize?: [string]; 31 | Duration?: [string]; 32 | OverallBitRate_Mode?: [string]; 33 | OverallBitRate?: [string]; 34 | StreamSize?: [string]; 35 | Title?: [string]; 36 | Album?: [string]; 37 | Album_Performer?: [string]; 38 | Track?: [string]; 39 | Track_Position?: [string]; 40 | Performer?: [string]; 41 | Composer?: [string]; 42 | Recorded_Date?: [string]; 43 | File_Modified_Date?: [string]; 44 | File_Modified_Date_Local?: [string]; 45 | Cover?: [string]; 46 | Cover_Type?: [string]; 47 | Cover_Mime?: [string]; 48 | } 49 | 50 | export interface AudioTrack extends Track 51 | { 52 | $: { type: 'Audio' }; 53 | StreamOrder?: [string]; 54 | ID?: [string]; 55 | Format?: [string]; 56 | Duration?: [string]; 57 | BitRate_Mode?: [string]; 58 | BitRate?: [string]; 59 | Channels?: [string]; 60 | ChannelPositions?: [string]; 61 | ChannelLayout?: [string]; 62 | SamplesPerFrame?: [string]; 63 | SamplingRate?: [string]; 64 | SamplingCount?: [string]; 65 | BitDepth?: [string]; 66 | StreamSize?: [string]; 67 | Compression_Mode?: [string]; 68 | StreamSize_Proportion?: [string]; 69 | Encoded_Library?: [string]; 70 | Encoded_Library_Name?: [string]; 71 | Encoded_Library_Version?: [string]; 72 | Encoded_Library_Date?: [string]; 73 | } 74 | 75 | export interface VideoTrack extends Track 76 | { 77 | $: { type: 'Video' }; 78 | StreamOrder?: [string]; 79 | ID?: [string]; 80 | UniqueID?: [string]; 81 | Format?: [string]; 82 | Format_Profile?: [string]; 83 | Format_Level?: [string]; 84 | Format_Settings_CABAC?: [string]; 85 | Format_Settings_RefFrames?: [string]; 86 | CodecID?: [string]; 87 | Duration?: [string]; 88 | BitRate_Nominal?: [string]; 89 | Width?: [string]; 90 | Height?: [string]; 91 | Sampled_Width?: [string]; 92 | Sampled_Height?: [string]; 93 | PixelAspectRatio?: [string]; 94 | DisplayAspectRatio?: [string]; 95 | FrameRate_Mode?: [string]; 96 | FrameRate?: [string]; 97 | FrameCount?: [string]; 98 | ColorSpace?: [string]; 99 | ChromaSubsampling?: [string]; 100 | BitDepth?: [string]; 101 | ScanType?: [string]; 102 | Delay?: [string]; 103 | Encoded_Library?: [string]; 104 | Encoded_Library_Name?: [string]; 105 | Encoded_Library_Version?: [string]; 106 | Encoded_Library_Settings?: [string]; 107 | } 108 | 109 | export interface ImageTrack extends Track 110 | { 111 | $: { type: 'Image' }; 112 | Format?: [string]; 113 | Format_Compression?: [string]; 114 | Width?: [string]; 115 | Height?: [string]; 116 | BitDepth?: [string]; 117 | Compression_Mode?: [string]; 118 | StreamSize?: [string]; 119 | } 120 | 121 | export interface TextTrack extends Track 122 | { 123 | $: { type: 'Text' }; 124 | ID?: [string]; 125 | UniqueID?: [string]; 126 | Format?: [string]; 127 | CodecID?: [string]; 128 | Compression_Mode?: [string]; 129 | Default?: [string]; 130 | Forced?: [string]; 131 | } -------------------------------------------------------------------------------- /src/properties-view-provider.ts: -------------------------------------------------------------------------------- 1 | import { execFile } from "child_process"; 2 | import dateformat from "dateformat"; 3 | import * as fs from "fs"; 4 | import mime from 'mime'; 5 | import { basename, dirname, join } from "path"; 6 | import { promisify } from 'util'; 7 | import * as vscode from "vscode"; 8 | import { Uri } from 'vscode'; 9 | import { parseString as parseXML } from "xml2js"; 10 | import { Config, SizeMode } from "./config-interface"; 11 | import { html, HtmlValue, raw } from "./html"; 12 | import { icons } from "./icons"; 13 | import { MediaInfoContainer } from "./media-info"; 14 | import { GroupRow, PropertyRow, SubGroupRow, TableRow } from "./table-row"; 15 | 16 | export async function provideViewHtml(view: 'command' | 'static', uri: Uri) 17 | { 18 | const { path, directory, name, realPath, stats } = await baseData(uri); 19 | 20 | // Byte size redundant for sizes < unit factor 21 | const sizeMode = Config.section.get('sizeMode'); 22 | const exactSize = stats.size >= factorFor(sizeMode) ? 23 | ` (${stats.size.toLocaleString()} B)` : 24 | ''; 25 | 26 | const copyIcon = await icons.copy; 27 | const editIcon = await icons.edit; 28 | 29 | const copyButton = (textOrUri: string | Uri) => html` 30 | 36 | `; 37 | 38 | const editButton = (uri: Uri) => html` 39 | 43 | `; 44 | 45 | const externalLink = (uri: Uri) => html` 46 | 47 | ${makePathBreakable(getUriText(uri))} 48 | 49 | `; 50 | 51 | const getUriText = (uri: Uri) => 52 | uri.scheme == 'file' ? uri.fsPath : uri.toString(); 53 | 54 | const cellWithButtons = (content: HtmlValue, ...buttons: HtmlValue[]) => html` 55 |
56 |
${content}
57 |
${buttons}
58 |
59 | `; 60 | 61 | const permissions = (mode: number) => 62 | { 63 | const title = [ 64 | 'Permissions by user, group and other.', 65 | 'Might only be meaningful on Unix systems.', 66 | ' r = read', 67 | ' w = write', 68 | ' x = execute', 69 | 'If a flag does not exist on the system, an underscore is shown.', 70 | 'If a flag is unset, a dash is shown.', 71 | 'If all flags are available the octal representation is shown in parentheses.', 72 | ].join('\n'); 73 | 74 | return html`${formatPermissions(mode)}`; 75 | }; 76 | 77 | const rows: TableRow[] = [ 78 | new PropertyRow('Name', cellWithButtons(name, editButton(uri), copyButton(name))), 79 | directory != null ? 80 | new PropertyRow('Directory', cellWithButtons( 81 | externalLink(directory), 82 | copyButton(directory), 83 | )) : null, 84 | new PropertyRow('Full Path', cellWithButtons(externalLink(uri), copyButton(uri))), 85 | realPath != null && uri.toString() != realPath.toString() ? 86 | new PropertyRow('Real Path', cellWithButtons( 87 | externalLink(realPath), 88 | editButton(realPath), 89 | copyButton(realPath), 90 | )) : null, 91 | new PropertyRow('Size', formatBytes(stats.size, sizeMode) + exactSize), 92 | stats.created ? new PropertyRow('Created', formatDate(stats.created)) : null, 93 | stats.changed ? new PropertyRow('Changed', formatDate(stats.changed)) : null, 94 | stats.modified ? new PropertyRow('Modified', formatDate(stats.modified)) : null, 95 | stats.accessed ? new PropertyRow('Accessed', formatDate(stats.accessed)) : null, 96 | stats.mode != null ? new PropertyRow('Permissions', permissions(stats.mode)) : null, 97 | ].filter(r => r != null) as TableRow[]; 98 | 99 | addMediaType(path, rows); 100 | await addMediaInfo(path, rows); 101 | 102 | const defaultStylePath = join(__dirname, '../styles/default.css'); 103 | const stylePath = Config.section.get('outputStylePath'); 104 | const style = (await promisify(fs.readFile)(stylePath ? stylePath : defaultStylePath)) 105 | .toString(); 106 | 107 | return html` 108 | 109 | 110 | 111 | 112 | 113 | Document 114 | 117 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | ${rows.map(r => r.toHTML())} 170 | 171 |
PropertyValue
172 | 175 | 176 | 177 | `.content; 178 | } 179 | 180 | async function baseData(uri: Uri): Promise 181 | { 182 | if (uri.scheme == 'file') 183 | { 184 | const path = uri.fsPath; 185 | const name = basename(path); 186 | const directory = Uri.file(dirname(path)); 187 | // bigint throws on format later 188 | const stats = await promisify(fs.stat)(path); 189 | const { size, birthtime, ctime, mtime, atime, mode } = stats; 190 | const realPath = Uri.file(await promisify(fs.realpath)(path)); 191 | 192 | return { 193 | path, name, directory, realPath, 194 | stats: { 195 | size, 196 | created: birthtime, 197 | changed: ctime, 198 | modified: mtime, 199 | accessed: atime, 200 | mode, 201 | }, 202 | }; 203 | } 204 | else // Virtual 205 | { 206 | const path = uri.toString(); 207 | const name = basename(uri.toString()); 208 | const directory = null; 209 | const realPath = null; 210 | const { size, ctime, mtime } = await vscode.workspace.fs.stat(uri); 211 | 212 | return { 213 | path, name, directory, realPath, 214 | stats: { 215 | size, 216 | created: ctime <= 0 ? null : new Date(ctime), 217 | changed: null, 218 | modified: mtime <= 0 ? null : new Date(mtime), 219 | accessed: null, 220 | mode: null, 221 | }, 222 | }; 223 | } 224 | } 225 | 226 | interface BaseData 227 | { 228 | path: string; 229 | realPath: Uri | null, 230 | name: string; 231 | directory: Uri | null, 232 | stats: { 233 | size: number, 234 | created: Date | null, 235 | changed: Date | null, 236 | modified: Date | null, 237 | accessed: Date | null, 238 | mode: number | null, 239 | } 240 | } 241 | 242 | function addMediaType(path: string, rows: TableRow[]) 243 | { 244 | const type = mime.getType(path) ?? '[unknown]'; 245 | rows.push(new PropertyRow('Media Type', type)); 246 | } 247 | 248 | async function addMediaInfo(path: string, rows: TableRow[]) 249 | { 250 | if (Config.section.get("queryMediaInfo")) 251 | try 252 | { 253 | const mediaXml = await exec('mediainfo', ['--Output=xml', '--Output=XML', path]); 254 | rows.push(new GroupRow("Media Info")); 255 | const mediaContainer = await promisify(parseXML)(mediaXml); 256 | const tracks = mediaContainer.MediaInfo.media[0].track; 257 | const rowTree = (parentLabel: string, obj: any, level = 0) => 258 | { 259 | rows.push(new SubGroupRow(parentLabel, level)); 260 | Object.keys(obj) 261 | .filter(key => key != "$") 262 | .forEach(key => 263 | { 264 | if (obj[key]) 265 | { 266 | const label = key.replace(/_/g, ' '); 267 | let value = (obj[key] as any)[0]; 268 | // If object, Base64 encoded or sub-tree 269 | if (typeof value == 'object') 270 | { 271 | if (value.$ && value.$.dt == 'binary.base64') 272 | { 273 | value = Buffer.from(value._, 'base64').toString(); 274 | } 275 | else 276 | { 277 | rowTree(label, value, level + 1); 278 | return; 279 | } 280 | } 281 | rows.push(new PropertyRow(label, value, level + 1)); 282 | } 283 | }); 284 | }; 285 | tracks.forEach(track => 286 | { 287 | rowTree(track.$.type, track); 288 | }); 289 | } 290 | catch { } 291 | } 292 | 293 | export async function viewPropertiesCommand(uri?: Uri) 294 | { 295 | const editor = vscode.window.activeTextEditor; 296 | if (uri == null && editor == null) 297 | { 298 | vscode.window.showWarningMessage("Cannot stat this item."); 299 | return; 300 | } 301 | 302 | const finalUri = uri ?? editor!.document.uri; 303 | const name = basename(finalUri.toString()); 304 | 305 | const panel = vscode.window.createWebviewPanel( 306 | 'file-properties', 307 | `Properties of ${name}`, 308 | vscode.ViewColumn.Two, 309 | { 310 | enableFindWidget: true, 311 | enableScripts: true, 312 | } 313 | ); 314 | 315 | panel.webview.html = await provideViewHtml('command', finalUri); 316 | 317 | panel.webview.onDidReceiveMessage(onViewMessage); 318 | 319 | const updateHandlers = [ 320 | vscode.workspace.onDidSaveTextDocument(async e => 321 | { 322 | if (e.uri.toString() == finalUri.toString()) 323 | panel.webview.html = await provideViewHtml('command', finalUri); 324 | }), 325 | vscode.workspace.onDidChangeConfiguration(async () => 326 | { 327 | panel.webview.html = await provideViewHtml('command', finalUri); 328 | }), 329 | ]; 330 | 331 | panel.onDidDispose(() => updateHandlers.forEach(h => h.dispose())); 332 | } 333 | 334 | export async function onViewMessage(message: ViewMessage) 335 | { 336 | try 337 | { 338 | switch (message.command) 339 | { 340 | case 'open': 341 | const uri = Uri.parse(message.uri); 342 | const document = await vscode.workspace.openTextDocument(uri); 343 | await vscode.window.showTextDocument(document); 344 | break; 345 | case 'open-external': 346 | const extUri = Uri.parse(message.uri); 347 | await vscode.env.openExternal(extUri); 348 | break; 349 | case 'log': 350 | console.log(message.data); 351 | break; 352 | } 353 | } 354 | catch (error) 355 | { 356 | vscode.window.showErrorMessage( 357 | `Failed to handle webview message: ${JSON.stringify(message)}\n` + 358 | `Error: ${error}`); 359 | } 360 | } 361 | 362 | // #region Utilities 363 | 364 | function formatBytes(size: number, mode: SizeMode) 365 | { 366 | const factor = factorFor(mode); 367 | const sizes = ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y']; 368 | 369 | let result = size; 370 | let i = 0; 371 | while (result >= factor && i < sizes.length - 1) 372 | { 373 | result /= factor; 374 | i++; 375 | } 376 | 377 | const formatted = result.toLocaleString(undefined, { maximumFractionDigits: 3 }); 378 | const prefix = sizes[i]; 379 | const modeSuffix = mode == 'kibi' && prefix != '' ? 'i' : ''; 380 | 381 | return `${formatted} ${prefix}${modeSuffix}B`; 382 | } 383 | 384 | function factorFor(mode: SizeMode) 385 | { 386 | const factor = { 387 | 'kilo': 1000, 388 | 'kibi': 1024, 389 | }[mode]; 390 | 391 | if (factor == null) 392 | throw new Error(`Unknown size mode: ${mode}`); 393 | 394 | return factor; 395 | } 396 | 397 | /** 398 | * Extracts and formats permissions from file mode. 399 | * Grouped by user, group and other (`rwx rwx rwx`). 400 | */ 401 | function formatPermissions(mode: number): string 402 | { 403 | // https://nodejs.org/docs/latest-v18.x/api/fs.html#file-mode-constants 404 | const flagGroups: FlagGroup[] = [ 405 | { 406 | S_IRUSR: 'r', 407 | S_IWUSR: 'w', 408 | S_IXUSR: 'x', 409 | }, 410 | { 411 | S_IRGRP: 'r', 412 | S_IWGRP: 'w', 413 | S_IXGRP: 'x', 414 | }, 415 | { 416 | S_IROTH: 'r', 417 | S_IWOTH: 'w', 418 | S_IXOTH: 'x', 419 | }, 420 | ]; 421 | 422 | const flags = flagGroups 423 | .map(group => 424 | (Object.entries(group) as [FlagKey, FlagSymbol][]) 425 | .map(([flag, char]) => 426 | flag in fs.constants == false ? '_' : 427 | (mode & fs.constants[flag]) == 0 ? '-' : 428 | char 429 | ) 430 | .join('') 431 | ) 432 | .join(' '); 433 | 434 | const octalRaw = mode.toString(8); 435 | const octal = octalRaw 436 | .padStart(3, '0') 437 | .substring(octalRaw.length - 3); // There may be other bits set 438 | 439 | const systemHasAllFlags = flagGroups 440 | .flatMap(group => Object.keys(group)) 441 | .every(flag => flag in fs.constants); 442 | 443 | return systemHasAllFlags ? `${flags} (${octal})` : flags; 444 | } 445 | 446 | function formatDate(date: Date) 447 | { 448 | // Extract and only update on config changed event if performance is impacted. 449 | const format = Config.section.get('dateTimeFormat'); 450 | const disableRelative = Config.section.get('disableRelativeTimestamps'); 451 | 452 | const absolute = format == null ? date.toLocaleString() : dateformat(date, format); 453 | if (disableRelative) 454 | return absolute; 455 | 456 | const relative = formatDateRelative(date); 457 | 458 | return `${absolute} (${relative})`; 459 | } 460 | 461 | function formatDateRelative(date: Date) 462 | { 463 | const formatter = new Intl.RelativeTimeFormat(undefined, { numeric: 'auto' }); 464 | 465 | const delta = -(new Date().getTime() - date.getTime()); 466 | const units = [ 467 | ['year', 31536000000], 468 | ['month', 2628000000], 469 | ['day', 86400000], 470 | ['hour', 3600000], 471 | ['minute', 60000], 472 | ['second', 1000], 473 | ] as const; 474 | 475 | for (const [unit, amount] of units) 476 | if (Math.abs(delta) > amount || unit === 'second') 477 | return formatter.format(Math.round(delta / amount), unit); 478 | }; 479 | 480 | /** 481 | * Inserts a zero-width-space after every slash to create line-break opportunities. 482 | * @param path Path to process. 483 | */ 484 | function makePathBreakable(path: string): string 485 | { 486 | return path.replace(/([\/\\])/g, substr => `${substr}\u200B`); 487 | } 488 | 489 | function exec(path: string, args: string[]) 490 | { 491 | return new Promise((res, rej) => 492 | { 493 | execFile(path, args, (error, stdout, stderr) => 494 | { 495 | if (error) 496 | rej({ error, stderr }); 497 | else 498 | res(stdout); 499 | }); 500 | }); 501 | } 502 | 503 | type FlagKey = keyof typeof fs.constants; 504 | type FlagSymbol = 'r' | 'w' | 'x'; 505 | type FlagGroup = Partial>; 506 | 507 | // #endregion 508 | 509 | interface OpenMessage 510 | { 511 | command: 'open'; 512 | uri: string; 513 | } 514 | interface OpenExternalMessage 515 | { 516 | command: 'open-external'; 517 | uri: string; 518 | } 519 | interface LogMessage 520 | { 521 | command: 'log'; 522 | data: any; 523 | } 524 | 525 | type ViewMessage = OpenMessage | OpenExternalMessage | LogMessage; 526 | -------------------------------------------------------------------------------- /src/static-view.ts: -------------------------------------------------------------------------------- 1 | import 2 | { 3 | CancellationToken, ConfigurationChangeEvent, TextDocument, Uri, WebviewView, 4 | WebviewViewProvider, WebviewViewResolveContext, window, workspace 5 | } from 'vscode'; 6 | import { sectionName } from './config-interface'; 7 | import { onViewMessage, provideViewHtml } from './properties-view-provider'; 8 | 9 | export class StaticViewProvider implements WebviewViewProvider 10 | { 11 | public static readonly viewType = 'filePropertiesViewer.view'; 12 | 13 | private view?: WebviewView; 14 | 15 | constructor(private extensionUri: Uri) 16 | { 17 | } 18 | 19 | register() 20 | { 21 | return window.registerWebviewViewProvider(StaticViewProvider.viewType, this); 22 | } 23 | 24 | async resolveWebviewView( 25 | webviewView: WebviewView, 26 | context: WebviewViewResolveContext, 27 | token: CancellationToken 28 | ): Promise 29 | { 30 | this.view = webviewView; 31 | const webview = this.view.webview; 32 | 33 | webview.options = { 34 | enableScripts: true, 35 | localResourceRoots: [this.extensionUri], 36 | }; 37 | webview.onDidReceiveMessage(onViewMessage); 38 | 39 | this.updatePanel(); 40 | 41 | const tokens = [ 42 | webviewView.onDidChangeVisibility(() => 43 | { 44 | if (webviewView.visible) 45 | this.updatePanel(); 46 | }), 47 | window.tabGroups.onDidChangeTabs(() => this.updatePanel()), 48 | window.tabGroups.onDidChangeTabGroups(() => this.updatePanel()), 49 | workspace.onDidSaveTextDocument(e => this.updatePanel(e.uri)), 50 | workspace.onDidChangeConfiguration(e => this.configurationChanged(e)), 51 | ]; 52 | 53 | webviewView.onDidDispose(() => tokens.forEach(t => t.dispose())); 54 | } 55 | 56 | private configurationChanged(e: ConfigurationChangeEvent) 57 | { 58 | if (e.affectsConfiguration(sectionName)) 59 | this.updatePanel(); 60 | } 61 | 62 | private updateCount = 0; 63 | 64 | /** 65 | * If a text editor is active, the view is updated according to its selection. 66 | */ 67 | private updatePanel(uri?: Uri) 68 | { 69 | if (this.view === undefined) 70 | return; 71 | 72 | uri = uri ?? getCurrentUri(); 73 | 74 | const getHtml = async () => 75 | { 76 | if (uri == null || uri.scheme != 'file') 77 | return '

Open a saved file to view properties.

'; 78 | 79 | try 80 | { 81 | return await provideViewHtml('static', uri); 82 | } 83 | catch 84 | { 85 | return '

Failed to determine file properties.

'; 86 | } 87 | }; 88 | 89 | const currentUpdate = ++this.updateCount; 90 | getHtml().then( 91 | html => 92 | { 93 | if (this.view == null || this.updateCount !== currentUpdate) 94 | return; 95 | 96 | this.view.webview.html = html; 97 | } 98 | ); 99 | } 100 | } 101 | 102 | 103 | function getCurrentUri(): Uri | undefined 104 | { 105 | const input = window.tabGroups.activeTabGroup.activeTab?.input ?? {}; 106 | const { uri } = input as any; 107 | 108 | return uri; 109 | } 110 | -------------------------------------------------------------------------------- /src/table-row.ts: -------------------------------------------------------------------------------- 1 | import { html, HtmlString } from "./html"; 2 | 3 | export abstract class TableRow 4 | { 5 | abstract toHTML(): HtmlString; 6 | } 7 | export class PropertyRow extends TableRow 8 | { 9 | constructor(public key: string, public value: any, private indent = 0) 10 | { 11 | super(); 12 | } 13 | 14 | toHTML() 15 | { 16 | return html` 17 | ${this.key} 18 | ${this.value} 19 | ` 20 | } 21 | } 22 | export class GroupRow extends TableRow 23 | { 24 | constructor(public label: string) 25 | { 26 | super(); 27 | } 28 | 29 | toHTML() 30 | { 31 | return html` 32 | ${this.label} 33 | `; 34 | } 35 | } 36 | 37 | export class SubGroupRow extends TableRow 38 | { 39 | constructor(public label: string, private indent = 0) 40 | { 41 | super(); 42 | } 43 | 44 | toHTML() 45 | { 46 | return html` 47 | 48 | ${this.label} 49 | 50 | `; 51 | } 52 | } -------------------------------------------------------------------------------- /src/test/extension.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from 'assert'; 2 | import * as vscode from 'vscode'; 3 | import { viewProperties } from '../command-names'; 4 | import { provideViewHtml } from '../properties-view-provider'; 5 | // TODO: currently inlined (https://github.com/vitejs/vite/issues/3295) 6 | import file100 from "./test-file-100.txt?url"; 7 | import file999 from "./test-file-999.txt?url"; 8 | import file1000 from "./test-file-1000.txt?url"; 9 | 10 | suite('Extension Tests', () => 11 | { 12 | test("Execute command without error", async () => 13 | { 14 | await vscode.window.showTextDocument(vscode.Uri.parse(file100)); 15 | await vscode.commands.executeCommand(viewProperties); 16 | }); 17 | 18 | test("Check HTML size strings.", async () => 19 | { 20 | const render = (path: string) => 21 | provideViewHtml('command', vscode.Uri.parse(path)); 22 | 23 | const html1 = await render(file100); 24 | assert.equal(html1.indexOf(">100 B<") > 0, true, `'100 B' string not found in HTML.\n${html1}`); 25 | 26 | const html2 = await render(file999); 27 | assert.equal(html2.indexOf(">999 B<") > 0, true, `'999 B' string not found in HTML.\n${html2}`); 28 | 29 | const html3 = await render(file1000); 30 | assert.equal(html3.indexOf(">1000 B<") > 0, false, `Cell should contain more than the raw byte count.\n${html3}`); 31 | assert.equal(html3.indexOf("(1000 B)") > 0, true, `Raw byte count not found.\n${html3}`); 32 | assert.equal(html3.indexOf("1 kB") > 0, true, `Converted byte count not found.\n${html3}`); 33 | }); 34 | 35 | // TODO: test date formatting configuration 36 | }); 37 | -------------------------------------------------------------------------------- /src/test/index.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import { runTests } from '@vscode/test-electron'; 3 | 4 | async function go() 5 | { 6 | try 7 | { 8 | const extensionDevelopmentPath = path.resolve(__dirname, '../../'); 9 | const extensionTestsPath = path.resolve(__dirname, './extension.test'); 10 | 11 | await runTests({ 12 | extensionDevelopmentPath, 13 | extensionTestsPath, 14 | }); 15 | } 16 | catch (e) 17 | { 18 | console.error('Tests failed.', e); 19 | process.exit(0); 20 | } 21 | } 22 | 23 | go(); -------------------------------------------------------------------------------- /src/test/test-file-100.txt: -------------------------------------------------------------------------------- 1 | 123456789 2 | 123456789 3 | 123456789 4 | 123456789 5 | 123456789 6 | 123456789 7 | 123456789 8 | 123456789 9 | 123456789 10 | 123456789 11 | -------------------------------------------------------------------------------- /src/test/test-file-1000.txt: -------------------------------------------------------------------------------- 1 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 2 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 3 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 4 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 5 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 6 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 7 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 8 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 9 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 10 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456780. -------------------------------------------------------------------------------- /src/test/test-file-999.txt: -------------------------------------------------------------------------------- 1 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 2 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 3 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 4 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 5 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 6 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 7 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 8 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 9 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 10 | 123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456780 -------------------------------------------------------------------------------- /src/test/url.d.ts: -------------------------------------------------------------------------------- 1 | declare module "*?url" { 2 | const value: string; 3 | 4 | export default value; 5 | } 6 | -------------------------------------------------------------------------------- /src/util.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Promise-based timeout function. 3 | * @param ms Timeout in milliseconds. 4 | */ 5 | export function delay(ms: number): Promise 6 | { 7 | return new Promise(res => setTimeout(res, ms)); 8 | } -------------------------------------------------------------------------------- /styles/default.css: -------------------------------------------------------------------------------- 1 | :root 2 | { 3 | --border-color: color-mix(in srgb, currentColor 20%, transparent); 4 | --border: 1px solid var(--border-color); 5 | --hover-background: color-mix(in srgb, currentColor 5%, transparent); 6 | } 7 | :root[data-view=static] 8 | { 9 | --border: none; 10 | } 11 | 12 | [data-view=static] body 13 | { 14 | margin: 0; 15 | padding: 0; 16 | color: var(--vscode-sideBar-foreground, var(--vscode-editor-foreground)); 17 | } 18 | [data-view=static] table 19 | { 20 | box-sizing: border-box; 21 | width: 100%; 22 | } 23 | 24 | table 25 | { 26 | border-spacing: 0; 27 | } 28 | th 29 | { 30 | font-size: bigger; 31 | font-weight: bolder; 32 | } 33 | th, td 34 | { 35 | padding: 8px; 36 | border-top: var(--border); 37 | } 38 | [data-view=static] th, 39 | [data-view=static] td 40 | { 41 | padding: 4px 8px; 42 | } 43 | tr:last-child th, 44 | tr:last-child td 45 | { 46 | border-bottom: var(--border); 47 | } 48 | 49 | tbody tr:hover td 50 | { 51 | background: var(--hover-background); 52 | } 53 | 54 | .column-header-cell 55 | { 56 | text-align: left; 57 | border-top: none; 58 | } 59 | [data-view=static] .column-header-cell 60 | { 61 | background: var(--vscode-sideBar-background, none); 62 | position: sticky; 63 | top: 0; 64 | } 65 | .group-row 66 | { 67 | text-align: center; 68 | } 69 | .sub-group-row 70 | { 71 | font-variant: small-caps; 72 | } 73 | 74 | td.indent-1 75 | { 76 | padding-left: 20px; 77 | } 78 | td.indent-2 79 | { 80 | padding-left: 40px; 81 | } 82 | td.indent-3 83 | { 84 | padding-left: 60px; 85 | } 86 | 87 | .icon-button 88 | { 89 | padding: 3px 5px; 90 | color: inherit; 91 | border: 1px solid transparent; 92 | background: none; 93 | cursor: pointer; 94 | transition: border ease-in-out 0.1s; 95 | } 96 | .icon-button:hover, 97 | .icon-button:focus 98 | { 99 | border-color: currentColor; 100 | } 101 | .icon-button > svg 102 | { 103 | display: inline-block; 104 | vertical-align: middle; 105 | height: 1em; 106 | width: 1em; 107 | } 108 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "NodeNext", 4 | "moduleResolution": "node", 5 | "target": "ES2019", 6 | "outDir": "out", 7 | "lib": [ 8 | "es2019" 9 | ], 10 | "sourceMap": true, 11 | "rootDir": "src", 12 | "strict": true, 13 | "noFallthroughCasesInSwitch": true, 14 | "experimentalDecorators": true, 15 | }, 16 | "exclude": [ 17 | "node_modules", 18 | ".vscode-test" 19 | ] 20 | } 21 | -------------------------------------------------------------------------------- /vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite'; 2 | 3 | export default defineConfig({ 4 | build: { 5 | lib: { 6 | entry: { 7 | 'extension': 'src/extension.ts', 8 | 'extension.test': 'src/test/extension.test.ts', 9 | }, 10 | name: 'extension', 11 | formats: ['cjs'], 12 | }, 13 | minify: true, 14 | rollupOptions: { 15 | output: { 16 | dir: 'out', 17 | }, 18 | external: [ 19 | 'vscode', 20 | 'fs', 21 | 'path', 22 | 'os', 23 | 'util', 24 | 'child_process', 25 | 'events', 26 | 'timers', 27 | 'stream', 28 | 'buffer', 29 | 'assert', 30 | 'mocha', 31 | ], 32 | }, 33 | }, 34 | }); 35 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@bcoe/v8-coverage@^0.2.3": 6 | version "0.2.3" 7 | resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" 8 | integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== 9 | 10 | "@esbuild/aix-ppc64@0.19.12": 11 | version "0.19.12" 12 | resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz#d1bc06aedb6936b3b6d313bf809a5a40387d2b7f" 13 | integrity sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA== 14 | 15 | "@esbuild/android-arm64@0.19.12": 16 | version "0.19.12" 17 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz#7ad65a36cfdb7e0d429c353e00f680d737c2aed4" 18 | integrity sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA== 19 | 20 | "@esbuild/android-arm@0.19.12": 21 | version "0.19.12" 22 | resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.19.12.tgz#b0c26536f37776162ca8bde25e42040c203f2824" 23 | integrity sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w== 24 | 25 | "@esbuild/android-x64@0.19.12": 26 | version "0.19.12" 27 | resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.19.12.tgz#cb13e2211282012194d89bf3bfe7721273473b3d" 28 | integrity sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew== 29 | 30 | "@esbuild/darwin-arm64@0.19.12": 31 | version "0.19.12" 32 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz#cbee41e988020d4b516e9d9e44dd29200996275e" 33 | integrity sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g== 34 | 35 | "@esbuild/darwin-x64@0.19.12": 36 | version "0.19.12" 37 | resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz#e37d9633246d52aecf491ee916ece709f9d5f4cd" 38 | integrity sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A== 39 | 40 | "@esbuild/freebsd-arm64@0.19.12": 41 | version "0.19.12" 42 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz#1ee4d8b682ed363b08af74d1ea2b2b4dbba76487" 43 | integrity sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA== 44 | 45 | "@esbuild/freebsd-x64@0.19.12": 46 | version "0.19.12" 47 | resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz#37a693553d42ff77cd7126764b535fb6cc28a11c" 48 | integrity sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg== 49 | 50 | "@esbuild/linux-arm64@0.19.12": 51 | version "0.19.12" 52 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz#be9b145985ec6c57470e0e051d887b09dddb2d4b" 53 | integrity sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA== 54 | 55 | "@esbuild/linux-arm@0.19.12": 56 | version "0.19.12" 57 | resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz#207ecd982a8db95f7b5279207d0ff2331acf5eef" 58 | integrity sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w== 59 | 60 | "@esbuild/linux-ia32@0.19.12": 61 | version "0.19.12" 62 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz#d0d86b5ca1562523dc284a6723293a52d5860601" 63 | integrity sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA== 64 | 65 | "@esbuild/linux-loong64@0.19.12": 66 | version "0.19.12" 67 | resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz#9a37f87fec4b8408e682b528391fa22afd952299" 68 | integrity sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA== 69 | 70 | "@esbuild/linux-mips64el@0.19.12": 71 | version "0.19.12" 72 | resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz#4ddebd4e6eeba20b509d8e74c8e30d8ace0b89ec" 73 | integrity sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w== 74 | 75 | "@esbuild/linux-ppc64@0.19.12": 76 | version "0.19.12" 77 | resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz#adb67dadb73656849f63cd522f5ecb351dd8dee8" 78 | integrity sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg== 79 | 80 | "@esbuild/linux-riscv64@0.19.12": 81 | version "0.19.12" 82 | resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz#11bc0698bf0a2abf8727f1c7ace2112612c15adf" 83 | integrity sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg== 84 | 85 | "@esbuild/linux-s390x@0.19.12": 86 | version "0.19.12" 87 | resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz#e86fb8ffba7c5c92ba91fc3b27ed5a70196c3cc8" 88 | integrity sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg== 89 | 90 | "@esbuild/linux-x64@0.19.12": 91 | version "0.19.12" 92 | resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz#5f37cfdc705aea687dfe5dfbec086a05acfe9c78" 93 | integrity sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg== 94 | 95 | "@esbuild/netbsd-x64@0.19.12": 96 | version "0.19.12" 97 | resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz#29da566a75324e0d0dd7e47519ba2f7ef168657b" 98 | integrity sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA== 99 | 100 | "@esbuild/openbsd-x64@0.19.12": 101 | version "0.19.12" 102 | resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz#306c0acbdb5a99c95be98bdd1d47c916e7dc3ff0" 103 | integrity sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw== 104 | 105 | "@esbuild/sunos-x64@0.19.12": 106 | version "0.19.12" 107 | resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz#0933eaab9af8b9b2c930236f62aae3fc593faf30" 108 | integrity sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA== 109 | 110 | "@esbuild/win32-arm64@0.19.12": 111 | version "0.19.12" 112 | resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz#773bdbaa1971b36db2f6560088639ccd1e6773ae" 113 | integrity sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A== 114 | 115 | "@esbuild/win32-ia32@0.19.12": 116 | version "0.19.12" 117 | resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz#000516cad06354cc84a73f0943a4aa690ef6fd67" 118 | integrity sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ== 119 | 120 | "@esbuild/win32-x64@0.19.12": 121 | version "0.19.12" 122 | resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz#c57c8afbb4054a3ab8317591a0b7320360b444ae" 123 | integrity sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA== 124 | 125 | "@isaacs/cliui@^8.0.2": 126 | version "8.0.2" 127 | resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" 128 | integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== 129 | dependencies: 130 | string-width "^5.1.2" 131 | string-width-cjs "npm:string-width@^4.2.0" 132 | strip-ansi "^7.0.1" 133 | strip-ansi-cjs "npm:strip-ansi@^6.0.1" 134 | wrap-ansi "^8.1.0" 135 | wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" 136 | 137 | "@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": 138 | version "0.1.3" 139 | resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" 140 | integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== 141 | 142 | "@jridgewell/resolve-uri@^3.1.0": 143 | version "3.1.2" 144 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" 145 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 146 | 147 | "@jridgewell/sourcemap-codec@^1.4.14": 148 | version "1.4.15" 149 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 150 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 151 | 152 | "@jridgewell/trace-mapping@^0.3.12": 153 | version "0.3.25" 154 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" 155 | integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== 156 | dependencies: 157 | "@jridgewell/resolve-uri" "^3.1.0" 158 | "@jridgewell/sourcemap-codec" "^1.4.14" 159 | 160 | "@pkgjs/parseargs@^0.11.0": 161 | version "0.11.0" 162 | resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" 163 | integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== 164 | 165 | "@rollup/rollup-android-arm-eabi@4.13.0": 166 | version "4.13.0" 167 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.13.0.tgz#b98786c1304b4ff8db3a873180b778649b5dff2b" 168 | integrity sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg== 169 | 170 | "@rollup/rollup-android-arm64@4.13.0": 171 | version "4.13.0" 172 | resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.13.0.tgz#8833679af11172b1bf1ab7cb3bad84df4caf0c9e" 173 | integrity sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q== 174 | 175 | "@rollup/rollup-darwin-arm64@4.13.0": 176 | version "4.13.0" 177 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.13.0.tgz#ef02d73e0a95d406e0eb4fd61a53d5d17775659b" 178 | integrity sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g== 179 | 180 | "@rollup/rollup-darwin-x64@4.13.0": 181 | version "4.13.0" 182 | resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.13.0.tgz#3ce5b9bcf92b3341a5c1c58a3e6bcce0ea9e7455" 183 | integrity sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg== 184 | 185 | "@rollup/rollup-linux-arm-gnueabihf@4.13.0": 186 | version "4.13.0" 187 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.13.0.tgz#3d3d2c018bdd8e037c6bfedd52acfff1c97e4be4" 188 | integrity sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ== 189 | 190 | "@rollup/rollup-linux-arm64-gnu@4.13.0": 191 | version "4.13.0" 192 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.13.0.tgz#5fc8cc978ff396eaa136d7bfe05b5b9138064143" 193 | integrity sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w== 194 | 195 | "@rollup/rollup-linux-arm64-musl@4.13.0": 196 | version "4.13.0" 197 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.13.0.tgz#f2ae7d7bed416ffa26d6b948ac5772b520700eef" 198 | integrity sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw== 199 | 200 | "@rollup/rollup-linux-riscv64-gnu@4.13.0": 201 | version "4.13.0" 202 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.13.0.tgz#303d57a328ee9a50c85385936f31cf62306d30b6" 203 | integrity sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA== 204 | 205 | "@rollup/rollup-linux-x64-gnu@4.13.0": 206 | version "4.13.0" 207 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.13.0.tgz#f672f6508f090fc73f08ba40ff76c20b57424778" 208 | integrity sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA== 209 | 210 | "@rollup/rollup-linux-x64-musl@4.13.0": 211 | version "4.13.0" 212 | resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.13.0.tgz#d2f34b1b157f3e7f13925bca3288192a66755a89" 213 | integrity sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw== 214 | 215 | "@rollup/rollup-win32-arm64-msvc@4.13.0": 216 | version "4.13.0" 217 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.13.0.tgz#8ffecc980ae4d9899eb2f9c4ae471a8d58d2da6b" 218 | integrity sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA== 219 | 220 | "@rollup/rollup-win32-ia32-msvc@4.13.0": 221 | version "4.13.0" 222 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.13.0.tgz#a7505884f415662e088365b9218b2b03a88fc6f2" 223 | integrity sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw== 224 | 225 | "@rollup/rollup-win32-x64-msvc@4.13.0": 226 | version "4.13.0" 227 | resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.13.0.tgz#6abd79db7ff8d01a58865ba20a63cfd23d9e2a10" 228 | integrity sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw== 229 | 230 | "@tootallnate/once@1": 231 | version "1.1.2" 232 | resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" 233 | integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== 234 | 235 | "@trysound/sax@0.2.0": 236 | version "0.2.0" 237 | resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" 238 | integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== 239 | 240 | "@types/dateformat@^5.0.2": 241 | version "5.0.2" 242 | resolved "https://registry.yarnpkg.com/@types/dateformat/-/dateformat-5.0.2.tgz#876f06431ce6f411dbaca3f81d95a8784c9ab82a" 243 | integrity sha512-M95hNBMa/hnwErH+a+VOD/sYgTmo15OTYTM2Hr52/e0OdOuY+Crag+kd3/ioZrhg0WGbl9Sm3hR7UU+MH6rfOw== 244 | 245 | "@types/estree@1.0.5": 246 | version "1.0.5" 247 | resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" 248 | integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== 249 | 250 | "@types/istanbul-lib-coverage@^2.0.1": 251 | version "2.0.6" 252 | resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" 253 | integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== 254 | 255 | "@types/mime@^3.0.4": 256 | version "3.0.4" 257 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.4.tgz#2198ac274de6017b44d941e00261d5bc6a0e0a45" 258 | integrity sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw== 259 | 260 | "@types/mocha@^10.0.2": 261 | version "10.0.6" 262 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.6.tgz#818551d39113081048bdddbef96701b4e8bb9d1b" 263 | integrity sha512-dJvrYWxP/UcXm36Qn36fxhUKu8A/xMRXVT2cliFF1Z7UA9liG5Psj3ezNSZw+5puH2czDXRLcXQxf8JbJt0ejg== 264 | 265 | "@types/mocha@^9.1.0": 266 | version "9.1.1" 267 | resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-9.1.1.tgz#e7c4f1001eefa4b8afbd1eee27a237fee3bf29c4" 268 | integrity sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw== 269 | 270 | "@types/node@*": 271 | version "20.11.27" 272 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.27.tgz#debe5cfc8a507dd60fe2a3b4875b1604f215c2ac" 273 | integrity sha512-qyUZfMnCg1KEz57r7pzFtSGt49f6RPkPBis3Vo4PbS7roQEDn22hiHzl/Lo1q4i4hDEgBJmBF/NTNg2XR0HbFg== 274 | dependencies: 275 | undici-types "~5.26.4" 276 | 277 | "@types/node@^18": 278 | version "18.19.24" 279 | resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.24.tgz#707d8a4907e55901466e60e8f7a62bc6197ace95" 280 | integrity sha512-eghAz3gnbQbvnHqB+mgB2ZR3aH6RhdEmHGS48BnV75KceQPHqabkxKI0BbUSsqhqy2Ddhc2xD/VAR9ySZd57Lw== 281 | dependencies: 282 | undici-types "~5.26.4" 283 | 284 | "@types/vscode@^1.75.0": 285 | version "1.87.0" 286 | resolved "https://registry.yarnpkg.com/@types/vscode/-/vscode-1.87.0.tgz#ee9b163f3d2115fb0b20619b34dd3abc5a923361" 287 | integrity sha512-y3yYJV2esWr8LNjp3VNbSMWG7Y43jC8pCldG8YwiHGAQbsymkkMMt0aDT1xZIOFM2eFcNiUc+dJMx1+Z0UT8fg== 288 | 289 | "@types/xml2js@^0.4.2": 290 | version "0.4.14" 291 | resolved "https://registry.yarnpkg.com/@types/xml2js/-/xml2js-0.4.14.tgz#5d462a2a7330345e2309c6b549a183a376de8f9a" 292 | integrity sha512-4YnrRemBShWRO2QjvUin8ESA41rH+9nQGLUGZV/1IDhi3SL9OhdpNC/MrulTWuptXKwhx/aDxE7toV0f/ypIXQ== 293 | dependencies: 294 | "@types/node" "*" 295 | 296 | "@vscode/test-cli@^0.0.8": 297 | version "0.0.8" 298 | resolved "https://registry.yarnpkg.com/@vscode/test-cli/-/test-cli-0.0.8.tgz#34ab78c74bd62fba142fda0ccc1ff2e7b20e41b0" 299 | integrity sha512-sBSMSDzJChiiDjmys2Q6uI4SIoUYf0t6oDsQO3ypaQ7udha9YD4e2On9e9VE5OBayZMpxbgJX+NudmCwJMdOIg== 300 | dependencies: 301 | "@types/mocha" "^10.0.2" 302 | c8 "^9.1.0" 303 | chokidar "^3.5.3" 304 | enhanced-resolve "^5.15.0" 305 | glob "^10.3.10" 306 | minimatch "^9.0.3" 307 | mocha "^10.2.0" 308 | supports-color "^9.4.0" 309 | yargs "^17.7.2" 310 | 311 | "@vscode/test-electron@^2.3.9": 312 | version "2.3.9" 313 | resolved "https://registry.yarnpkg.com/@vscode/test-electron/-/test-electron-2.3.9.tgz#f61181392634b408411e4302aef6e1cd2dd41474" 314 | integrity sha512-z3eiChaCQXMqBnk2aHHSEkobmC2VRalFQN0ApOAtydL172zXGxTwGrRtviT5HnUB+Q+G3vtEYFtuQkYqBzYgMA== 315 | dependencies: 316 | http-proxy-agent "^4.0.1" 317 | https-proxy-agent "^5.0.0" 318 | jszip "^3.10.1" 319 | semver "^7.5.2" 320 | 321 | agent-base@6: 322 | version "6.0.2" 323 | resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" 324 | integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== 325 | dependencies: 326 | debug "4" 327 | 328 | ansi-colors@4.1.1: 329 | version "4.1.1" 330 | resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" 331 | integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== 332 | 333 | ansi-regex@^5.0.1: 334 | version "5.0.1" 335 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 336 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 337 | 338 | ansi-regex@^6.0.1: 339 | version "6.0.1" 340 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a" 341 | integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== 342 | 343 | ansi-styles@^4.0.0, ansi-styles@^4.1.0: 344 | version "4.3.0" 345 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 346 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 347 | dependencies: 348 | color-convert "^2.0.1" 349 | 350 | ansi-styles@^6.1.0: 351 | version "6.2.1" 352 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.1.tgz#0e62320cf99c21afff3b3012192546aacbfb05c5" 353 | integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== 354 | 355 | anymatch@~3.1.2: 356 | version "3.1.2" 357 | resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" 358 | integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== 359 | dependencies: 360 | normalize-path "^3.0.0" 361 | picomatch "^2.0.4" 362 | 363 | argparse@^2.0.1: 364 | version "2.0.1" 365 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" 366 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 367 | 368 | balanced-match@^1.0.0: 369 | version "1.0.2" 370 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" 371 | integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== 372 | 373 | binary-extensions@^2.0.0: 374 | version "2.2.0" 375 | resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d" 376 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 377 | 378 | boolbase@^1.0.0: 379 | version "1.0.0" 380 | resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" 381 | integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24= 382 | 383 | brace-expansion@^1.1.7: 384 | version "1.1.11" 385 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 386 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 387 | dependencies: 388 | balanced-match "^1.0.0" 389 | concat-map "0.0.1" 390 | 391 | brace-expansion@^2.0.1: 392 | version "2.0.1" 393 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" 394 | integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== 395 | dependencies: 396 | balanced-match "^1.0.0" 397 | 398 | braces@~3.0.2: 399 | version "3.0.2" 400 | resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" 401 | integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== 402 | dependencies: 403 | fill-range "^7.0.1" 404 | 405 | browser-stdout@1.3.1: 406 | version "1.3.1" 407 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 408 | integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== 409 | 410 | c8@^9.1.0: 411 | version "9.1.0" 412 | resolved "https://registry.yarnpkg.com/c8/-/c8-9.1.0.tgz#0e57ba3ab9e5960ab1d650b4a86f71e53cb68112" 413 | integrity sha512-mBWcT5iqNir1zIkzSPyI3NCR9EZCVI3WUD+AVO17MVWTSFNyUueXE82qTeampNtTr+ilN/5Ua3j24LgbCKjDVg== 414 | dependencies: 415 | "@bcoe/v8-coverage" "^0.2.3" 416 | "@istanbuljs/schema" "^0.1.3" 417 | find-up "^5.0.0" 418 | foreground-child "^3.1.1" 419 | istanbul-lib-coverage "^3.2.0" 420 | istanbul-lib-report "^3.0.1" 421 | istanbul-reports "^3.1.6" 422 | test-exclude "^6.0.0" 423 | v8-to-istanbul "^9.0.0" 424 | yargs "^17.7.2" 425 | yargs-parser "^21.1.1" 426 | 427 | camelcase@^6.0.0: 428 | version "6.3.0" 429 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 430 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 431 | 432 | chalk@^4.1.0: 433 | version "4.1.2" 434 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" 435 | integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== 436 | dependencies: 437 | ansi-styles "^4.1.0" 438 | supports-color "^7.1.0" 439 | 440 | chokidar@3.5.3: 441 | version "3.5.3" 442 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" 443 | integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== 444 | dependencies: 445 | anymatch "~3.1.2" 446 | braces "~3.0.2" 447 | glob-parent "~5.1.2" 448 | is-binary-path "~2.1.0" 449 | is-glob "~4.0.1" 450 | normalize-path "~3.0.0" 451 | readdirp "~3.6.0" 452 | optionalDependencies: 453 | fsevents "~2.3.2" 454 | 455 | chokidar@^3.5.3: 456 | version "3.6.0" 457 | resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" 458 | integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== 459 | dependencies: 460 | anymatch "~3.1.2" 461 | braces "~3.0.2" 462 | glob-parent "~5.1.2" 463 | is-binary-path "~2.1.0" 464 | is-glob "~4.0.1" 465 | normalize-path "~3.0.0" 466 | readdirp "~3.6.0" 467 | optionalDependencies: 468 | fsevents "~2.3.2" 469 | 470 | cliui@^7.0.2: 471 | version "7.0.4" 472 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" 473 | integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== 474 | dependencies: 475 | string-width "^4.2.0" 476 | strip-ansi "^6.0.0" 477 | wrap-ansi "^7.0.0" 478 | 479 | cliui@^8.0.1: 480 | version "8.0.1" 481 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" 482 | integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== 483 | dependencies: 484 | string-width "^4.2.0" 485 | strip-ansi "^6.0.1" 486 | wrap-ansi "^7.0.0" 487 | 488 | color-convert@^2.0.1: 489 | version "2.0.1" 490 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 491 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 492 | dependencies: 493 | color-name "~1.1.4" 494 | 495 | color-name@~1.1.4: 496 | version "1.1.4" 497 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 498 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 499 | 500 | commander@^7.2.0: 501 | version "7.2.0" 502 | resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" 503 | integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== 504 | 505 | concat-map@0.0.1: 506 | version "0.0.1" 507 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 508 | integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== 509 | 510 | convert-source-map@^2.0.0: 511 | version "2.0.0" 512 | resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" 513 | integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== 514 | 515 | core-util-is@~1.0.0: 516 | version "1.0.3" 517 | resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85" 518 | integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== 519 | 520 | cross-spawn@^7.0.0: 521 | version "7.0.3" 522 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" 523 | integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== 524 | dependencies: 525 | path-key "^3.1.0" 526 | shebang-command "^2.0.0" 527 | which "^2.0.1" 528 | 529 | css-select@^4.1.3: 530 | version "4.2.1" 531 | resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.2.1.tgz#9e665d6ae4c7f9d65dbe69d0316e3221fb274cdd" 532 | integrity sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ== 533 | dependencies: 534 | boolbase "^1.0.0" 535 | css-what "^5.1.0" 536 | domhandler "^4.3.0" 537 | domutils "^2.8.0" 538 | nth-check "^2.0.1" 539 | 540 | css-tree@^1.1.2, css-tree@^1.1.3: 541 | version "1.1.3" 542 | resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" 543 | integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== 544 | dependencies: 545 | mdn-data "2.0.14" 546 | source-map "^0.6.1" 547 | 548 | css-what@^5.1.0: 549 | version "5.1.0" 550 | resolved "https://registry.yarnpkg.com/css-what/-/css-what-5.1.0.tgz#3f7b707aadf633baf62c2ceb8579b545bb40f7fe" 551 | integrity sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw== 552 | 553 | csso@^4.2.0: 554 | version "4.2.0" 555 | resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529" 556 | integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== 557 | dependencies: 558 | css-tree "^1.1.2" 559 | 560 | dateformat@5.0.3: 561 | version "5.0.3" 562 | resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-5.0.3.tgz#fe2223eff3cc70ce716931cb3038b59a9280696e" 563 | integrity sha512-Kvr6HmPXUMerlLcLF+Pwq3K7apHpYmGDVqrxcDasBg86UcKeTSNWbEzU8bwdXnxnR44FtMhJAxI4Bov6Y/KUfA== 564 | 565 | debug@4, debug@4.3.4: 566 | version "4.3.4" 567 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" 568 | integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== 569 | dependencies: 570 | ms "2.1.2" 571 | 572 | decamelize@^4.0.0: 573 | version "4.0.0" 574 | resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" 575 | integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== 576 | 577 | diff@5.0.0: 578 | version "5.0.0" 579 | resolved "https://registry.yarnpkg.com/diff/-/diff-5.0.0.tgz#7ed6ad76d859d030787ec35855f5b1daf31d852b" 580 | integrity sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w== 581 | 582 | dom-serializer@^1.0.1: 583 | version "1.3.2" 584 | resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.3.2.tgz#6206437d32ceefaec7161803230c7a20bc1b4d91" 585 | integrity sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig== 586 | dependencies: 587 | domelementtype "^2.0.1" 588 | domhandler "^4.2.0" 589 | entities "^2.0.0" 590 | 591 | domelementtype@^2.0.1, domelementtype@^2.2.0: 592 | version "2.2.0" 593 | resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" 594 | integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== 595 | 596 | domhandler@^4.2.0, domhandler@^4.3.0: 597 | version "4.3.0" 598 | resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.0.tgz#16c658c626cf966967e306f966b431f77d4a5626" 599 | integrity sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g== 600 | dependencies: 601 | domelementtype "^2.2.0" 602 | 603 | domutils@^2.8.0: 604 | version "2.8.0" 605 | resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" 606 | integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== 607 | dependencies: 608 | dom-serializer "^1.0.1" 609 | domelementtype "^2.2.0" 610 | domhandler "^4.2.0" 611 | 612 | eastasianwidth@^0.2.0: 613 | version "0.2.0" 614 | resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" 615 | integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== 616 | 617 | emoji-regex@^8.0.0: 618 | version "8.0.0" 619 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 620 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 621 | 622 | emoji-regex@^9.2.2: 623 | version "9.2.2" 624 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" 625 | integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== 626 | 627 | enhanced-resolve@^5.15.0: 628 | version "5.16.0" 629 | resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.16.0.tgz#65ec88778083056cb32487faa9aef82ed0864787" 630 | integrity sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA== 631 | dependencies: 632 | graceful-fs "^4.2.4" 633 | tapable "^2.2.0" 634 | 635 | entities@^2.0.0: 636 | version "2.2.0" 637 | resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" 638 | integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== 639 | 640 | esbuild@^0.19.3: 641 | version "0.19.12" 642 | resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.19.12.tgz#dc82ee5dc79e82f5a5c3b4323a2a641827db3e04" 643 | integrity sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg== 644 | optionalDependencies: 645 | "@esbuild/aix-ppc64" "0.19.12" 646 | "@esbuild/android-arm" "0.19.12" 647 | "@esbuild/android-arm64" "0.19.12" 648 | "@esbuild/android-x64" "0.19.12" 649 | "@esbuild/darwin-arm64" "0.19.12" 650 | "@esbuild/darwin-x64" "0.19.12" 651 | "@esbuild/freebsd-arm64" "0.19.12" 652 | "@esbuild/freebsd-x64" "0.19.12" 653 | "@esbuild/linux-arm" "0.19.12" 654 | "@esbuild/linux-arm64" "0.19.12" 655 | "@esbuild/linux-ia32" "0.19.12" 656 | "@esbuild/linux-loong64" "0.19.12" 657 | "@esbuild/linux-mips64el" "0.19.12" 658 | "@esbuild/linux-ppc64" "0.19.12" 659 | "@esbuild/linux-riscv64" "0.19.12" 660 | "@esbuild/linux-s390x" "0.19.12" 661 | "@esbuild/linux-x64" "0.19.12" 662 | "@esbuild/netbsd-x64" "0.19.12" 663 | "@esbuild/openbsd-x64" "0.19.12" 664 | "@esbuild/sunos-x64" "0.19.12" 665 | "@esbuild/win32-arm64" "0.19.12" 666 | "@esbuild/win32-ia32" "0.19.12" 667 | "@esbuild/win32-x64" "0.19.12" 668 | 669 | escalade@^3.1.1: 670 | version "3.1.1" 671 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" 672 | integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== 673 | 674 | escape-string-regexp@4.0.0: 675 | version "4.0.0" 676 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" 677 | integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== 678 | 679 | fill-range@^7.0.1: 680 | version "7.0.1" 681 | resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" 682 | integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== 683 | dependencies: 684 | to-regex-range "^5.0.1" 685 | 686 | find-up@5.0.0, find-up@^5.0.0: 687 | version "5.0.0" 688 | resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" 689 | integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== 690 | dependencies: 691 | locate-path "^6.0.0" 692 | path-exists "^4.0.0" 693 | 694 | flat@^5.0.2: 695 | version "5.0.2" 696 | resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" 697 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 698 | 699 | foreground-child@^3.1.0, foreground-child@^3.1.1: 700 | version "3.1.1" 701 | resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.1.1.tgz#1d173e776d75d2772fed08efe4a0de1ea1b12d0d" 702 | integrity sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== 703 | dependencies: 704 | cross-spawn "^7.0.0" 705 | signal-exit "^4.0.1" 706 | 707 | fs.realpath@^1.0.0: 708 | version "1.0.0" 709 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 710 | integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== 711 | 712 | fsevents@~2.3.2: 713 | version "2.3.2" 714 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" 715 | integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== 716 | 717 | fsevents@~2.3.3: 718 | version "2.3.3" 719 | resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" 720 | integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== 721 | 722 | get-caller-file@^2.0.5: 723 | version "2.0.5" 724 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 725 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 726 | 727 | glob-parent@~5.1.2: 728 | version "5.1.2" 729 | resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" 730 | integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== 731 | dependencies: 732 | is-glob "^4.0.1" 733 | 734 | glob@8.1.0: 735 | version "8.1.0" 736 | resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" 737 | integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== 738 | dependencies: 739 | fs.realpath "^1.0.0" 740 | inflight "^1.0.4" 741 | inherits "2" 742 | minimatch "^5.0.1" 743 | once "^1.3.0" 744 | 745 | glob@^10.3.10: 746 | version "10.3.10" 747 | resolved "https://registry.yarnpkg.com/glob/-/glob-10.3.10.tgz#0351ebb809fd187fe421ab96af83d3a70715df4b" 748 | integrity sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g== 749 | dependencies: 750 | foreground-child "^3.1.0" 751 | jackspeak "^2.3.5" 752 | minimatch "^9.0.1" 753 | minipass "^5.0.0 || ^6.0.2 || ^7.0.0" 754 | path-scurry "^1.10.1" 755 | 756 | glob@^7.1.4: 757 | version "7.2.3" 758 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" 759 | integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== 760 | dependencies: 761 | fs.realpath "^1.0.0" 762 | inflight "^1.0.4" 763 | inherits "2" 764 | minimatch "^3.1.1" 765 | once "^1.3.0" 766 | path-is-absolute "^1.0.0" 767 | 768 | graceful-fs@^4.2.4: 769 | version "4.2.11" 770 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" 771 | integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== 772 | 773 | has-flag@^4.0.0: 774 | version "4.0.0" 775 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" 776 | integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== 777 | 778 | he@1.2.0: 779 | version "1.2.0" 780 | resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 781 | integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 782 | 783 | html-escaper@^2.0.0: 784 | version "2.0.2" 785 | resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" 786 | integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== 787 | 788 | http-proxy-agent@^4.0.1: 789 | version "4.0.1" 790 | resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" 791 | integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== 792 | dependencies: 793 | "@tootallnate/once" "1" 794 | agent-base "6" 795 | debug "4" 796 | 797 | https-proxy-agent@^5.0.0: 798 | version "5.0.1" 799 | resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" 800 | integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== 801 | dependencies: 802 | agent-base "6" 803 | debug "4" 804 | 805 | immediate@~3.0.5: 806 | version "3.0.6" 807 | resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" 808 | integrity sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ== 809 | 810 | inflight@^1.0.4: 811 | version "1.0.6" 812 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 813 | integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== 814 | dependencies: 815 | once "^1.3.0" 816 | wrappy "1" 817 | 818 | inherits@2, inherits@~2.0.3: 819 | version "2.0.4" 820 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" 821 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 822 | 823 | is-binary-path@~2.1.0: 824 | version "2.1.0" 825 | resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" 826 | integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== 827 | dependencies: 828 | binary-extensions "^2.0.0" 829 | 830 | is-extglob@^2.1.1: 831 | version "2.1.1" 832 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 833 | integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= 834 | 835 | is-fullwidth-code-point@^3.0.0: 836 | version "3.0.0" 837 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 838 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 839 | 840 | is-glob@^4.0.1, is-glob@~4.0.1: 841 | version "4.0.3" 842 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" 843 | integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== 844 | dependencies: 845 | is-extglob "^2.1.1" 846 | 847 | is-number@^7.0.0: 848 | version "7.0.0" 849 | resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" 850 | integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== 851 | 852 | is-plain-obj@^2.1.0: 853 | version "2.1.0" 854 | resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" 855 | integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== 856 | 857 | is-unicode-supported@^0.1.0: 858 | version "0.1.0" 859 | resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" 860 | integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== 861 | 862 | isarray@~1.0.0: 863 | version "1.0.0" 864 | resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" 865 | integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== 866 | 867 | isexe@^2.0.0: 868 | version "2.0.0" 869 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 870 | integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== 871 | 872 | istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: 873 | version "3.2.2" 874 | resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" 875 | integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== 876 | 877 | istanbul-lib-report@^3.0.0, istanbul-lib-report@^3.0.1: 878 | version "3.0.1" 879 | resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" 880 | integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== 881 | dependencies: 882 | istanbul-lib-coverage "^3.0.0" 883 | make-dir "^4.0.0" 884 | supports-color "^7.1.0" 885 | 886 | istanbul-reports@^3.1.6: 887 | version "3.1.7" 888 | resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.7.tgz#daed12b9e1dca518e15c056e1e537e741280fa0b" 889 | integrity sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g== 890 | dependencies: 891 | html-escaper "^2.0.0" 892 | istanbul-lib-report "^3.0.0" 893 | 894 | jackspeak@^2.3.5: 895 | version "2.3.6" 896 | resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-2.3.6.tgz#647ecc472238aee4b06ac0e461acc21a8c505ca8" 897 | integrity sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ== 898 | dependencies: 899 | "@isaacs/cliui" "^8.0.2" 900 | optionalDependencies: 901 | "@pkgjs/parseargs" "^0.11.0" 902 | 903 | js-yaml@4.1.0: 904 | version "4.1.0" 905 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" 906 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 907 | dependencies: 908 | argparse "^2.0.1" 909 | 910 | jszip@^3.10.1: 911 | version "3.10.1" 912 | resolved "https://registry.yarnpkg.com/jszip/-/jszip-3.10.1.tgz#34aee70eb18ea1faec2f589208a157d1feb091c2" 913 | integrity sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g== 914 | dependencies: 915 | lie "~3.3.0" 916 | pako "~1.0.2" 917 | readable-stream "~2.3.6" 918 | setimmediate "^1.0.5" 919 | 920 | lie@~3.3.0: 921 | version "3.3.0" 922 | resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" 923 | integrity sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ== 924 | dependencies: 925 | immediate "~3.0.5" 926 | 927 | locate-path@^6.0.0: 928 | version "6.0.0" 929 | resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" 930 | integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== 931 | dependencies: 932 | p-locate "^5.0.0" 933 | 934 | log-symbols@4.1.0: 935 | version "4.1.0" 936 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" 937 | integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== 938 | dependencies: 939 | chalk "^4.1.0" 940 | is-unicode-supported "^0.1.0" 941 | 942 | lru-cache@^6.0.0: 943 | version "6.0.0" 944 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" 945 | integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== 946 | dependencies: 947 | yallist "^4.0.0" 948 | 949 | "lru-cache@^9.1.1 || ^10.0.0": 950 | version "10.2.0" 951 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" 952 | integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== 953 | 954 | make-dir@^4.0.0: 955 | version "4.0.0" 956 | resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" 957 | integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== 958 | dependencies: 959 | semver "^7.5.3" 960 | 961 | mdn-data@2.0.14: 962 | version "2.0.14" 963 | resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" 964 | integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== 965 | 966 | mime@^4.0.1: 967 | version "4.0.1" 968 | resolved "https://registry.yarnpkg.com/mime/-/mime-4.0.1.tgz#ad7563d1bfe30253ad97dedfae2b1009d01b9470" 969 | integrity sha512-5lZ5tyrIfliMXzFtkYyekWbtRXObT9OWa8IwQ5uxTBDHucNNwniRqo0yInflj+iYi5CBa6qxadGzGarDfuEOxA== 970 | 971 | minimatch@5.0.1: 972 | version "5.0.1" 973 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.0.1.tgz#fb9022f7528125187c92bd9e9b6366be1cf3415b" 974 | integrity sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g== 975 | dependencies: 976 | brace-expansion "^2.0.1" 977 | 978 | minimatch@^3.0.4, minimatch@^3.1.1: 979 | version "3.1.2" 980 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" 981 | integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== 982 | dependencies: 983 | brace-expansion "^1.1.7" 984 | 985 | minimatch@^5.0.1: 986 | version "5.1.6" 987 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" 988 | integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== 989 | dependencies: 990 | brace-expansion "^2.0.1" 991 | 992 | minimatch@^9.0.1, minimatch@^9.0.3: 993 | version "9.0.3" 994 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.3.tgz#a6e00c3de44c3a542bfaae70abfc22420a6da825" 995 | integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== 996 | dependencies: 997 | brace-expansion "^2.0.1" 998 | 999 | "minipass@^5.0.0 || ^6.0.2 || ^7.0.0": 1000 | version "7.0.4" 1001 | resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.0.4.tgz#dbce03740f50a4786ba994c1fb908844d27b038c" 1002 | integrity sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ== 1003 | 1004 | mocha@10.3.0, mocha@^10.2.0: 1005 | version "10.3.0" 1006 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-10.3.0.tgz#0e185c49e6dccf582035c05fa91084a4ff6e3fe9" 1007 | integrity sha512-uF2XJs+7xSLsrmIvn37i/wnc91nw7XjOQB8ccyx5aEgdnohr7n+rEiZP23WkCYHjilR6+EboEnbq/ZQDz4LSbg== 1008 | dependencies: 1009 | ansi-colors "4.1.1" 1010 | browser-stdout "1.3.1" 1011 | chokidar "3.5.3" 1012 | debug "4.3.4" 1013 | diff "5.0.0" 1014 | escape-string-regexp "4.0.0" 1015 | find-up "5.0.0" 1016 | glob "8.1.0" 1017 | he "1.2.0" 1018 | js-yaml "4.1.0" 1019 | log-symbols "4.1.0" 1020 | minimatch "5.0.1" 1021 | ms "2.1.3" 1022 | serialize-javascript "6.0.0" 1023 | strip-json-comments "3.1.1" 1024 | supports-color "8.1.1" 1025 | workerpool "6.2.1" 1026 | yargs "16.2.0" 1027 | yargs-parser "20.2.4" 1028 | yargs-unparser "2.0.0" 1029 | 1030 | ms@2.1.2: 1031 | version "2.1.2" 1032 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" 1033 | integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== 1034 | 1035 | ms@2.1.3: 1036 | version "2.1.3" 1037 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 1038 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 1039 | 1040 | nanoid@^3.3.7: 1041 | version "3.3.7" 1042 | resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.7.tgz#d0c301a691bc8d54efa0a2226ccf3fe2fd656bd8" 1043 | integrity sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g== 1044 | 1045 | normalize-path@^3.0.0, normalize-path@~3.0.0: 1046 | version "3.0.0" 1047 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" 1048 | integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== 1049 | 1050 | nth-check@^2.0.1: 1051 | version "2.0.1" 1052 | resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.0.1.tgz#2efe162f5c3da06a28959fbd3db75dbeea9f0fc2" 1053 | integrity sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w== 1054 | dependencies: 1055 | boolbase "^1.0.0" 1056 | 1057 | once@^1.3.0: 1058 | version "1.4.0" 1059 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 1060 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 1061 | dependencies: 1062 | wrappy "1" 1063 | 1064 | p-limit@^3.0.2: 1065 | version "3.1.0" 1066 | resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" 1067 | integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== 1068 | dependencies: 1069 | yocto-queue "^0.1.0" 1070 | 1071 | p-locate@^5.0.0: 1072 | version "5.0.0" 1073 | resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" 1074 | integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== 1075 | dependencies: 1076 | p-limit "^3.0.2" 1077 | 1078 | pako@~1.0.2: 1079 | version "1.0.11" 1080 | resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf" 1081 | integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw== 1082 | 1083 | path-exists@^4.0.0: 1084 | version "4.0.0" 1085 | resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" 1086 | integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== 1087 | 1088 | path-is-absolute@^1.0.0: 1089 | version "1.0.1" 1090 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 1091 | integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== 1092 | 1093 | path-key@^3.1.0: 1094 | version "3.1.1" 1095 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" 1096 | integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== 1097 | 1098 | path-scurry@^1.10.1: 1099 | version "1.10.1" 1100 | resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.10.1.tgz#9ba6bf5aa8500fe9fd67df4f0d9483b2b0bfc698" 1101 | integrity sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ== 1102 | dependencies: 1103 | lru-cache "^9.1.1 || ^10.0.0" 1104 | minipass "^5.0.0 || ^6.0.2 || ^7.0.0" 1105 | 1106 | picocolors@^1.0.0: 1107 | version "1.0.0" 1108 | resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c" 1109 | integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== 1110 | 1111 | picomatch@^2.0.4, picomatch@^2.2.1: 1112 | version "2.3.1" 1113 | resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" 1114 | integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== 1115 | 1116 | postcss@^8.4.35: 1117 | version "8.4.35" 1118 | resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.35.tgz#60997775689ce09011edf083a549cea44aabe2f7" 1119 | integrity sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA== 1120 | dependencies: 1121 | nanoid "^3.3.7" 1122 | picocolors "^1.0.0" 1123 | source-map-js "^1.0.2" 1124 | 1125 | process-nextick-args@~2.0.0: 1126 | version "2.0.1" 1127 | resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" 1128 | integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== 1129 | 1130 | randombytes@^2.1.0: 1131 | version "2.1.0" 1132 | resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" 1133 | integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== 1134 | dependencies: 1135 | safe-buffer "^5.1.0" 1136 | 1137 | readable-stream@~2.3.6: 1138 | version "2.3.8" 1139 | resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" 1140 | integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== 1141 | dependencies: 1142 | core-util-is "~1.0.0" 1143 | inherits "~2.0.3" 1144 | isarray "~1.0.0" 1145 | process-nextick-args "~2.0.0" 1146 | safe-buffer "~5.1.1" 1147 | string_decoder "~1.1.1" 1148 | util-deprecate "~1.0.1" 1149 | 1150 | readdirp@~3.6.0: 1151 | version "3.6.0" 1152 | resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" 1153 | integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== 1154 | dependencies: 1155 | picomatch "^2.2.1" 1156 | 1157 | require-directory@^2.1.1: 1158 | version "2.1.1" 1159 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 1160 | integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= 1161 | 1162 | rollup@^4.2.0: 1163 | version "4.13.0" 1164 | resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.13.0.tgz#dd2ae144b4cdc2ea25420477f68d4937a721237a" 1165 | integrity sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg== 1166 | dependencies: 1167 | "@types/estree" "1.0.5" 1168 | optionalDependencies: 1169 | "@rollup/rollup-android-arm-eabi" "4.13.0" 1170 | "@rollup/rollup-android-arm64" "4.13.0" 1171 | "@rollup/rollup-darwin-arm64" "4.13.0" 1172 | "@rollup/rollup-darwin-x64" "4.13.0" 1173 | "@rollup/rollup-linux-arm-gnueabihf" "4.13.0" 1174 | "@rollup/rollup-linux-arm64-gnu" "4.13.0" 1175 | "@rollup/rollup-linux-arm64-musl" "4.13.0" 1176 | "@rollup/rollup-linux-riscv64-gnu" "4.13.0" 1177 | "@rollup/rollup-linux-x64-gnu" "4.13.0" 1178 | "@rollup/rollup-linux-x64-musl" "4.13.0" 1179 | "@rollup/rollup-win32-arm64-msvc" "4.13.0" 1180 | "@rollup/rollup-win32-ia32-msvc" "4.13.0" 1181 | "@rollup/rollup-win32-x64-msvc" "4.13.0" 1182 | fsevents "~2.3.2" 1183 | 1184 | safe-buffer@^5.1.0: 1185 | version "5.2.1" 1186 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 1187 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1188 | 1189 | safe-buffer@~5.1.0, safe-buffer@~5.1.1: 1190 | version "5.1.2" 1191 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 1192 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 1193 | 1194 | sax@>=0.6.0: 1195 | version "1.3.0" 1196 | resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" 1197 | integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== 1198 | 1199 | semver@^7.5.2, semver@^7.5.3: 1200 | version "7.6.0" 1201 | resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.0.tgz#1a46a4db4bffcccd97b743b5005c8325f23d4e2d" 1202 | integrity sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg== 1203 | dependencies: 1204 | lru-cache "^6.0.0" 1205 | 1206 | serialize-javascript@6.0.0: 1207 | version "6.0.0" 1208 | resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8" 1209 | integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag== 1210 | dependencies: 1211 | randombytes "^2.1.0" 1212 | 1213 | setimmediate@^1.0.5: 1214 | version "1.0.5" 1215 | resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" 1216 | integrity sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA== 1217 | 1218 | shebang-command@^2.0.0: 1219 | version "2.0.0" 1220 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" 1221 | integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== 1222 | dependencies: 1223 | shebang-regex "^3.0.0" 1224 | 1225 | shebang-regex@^3.0.0: 1226 | version "3.0.0" 1227 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" 1228 | integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== 1229 | 1230 | signal-exit@^4.0.1: 1231 | version "4.1.0" 1232 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" 1233 | integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== 1234 | 1235 | source-map-js@^1.0.2: 1236 | version "1.0.2" 1237 | resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" 1238 | integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== 1239 | 1240 | source-map@^0.6.1: 1241 | version "0.6.1" 1242 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 1243 | integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 1244 | 1245 | stable@^0.1.8: 1246 | version "0.1.8" 1247 | resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf" 1248 | integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== 1249 | 1250 | "string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 1251 | version "4.2.3" 1252 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 1253 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1254 | dependencies: 1255 | emoji-regex "^8.0.0" 1256 | is-fullwidth-code-point "^3.0.0" 1257 | strip-ansi "^6.0.1" 1258 | 1259 | string-width@^5.0.1, string-width@^5.1.2: 1260 | version "5.1.2" 1261 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" 1262 | integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== 1263 | dependencies: 1264 | eastasianwidth "^0.2.0" 1265 | emoji-regex "^9.2.2" 1266 | strip-ansi "^7.0.1" 1267 | 1268 | string_decoder@~1.1.1: 1269 | version "1.1.1" 1270 | resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" 1271 | integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== 1272 | dependencies: 1273 | safe-buffer "~5.1.0" 1274 | 1275 | "strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1276 | version "6.0.1" 1277 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 1278 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1279 | dependencies: 1280 | ansi-regex "^5.0.1" 1281 | 1282 | strip-ansi@^7.0.1: 1283 | version "7.1.0" 1284 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" 1285 | integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== 1286 | dependencies: 1287 | ansi-regex "^6.0.1" 1288 | 1289 | strip-json-comments@3.1.1: 1290 | version "3.1.1" 1291 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" 1292 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1293 | 1294 | supports-color@8.1.1: 1295 | version "8.1.1" 1296 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" 1297 | integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== 1298 | dependencies: 1299 | has-flag "^4.0.0" 1300 | 1301 | supports-color@^7.1.0: 1302 | version "7.2.0" 1303 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" 1304 | integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== 1305 | dependencies: 1306 | has-flag "^4.0.0" 1307 | 1308 | supports-color@^9.4.0: 1309 | version "9.4.0" 1310 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-9.4.0.tgz#17bfcf686288f531db3dea3215510621ccb55954" 1311 | integrity sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw== 1312 | 1313 | svgo@^2.8.0: 1314 | version "2.8.0" 1315 | resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24" 1316 | integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== 1317 | dependencies: 1318 | "@trysound/sax" "0.2.0" 1319 | commander "^7.2.0" 1320 | css-select "^4.1.3" 1321 | css-tree "^1.1.3" 1322 | csso "^4.2.0" 1323 | picocolors "^1.0.0" 1324 | stable "^0.1.8" 1325 | 1326 | tapable@^2.2.0: 1327 | version "2.2.1" 1328 | resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" 1329 | integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== 1330 | 1331 | test-exclude@^6.0.0: 1332 | version "6.0.0" 1333 | resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" 1334 | integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== 1335 | dependencies: 1336 | "@istanbuljs/schema" "^0.1.2" 1337 | glob "^7.1.4" 1338 | minimatch "^3.0.4" 1339 | 1340 | to-regex-range@^5.0.1: 1341 | version "5.0.1" 1342 | resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" 1343 | integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== 1344 | dependencies: 1345 | is-number "^7.0.0" 1346 | 1347 | typescript@5: 1348 | version "5.4.2" 1349 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.2.tgz#0ae9cebcfae970718474fe0da2c090cad6577372" 1350 | integrity sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ== 1351 | 1352 | undici-types@~5.26.4: 1353 | version "5.26.5" 1354 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" 1355 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 1356 | 1357 | util-deprecate@~1.0.1: 1358 | version "1.0.2" 1359 | resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" 1360 | integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== 1361 | 1362 | v8-to-istanbul@^9.0.0: 1363 | version "9.2.0" 1364 | resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" 1365 | integrity sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA== 1366 | dependencies: 1367 | "@jridgewell/trace-mapping" "^0.3.12" 1368 | "@types/istanbul-lib-coverage" "^2.0.1" 1369 | convert-source-map "^2.0.0" 1370 | 1371 | vite@^5.1.7: 1372 | version "5.1.7" 1373 | resolved "https://registry.yarnpkg.com/vite/-/vite-5.1.7.tgz#9f685a2c4c70707fef6d37341b0e809c366da619" 1374 | integrity sha512-sgnEEFTZYMui/sTlH1/XEnVNHMujOahPLGMxn1+5sIT45Xjng1Ec1K78jRP15dSmVgg5WBin9yO81j3o9OxofA== 1375 | dependencies: 1376 | esbuild "^0.19.3" 1377 | postcss "^8.4.35" 1378 | rollup "^4.2.0" 1379 | optionalDependencies: 1380 | fsevents "~2.3.3" 1381 | 1382 | which@^2.0.1: 1383 | version "2.0.2" 1384 | resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" 1385 | integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== 1386 | dependencies: 1387 | isexe "^2.0.0" 1388 | 1389 | workerpool@6.2.1: 1390 | version "6.2.1" 1391 | resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" 1392 | integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== 1393 | 1394 | "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: 1395 | version "7.0.0" 1396 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 1397 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1398 | dependencies: 1399 | ansi-styles "^4.0.0" 1400 | string-width "^4.1.0" 1401 | strip-ansi "^6.0.0" 1402 | 1403 | wrap-ansi@^8.1.0: 1404 | version "8.1.0" 1405 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" 1406 | integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== 1407 | dependencies: 1408 | ansi-styles "^6.1.0" 1409 | string-width "^5.0.1" 1410 | strip-ansi "^7.0.1" 1411 | 1412 | wrappy@1: 1413 | version "1.0.2" 1414 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 1415 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1416 | 1417 | xml2js@^0.6.2: 1418 | version "0.6.2" 1419 | resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499" 1420 | integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== 1421 | dependencies: 1422 | sax ">=0.6.0" 1423 | xmlbuilder "~11.0.0" 1424 | 1425 | xmlbuilder@~11.0.0: 1426 | version "11.0.1" 1427 | resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3" 1428 | integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== 1429 | 1430 | y18n@^5.0.5: 1431 | version "5.0.8" 1432 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 1433 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1434 | 1435 | yallist@^4.0.0: 1436 | version "4.0.0" 1437 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" 1438 | integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== 1439 | 1440 | yargs-parser@20.2.4: 1441 | version "20.2.4" 1442 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.4.tgz#b42890f14566796f85ae8e3a25290d205f154a54" 1443 | integrity sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA== 1444 | 1445 | yargs-parser@^20.2.2: 1446 | version "20.2.9" 1447 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" 1448 | integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== 1449 | 1450 | yargs-parser@^21.1.1: 1451 | version "21.1.1" 1452 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" 1453 | integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== 1454 | 1455 | yargs-unparser@2.0.0: 1456 | version "2.0.0" 1457 | resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" 1458 | integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== 1459 | dependencies: 1460 | camelcase "^6.0.0" 1461 | decamelize "^4.0.0" 1462 | flat "^5.0.2" 1463 | is-plain-obj "^2.1.0" 1464 | 1465 | yargs@16.2.0: 1466 | version "16.2.0" 1467 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" 1468 | integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== 1469 | dependencies: 1470 | cliui "^7.0.2" 1471 | escalade "^3.1.1" 1472 | get-caller-file "^2.0.5" 1473 | require-directory "^2.1.1" 1474 | string-width "^4.2.0" 1475 | y18n "^5.0.5" 1476 | yargs-parser "^20.2.2" 1477 | 1478 | yargs@^17.7.2: 1479 | version "17.7.2" 1480 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" 1481 | integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== 1482 | dependencies: 1483 | cliui "^8.0.1" 1484 | escalade "^3.1.1" 1485 | get-caller-file "^2.0.5" 1486 | require-directory "^2.1.1" 1487 | string-width "^4.2.3" 1488 | y18n "^5.0.5" 1489 | yargs-parser "^21.1.1" 1490 | 1491 | yocto-queue@^0.1.0: 1492 | version "0.1.0" 1493 | resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" 1494 | integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== 1495 | --------------------------------------------------------------------------------