├── CHANGELOG.md ├── LICENSE.md ├── README.md ├── SECURITY.md ├── media ├── enable.png └── preview.png ├── nmap-peek-2.0.0.vsix.zip ├── package-lock.json ├── package.json ├── resources ├── dark │ └── preview.svg ├── light │ └── preview.svg └── neutral │ └── nmap-peek-logo.png ├── src ├── extension.ts ├── panels │ └── HelloWorldPanel.ts ├── test │ └── extension.test.ts ├── types.ts ├── utilities │ ├── getNonce.ts │ └── getUri.ts └── utils.ts ├── tsconfig.json ├── webpack.config.js └── webview-ui ├── .gitignore ├── README.md ├── index.html ├── package-lock.json ├── package.json ├── postcss.config.js ├── src ├── App.css ├── App.tsx ├── Components │ ├── CPEView.tsx │ ├── ErrorBoundary.tsx │ ├── FPView.tsx │ ├── Footer.tsx │ ├── HostsView.tsx │ ├── MainView.tsx │ ├── PortsView.tsx │ ├── ScanInfo.tsx │ ├── ScriptsView.tsx │ ├── Search.tsx │ └── Tools.tsx ├── index.tsx ├── utilities │ ├── types.ts │ ├── utils.ts │ └── vscode.ts └── vite-env.d.ts ├── tailwind.config.js ├── tsconfig.json └── vite.config.ts /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [1.0.0] - 18.01.2023 4 | 5 | - Initial release 6 | 7 | ## [1.0.1] - 19.01.2023 8 | 9 | - Added MIT license 10 | - Update missing icons etc. 11 | 12 | ## [1.0.2] - 29.01.2023 13 | 14 | - Added better error handling 15 | 16 | ## [1.0.3] - 01.03.2023 17 | 18 | - Fixed parsing bug when only one port was open 19 | - Code refactoring 20 | 21 | ## [1.0.4] - 08.03.2023 22 | 23 | - Fixed parsing bug when only one host was open 24 | - Fixed OS detection bug 25 | 26 | ## [1.0.5] - 15.04.2023 27 | 28 | - Fixed bug for host being offline 29 | - Fixed bug for single host, where no ip was shown 30 | 31 | ## [2.0.0] - 10.12.2023 32 | 33 | - Massive rewrite of the code 34 | - Uses `WebView` intead of `TreeView`, which offers more flexibility 35 | - Filtering option 36 | - Better UI with more options and interactions 37 | 38 | ## [2.0.1] - 12.12.2023 39 | 40 | - Fixed bug where the app crashed when host was down 41 | - Added better error handling 42 | 43 | ## [2.0.2] - 22.12.2023 44 | - Added new search filters 45 | - Improved GUI for better readability 46 | - Updated the host view to show open ports instead of scanned ports 47 | - Added VS Code tests to avoid bugs 48 | 49 | 50 | ## [2.1.0] - 20.02.2025 51 | - Fixed bug with `pnumber` filter 52 | - `pnumber` now returns only the matching port for each host 53 | - Added option to export filtered results in 3 formats 54 | - JSON 55 | - CSV 56 | - host:port 57 | - Best Script visbility 58 | - Added Fingerprint support 59 | - Updated dependancies -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 nmap-peek 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 | # Nmap-Peek 2 | 3 | An easy way to preview the content of an XML nmap file, in VS Code. 4 | 5 | ## Features 6 | 7 | A simple side view of your XMl nmap file. The extensions prints all the basic information retrieved from an nmap scan. 8 | 9 | ![nmap peek](./media/preview.png) 10 | 11 | ## Display GUI 12 | 13 | When an `.xml` file is open on the editor, an icon of an eye will become visible on the toolbar. 14 | ![nmap peek](./media/enable.png) 15 | 16 | It is possible to run the command directly without writting the command by opening the Command Palette (`Ctrl + Shift + P` or `command + Shift + P`). After run the `nmap: Visualize Nmap` command. 17 | 18 | The colors for port status are `green` dot for `open`, `red` for `closed`, `yellow` for `filtered` or `mixed response`. 19 | 20 | ## Requirements 21 | 22 | The application is using `fast-xml-parser` for parsing the XML content of nmap. 23 | 24 | ## Known Issues 25 | 26 | it is not possible to have multiple instances of the preview at the same time. 27 | 28 | ## Release Notes 29 | 30 | ### 2.1.0 31 | - Fixed bug with `pnumber` filter 32 | - `pnumber` now returns only the matching port for each host 33 | - Added option to export filtered results in 3 formats 34 | - JSON 35 | - CSV 36 | - host:port 37 | - Best Script visbility 38 | - Added Fingerprint support 39 | - Updated dependancies 40 | 41 | 42 | ### 2.0.3 43 | 44 | - Fixed width layout for ports 45 | - Added tool to extract URLs 46 | - Added fast copy to clipboard options 47 | 48 | ### 2.0.2 49 | 50 | - Added filter search options 51 | - Updated view to show open ports instead of scanned ports 52 | - Improved layout 53 | 54 | ### 2.0.1 55 | 56 | Fixed bug when host was down 57 | 58 | ### 2.0.0 59 | 60 | - Use latest version of `fast-xml-parser` 61 | - Extension completely re-written to use `Webview` instead of `TreeView` 62 | - New UI 63 | - Search option added 64 | - New action icon 65 | - Diplays more Nmap fields like: 66 | - script output 67 | - preview scanned ports 68 | - Nmap scan info 69 | - MAC and IPv6 addresses 70 | - CPE information 71 | 72 | ### 1.0.5 73 | 74 | - Fixed bug in single host nmap scans 75 | - Fixed bug when host is offline 76 | 77 | ### 1.0.4 78 | 79 | - Fixed bug in single host nmap scans 80 | - Parsing OS directly 81 | 82 | ### 1.0.3 83 | 84 | - Fixed bug in case a single port was open. 85 | - Refactored code to avoid duplicate snippets 86 | 87 | ### 1.0.2 88 | 89 | - Improved error handling. 90 | 91 | ### 1.0.1 92 | 93 | - Updated needed license information and missing icons. 94 | 95 | ### 1.0.0 96 | 97 | - Initial release of nmap peek. -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## Security 4 | 5 | Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet), [Xamarin](https://github.com/xamarin), and [our GitHub organizations](https://opensource.microsoft.com/). 6 | 7 | If you believe you have found a security vulnerability in any Microsoft-owned repository that meets Microsoft's [Microsoft's definition of a security vulnerability]() of a security vulnerability, please report it to us as described below. 8 | 9 | ## Reporting Security Issues 10 | 11 | **Please do not report security vulnerabilities through public GitHub issues.** 12 | 13 | Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://msrc.microsoft.com/create-report). 14 | 15 | If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the the [Microsoft Security Response Center PGP Key page](https://www.microsoft.com/en-us/msrc/pgp-key-msrc). 16 | 17 | You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). 18 | 19 | Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: 20 | 21 | - Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) 22 | - Full paths of source file(s) related to the manifestation of the issue 23 | - The location of the affected source code (tag/branch/commit or direct URL) 24 | - Any special configuration required to reproduce the issue 25 | - Step-by-step instructions to reproduce the issue 26 | - Proof-of-concept or exploit code (if possible) 27 | - Impact of the issue, including how an attacker might exploit the issue 28 | 29 | This information will help us triage your report more quickly. 30 | 31 | If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://microsoft.com/msrc/bounty) page for more details about our active programs. 32 | 33 | ## Preferred Languages 34 | 35 | We prefer all communications to be in English. 36 | 37 | ## Policy 38 | 39 | Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://www.microsoft.com/en-us/msrc/cvd). 40 | 41 | -------------------------------------------------------------------------------- /media/enable.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marduc812/vscode-nmap-peek/dadbeb10aa60b4ea5ab821a5f4974300f8f0edb8/media/enable.png -------------------------------------------------------------------------------- /media/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marduc812/vscode-nmap-peek/dadbeb10aa60b4ea5ab821a5f4974300f8f0edb8/media/preview.png -------------------------------------------------------------------------------- /nmap-peek-2.0.0.vsix.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marduc812/vscode-nmap-peek/dadbeb10aa60b4ea5ab821a5f4974300f8f0edb8/nmap-peek-2.0.0.vsix.zip -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nmap-peek", 3 | "displayName": "Nmap Peek", 4 | "description": "View your nmap output inside VS Code, in a nice clean GUI", 5 | "version": "2.1.0", 6 | "icon": "resources/neutral/nmap-peek-logo.png", 7 | "author": { 8 | "name": "marduc812" 9 | }, 10 | "homepage": "https://github.com/marduc812/vscode-nmap-peek/blob/main/README.md", 11 | "repository": { 12 | "type": "git", 13 | "url": "https://github.com/marduc812/vscode-nmap-peek.git" 14 | }, 15 | "publisher": "marduc812", 16 | "engines": { 17 | "vscode": "^1.74.0" 18 | }, 19 | "categories": [ 20 | "Other" 21 | ], 22 | "activationEvents": [], 23 | "main": "./dist/extension.js", 24 | "contributes": { 25 | "commands": [ 26 | { 27 | "command": "nmap-peek.visualize", 28 | "title": "Visualize Nmap", 29 | "category": "nmap", 30 | "icon": { 31 | "light": "resources/light/preview.svg", 32 | "dark": "resources/dark/preview.svg" 33 | } 34 | } 35 | ], 36 | "menus": { 37 | "editor/title": [ 38 | { 39 | "command": "nmap-peek.visualize", 40 | "when": "editorLangId == xml", 41 | "group": "navigation" 42 | } 43 | ] 44 | } 45 | }, 46 | "scripts": { 47 | "install:all": "npm install && cd webview-ui && npm install", 48 | "start:webview": "cd webview-ui && npm run start", 49 | "build:webview": "cd webview-ui && npm run build", 50 | "vscode:prepublish": "npm run compile", 51 | "compile": "webpack", 52 | "watch": "webpack --watch", 53 | "package": "webpack --mode production --devtool hidden-source-map", 54 | "compile-tests": "tsc -p . --outDir out", 55 | "watch-tests": "tsc -p . -w --outDir out", 56 | "pretest": "npm run compile-tests && npm run compile && npm run lint", 57 | "lint": "eslint src --ext ts", 58 | "test": "vscode-test" 59 | }, 60 | "devDependencies": { 61 | "@types/mocha": "^10.0.6", 62 | "@types/node": "^18.19.3", 63 | "@types/vscode": "^1.74.0", 64 | "@typescript-eslint/eslint-plugin": "^6.13.2", 65 | "@typescript-eslint/parser": "^6.13.2", 66 | "@vscode/test-cli": "^0.0.4", 67 | "@vscode/test-electron": "^2.3.8", 68 | "eslint": "^8.55.0", 69 | "prettier": "^3.1.0", 70 | "ts-loader": "^9.5.1", 71 | "typescript": "^5.3.3", 72 | "vscode-test": "^1.6.1", 73 | "webpack": "^5.89.0", 74 | "webpack-cli": "^5.1.4" 75 | }, 76 | "dependencies": { 77 | "fast-xml-parser": "^4.3.2", 78 | "glob": "^10.3.10", 79 | "path-browserify": "^1.0.1" 80 | } 81 | } 82 | -------------------------------------------------------------------------------- /resources/dark/preview.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/light/preview.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /resources/neutral/nmap-peek-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/marduc812/vscode-nmap-peek/dadbeb10aa60b4ea5ab821a5f4974300f8f0edb8/resources/neutral/nmap-peek-logo.png -------------------------------------------------------------------------------- /src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import { commands, ExtensionContext } from "vscode"; 3 | import { parseXMLContent, verifyNmapFile } from './utils'; 4 | import { HelloWorldPanel } from "./panels/HelloWorldPanel"; 5 | import { NmapRunType } from './types'; 6 | import path from 'path'; 7 | 8 | export function activate(context: ExtensionContext) { 9 | const nmapWebView = commands.registerCommand("nmap-peek.visualize", () => { 10 | 11 | const editor = vscode.window.activeTextEditor; 12 | if (!editor) { 13 | vscode.window.showErrorMessage('No Nmap file is open in the editor'); 14 | return; 15 | } 16 | 17 | if(!verifyNmapFile(editor)) { 18 | return; 19 | } 20 | 21 | // Info about the whole scan 22 | const scan: NmapRunType | null = parseXMLContent(editor); 23 | 24 | const filePath = editor.document.fileName; 25 | const fileName = path.basename(filePath); 26 | 27 | const nmapData = editor.document.getText(); 28 | 29 | if (scan === null) { 30 | vscode.window.showErrorMessage('Failed to parse XML content.'); 31 | return; 32 | } 33 | 34 | HelloWorldPanel.render(context.extensionUri, nmapData, fileName); 35 | }); 36 | 37 | context.subscriptions.push(nmapWebView); 38 | } 39 | -------------------------------------------------------------------------------- /src/panels/HelloWorldPanel.ts: -------------------------------------------------------------------------------- 1 | import { Disposable, Webview, WebviewPanel, window, Uri, ViewColumn } from "vscode"; 2 | import { getUri } from "../utilities/getUri"; 3 | import { getNonce } from "../utilities/getNonce"; 4 | 5 | export class HelloWorldPanel { 6 | public static currentPanel: HelloWorldPanel | undefined; 7 | private readonly _panel: WebviewPanel; 8 | private _disposables: Disposable[] = []; 9 | static webview: any; 10 | 11 | 12 | private constructor(panel: WebviewPanel, extensionUri: Uri) { 13 | this._panel = panel; 14 | 15 | this._panel.onDidDispose(() => this.dispose(), null, this._disposables); 16 | 17 | 18 | this._panel.webview.html = this._getWebviewContent(this._panel.webview, extensionUri); 19 | 20 | 21 | this._setWebviewMessageListener(this._panel.webview); 22 | } 23 | 24 | public static render(extensionUri: Uri, someData: string, tabName: string) { 25 | 26 | if (HelloWorldPanel.currentPanel) { 27 | // If the webview panel already exists remove it 28 | HelloWorldPanel.currentPanel.dispose(); 29 | } 30 | const panel = window.createWebviewPanel( 31 | "showNmapVisualizer", 32 | `${tabName} Preview`, 33 | ViewColumn.Beside, 34 | { 35 | enableScripts: true, 36 | localResourceRoots: [Uri.joinPath(extensionUri, "out"), Uri.joinPath(extensionUri, "webview-ui/build")], 37 | } 38 | ); 39 | 40 | HelloWorldPanel.currentPanel = new HelloWorldPanel(panel, extensionUri); 41 | 42 | // Send data to the webview 43 | panel.webview.postMessage({ command: 'sendData', data: someData }); 44 | 45 | } 46 | 47 | public dispose() { 48 | HelloWorldPanel.currentPanel = undefined; 49 | this._panel.dispose(); 50 | while (this._disposables.length) { 51 | const disposable = this._disposables.pop(); 52 | if (disposable) { 53 | disposable.dispose(); 54 | } 55 | } 56 | } 57 | 58 | 59 | private _getWebviewContent(webview: Webview, extensionUri: Uri) { 60 | 61 | const stylesUri = getUri(webview, extensionUri, ["webview-ui", "build", "assets", "index.css"]); 62 | 63 | const scriptUri = getUri(webview, extensionUri, ["webview-ui", "build", "assets", "index.js"]); 64 | 65 | const nonce = getNonce(); 66 | 67 | 68 | return /*html*/ ` 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | Hello World 77 | 78 | 79 |
80 | 81 | 82 | 83 | `; 84 | } 85 | 86 | private _setWebviewMessageListener(webview: Webview) { 87 | webview.onDidReceiveMessage( 88 | (message: any) => { 89 | const command = message.command; 90 | const text = message.text; 91 | 92 | switch (command) { 93 | case "hello": 94 | 95 | window.showInformationMessage(text); 96 | return; 97 | 98 | 99 | } 100 | }, 101 | undefined, 102 | this._disposables 103 | ); 104 | } 105 | } 106 | -------------------------------------------------------------------------------- /src/test/extension.test.ts: -------------------------------------------------------------------------------- 1 | import * as assert from 'assert'; 2 | import * as vscode from 'vscode'; 3 | import * as fs from 'fs'; 4 | import * as path from 'path'; 5 | 6 | suite('Extension Test Suite', function () { 7 | this.timeout(10000); 8 | 9 | vscode.window.showInformationMessage('Start all tests.'); 10 | 11 | const testFilesPath = path.join(__dirname, '../../../test-scan-files'); 12 | const files = fs.readdirSync(testFilesPath); 13 | 14 | files.forEach(file => { 15 | test(`Test for file: ${file}`, async () => { 16 | const filePath = path.join(testFilesPath, file); 17 | const document = await vscode.workspace.openTextDocument(filePath); 18 | await vscode.window.showTextDocument(document); 19 | 20 | assert.strictEqual(document.languageId, 'xml', `File ${file} should be an XML file`); 21 | 22 | await vscode.commands.executeCommand('nmap-peek.visualize'); 23 | 24 | await new Promise(resolve => setTimeout(resolve, 5000)); // Delay for 5000 milliseconds 25 | await vscode.commands.executeCommand('workbench.action.closeAllEditors'); 26 | }); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/naming-convention */ 2 | export type NmapRunType = { 3 | "nmaprun": { 4 | "scaninfo": ScanInfoType; 5 | "host": HostType | HostType[]; 6 | } 7 | }; 8 | 9 | export type ScanInfoType = { 10 | "@_type": string; 11 | "@_protocol": string; 12 | "@_numservices": string; 13 | "@_services":string; 14 | }; 15 | 16 | export type HostType = { 17 | "status": HostStatusType; 18 | "address": HostAddressType | HostAddressType[]; 19 | "hostnames": HostnameType | HostnameType[] | string; 20 | "ports": PortsType; 21 | "os"?: OSType; 22 | }; 23 | 24 | export type OSType = { 25 | "osmatch": OSMatchType[] 26 | }; 27 | 28 | export type OSMatchType = { 29 | "osclass": OSClass; 30 | }; 31 | 32 | export type OSClass = { 33 | "@_vendor": string; 34 | "@_osfamily": string; 35 | }; 36 | 37 | export type HostStatusType = { 38 | "@_state": string; 39 | "@_reason": string; 40 | "@_reason_ttl": string; 41 | }; 42 | 43 | export type HostAddressType = { 44 | "@_addr": string; 45 | "@_addrtype": string; 46 | }; 47 | 48 | export type HostnameType = { 49 | "@_name": string; 50 | "@_type": string; 51 | }; 52 | 53 | export type PortsType = { 54 | "port" : PortType[]; 55 | }; 56 | 57 | export type PortType = { 58 | "state": { 59 | "@_state": string; 60 | "@_reason": string; 61 | "@_reason_ttl": string; 62 | }; 63 | "service"?: PortServiceType; 64 | "script"?: PortScriptType[]; 65 | "@_protocol": string; 66 | "@_portid": string; 67 | }; 68 | 69 | export type PortServiceType = { 70 | "cpe": string | string[]; 71 | "@_name": string; 72 | "@_product": string; 73 | "@_version": string; 74 | "@_extrainfo": string; 75 | "@_ostype": string; 76 | }; 77 | 78 | export type PortScriptType = { 79 | "@_id": string; 80 | "@_output": string; 81 | }; -------------------------------------------------------------------------------- /src/utilities/getNonce.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * A helper function that returns a unique alphanumeric identifier called a nonce. 3 | * 4 | * @remarks This function is primarily used to help enforce content security 5 | * policies for resources/scripts being executed in a webview context. 6 | * 7 | * @returns A nonce 8 | */ 9 | export function getNonce() { 10 | let text = ""; 11 | const possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 12 | for (let i = 0; i < 32; i++) { 13 | text += possible.charAt(Math.floor(Math.random() * possible.length)); 14 | } 15 | return text; 16 | } 17 | -------------------------------------------------------------------------------- /src/utilities/getUri.ts: -------------------------------------------------------------------------------- 1 | import { Uri, Webview } from "vscode"; 2 | 3 | /** 4 | * A helper function which will get the webview URI of a given file or resource. 5 | * 6 | * @remarks This URI can be used within a webview's HTML as a link to the 7 | * given file/resource. 8 | * 9 | * @param webview A reference to the extension webview 10 | * @param extensionUri The URI of the directory containing the extension 11 | * @param pathList An array of strings representing the path to a file/resource 12 | * @returns A URI pointing to the file/resource 13 | */ 14 | export function getUri(webview: Webview, extensionUri: Uri, pathList: string[]) { 15 | return webview.asWebviewUri(Uri.joinPath(extensionUri, ...pathList)); 16 | } 17 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import * as vscode from 'vscode'; 2 | import { NmapRunType } from './types'; 3 | import { XMLParser } from 'fast-xml-parser'; 4 | 5 | /** 6 | * Verifies that the open file is XML and that it's a valid Nmap file 7 | * @param editor - The active VS code editor object 8 | * @returns {boolean} valid - True if nmap file / False if not 9 | */ 10 | export const verifyNmapFile = (editor: vscode.TextEditor): boolean => { 11 | const document = editor.document; 12 | const fileType = document.languageId; 13 | 14 | if (fileType !== 'xml') { 15 | vscode.window.showErrorMessage('Unsupported file format. Only .xml is currently supported'); 16 | return false; 17 | } 18 | 19 | const content = document.getText(); 20 | if (!content.includes(' { 34 | const fileContent = editor.document.getText(); 35 | const parsingOptions = { 36 | ignoreAttributes: false, 37 | ignoreNameSpace: false 38 | }; 39 | const xmlParser = new XMLParser(parsingOptions); 40 | try { 41 | const parsedContent: NmapRunType = xmlParser.parse(fileContent); 42 | return parsedContent; 43 | } catch (error) { 44 | return null; 45 | } 46 | }; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "Node16", 4 | "target": "ES2022", 5 | "lib": [ 6 | "ES2022" 7 | ], 8 | "sourceMap": true, 9 | "rootDir": "src", 10 | "strict": true /* enable all strict type-checking options */ 11 | /* Additional Checks */ 12 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 13 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 14 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 15 | }, 16 | "exclude": [ 17 | "webview-ui" 18 | ] 19 | } -------------------------------------------------------------------------------- /webpack.config.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | 3 | 'use strict'; 4 | 5 | const path = require('path'); 6 | 7 | //@ts-check 8 | /** @typedef {import('webpack').Configuration} WebpackConfig **/ 9 | 10 | /** @type WebpackConfig */ 11 | const extensionConfig = { 12 | target: 'webworker', // VS Code extensions run in a Node.js-context 📖 -> https://webpack.js.org/configuration/node/ 13 | mode: 'production', // this leaves the source code as close as possible to the original (when packaging we set this to 'production') 14 | 15 | entry: './src/extension.ts', // the entry point of this extension, 📖 -> https://webpack.js.org/configuration/entry-context/ 16 | output: { 17 | // the bundle is stored in the 'dist' folder (check package.json), 📖 -> https://webpack.js.org/configuration/output/ 18 | path: path.resolve(__dirname, 'dist'), 19 | filename: 'extension.js', 20 | libraryTarget: 'commonjs2' 21 | }, 22 | externals: { 23 | vscode: 'commonjs vscode' // the vscode-module is created on-the-fly and must be excluded. Add other modules that cannot be webpack'ed, 📖 -> https://webpack.js.org/configuration/externals/ 24 | // modules added here also need to be added in the .vscodeignore file 25 | }, 26 | resolve: { 27 | // support reading TypeScript and JavaScript files, 📖 -> https://github.com/TypeStrong/ts-loader 28 | extensions: ['.ts', '.js'], 29 | mainFields: ['browser', 'module', 'main'], 30 | fallback: { 31 | "path": require.resolve("path-browserify") 32 | } 33 | }, 34 | module: { 35 | rules: [ 36 | { 37 | test: /\.ts$/, 38 | exclude: /node_modules/, 39 | use: [ 40 | { 41 | loader: 'ts-loader' 42 | } 43 | ] 44 | } 45 | ] 46 | }, 47 | devtool: 'nosources-source-map', 48 | infrastructureLogging: { 49 | level: "log", // enables logging required for problem matchers 50 | }, 51 | }; 52 | module.exports = [ extensionConfig ]; -------------------------------------------------------------------------------- /webview-ui/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | build 6 | build-ssr 7 | *.local 8 | src/utilities/test.ts 9 | sample.xml 10 | scans -------------------------------------------------------------------------------- /webview-ui/README.md: -------------------------------------------------------------------------------- 1 | # `webview-ui` Directory 2 | 3 | This directory contains all of the code that will be executed within the webview context. It can be thought of as the place where all the "frontend" code of a webview is contained. 4 | 5 | Types of content that can be contained here: 6 | 7 | - Frontend framework code (i.e. React, Svelte, Vue, etc.) 8 | - JavaScript files 9 | - CSS files 10 | - Assets / resources (i.e. images, illustrations, etc.) 11 | -------------------------------------------------------------------------------- /webview-ui/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Nmap Preview 7 | 8 | 9 |
10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /webview-ui/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hello-world", 3 | "version": "0.0.1", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "hello-world", 9 | "version": "0.0.1", 10 | "dependencies": { 11 | "fast-xml-parser": "^4.3.2", 12 | "react": "^17.0.2", 13 | "react-dom": "^17.0.2", 14 | "react-hot-toast": "^2.4.1", 15 | "react-icons": "^4.12.0" 16 | }, 17 | "devDependencies": { 18 | "@types/react": "^17.0.33", 19 | "@types/react-dom": "^17.0.10", 20 | "@types/vscode-webview": "^1.57.0", 21 | "@vitejs/plugin-react": "^1.0.7", 22 | "autoprefixer": "^10.4.16", 23 | "postcss": "^8.4.32", 24 | "tailwindcss": "^3.3.6", 25 | "typescript": "^4.4.4", 26 | "vite": "^6.1.0" 27 | } 28 | }, 29 | "node_modules/@alloc/quick-lru": { 30 | "version": "5.2.0", 31 | "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", 32 | "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", 33 | "dev": true, 34 | "license": "MIT", 35 | "engines": { 36 | "node": ">=10" 37 | }, 38 | "funding": { 39 | "url": "https://github.com/sponsors/sindresorhus" 40 | } 41 | }, 42 | "node_modules/@ampproject/remapping": { 43 | "version": "2.3.0", 44 | "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", 45 | "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", 46 | "dev": true, 47 | "license": "Apache-2.0", 48 | "dependencies": { 49 | "@jridgewell/gen-mapping": "^0.3.5", 50 | "@jridgewell/trace-mapping": "^0.3.24" 51 | }, 52 | "engines": { 53 | "node": ">=6.0.0" 54 | } 55 | }, 56 | "node_modules/@babel/code-frame": { 57 | "version": "7.26.2", 58 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", 59 | "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", 60 | "dev": true, 61 | "license": "MIT", 62 | "dependencies": { 63 | "@babel/helper-validator-identifier": "^7.25.9", 64 | "js-tokens": "^4.0.0", 65 | "picocolors": "^1.0.0" 66 | }, 67 | "engines": { 68 | "node": ">=6.9.0" 69 | } 70 | }, 71 | "node_modules/@babel/compat-data": { 72 | "version": "7.26.8", 73 | "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", 74 | "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", 75 | "dev": true, 76 | "license": "MIT", 77 | "engines": { 78 | "node": ">=6.9.0" 79 | } 80 | }, 81 | "node_modules/@babel/core": { 82 | "version": "7.26.9", 83 | "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz", 84 | "integrity": "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw==", 85 | "dev": true, 86 | "license": "MIT", 87 | "dependencies": { 88 | "@ampproject/remapping": "^2.2.0", 89 | "@babel/code-frame": "^7.26.2", 90 | "@babel/generator": "^7.26.9", 91 | "@babel/helper-compilation-targets": "^7.26.5", 92 | "@babel/helper-module-transforms": "^7.26.0", 93 | "@babel/helpers": "^7.26.9", 94 | "@babel/parser": "^7.26.9", 95 | "@babel/template": "^7.26.9", 96 | "@babel/traverse": "^7.26.9", 97 | "@babel/types": "^7.26.9", 98 | "convert-source-map": "^2.0.0", 99 | "debug": "^4.1.0", 100 | "gensync": "^1.0.0-beta.2", 101 | "json5": "^2.2.3", 102 | "semver": "^6.3.1" 103 | }, 104 | "engines": { 105 | "node": ">=6.9.0" 106 | }, 107 | "funding": { 108 | "type": "opencollective", 109 | "url": "https://opencollective.com/babel" 110 | } 111 | }, 112 | "node_modules/@babel/generator": { 113 | "version": "7.26.9", 114 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.9.tgz", 115 | "integrity": "sha512-kEWdzjOAUMW4hAyrzJ0ZaTOu9OmpyDIQicIh0zg0EEcEkYXZb2TjtBhnHi2ViX7PKwZqF4xwqfAm299/QMP3lg==", 116 | "dev": true, 117 | "license": "MIT", 118 | "dependencies": { 119 | "@babel/parser": "^7.26.9", 120 | "@babel/types": "^7.26.9", 121 | "@jridgewell/gen-mapping": "^0.3.5", 122 | "@jridgewell/trace-mapping": "^0.3.25", 123 | "jsesc": "^3.0.2" 124 | }, 125 | "engines": { 126 | "node": ">=6.9.0" 127 | } 128 | }, 129 | "node_modules/@babel/helper-annotate-as-pure": { 130 | "version": "7.25.9", 131 | "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", 132 | "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", 133 | "dev": true, 134 | "license": "MIT", 135 | "dependencies": { 136 | "@babel/types": "^7.25.9" 137 | }, 138 | "engines": { 139 | "node": ">=6.9.0" 140 | } 141 | }, 142 | "node_modules/@babel/helper-compilation-targets": { 143 | "version": "7.26.5", 144 | "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", 145 | "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", 146 | "dev": true, 147 | "license": "MIT", 148 | "dependencies": { 149 | "@babel/compat-data": "^7.26.5", 150 | "@babel/helper-validator-option": "^7.25.9", 151 | "browserslist": "^4.24.0", 152 | "lru-cache": "^5.1.1", 153 | "semver": "^6.3.1" 154 | }, 155 | "engines": { 156 | "node": ">=6.9.0" 157 | } 158 | }, 159 | "node_modules/@babel/helper-module-imports": { 160 | "version": "7.25.9", 161 | "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", 162 | "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", 163 | "dev": true, 164 | "license": "MIT", 165 | "dependencies": { 166 | "@babel/traverse": "^7.25.9", 167 | "@babel/types": "^7.25.9" 168 | }, 169 | "engines": { 170 | "node": ">=6.9.0" 171 | } 172 | }, 173 | "node_modules/@babel/helper-module-transforms": { 174 | "version": "7.26.0", 175 | "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", 176 | "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", 177 | "dev": true, 178 | "license": "MIT", 179 | "dependencies": { 180 | "@babel/helper-module-imports": "^7.25.9", 181 | "@babel/helper-validator-identifier": "^7.25.9", 182 | "@babel/traverse": "^7.25.9" 183 | }, 184 | "engines": { 185 | "node": ">=6.9.0" 186 | }, 187 | "peerDependencies": { 188 | "@babel/core": "^7.0.0" 189 | } 190 | }, 191 | "node_modules/@babel/helper-plugin-utils": { 192 | "version": "7.26.5", 193 | "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", 194 | "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", 195 | "dev": true, 196 | "license": "MIT", 197 | "engines": { 198 | "node": ">=6.9.0" 199 | } 200 | }, 201 | "node_modules/@babel/helper-string-parser": { 202 | "version": "7.25.9", 203 | "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", 204 | "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", 205 | "dev": true, 206 | "license": "MIT", 207 | "engines": { 208 | "node": ">=6.9.0" 209 | } 210 | }, 211 | "node_modules/@babel/helper-validator-identifier": { 212 | "version": "7.25.9", 213 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", 214 | "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", 215 | "dev": true, 216 | "license": "MIT", 217 | "engines": { 218 | "node": ">=6.9.0" 219 | } 220 | }, 221 | "node_modules/@babel/helper-validator-option": { 222 | "version": "7.25.9", 223 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", 224 | "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", 225 | "dev": true, 226 | "license": "MIT", 227 | "engines": { 228 | "node": ">=6.9.0" 229 | } 230 | }, 231 | "node_modules/@babel/helpers": { 232 | "version": "7.26.9", 233 | "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.9.tgz", 234 | "integrity": "sha512-Mz/4+y8udxBKdmzt/UjPACs4G3j5SshJJEFFKxlCGPydG4JAHXxjWjAwjd09tf6oINvl1VfMJo+nB7H2YKQ0dA==", 235 | "dev": true, 236 | "license": "MIT", 237 | "dependencies": { 238 | "@babel/template": "^7.26.9", 239 | "@babel/types": "^7.26.9" 240 | }, 241 | "engines": { 242 | "node": ">=6.9.0" 243 | } 244 | }, 245 | "node_modules/@babel/parser": { 246 | "version": "7.26.9", 247 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.9.tgz", 248 | "integrity": "sha512-81NWa1njQblgZbQHxWHpxxCzNsa3ZwvFqpUg7P+NNUU6f3UU2jBEg4OlF/J6rl8+PQGh1q6/zWScd001YwcA5A==", 249 | "dev": true, 250 | "license": "MIT", 251 | "dependencies": { 252 | "@babel/types": "^7.26.9" 253 | }, 254 | "bin": { 255 | "parser": "bin/babel-parser.js" 256 | }, 257 | "engines": { 258 | "node": ">=6.0.0" 259 | } 260 | }, 261 | "node_modules/@babel/plugin-syntax-jsx": { 262 | "version": "7.25.9", 263 | "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", 264 | "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", 265 | "dev": true, 266 | "license": "MIT", 267 | "dependencies": { 268 | "@babel/helper-plugin-utils": "^7.25.9" 269 | }, 270 | "engines": { 271 | "node": ">=6.9.0" 272 | }, 273 | "peerDependencies": { 274 | "@babel/core": "^7.0.0-0" 275 | } 276 | }, 277 | "node_modules/@babel/plugin-transform-react-jsx": { 278 | "version": "7.25.9", 279 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", 280 | "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", 281 | "dev": true, 282 | "license": "MIT", 283 | "dependencies": { 284 | "@babel/helper-annotate-as-pure": "^7.25.9", 285 | "@babel/helper-module-imports": "^7.25.9", 286 | "@babel/helper-plugin-utils": "^7.25.9", 287 | "@babel/plugin-syntax-jsx": "^7.25.9", 288 | "@babel/types": "^7.25.9" 289 | }, 290 | "engines": { 291 | "node": ">=6.9.0" 292 | }, 293 | "peerDependencies": { 294 | "@babel/core": "^7.0.0-0" 295 | } 296 | }, 297 | "node_modules/@babel/plugin-transform-react-jsx-development": { 298 | "version": "7.25.9", 299 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", 300 | "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", 301 | "dev": true, 302 | "license": "MIT", 303 | "dependencies": { 304 | "@babel/plugin-transform-react-jsx": "^7.25.9" 305 | }, 306 | "engines": { 307 | "node": ">=6.9.0" 308 | }, 309 | "peerDependencies": { 310 | "@babel/core": "^7.0.0-0" 311 | } 312 | }, 313 | "node_modules/@babel/plugin-transform-react-jsx-self": { 314 | "version": "7.25.9", 315 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", 316 | "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", 317 | "dev": true, 318 | "license": "MIT", 319 | "dependencies": { 320 | "@babel/helper-plugin-utils": "^7.25.9" 321 | }, 322 | "engines": { 323 | "node": ">=6.9.0" 324 | }, 325 | "peerDependencies": { 326 | "@babel/core": "^7.0.0-0" 327 | } 328 | }, 329 | "node_modules/@babel/plugin-transform-react-jsx-source": { 330 | "version": "7.25.9", 331 | "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", 332 | "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", 333 | "dev": true, 334 | "license": "MIT", 335 | "dependencies": { 336 | "@babel/helper-plugin-utils": "^7.25.9" 337 | }, 338 | "engines": { 339 | "node": ">=6.9.0" 340 | }, 341 | "peerDependencies": { 342 | "@babel/core": "^7.0.0-0" 343 | } 344 | }, 345 | "node_modules/@babel/template": { 346 | "version": "7.26.9", 347 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", 348 | "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", 349 | "dev": true, 350 | "license": "MIT", 351 | "dependencies": { 352 | "@babel/code-frame": "^7.26.2", 353 | "@babel/parser": "^7.26.9", 354 | "@babel/types": "^7.26.9" 355 | }, 356 | "engines": { 357 | "node": ">=6.9.0" 358 | } 359 | }, 360 | "node_modules/@babel/traverse": { 361 | "version": "7.26.9", 362 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.9.tgz", 363 | "integrity": "sha512-ZYW7L+pL8ahU5fXmNbPF+iZFHCv5scFak7MZ9bwaRPLUhHh7QQEMjZUg0HevihoqCM5iSYHN61EyCoZvqC+bxg==", 364 | "dev": true, 365 | "license": "MIT", 366 | "dependencies": { 367 | "@babel/code-frame": "^7.26.2", 368 | "@babel/generator": "^7.26.9", 369 | "@babel/parser": "^7.26.9", 370 | "@babel/template": "^7.26.9", 371 | "@babel/types": "^7.26.9", 372 | "debug": "^4.3.1", 373 | "globals": "^11.1.0" 374 | }, 375 | "engines": { 376 | "node": ">=6.9.0" 377 | } 378 | }, 379 | "node_modules/@babel/types": { 380 | "version": "7.26.9", 381 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.9.tgz", 382 | "integrity": "sha512-Y3IR1cRnOxOCDvMmNiym7XpXQ93iGDDPHx+Zj+NM+rg0fBaShfQLkg+hKPaZCEvg5N/LeCo4+Rj/i3FuJsIQaw==", 383 | "dev": true, 384 | "license": "MIT", 385 | "dependencies": { 386 | "@babel/helper-string-parser": "^7.25.9", 387 | "@babel/helper-validator-identifier": "^7.25.9" 388 | }, 389 | "engines": { 390 | "node": ">=6.9.0" 391 | } 392 | }, 393 | "node_modules/@esbuild/aix-ppc64": { 394 | "version": "0.24.2", 395 | "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", 396 | "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", 397 | "cpu": [ 398 | "ppc64" 399 | ], 400 | "dev": true, 401 | "license": "MIT", 402 | "optional": true, 403 | "os": [ 404 | "aix" 405 | ], 406 | "engines": { 407 | "node": ">=18" 408 | } 409 | }, 410 | "node_modules/@esbuild/android-arm": { 411 | "version": "0.24.2", 412 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", 413 | "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", 414 | "cpu": [ 415 | "arm" 416 | ], 417 | "dev": true, 418 | "license": "MIT", 419 | "optional": true, 420 | "os": [ 421 | "android" 422 | ], 423 | "engines": { 424 | "node": ">=18" 425 | } 426 | }, 427 | "node_modules/@esbuild/android-arm64": { 428 | "version": "0.24.2", 429 | "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", 430 | "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", 431 | "cpu": [ 432 | "arm64" 433 | ], 434 | "dev": true, 435 | "license": "MIT", 436 | "optional": true, 437 | "os": [ 438 | "android" 439 | ], 440 | "engines": { 441 | "node": ">=18" 442 | } 443 | }, 444 | "node_modules/@esbuild/android-x64": { 445 | "version": "0.24.2", 446 | "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", 447 | "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", 448 | "cpu": [ 449 | "x64" 450 | ], 451 | "dev": true, 452 | "license": "MIT", 453 | "optional": true, 454 | "os": [ 455 | "android" 456 | ], 457 | "engines": { 458 | "node": ">=18" 459 | } 460 | }, 461 | "node_modules/@esbuild/darwin-arm64": { 462 | "version": "0.24.2", 463 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", 464 | "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", 465 | "cpu": [ 466 | "arm64" 467 | ], 468 | "dev": true, 469 | "license": "MIT", 470 | "optional": true, 471 | "os": [ 472 | "darwin" 473 | ], 474 | "engines": { 475 | "node": ">=18" 476 | } 477 | }, 478 | "node_modules/@esbuild/darwin-x64": { 479 | "version": "0.24.2", 480 | "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", 481 | "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", 482 | "cpu": [ 483 | "x64" 484 | ], 485 | "dev": true, 486 | "license": "MIT", 487 | "optional": true, 488 | "os": [ 489 | "darwin" 490 | ], 491 | "engines": { 492 | "node": ">=18" 493 | } 494 | }, 495 | "node_modules/@esbuild/freebsd-arm64": { 496 | "version": "0.24.2", 497 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", 498 | "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", 499 | "cpu": [ 500 | "arm64" 501 | ], 502 | "dev": true, 503 | "license": "MIT", 504 | "optional": true, 505 | "os": [ 506 | "freebsd" 507 | ], 508 | "engines": { 509 | "node": ">=18" 510 | } 511 | }, 512 | "node_modules/@esbuild/freebsd-x64": { 513 | "version": "0.24.2", 514 | "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", 515 | "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", 516 | "cpu": [ 517 | "x64" 518 | ], 519 | "dev": true, 520 | "license": "MIT", 521 | "optional": true, 522 | "os": [ 523 | "freebsd" 524 | ], 525 | "engines": { 526 | "node": ">=18" 527 | } 528 | }, 529 | "node_modules/@esbuild/linux-arm": { 530 | "version": "0.24.2", 531 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", 532 | "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", 533 | "cpu": [ 534 | "arm" 535 | ], 536 | "dev": true, 537 | "license": "MIT", 538 | "optional": true, 539 | "os": [ 540 | "linux" 541 | ], 542 | "engines": { 543 | "node": ">=18" 544 | } 545 | }, 546 | "node_modules/@esbuild/linux-arm64": { 547 | "version": "0.24.2", 548 | "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", 549 | "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", 550 | "cpu": [ 551 | "arm64" 552 | ], 553 | "dev": true, 554 | "license": "MIT", 555 | "optional": true, 556 | "os": [ 557 | "linux" 558 | ], 559 | "engines": { 560 | "node": ">=18" 561 | } 562 | }, 563 | "node_modules/@esbuild/linux-ia32": { 564 | "version": "0.24.2", 565 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", 566 | "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", 567 | "cpu": [ 568 | "ia32" 569 | ], 570 | "dev": true, 571 | "license": "MIT", 572 | "optional": true, 573 | "os": [ 574 | "linux" 575 | ], 576 | "engines": { 577 | "node": ">=18" 578 | } 579 | }, 580 | "node_modules/@esbuild/linux-loong64": { 581 | "version": "0.24.2", 582 | "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", 583 | "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", 584 | "cpu": [ 585 | "loong64" 586 | ], 587 | "dev": true, 588 | "license": "MIT", 589 | "optional": true, 590 | "os": [ 591 | "linux" 592 | ], 593 | "engines": { 594 | "node": ">=18" 595 | } 596 | }, 597 | "node_modules/@esbuild/linux-mips64el": { 598 | "version": "0.24.2", 599 | "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", 600 | "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", 601 | "cpu": [ 602 | "mips64el" 603 | ], 604 | "dev": true, 605 | "license": "MIT", 606 | "optional": true, 607 | "os": [ 608 | "linux" 609 | ], 610 | "engines": { 611 | "node": ">=18" 612 | } 613 | }, 614 | "node_modules/@esbuild/linux-ppc64": { 615 | "version": "0.24.2", 616 | "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", 617 | "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", 618 | "cpu": [ 619 | "ppc64" 620 | ], 621 | "dev": true, 622 | "license": "MIT", 623 | "optional": true, 624 | "os": [ 625 | "linux" 626 | ], 627 | "engines": { 628 | "node": ">=18" 629 | } 630 | }, 631 | "node_modules/@esbuild/linux-riscv64": { 632 | "version": "0.24.2", 633 | "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", 634 | "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", 635 | "cpu": [ 636 | "riscv64" 637 | ], 638 | "dev": true, 639 | "license": "MIT", 640 | "optional": true, 641 | "os": [ 642 | "linux" 643 | ], 644 | "engines": { 645 | "node": ">=18" 646 | } 647 | }, 648 | "node_modules/@esbuild/linux-s390x": { 649 | "version": "0.24.2", 650 | "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", 651 | "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", 652 | "cpu": [ 653 | "s390x" 654 | ], 655 | "dev": true, 656 | "license": "MIT", 657 | "optional": true, 658 | "os": [ 659 | "linux" 660 | ], 661 | "engines": { 662 | "node": ">=18" 663 | } 664 | }, 665 | "node_modules/@esbuild/linux-x64": { 666 | "version": "0.24.2", 667 | "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", 668 | "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", 669 | "cpu": [ 670 | "x64" 671 | ], 672 | "dev": true, 673 | "license": "MIT", 674 | "optional": true, 675 | "os": [ 676 | "linux" 677 | ], 678 | "engines": { 679 | "node": ">=18" 680 | } 681 | }, 682 | "node_modules/@esbuild/netbsd-arm64": { 683 | "version": "0.24.2", 684 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", 685 | "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", 686 | "cpu": [ 687 | "arm64" 688 | ], 689 | "dev": true, 690 | "license": "MIT", 691 | "optional": true, 692 | "os": [ 693 | "netbsd" 694 | ], 695 | "engines": { 696 | "node": ">=18" 697 | } 698 | }, 699 | "node_modules/@esbuild/netbsd-x64": { 700 | "version": "0.24.2", 701 | "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", 702 | "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", 703 | "cpu": [ 704 | "x64" 705 | ], 706 | "dev": true, 707 | "license": "MIT", 708 | "optional": true, 709 | "os": [ 710 | "netbsd" 711 | ], 712 | "engines": { 713 | "node": ">=18" 714 | } 715 | }, 716 | "node_modules/@esbuild/openbsd-arm64": { 717 | "version": "0.24.2", 718 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", 719 | "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", 720 | "cpu": [ 721 | "arm64" 722 | ], 723 | "dev": true, 724 | "license": "MIT", 725 | "optional": true, 726 | "os": [ 727 | "openbsd" 728 | ], 729 | "engines": { 730 | "node": ">=18" 731 | } 732 | }, 733 | "node_modules/@esbuild/openbsd-x64": { 734 | "version": "0.24.2", 735 | "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", 736 | "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", 737 | "cpu": [ 738 | "x64" 739 | ], 740 | "dev": true, 741 | "license": "MIT", 742 | "optional": true, 743 | "os": [ 744 | "openbsd" 745 | ], 746 | "engines": { 747 | "node": ">=18" 748 | } 749 | }, 750 | "node_modules/@esbuild/sunos-x64": { 751 | "version": "0.24.2", 752 | "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", 753 | "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", 754 | "cpu": [ 755 | "x64" 756 | ], 757 | "dev": true, 758 | "license": "MIT", 759 | "optional": true, 760 | "os": [ 761 | "sunos" 762 | ], 763 | "engines": { 764 | "node": ">=18" 765 | } 766 | }, 767 | "node_modules/@esbuild/win32-arm64": { 768 | "version": "0.24.2", 769 | "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", 770 | "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", 771 | "cpu": [ 772 | "arm64" 773 | ], 774 | "dev": true, 775 | "license": "MIT", 776 | "optional": true, 777 | "os": [ 778 | "win32" 779 | ], 780 | "engines": { 781 | "node": ">=18" 782 | } 783 | }, 784 | "node_modules/@esbuild/win32-ia32": { 785 | "version": "0.24.2", 786 | "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", 787 | "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", 788 | "cpu": [ 789 | "ia32" 790 | ], 791 | "dev": true, 792 | "license": "MIT", 793 | "optional": true, 794 | "os": [ 795 | "win32" 796 | ], 797 | "engines": { 798 | "node": ">=18" 799 | } 800 | }, 801 | "node_modules/@esbuild/win32-x64": { 802 | "version": "0.24.2", 803 | "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", 804 | "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", 805 | "cpu": [ 806 | "x64" 807 | ], 808 | "dev": true, 809 | "license": "MIT", 810 | "optional": true, 811 | "os": [ 812 | "win32" 813 | ], 814 | "engines": { 815 | "node": ">=18" 816 | } 817 | }, 818 | "node_modules/@isaacs/cliui": { 819 | "version": "8.0.2", 820 | "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", 821 | "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", 822 | "dev": true, 823 | "license": "ISC", 824 | "dependencies": { 825 | "string-width": "^5.1.2", 826 | "string-width-cjs": "npm:string-width@^4.2.0", 827 | "strip-ansi": "^7.0.1", 828 | "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", 829 | "wrap-ansi": "^8.1.0", 830 | "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" 831 | }, 832 | "engines": { 833 | "node": ">=12" 834 | } 835 | }, 836 | "node_modules/@jridgewell/gen-mapping": { 837 | "version": "0.3.8", 838 | "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", 839 | "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", 840 | "dev": true, 841 | "license": "MIT", 842 | "dependencies": { 843 | "@jridgewell/set-array": "^1.2.1", 844 | "@jridgewell/sourcemap-codec": "^1.4.10", 845 | "@jridgewell/trace-mapping": "^0.3.24" 846 | }, 847 | "engines": { 848 | "node": ">=6.0.0" 849 | } 850 | }, 851 | "node_modules/@jridgewell/resolve-uri": { 852 | "version": "3.1.2", 853 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 854 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 855 | "dev": true, 856 | "license": "MIT", 857 | "engines": { 858 | "node": ">=6.0.0" 859 | } 860 | }, 861 | "node_modules/@jridgewell/set-array": { 862 | "version": "1.2.1", 863 | "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", 864 | "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", 865 | "dev": true, 866 | "license": "MIT", 867 | "engines": { 868 | "node": ">=6.0.0" 869 | } 870 | }, 871 | "node_modules/@jridgewell/sourcemap-codec": { 872 | "version": "1.5.0", 873 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", 874 | "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", 875 | "dev": true, 876 | "license": "MIT" 877 | }, 878 | "node_modules/@jridgewell/trace-mapping": { 879 | "version": "0.3.25", 880 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", 881 | "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", 882 | "dev": true, 883 | "license": "MIT", 884 | "dependencies": { 885 | "@jridgewell/resolve-uri": "^3.1.0", 886 | "@jridgewell/sourcemap-codec": "^1.4.14" 887 | } 888 | }, 889 | "node_modules/@nodelib/fs.scandir": { 890 | "version": "2.1.5", 891 | "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", 892 | "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", 893 | "dev": true, 894 | "license": "MIT", 895 | "dependencies": { 896 | "@nodelib/fs.stat": "2.0.5", 897 | "run-parallel": "^1.1.9" 898 | }, 899 | "engines": { 900 | "node": ">= 8" 901 | } 902 | }, 903 | "node_modules/@nodelib/fs.stat": { 904 | "version": "2.0.5", 905 | "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", 906 | "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", 907 | "dev": true, 908 | "license": "MIT", 909 | "engines": { 910 | "node": ">= 8" 911 | } 912 | }, 913 | "node_modules/@nodelib/fs.walk": { 914 | "version": "1.2.8", 915 | "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", 916 | "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", 917 | "dev": true, 918 | "license": "MIT", 919 | "dependencies": { 920 | "@nodelib/fs.scandir": "2.1.5", 921 | "fastq": "^1.6.0" 922 | }, 923 | "engines": { 924 | "node": ">= 8" 925 | } 926 | }, 927 | "node_modules/@pkgjs/parseargs": { 928 | "version": "0.11.0", 929 | "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", 930 | "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", 931 | "dev": true, 932 | "license": "MIT", 933 | "optional": true, 934 | "engines": { 935 | "node": ">=14" 936 | } 937 | }, 938 | "node_modules/@rollup/pluginutils": { 939 | "version": "4.2.1", 940 | "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", 941 | "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", 942 | "dev": true, 943 | "license": "MIT", 944 | "dependencies": { 945 | "estree-walker": "^2.0.1", 946 | "picomatch": "^2.2.2" 947 | }, 948 | "engines": { 949 | "node": ">= 8.0.0" 950 | } 951 | }, 952 | "node_modules/@rollup/rollup-android-arm-eabi": { 953 | "version": "4.34.8", 954 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.8.tgz", 955 | "integrity": "sha512-q217OSE8DTp8AFHuNHXo0Y86e1wtlfVrXiAlwkIvGRQv9zbc6mE3sjIVfwI8sYUyNxwOg0j/Vm1RKM04JcWLJw==", 956 | "cpu": [ 957 | "arm" 958 | ], 959 | "dev": true, 960 | "license": "MIT", 961 | "optional": true, 962 | "os": [ 963 | "android" 964 | ] 965 | }, 966 | "node_modules/@rollup/rollup-android-arm64": { 967 | "version": "4.34.8", 968 | "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.8.tgz", 969 | "integrity": "sha512-Gigjz7mNWaOL9wCggvoK3jEIUUbGul656opstjaUSGC3eT0BM7PofdAJaBfPFWWkXNVAXbaQtC99OCg4sJv70Q==", 970 | "cpu": [ 971 | "arm64" 972 | ], 973 | "dev": true, 974 | "license": "MIT", 975 | "optional": true, 976 | "os": [ 977 | "android" 978 | ] 979 | }, 980 | "node_modules/@rollup/rollup-darwin-arm64": { 981 | "version": "4.34.8", 982 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.8.tgz", 983 | "integrity": "sha512-02rVdZ5tgdUNRxIUrFdcMBZQoaPMrxtwSb+/hOfBdqkatYHR3lZ2A2EGyHq2sGOd0Owk80oV3snlDASC24He3Q==", 984 | "cpu": [ 985 | "arm64" 986 | ], 987 | "dev": true, 988 | "license": "MIT", 989 | "optional": true, 990 | "os": [ 991 | "darwin" 992 | ] 993 | }, 994 | "node_modules/@rollup/rollup-darwin-x64": { 995 | "version": "4.34.8", 996 | "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.8.tgz", 997 | "integrity": "sha512-qIP/elwR/tq/dYRx3lgwK31jkZvMiD6qUtOycLhTzCvrjbZ3LjQnEM9rNhSGpbLXVJYQ3rq39A6Re0h9tU2ynw==", 998 | "cpu": [ 999 | "x64" 1000 | ], 1001 | "dev": true, 1002 | "license": "MIT", 1003 | "optional": true, 1004 | "os": [ 1005 | "darwin" 1006 | ] 1007 | }, 1008 | "node_modules/@rollup/rollup-freebsd-arm64": { 1009 | "version": "4.34.8", 1010 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.8.tgz", 1011 | "integrity": "sha512-IQNVXL9iY6NniYbTaOKdrlVP3XIqazBgJOVkddzJlqnCpRi/yAeSOa8PLcECFSQochzqApIOE1GHNu3pCz+BDA==", 1012 | "cpu": [ 1013 | "arm64" 1014 | ], 1015 | "dev": true, 1016 | "license": "MIT", 1017 | "optional": true, 1018 | "os": [ 1019 | "freebsd" 1020 | ] 1021 | }, 1022 | "node_modules/@rollup/rollup-freebsd-x64": { 1023 | "version": "4.34.8", 1024 | "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.8.tgz", 1025 | "integrity": "sha512-TYXcHghgnCqYFiE3FT5QwXtOZqDj5GmaFNTNt3jNC+vh22dc/ukG2cG+pi75QO4kACohZzidsq7yKTKwq/Jq7Q==", 1026 | "cpu": [ 1027 | "x64" 1028 | ], 1029 | "dev": true, 1030 | "license": "MIT", 1031 | "optional": true, 1032 | "os": [ 1033 | "freebsd" 1034 | ] 1035 | }, 1036 | "node_modules/@rollup/rollup-linux-arm-gnueabihf": { 1037 | "version": "4.34.8", 1038 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.8.tgz", 1039 | "integrity": "sha512-A4iphFGNkWRd+5m3VIGuqHnG3MVnqKe7Al57u9mwgbyZ2/xF9Jio72MaY7xxh+Y87VAHmGQr73qoKL9HPbXj1g==", 1040 | "cpu": [ 1041 | "arm" 1042 | ], 1043 | "dev": true, 1044 | "license": "MIT", 1045 | "optional": true, 1046 | "os": [ 1047 | "linux" 1048 | ] 1049 | }, 1050 | "node_modules/@rollup/rollup-linux-arm-musleabihf": { 1051 | "version": "4.34.8", 1052 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.8.tgz", 1053 | "integrity": "sha512-S0lqKLfTm5u+QTxlFiAnb2J/2dgQqRy/XvziPtDd1rKZFXHTyYLoVL58M/XFwDI01AQCDIevGLbQrMAtdyanpA==", 1054 | "cpu": [ 1055 | "arm" 1056 | ], 1057 | "dev": true, 1058 | "license": "MIT", 1059 | "optional": true, 1060 | "os": [ 1061 | "linux" 1062 | ] 1063 | }, 1064 | "node_modules/@rollup/rollup-linux-arm64-gnu": { 1065 | "version": "4.34.8", 1066 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.8.tgz", 1067 | "integrity": "sha512-jpz9YOuPiSkL4G4pqKrus0pn9aYwpImGkosRKwNi+sJSkz+WU3anZe6hi73StLOQdfXYXC7hUfsQlTnjMd3s1A==", 1068 | "cpu": [ 1069 | "arm64" 1070 | ], 1071 | "dev": true, 1072 | "license": "MIT", 1073 | "optional": true, 1074 | "os": [ 1075 | "linux" 1076 | ] 1077 | }, 1078 | "node_modules/@rollup/rollup-linux-arm64-musl": { 1079 | "version": "4.34.8", 1080 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.8.tgz", 1081 | "integrity": "sha512-KdSfaROOUJXgTVxJNAZ3KwkRc5nggDk+06P6lgi1HLv1hskgvxHUKZ4xtwHkVYJ1Rep4GNo+uEfycCRRxht7+Q==", 1082 | "cpu": [ 1083 | "arm64" 1084 | ], 1085 | "dev": true, 1086 | "license": "MIT", 1087 | "optional": true, 1088 | "os": [ 1089 | "linux" 1090 | ] 1091 | }, 1092 | "node_modules/@rollup/rollup-linux-loongarch64-gnu": { 1093 | "version": "4.34.8", 1094 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.8.tgz", 1095 | "integrity": "sha512-NyF4gcxwkMFRjgXBM6g2lkT58OWztZvw5KkV2K0qqSnUEqCVcqdh2jN4gQrTn/YUpAcNKyFHfoOZEer9nwo6uQ==", 1096 | "cpu": [ 1097 | "loong64" 1098 | ], 1099 | "dev": true, 1100 | "license": "MIT", 1101 | "optional": true, 1102 | "os": [ 1103 | "linux" 1104 | ] 1105 | }, 1106 | "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { 1107 | "version": "4.34.8", 1108 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.8.tgz", 1109 | "integrity": "sha512-LMJc999GkhGvktHU85zNTDImZVUCJ1z/MbAJTnviiWmmjyckP5aQsHtcujMjpNdMZPT2rQEDBlJfubhs3jsMfw==", 1110 | "cpu": [ 1111 | "ppc64" 1112 | ], 1113 | "dev": true, 1114 | "license": "MIT", 1115 | "optional": true, 1116 | "os": [ 1117 | "linux" 1118 | ] 1119 | }, 1120 | "node_modules/@rollup/rollup-linux-riscv64-gnu": { 1121 | "version": "4.34.8", 1122 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.8.tgz", 1123 | "integrity": "sha512-xAQCAHPj8nJq1PI3z8CIZzXuXCstquz7cIOL73HHdXiRcKk8Ywwqtx2wrIy23EcTn4aZ2fLJNBB8d0tQENPCmw==", 1124 | "cpu": [ 1125 | "riscv64" 1126 | ], 1127 | "dev": true, 1128 | "license": "MIT", 1129 | "optional": true, 1130 | "os": [ 1131 | "linux" 1132 | ] 1133 | }, 1134 | "node_modules/@rollup/rollup-linux-s390x-gnu": { 1135 | "version": "4.34.8", 1136 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.8.tgz", 1137 | "integrity": "sha512-DdePVk1NDEuc3fOe3dPPTb+rjMtuFw89gw6gVWxQFAuEqqSdDKnrwzZHrUYdac7A7dXl9Q2Vflxpme15gUWQFA==", 1138 | "cpu": [ 1139 | "s390x" 1140 | ], 1141 | "dev": true, 1142 | "license": "MIT", 1143 | "optional": true, 1144 | "os": [ 1145 | "linux" 1146 | ] 1147 | }, 1148 | "node_modules/@rollup/rollup-linux-x64-gnu": { 1149 | "version": "4.34.8", 1150 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.8.tgz", 1151 | "integrity": "sha512-8y7ED8gjxITUltTUEJLQdgpbPh1sUQ0kMTmufRF/Ns5tI9TNMNlhWtmPKKHCU0SilX+3MJkZ0zERYYGIVBYHIA==", 1152 | "cpu": [ 1153 | "x64" 1154 | ], 1155 | "dev": true, 1156 | "license": "MIT", 1157 | "optional": true, 1158 | "os": [ 1159 | "linux" 1160 | ] 1161 | }, 1162 | "node_modules/@rollup/rollup-linux-x64-musl": { 1163 | "version": "4.34.8", 1164 | "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.8.tgz", 1165 | "integrity": "sha512-SCXcP0ZpGFIe7Ge+McxY5zKxiEI5ra+GT3QRxL0pMMtxPfpyLAKleZODi1zdRHkz5/BhueUrYtYVgubqe9JBNQ==", 1166 | "cpu": [ 1167 | "x64" 1168 | ], 1169 | "dev": true, 1170 | "license": "MIT", 1171 | "optional": true, 1172 | "os": [ 1173 | "linux" 1174 | ] 1175 | }, 1176 | "node_modules/@rollup/rollup-win32-arm64-msvc": { 1177 | "version": "4.34.8", 1178 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.8.tgz", 1179 | "integrity": "sha512-YHYsgzZgFJzTRbth4h7Or0m5O74Yda+hLin0irAIobkLQFRQd1qWmnoVfwmKm9TXIZVAD0nZ+GEb2ICicLyCnQ==", 1180 | "cpu": [ 1181 | "arm64" 1182 | ], 1183 | "dev": true, 1184 | "license": "MIT", 1185 | "optional": true, 1186 | "os": [ 1187 | "win32" 1188 | ] 1189 | }, 1190 | "node_modules/@rollup/rollup-win32-ia32-msvc": { 1191 | "version": "4.34.8", 1192 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.8.tgz", 1193 | "integrity": "sha512-r3NRQrXkHr4uWy5TOjTpTYojR9XmF0j/RYgKCef+Ag46FWUTltm5ziticv8LdNsDMehjJ543x/+TJAek/xBA2w==", 1194 | "cpu": [ 1195 | "ia32" 1196 | ], 1197 | "dev": true, 1198 | "license": "MIT", 1199 | "optional": true, 1200 | "os": [ 1201 | "win32" 1202 | ] 1203 | }, 1204 | "node_modules/@rollup/rollup-win32-x64-msvc": { 1205 | "version": "4.34.8", 1206 | "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.8.tgz", 1207 | "integrity": "sha512-U0FaE5O1BCpZSeE6gBl3c5ObhePQSfk9vDRToMmTkbhCOgW4jqvtS5LGyQ76L1fH8sM0keRp4uDTsbjiUyjk0g==", 1208 | "cpu": [ 1209 | "x64" 1210 | ], 1211 | "dev": true, 1212 | "license": "MIT", 1213 | "optional": true, 1214 | "os": [ 1215 | "win32" 1216 | ] 1217 | }, 1218 | "node_modules/@types/estree": { 1219 | "version": "1.0.6", 1220 | "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", 1221 | "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", 1222 | "dev": true, 1223 | "license": "MIT" 1224 | }, 1225 | "node_modules/@types/prop-types": { 1226 | "version": "15.7.14", 1227 | "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", 1228 | "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", 1229 | "dev": true, 1230 | "license": "MIT" 1231 | }, 1232 | "node_modules/@types/react": { 1233 | "version": "17.0.83", 1234 | "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.83.tgz", 1235 | "integrity": "sha512-l0m4ArKJvmFtR4e8UmKrj1pB4tUgOhJITf+mADyF/p69Ts1YAR/E+G9XEM0mHXKVRa1dQNHseyyDNzeuAXfXQw==", 1236 | "dev": true, 1237 | "license": "MIT", 1238 | "dependencies": { 1239 | "@types/prop-types": "*", 1240 | "@types/scheduler": "^0.16", 1241 | "csstype": "^3.0.2" 1242 | } 1243 | }, 1244 | "node_modules/@types/react-dom": { 1245 | "version": "17.0.26", 1246 | "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-17.0.26.tgz", 1247 | "integrity": "sha512-Z+2VcYXJwOqQ79HreLU/1fyQ88eXSSFh6I3JdrEHQIfYSI0kCQpTGvOrbE6jFGGYXKsHuwY9tBa/w5Uo6KzrEg==", 1248 | "dev": true, 1249 | "license": "MIT", 1250 | "peerDependencies": { 1251 | "@types/react": "^17.0.0" 1252 | } 1253 | }, 1254 | "node_modules/@types/scheduler": { 1255 | "version": "0.16.8", 1256 | "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", 1257 | "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==", 1258 | "dev": true, 1259 | "license": "MIT" 1260 | }, 1261 | "node_modules/@types/vscode-webview": { 1262 | "version": "1.57.5", 1263 | "resolved": "https://registry.npmjs.org/@types/vscode-webview/-/vscode-webview-1.57.5.tgz", 1264 | "integrity": "sha512-iBAUYNYkz+uk1kdsq05fEcoh8gJmwT3lqqFPN7MGyjQ3HVloViMdo7ZJ8DFIP8WOK74PjOEilosqAyxV2iUFUw==", 1265 | "dev": true, 1266 | "license": "MIT" 1267 | }, 1268 | "node_modules/@vitejs/plugin-react": { 1269 | "version": "1.3.2", 1270 | "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-1.3.2.tgz", 1271 | "integrity": "sha512-aurBNmMo0kz1O4qRoY+FM4epSA39y3ShWGuqfLRA/3z0oEJAdtoSfgA3aO98/PCCHAqMaduLxIxErWrVKIFzXA==", 1272 | "dev": true, 1273 | "license": "MIT", 1274 | "dependencies": { 1275 | "@babel/core": "^7.17.10", 1276 | "@babel/plugin-transform-react-jsx": "^7.17.3", 1277 | "@babel/plugin-transform-react-jsx-development": "^7.16.7", 1278 | "@babel/plugin-transform-react-jsx-self": "^7.16.7", 1279 | "@babel/plugin-transform-react-jsx-source": "^7.16.7", 1280 | "@rollup/pluginutils": "^4.2.1", 1281 | "react-refresh": "^0.13.0", 1282 | "resolve": "^1.22.0" 1283 | }, 1284 | "engines": { 1285 | "node": ">=12.0.0" 1286 | } 1287 | }, 1288 | "node_modules/ansi-regex": { 1289 | "version": "6.1.0", 1290 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", 1291 | "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", 1292 | "dev": true, 1293 | "license": "MIT", 1294 | "engines": { 1295 | "node": ">=12" 1296 | }, 1297 | "funding": { 1298 | "url": "https://github.com/chalk/ansi-regex?sponsor=1" 1299 | } 1300 | }, 1301 | "node_modules/ansi-styles": { 1302 | "version": "6.2.1", 1303 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", 1304 | "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", 1305 | "dev": true, 1306 | "license": "MIT", 1307 | "engines": { 1308 | "node": ">=12" 1309 | }, 1310 | "funding": { 1311 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 1312 | } 1313 | }, 1314 | "node_modules/any-promise": { 1315 | "version": "1.3.0", 1316 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 1317 | "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", 1318 | "dev": true, 1319 | "license": "MIT" 1320 | }, 1321 | "node_modules/anymatch": { 1322 | "version": "3.1.3", 1323 | "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", 1324 | "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", 1325 | "dev": true, 1326 | "license": "ISC", 1327 | "dependencies": { 1328 | "normalize-path": "^3.0.0", 1329 | "picomatch": "^2.0.4" 1330 | }, 1331 | "engines": { 1332 | "node": ">= 8" 1333 | } 1334 | }, 1335 | "node_modules/arg": { 1336 | "version": "5.0.2", 1337 | "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", 1338 | "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", 1339 | "dev": true, 1340 | "license": "MIT" 1341 | }, 1342 | "node_modules/autoprefixer": { 1343 | "version": "10.4.20", 1344 | "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", 1345 | "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", 1346 | "dev": true, 1347 | "funding": [ 1348 | { 1349 | "type": "opencollective", 1350 | "url": "https://opencollective.com/postcss/" 1351 | }, 1352 | { 1353 | "type": "tidelift", 1354 | "url": "https://tidelift.com/funding/github/npm/autoprefixer" 1355 | }, 1356 | { 1357 | "type": "github", 1358 | "url": "https://github.com/sponsors/ai" 1359 | } 1360 | ], 1361 | "license": "MIT", 1362 | "dependencies": { 1363 | "browserslist": "^4.23.3", 1364 | "caniuse-lite": "^1.0.30001646", 1365 | "fraction.js": "^4.3.7", 1366 | "normalize-range": "^0.1.2", 1367 | "picocolors": "^1.0.1", 1368 | "postcss-value-parser": "^4.2.0" 1369 | }, 1370 | "bin": { 1371 | "autoprefixer": "bin/autoprefixer" 1372 | }, 1373 | "engines": { 1374 | "node": "^10 || ^12 || >=14" 1375 | }, 1376 | "peerDependencies": { 1377 | "postcss": "^8.1.0" 1378 | } 1379 | }, 1380 | "node_modules/balanced-match": { 1381 | "version": "1.0.2", 1382 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 1383 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", 1384 | "dev": true, 1385 | "license": "MIT" 1386 | }, 1387 | "node_modules/binary-extensions": { 1388 | "version": "2.3.0", 1389 | "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", 1390 | "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", 1391 | "dev": true, 1392 | "license": "MIT", 1393 | "engines": { 1394 | "node": ">=8" 1395 | }, 1396 | "funding": { 1397 | "url": "https://github.com/sponsors/sindresorhus" 1398 | } 1399 | }, 1400 | "node_modules/brace-expansion": { 1401 | "version": "2.0.1", 1402 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", 1403 | "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", 1404 | "dev": true, 1405 | "license": "MIT", 1406 | "dependencies": { 1407 | "balanced-match": "^1.0.0" 1408 | } 1409 | }, 1410 | "node_modules/braces": { 1411 | "version": "3.0.3", 1412 | "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", 1413 | "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", 1414 | "dev": true, 1415 | "license": "MIT", 1416 | "dependencies": { 1417 | "fill-range": "^7.1.1" 1418 | }, 1419 | "engines": { 1420 | "node": ">=8" 1421 | } 1422 | }, 1423 | "node_modules/browserslist": { 1424 | "version": "4.24.4", 1425 | "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", 1426 | "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", 1427 | "dev": true, 1428 | "funding": [ 1429 | { 1430 | "type": "opencollective", 1431 | "url": "https://opencollective.com/browserslist" 1432 | }, 1433 | { 1434 | "type": "tidelift", 1435 | "url": "https://tidelift.com/funding/github/npm/browserslist" 1436 | }, 1437 | { 1438 | "type": "github", 1439 | "url": "https://github.com/sponsors/ai" 1440 | } 1441 | ], 1442 | "license": "MIT", 1443 | "dependencies": { 1444 | "caniuse-lite": "^1.0.30001688", 1445 | "electron-to-chromium": "^1.5.73", 1446 | "node-releases": "^2.0.19", 1447 | "update-browserslist-db": "^1.1.1" 1448 | }, 1449 | "bin": { 1450 | "browserslist": "cli.js" 1451 | }, 1452 | "engines": { 1453 | "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" 1454 | } 1455 | }, 1456 | "node_modules/camelcase-css": { 1457 | "version": "2.0.1", 1458 | "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", 1459 | "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", 1460 | "dev": true, 1461 | "license": "MIT", 1462 | "engines": { 1463 | "node": ">= 6" 1464 | } 1465 | }, 1466 | "node_modules/caniuse-lite": { 1467 | "version": "1.0.30001700", 1468 | "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001700.tgz", 1469 | "integrity": "sha512-2S6XIXwaE7K7erT8dY+kLQcpa5ms63XlRkMkReXjle+kf6c5g38vyMl+Z5y8dSxOFDhcFe+nxnn261PLxBSQsQ==", 1470 | "dev": true, 1471 | "funding": [ 1472 | { 1473 | "type": "opencollective", 1474 | "url": "https://opencollective.com/browserslist" 1475 | }, 1476 | { 1477 | "type": "tidelift", 1478 | "url": "https://tidelift.com/funding/github/npm/caniuse-lite" 1479 | }, 1480 | { 1481 | "type": "github", 1482 | "url": "https://github.com/sponsors/ai" 1483 | } 1484 | ], 1485 | "license": "CC-BY-4.0" 1486 | }, 1487 | "node_modules/chokidar": { 1488 | "version": "3.6.0", 1489 | "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", 1490 | "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", 1491 | "dev": true, 1492 | "license": "MIT", 1493 | "dependencies": { 1494 | "anymatch": "~3.1.2", 1495 | "braces": "~3.0.2", 1496 | "glob-parent": "~5.1.2", 1497 | "is-binary-path": "~2.1.0", 1498 | "is-glob": "~4.0.1", 1499 | "normalize-path": "~3.0.0", 1500 | "readdirp": "~3.6.0" 1501 | }, 1502 | "engines": { 1503 | "node": ">= 8.10.0" 1504 | }, 1505 | "funding": { 1506 | "url": "https://paulmillr.com/funding/" 1507 | }, 1508 | "optionalDependencies": { 1509 | "fsevents": "~2.3.2" 1510 | } 1511 | }, 1512 | "node_modules/chokidar/node_modules/glob-parent": { 1513 | "version": "5.1.2", 1514 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1515 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1516 | "dev": true, 1517 | "license": "ISC", 1518 | "dependencies": { 1519 | "is-glob": "^4.0.1" 1520 | }, 1521 | "engines": { 1522 | "node": ">= 6" 1523 | } 1524 | }, 1525 | "node_modules/color-convert": { 1526 | "version": "2.0.1", 1527 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 1528 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 1529 | "dev": true, 1530 | "license": "MIT", 1531 | "dependencies": { 1532 | "color-name": "~1.1.4" 1533 | }, 1534 | "engines": { 1535 | "node": ">=7.0.0" 1536 | } 1537 | }, 1538 | "node_modules/color-name": { 1539 | "version": "1.1.4", 1540 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 1541 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 1542 | "dev": true, 1543 | "license": "MIT" 1544 | }, 1545 | "node_modules/commander": { 1546 | "version": "4.1.1", 1547 | "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", 1548 | "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", 1549 | "dev": true, 1550 | "license": "MIT", 1551 | "engines": { 1552 | "node": ">= 6" 1553 | } 1554 | }, 1555 | "node_modules/convert-source-map": { 1556 | "version": "2.0.0", 1557 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", 1558 | "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", 1559 | "dev": true, 1560 | "license": "MIT" 1561 | }, 1562 | "node_modules/cross-spawn": { 1563 | "version": "7.0.6", 1564 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", 1565 | "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", 1566 | "dev": true, 1567 | "license": "MIT", 1568 | "dependencies": { 1569 | "path-key": "^3.1.0", 1570 | "shebang-command": "^2.0.0", 1571 | "which": "^2.0.1" 1572 | }, 1573 | "engines": { 1574 | "node": ">= 8" 1575 | } 1576 | }, 1577 | "node_modules/cssesc": { 1578 | "version": "3.0.0", 1579 | "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", 1580 | "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", 1581 | "dev": true, 1582 | "license": "MIT", 1583 | "bin": { 1584 | "cssesc": "bin/cssesc" 1585 | }, 1586 | "engines": { 1587 | "node": ">=4" 1588 | } 1589 | }, 1590 | "node_modules/csstype": { 1591 | "version": "3.1.3", 1592 | "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", 1593 | "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", 1594 | "license": "MIT" 1595 | }, 1596 | "node_modules/debug": { 1597 | "version": "4.4.0", 1598 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", 1599 | "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", 1600 | "dev": true, 1601 | "license": "MIT", 1602 | "dependencies": { 1603 | "ms": "^2.1.3" 1604 | }, 1605 | "engines": { 1606 | "node": ">=6.0" 1607 | }, 1608 | "peerDependenciesMeta": { 1609 | "supports-color": { 1610 | "optional": true 1611 | } 1612 | } 1613 | }, 1614 | "node_modules/didyoumean": { 1615 | "version": "1.2.2", 1616 | "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", 1617 | "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", 1618 | "dev": true, 1619 | "license": "Apache-2.0" 1620 | }, 1621 | "node_modules/dlv": { 1622 | "version": "1.1.3", 1623 | "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", 1624 | "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", 1625 | "dev": true, 1626 | "license": "MIT" 1627 | }, 1628 | "node_modules/eastasianwidth": { 1629 | "version": "0.2.0", 1630 | "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", 1631 | "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", 1632 | "dev": true, 1633 | "license": "MIT" 1634 | }, 1635 | "node_modules/electron-to-chromium": { 1636 | "version": "1.5.102", 1637 | "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.102.tgz", 1638 | "integrity": "sha512-eHhqaja8tE/FNpIiBrvBjFV/SSKpyWHLvxuR9dPTdo+3V9ppdLmFB7ZZQ98qNovcngPLYIz0oOBF9P0FfZef5Q==", 1639 | "dev": true, 1640 | "license": "ISC" 1641 | }, 1642 | "node_modules/emoji-regex": { 1643 | "version": "9.2.2", 1644 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", 1645 | "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", 1646 | "dev": true, 1647 | "license": "MIT" 1648 | }, 1649 | "node_modules/esbuild": { 1650 | "version": "0.24.2", 1651 | "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", 1652 | "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", 1653 | "dev": true, 1654 | "hasInstallScript": true, 1655 | "license": "MIT", 1656 | "bin": { 1657 | "esbuild": "bin/esbuild" 1658 | }, 1659 | "engines": { 1660 | "node": ">=18" 1661 | }, 1662 | "optionalDependencies": { 1663 | "@esbuild/aix-ppc64": "0.24.2", 1664 | "@esbuild/android-arm": "0.24.2", 1665 | "@esbuild/android-arm64": "0.24.2", 1666 | "@esbuild/android-x64": "0.24.2", 1667 | "@esbuild/darwin-arm64": "0.24.2", 1668 | "@esbuild/darwin-x64": "0.24.2", 1669 | "@esbuild/freebsd-arm64": "0.24.2", 1670 | "@esbuild/freebsd-x64": "0.24.2", 1671 | "@esbuild/linux-arm": "0.24.2", 1672 | "@esbuild/linux-arm64": "0.24.2", 1673 | "@esbuild/linux-ia32": "0.24.2", 1674 | "@esbuild/linux-loong64": "0.24.2", 1675 | "@esbuild/linux-mips64el": "0.24.2", 1676 | "@esbuild/linux-ppc64": "0.24.2", 1677 | "@esbuild/linux-riscv64": "0.24.2", 1678 | "@esbuild/linux-s390x": "0.24.2", 1679 | "@esbuild/linux-x64": "0.24.2", 1680 | "@esbuild/netbsd-arm64": "0.24.2", 1681 | "@esbuild/netbsd-x64": "0.24.2", 1682 | "@esbuild/openbsd-arm64": "0.24.2", 1683 | "@esbuild/openbsd-x64": "0.24.2", 1684 | "@esbuild/sunos-x64": "0.24.2", 1685 | "@esbuild/win32-arm64": "0.24.2", 1686 | "@esbuild/win32-ia32": "0.24.2", 1687 | "@esbuild/win32-x64": "0.24.2" 1688 | } 1689 | }, 1690 | "node_modules/escalade": { 1691 | "version": "3.2.0", 1692 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", 1693 | "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", 1694 | "dev": true, 1695 | "license": "MIT", 1696 | "engines": { 1697 | "node": ">=6" 1698 | } 1699 | }, 1700 | "node_modules/estree-walker": { 1701 | "version": "2.0.2", 1702 | "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", 1703 | "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", 1704 | "dev": true, 1705 | "license": "MIT" 1706 | }, 1707 | "node_modules/fast-glob": { 1708 | "version": "3.3.3", 1709 | "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", 1710 | "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", 1711 | "dev": true, 1712 | "license": "MIT", 1713 | "dependencies": { 1714 | "@nodelib/fs.stat": "^2.0.2", 1715 | "@nodelib/fs.walk": "^1.2.3", 1716 | "glob-parent": "^5.1.2", 1717 | "merge2": "^1.3.0", 1718 | "micromatch": "^4.0.8" 1719 | }, 1720 | "engines": { 1721 | "node": ">=8.6.0" 1722 | } 1723 | }, 1724 | "node_modules/fast-glob/node_modules/glob-parent": { 1725 | "version": "5.1.2", 1726 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", 1727 | "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", 1728 | "dev": true, 1729 | "license": "ISC", 1730 | "dependencies": { 1731 | "is-glob": "^4.0.1" 1732 | }, 1733 | "engines": { 1734 | "node": ">= 6" 1735 | } 1736 | }, 1737 | "node_modules/fast-xml-parser": { 1738 | "version": "4.5.2", 1739 | "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.2.tgz", 1740 | "integrity": "sha512-xmnYV9o0StIz/0ArdzmWTxn9oDy0lH8Z80/8X/TD2EUQKXY4DHxoT9mYBqgGIG17DgddCJtH1M6DriMbalNsAA==", 1741 | "funding": [ 1742 | { 1743 | "type": "github", 1744 | "url": "https://github.com/sponsors/NaturalIntelligence" 1745 | } 1746 | ], 1747 | "license": "MIT", 1748 | "dependencies": { 1749 | "strnum": "^1.0.5" 1750 | }, 1751 | "bin": { 1752 | "fxparser": "src/cli/cli.js" 1753 | } 1754 | }, 1755 | "node_modules/fastq": { 1756 | "version": "1.19.0", 1757 | "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.0.tgz", 1758 | "integrity": "sha512-7SFSRCNjBQIZH/xZR3iy5iQYR8aGBE0h3VG6/cwlbrpdciNYBMotQav8c1XI3HjHH+NikUpP53nPdlZSdWmFzA==", 1759 | "dev": true, 1760 | "license": "ISC", 1761 | "dependencies": { 1762 | "reusify": "^1.0.4" 1763 | } 1764 | }, 1765 | "node_modules/fill-range": { 1766 | "version": "7.1.1", 1767 | "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", 1768 | "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", 1769 | "dev": true, 1770 | "license": "MIT", 1771 | "dependencies": { 1772 | "to-regex-range": "^5.0.1" 1773 | }, 1774 | "engines": { 1775 | "node": ">=8" 1776 | } 1777 | }, 1778 | "node_modules/foreground-child": { 1779 | "version": "3.3.0", 1780 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz", 1781 | "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==", 1782 | "dev": true, 1783 | "license": "ISC", 1784 | "dependencies": { 1785 | "cross-spawn": "^7.0.0", 1786 | "signal-exit": "^4.0.1" 1787 | }, 1788 | "engines": { 1789 | "node": ">=14" 1790 | }, 1791 | "funding": { 1792 | "url": "https://github.com/sponsors/isaacs" 1793 | } 1794 | }, 1795 | "node_modules/fraction.js": { 1796 | "version": "4.3.7", 1797 | "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", 1798 | "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", 1799 | "dev": true, 1800 | "license": "MIT", 1801 | "engines": { 1802 | "node": "*" 1803 | }, 1804 | "funding": { 1805 | "type": "patreon", 1806 | "url": "https://github.com/sponsors/rawify" 1807 | } 1808 | }, 1809 | "node_modules/fsevents": { 1810 | "version": "2.3.3", 1811 | "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", 1812 | "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", 1813 | "dev": true, 1814 | "hasInstallScript": true, 1815 | "license": "MIT", 1816 | "optional": true, 1817 | "os": [ 1818 | "darwin" 1819 | ], 1820 | "engines": { 1821 | "node": "^8.16.0 || ^10.6.0 || >=11.0.0" 1822 | } 1823 | }, 1824 | "node_modules/function-bind": { 1825 | "version": "1.1.2", 1826 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1827 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1828 | "dev": true, 1829 | "license": "MIT", 1830 | "funding": { 1831 | "url": "https://github.com/sponsors/ljharb" 1832 | } 1833 | }, 1834 | "node_modules/gensync": { 1835 | "version": "1.0.0-beta.2", 1836 | "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", 1837 | "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", 1838 | "dev": true, 1839 | "license": "MIT", 1840 | "engines": { 1841 | "node": ">=6.9.0" 1842 | } 1843 | }, 1844 | "node_modules/glob": { 1845 | "version": "10.4.5", 1846 | "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", 1847 | "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", 1848 | "dev": true, 1849 | "license": "ISC", 1850 | "dependencies": { 1851 | "foreground-child": "^3.1.0", 1852 | "jackspeak": "^3.1.2", 1853 | "minimatch": "^9.0.4", 1854 | "minipass": "^7.1.2", 1855 | "package-json-from-dist": "^1.0.0", 1856 | "path-scurry": "^1.11.1" 1857 | }, 1858 | "bin": { 1859 | "glob": "dist/esm/bin.mjs" 1860 | }, 1861 | "funding": { 1862 | "url": "https://github.com/sponsors/isaacs" 1863 | } 1864 | }, 1865 | "node_modules/glob-parent": { 1866 | "version": "6.0.2", 1867 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", 1868 | "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", 1869 | "dev": true, 1870 | "license": "ISC", 1871 | "dependencies": { 1872 | "is-glob": "^4.0.3" 1873 | }, 1874 | "engines": { 1875 | "node": ">=10.13.0" 1876 | } 1877 | }, 1878 | "node_modules/globals": { 1879 | "version": "11.12.0", 1880 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 1881 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 1882 | "dev": true, 1883 | "license": "MIT", 1884 | "engines": { 1885 | "node": ">=4" 1886 | } 1887 | }, 1888 | "node_modules/goober": { 1889 | "version": "2.1.16", 1890 | "resolved": "https://registry.npmjs.org/goober/-/goober-2.1.16.tgz", 1891 | "integrity": "sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==", 1892 | "license": "MIT", 1893 | "peerDependencies": { 1894 | "csstype": "^3.0.10" 1895 | } 1896 | }, 1897 | "node_modules/hasown": { 1898 | "version": "2.0.2", 1899 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1900 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1901 | "dev": true, 1902 | "license": "MIT", 1903 | "dependencies": { 1904 | "function-bind": "^1.1.2" 1905 | }, 1906 | "engines": { 1907 | "node": ">= 0.4" 1908 | } 1909 | }, 1910 | "node_modules/is-binary-path": { 1911 | "version": "2.1.0", 1912 | "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", 1913 | "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", 1914 | "dev": true, 1915 | "license": "MIT", 1916 | "dependencies": { 1917 | "binary-extensions": "^2.0.0" 1918 | }, 1919 | "engines": { 1920 | "node": ">=8" 1921 | } 1922 | }, 1923 | "node_modules/is-core-module": { 1924 | "version": "2.16.1", 1925 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", 1926 | "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", 1927 | "dev": true, 1928 | "license": "MIT", 1929 | "dependencies": { 1930 | "hasown": "^2.0.2" 1931 | }, 1932 | "engines": { 1933 | "node": ">= 0.4" 1934 | }, 1935 | "funding": { 1936 | "url": "https://github.com/sponsors/ljharb" 1937 | } 1938 | }, 1939 | "node_modules/is-extglob": { 1940 | "version": "2.1.1", 1941 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1942 | "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", 1943 | "dev": true, 1944 | "license": "MIT", 1945 | "engines": { 1946 | "node": ">=0.10.0" 1947 | } 1948 | }, 1949 | "node_modules/is-fullwidth-code-point": { 1950 | "version": "3.0.0", 1951 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1952 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1953 | "dev": true, 1954 | "license": "MIT", 1955 | "engines": { 1956 | "node": ">=8" 1957 | } 1958 | }, 1959 | "node_modules/is-glob": { 1960 | "version": "4.0.3", 1961 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", 1962 | "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", 1963 | "dev": true, 1964 | "license": "MIT", 1965 | "dependencies": { 1966 | "is-extglob": "^2.1.1" 1967 | }, 1968 | "engines": { 1969 | "node": ">=0.10.0" 1970 | } 1971 | }, 1972 | "node_modules/is-number": { 1973 | "version": "7.0.0", 1974 | "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", 1975 | "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", 1976 | "dev": true, 1977 | "license": "MIT", 1978 | "engines": { 1979 | "node": ">=0.12.0" 1980 | } 1981 | }, 1982 | "node_modules/isexe": { 1983 | "version": "2.0.0", 1984 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1985 | "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", 1986 | "dev": true, 1987 | "license": "ISC" 1988 | }, 1989 | "node_modules/jackspeak": { 1990 | "version": "3.4.3", 1991 | "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", 1992 | "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", 1993 | "dev": true, 1994 | "license": "BlueOak-1.0.0", 1995 | "dependencies": { 1996 | "@isaacs/cliui": "^8.0.2" 1997 | }, 1998 | "funding": { 1999 | "url": "https://github.com/sponsors/isaacs" 2000 | }, 2001 | "optionalDependencies": { 2002 | "@pkgjs/parseargs": "^0.11.0" 2003 | } 2004 | }, 2005 | "node_modules/jiti": { 2006 | "version": "1.21.7", 2007 | "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", 2008 | "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", 2009 | "dev": true, 2010 | "license": "MIT", 2011 | "bin": { 2012 | "jiti": "bin/jiti.js" 2013 | } 2014 | }, 2015 | "node_modules/js-tokens": { 2016 | "version": "4.0.0", 2017 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 2018 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 2019 | "license": "MIT" 2020 | }, 2021 | "node_modules/jsesc": { 2022 | "version": "3.1.0", 2023 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", 2024 | "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", 2025 | "dev": true, 2026 | "license": "MIT", 2027 | "bin": { 2028 | "jsesc": "bin/jsesc" 2029 | }, 2030 | "engines": { 2031 | "node": ">=6" 2032 | } 2033 | }, 2034 | "node_modules/json5": { 2035 | "version": "2.2.3", 2036 | "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", 2037 | "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", 2038 | "dev": true, 2039 | "license": "MIT", 2040 | "bin": { 2041 | "json5": "lib/cli.js" 2042 | }, 2043 | "engines": { 2044 | "node": ">=6" 2045 | } 2046 | }, 2047 | "node_modules/lilconfig": { 2048 | "version": "3.1.3", 2049 | "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", 2050 | "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", 2051 | "dev": true, 2052 | "license": "MIT", 2053 | "engines": { 2054 | "node": ">=14" 2055 | }, 2056 | "funding": { 2057 | "url": "https://github.com/sponsors/antonk52" 2058 | } 2059 | }, 2060 | "node_modules/lines-and-columns": { 2061 | "version": "1.2.4", 2062 | "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", 2063 | "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", 2064 | "dev": true, 2065 | "license": "MIT" 2066 | }, 2067 | "node_modules/loose-envify": { 2068 | "version": "1.4.0", 2069 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", 2070 | "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", 2071 | "license": "MIT", 2072 | "dependencies": { 2073 | "js-tokens": "^3.0.0 || ^4.0.0" 2074 | }, 2075 | "bin": { 2076 | "loose-envify": "cli.js" 2077 | } 2078 | }, 2079 | "node_modules/lru-cache": { 2080 | "version": "5.1.1", 2081 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 2082 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 2083 | "dev": true, 2084 | "license": "ISC", 2085 | "dependencies": { 2086 | "yallist": "^3.0.2" 2087 | } 2088 | }, 2089 | "node_modules/merge2": { 2090 | "version": "1.4.1", 2091 | "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", 2092 | "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", 2093 | "dev": true, 2094 | "license": "MIT", 2095 | "engines": { 2096 | "node": ">= 8" 2097 | } 2098 | }, 2099 | "node_modules/micromatch": { 2100 | "version": "4.0.8", 2101 | "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", 2102 | "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", 2103 | "dev": true, 2104 | "license": "MIT", 2105 | "dependencies": { 2106 | "braces": "^3.0.3", 2107 | "picomatch": "^2.3.1" 2108 | }, 2109 | "engines": { 2110 | "node": ">=8.6" 2111 | } 2112 | }, 2113 | "node_modules/minimatch": { 2114 | "version": "9.0.5", 2115 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", 2116 | "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", 2117 | "dev": true, 2118 | "license": "ISC", 2119 | "dependencies": { 2120 | "brace-expansion": "^2.0.1" 2121 | }, 2122 | "engines": { 2123 | "node": ">=16 || 14 >=14.17" 2124 | }, 2125 | "funding": { 2126 | "url": "https://github.com/sponsors/isaacs" 2127 | } 2128 | }, 2129 | "node_modules/minipass": { 2130 | "version": "7.1.2", 2131 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", 2132 | "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", 2133 | "dev": true, 2134 | "license": "ISC", 2135 | "engines": { 2136 | "node": ">=16 || 14 >=14.17" 2137 | } 2138 | }, 2139 | "node_modules/ms": { 2140 | "version": "2.1.3", 2141 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 2142 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", 2143 | "dev": true, 2144 | "license": "MIT" 2145 | }, 2146 | "node_modules/mz": { 2147 | "version": "2.7.0", 2148 | "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", 2149 | "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", 2150 | "dev": true, 2151 | "license": "MIT", 2152 | "dependencies": { 2153 | "any-promise": "^1.0.0", 2154 | "object-assign": "^4.0.1", 2155 | "thenify-all": "^1.0.0" 2156 | } 2157 | }, 2158 | "node_modules/nanoid": { 2159 | "version": "3.3.8", 2160 | "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", 2161 | "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", 2162 | "dev": true, 2163 | "funding": [ 2164 | { 2165 | "type": "github", 2166 | "url": "https://github.com/sponsors/ai" 2167 | } 2168 | ], 2169 | "license": "MIT", 2170 | "bin": { 2171 | "nanoid": "bin/nanoid.cjs" 2172 | }, 2173 | "engines": { 2174 | "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" 2175 | } 2176 | }, 2177 | "node_modules/node-releases": { 2178 | "version": "2.0.19", 2179 | "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", 2180 | "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", 2181 | "dev": true, 2182 | "license": "MIT" 2183 | }, 2184 | "node_modules/normalize-path": { 2185 | "version": "3.0.0", 2186 | "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", 2187 | "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", 2188 | "dev": true, 2189 | "license": "MIT", 2190 | "engines": { 2191 | "node": ">=0.10.0" 2192 | } 2193 | }, 2194 | "node_modules/normalize-range": { 2195 | "version": "0.1.2", 2196 | "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", 2197 | "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", 2198 | "dev": true, 2199 | "license": "MIT", 2200 | "engines": { 2201 | "node": ">=0.10.0" 2202 | } 2203 | }, 2204 | "node_modules/object-assign": { 2205 | "version": "4.1.1", 2206 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 2207 | "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", 2208 | "license": "MIT", 2209 | "engines": { 2210 | "node": ">=0.10.0" 2211 | } 2212 | }, 2213 | "node_modules/object-hash": { 2214 | "version": "3.0.0", 2215 | "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", 2216 | "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", 2217 | "dev": true, 2218 | "license": "MIT", 2219 | "engines": { 2220 | "node": ">= 6" 2221 | } 2222 | }, 2223 | "node_modules/package-json-from-dist": { 2224 | "version": "1.0.1", 2225 | "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", 2226 | "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", 2227 | "dev": true, 2228 | "license": "BlueOak-1.0.0" 2229 | }, 2230 | "node_modules/path-key": { 2231 | "version": "3.1.1", 2232 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", 2233 | "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", 2234 | "dev": true, 2235 | "license": "MIT", 2236 | "engines": { 2237 | "node": ">=8" 2238 | } 2239 | }, 2240 | "node_modules/path-parse": { 2241 | "version": "1.0.7", 2242 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 2243 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", 2244 | "dev": true, 2245 | "license": "MIT" 2246 | }, 2247 | "node_modules/path-scurry": { 2248 | "version": "1.11.1", 2249 | "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", 2250 | "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", 2251 | "dev": true, 2252 | "license": "BlueOak-1.0.0", 2253 | "dependencies": { 2254 | "lru-cache": "^10.2.0", 2255 | "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" 2256 | }, 2257 | "engines": { 2258 | "node": ">=16 || 14 >=14.18" 2259 | }, 2260 | "funding": { 2261 | "url": "https://github.com/sponsors/isaacs" 2262 | } 2263 | }, 2264 | "node_modules/path-scurry/node_modules/lru-cache": { 2265 | "version": "10.4.3", 2266 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", 2267 | "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", 2268 | "dev": true, 2269 | "license": "ISC" 2270 | }, 2271 | "node_modules/picocolors": { 2272 | "version": "1.1.1", 2273 | "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", 2274 | "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", 2275 | "dev": true, 2276 | "license": "ISC" 2277 | }, 2278 | "node_modules/picomatch": { 2279 | "version": "2.3.1", 2280 | "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", 2281 | "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", 2282 | "dev": true, 2283 | "license": "MIT", 2284 | "engines": { 2285 | "node": ">=8.6" 2286 | }, 2287 | "funding": { 2288 | "url": "https://github.com/sponsors/jonschlinkert" 2289 | } 2290 | }, 2291 | "node_modules/pify": { 2292 | "version": "2.3.0", 2293 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 2294 | "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", 2295 | "dev": true, 2296 | "license": "MIT", 2297 | "engines": { 2298 | "node": ">=0.10.0" 2299 | } 2300 | }, 2301 | "node_modules/pirates": { 2302 | "version": "4.0.6", 2303 | "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", 2304 | "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", 2305 | "dev": true, 2306 | "license": "MIT", 2307 | "engines": { 2308 | "node": ">= 6" 2309 | } 2310 | }, 2311 | "node_modules/postcss": { 2312 | "version": "8.5.2", 2313 | "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.2.tgz", 2314 | "integrity": "sha512-MjOadfU3Ys9KYoX0AdkBlFEF1Vx37uCCeN4ZHnmwm9FfpbsGWMZeBLMmmpY+6Ocqod7mkdZ0DT31OlbsFrLlkA==", 2315 | "dev": true, 2316 | "funding": [ 2317 | { 2318 | "type": "opencollective", 2319 | "url": "https://opencollective.com/postcss/" 2320 | }, 2321 | { 2322 | "type": "tidelift", 2323 | "url": "https://tidelift.com/funding/github/npm/postcss" 2324 | }, 2325 | { 2326 | "type": "github", 2327 | "url": "https://github.com/sponsors/ai" 2328 | } 2329 | ], 2330 | "license": "MIT", 2331 | "dependencies": { 2332 | "nanoid": "^3.3.8", 2333 | "picocolors": "^1.1.1", 2334 | "source-map-js": "^1.2.1" 2335 | }, 2336 | "engines": { 2337 | "node": "^10 || ^12 || >=14" 2338 | } 2339 | }, 2340 | "node_modules/postcss-import": { 2341 | "version": "15.1.0", 2342 | "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", 2343 | "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", 2344 | "dev": true, 2345 | "license": "MIT", 2346 | "dependencies": { 2347 | "postcss-value-parser": "^4.0.0", 2348 | "read-cache": "^1.0.0", 2349 | "resolve": "^1.1.7" 2350 | }, 2351 | "engines": { 2352 | "node": ">=14.0.0" 2353 | }, 2354 | "peerDependencies": { 2355 | "postcss": "^8.0.0" 2356 | } 2357 | }, 2358 | "node_modules/postcss-js": { 2359 | "version": "4.0.1", 2360 | "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", 2361 | "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", 2362 | "dev": true, 2363 | "license": "MIT", 2364 | "dependencies": { 2365 | "camelcase-css": "^2.0.1" 2366 | }, 2367 | "engines": { 2368 | "node": "^12 || ^14 || >= 16" 2369 | }, 2370 | "funding": { 2371 | "type": "opencollective", 2372 | "url": "https://opencollective.com/postcss/" 2373 | }, 2374 | "peerDependencies": { 2375 | "postcss": "^8.4.21" 2376 | } 2377 | }, 2378 | "node_modules/postcss-load-config": { 2379 | "version": "4.0.2", 2380 | "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", 2381 | "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", 2382 | "dev": true, 2383 | "funding": [ 2384 | { 2385 | "type": "opencollective", 2386 | "url": "https://opencollective.com/postcss/" 2387 | }, 2388 | { 2389 | "type": "github", 2390 | "url": "https://github.com/sponsors/ai" 2391 | } 2392 | ], 2393 | "license": "MIT", 2394 | "dependencies": { 2395 | "lilconfig": "^3.0.0", 2396 | "yaml": "^2.3.4" 2397 | }, 2398 | "engines": { 2399 | "node": ">= 14" 2400 | }, 2401 | "peerDependencies": { 2402 | "postcss": ">=8.0.9", 2403 | "ts-node": ">=9.0.0" 2404 | }, 2405 | "peerDependenciesMeta": { 2406 | "postcss": { 2407 | "optional": true 2408 | }, 2409 | "ts-node": { 2410 | "optional": true 2411 | } 2412 | } 2413 | }, 2414 | "node_modules/postcss-nested": { 2415 | "version": "6.2.0", 2416 | "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", 2417 | "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", 2418 | "dev": true, 2419 | "funding": [ 2420 | { 2421 | "type": "opencollective", 2422 | "url": "https://opencollective.com/postcss/" 2423 | }, 2424 | { 2425 | "type": "github", 2426 | "url": "https://github.com/sponsors/ai" 2427 | } 2428 | ], 2429 | "license": "MIT", 2430 | "dependencies": { 2431 | "postcss-selector-parser": "^6.1.1" 2432 | }, 2433 | "engines": { 2434 | "node": ">=12.0" 2435 | }, 2436 | "peerDependencies": { 2437 | "postcss": "^8.2.14" 2438 | } 2439 | }, 2440 | "node_modules/postcss-selector-parser": { 2441 | "version": "6.1.2", 2442 | "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", 2443 | "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", 2444 | "dev": true, 2445 | "license": "MIT", 2446 | "dependencies": { 2447 | "cssesc": "^3.0.0", 2448 | "util-deprecate": "^1.0.2" 2449 | }, 2450 | "engines": { 2451 | "node": ">=4" 2452 | } 2453 | }, 2454 | "node_modules/postcss-value-parser": { 2455 | "version": "4.2.0", 2456 | "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", 2457 | "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", 2458 | "dev": true, 2459 | "license": "MIT" 2460 | }, 2461 | "node_modules/queue-microtask": { 2462 | "version": "1.2.3", 2463 | "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", 2464 | "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", 2465 | "dev": true, 2466 | "funding": [ 2467 | { 2468 | "type": "github", 2469 | "url": "https://github.com/sponsors/feross" 2470 | }, 2471 | { 2472 | "type": "patreon", 2473 | "url": "https://www.patreon.com/feross" 2474 | }, 2475 | { 2476 | "type": "consulting", 2477 | "url": "https://feross.org/support" 2478 | } 2479 | ], 2480 | "license": "MIT" 2481 | }, 2482 | "node_modules/react": { 2483 | "version": "17.0.2", 2484 | "resolved": "https://registry.npmjs.org/react/-/react-17.0.2.tgz", 2485 | "integrity": "sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==", 2486 | "license": "MIT", 2487 | "dependencies": { 2488 | "loose-envify": "^1.1.0", 2489 | "object-assign": "^4.1.1" 2490 | }, 2491 | "engines": { 2492 | "node": ">=0.10.0" 2493 | } 2494 | }, 2495 | "node_modules/react-dom": { 2496 | "version": "17.0.2", 2497 | "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.2.tgz", 2498 | "integrity": "sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==", 2499 | "license": "MIT", 2500 | "dependencies": { 2501 | "loose-envify": "^1.1.0", 2502 | "object-assign": "^4.1.1", 2503 | "scheduler": "^0.20.2" 2504 | }, 2505 | "peerDependencies": { 2506 | "react": "17.0.2" 2507 | } 2508 | }, 2509 | "node_modules/react-hot-toast": { 2510 | "version": "2.5.2", 2511 | "resolved": "https://registry.npmjs.org/react-hot-toast/-/react-hot-toast-2.5.2.tgz", 2512 | "integrity": "sha512-Tun3BbCxzmXXM7C+NI4qiv6lT0uwGh4oAfeJyNOjYUejTsm35mK9iCaYLGv8cBz9L5YxZLx/2ii7zsIwPtPUdw==", 2513 | "license": "MIT", 2514 | "dependencies": { 2515 | "csstype": "^3.1.3", 2516 | "goober": "^2.1.16" 2517 | }, 2518 | "engines": { 2519 | "node": ">=10" 2520 | }, 2521 | "peerDependencies": { 2522 | "react": ">=16", 2523 | "react-dom": ">=16" 2524 | } 2525 | }, 2526 | "node_modules/react-icons": { 2527 | "version": "4.12.0", 2528 | "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz", 2529 | "integrity": "sha512-IBaDuHiShdZqmfc/TwHu6+d6k2ltNCf3AszxNmjJc1KUfXdEeRJOKyNvLmAHaarhzGmTSVygNdyu8/opXv2gaw==", 2530 | "license": "MIT", 2531 | "peerDependencies": { 2532 | "react": "*" 2533 | } 2534 | }, 2535 | "node_modules/react-refresh": { 2536 | "version": "0.13.0", 2537 | "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.13.0.tgz", 2538 | "integrity": "sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==", 2539 | "dev": true, 2540 | "license": "MIT", 2541 | "engines": { 2542 | "node": ">=0.10.0" 2543 | } 2544 | }, 2545 | "node_modules/read-cache": { 2546 | "version": "1.0.0", 2547 | "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", 2548 | "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", 2549 | "dev": true, 2550 | "license": "MIT", 2551 | "dependencies": { 2552 | "pify": "^2.3.0" 2553 | } 2554 | }, 2555 | "node_modules/readdirp": { 2556 | "version": "3.6.0", 2557 | "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", 2558 | "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", 2559 | "dev": true, 2560 | "license": "MIT", 2561 | "dependencies": { 2562 | "picomatch": "^2.2.1" 2563 | }, 2564 | "engines": { 2565 | "node": ">=8.10.0" 2566 | } 2567 | }, 2568 | "node_modules/resolve": { 2569 | "version": "1.22.10", 2570 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", 2571 | "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", 2572 | "dev": true, 2573 | "license": "MIT", 2574 | "dependencies": { 2575 | "is-core-module": "^2.16.0", 2576 | "path-parse": "^1.0.7", 2577 | "supports-preserve-symlinks-flag": "^1.0.0" 2578 | }, 2579 | "bin": { 2580 | "resolve": "bin/resolve" 2581 | }, 2582 | "engines": { 2583 | "node": ">= 0.4" 2584 | }, 2585 | "funding": { 2586 | "url": "https://github.com/sponsors/ljharb" 2587 | } 2588 | }, 2589 | "node_modules/reusify": { 2590 | "version": "1.0.4", 2591 | "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", 2592 | "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", 2593 | "dev": true, 2594 | "license": "MIT", 2595 | "engines": { 2596 | "iojs": ">=1.0.0", 2597 | "node": ">=0.10.0" 2598 | } 2599 | }, 2600 | "node_modules/rollup": { 2601 | "version": "4.34.8", 2602 | "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.8.tgz", 2603 | "integrity": "sha512-489gTVMzAYdiZHFVA/ig/iYFllCcWFHMvUHI1rpFmkoUtRlQxqh6/yiNqnYibjMZ2b/+FUQwldG+aLsEt6bglQ==", 2604 | "dev": true, 2605 | "license": "MIT", 2606 | "dependencies": { 2607 | "@types/estree": "1.0.6" 2608 | }, 2609 | "bin": { 2610 | "rollup": "dist/bin/rollup" 2611 | }, 2612 | "engines": { 2613 | "node": ">=18.0.0", 2614 | "npm": ">=8.0.0" 2615 | }, 2616 | "optionalDependencies": { 2617 | "@rollup/rollup-android-arm-eabi": "4.34.8", 2618 | "@rollup/rollup-android-arm64": "4.34.8", 2619 | "@rollup/rollup-darwin-arm64": "4.34.8", 2620 | "@rollup/rollup-darwin-x64": "4.34.8", 2621 | "@rollup/rollup-freebsd-arm64": "4.34.8", 2622 | "@rollup/rollup-freebsd-x64": "4.34.8", 2623 | "@rollup/rollup-linux-arm-gnueabihf": "4.34.8", 2624 | "@rollup/rollup-linux-arm-musleabihf": "4.34.8", 2625 | "@rollup/rollup-linux-arm64-gnu": "4.34.8", 2626 | "@rollup/rollup-linux-arm64-musl": "4.34.8", 2627 | "@rollup/rollup-linux-loongarch64-gnu": "4.34.8", 2628 | "@rollup/rollup-linux-powerpc64le-gnu": "4.34.8", 2629 | "@rollup/rollup-linux-riscv64-gnu": "4.34.8", 2630 | "@rollup/rollup-linux-s390x-gnu": "4.34.8", 2631 | "@rollup/rollup-linux-x64-gnu": "4.34.8", 2632 | "@rollup/rollup-linux-x64-musl": "4.34.8", 2633 | "@rollup/rollup-win32-arm64-msvc": "4.34.8", 2634 | "@rollup/rollup-win32-ia32-msvc": "4.34.8", 2635 | "@rollup/rollup-win32-x64-msvc": "4.34.8", 2636 | "fsevents": "~2.3.2" 2637 | } 2638 | }, 2639 | "node_modules/run-parallel": { 2640 | "version": "1.2.0", 2641 | "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", 2642 | "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", 2643 | "dev": true, 2644 | "funding": [ 2645 | { 2646 | "type": "github", 2647 | "url": "https://github.com/sponsors/feross" 2648 | }, 2649 | { 2650 | "type": "patreon", 2651 | "url": "https://www.patreon.com/feross" 2652 | }, 2653 | { 2654 | "type": "consulting", 2655 | "url": "https://feross.org/support" 2656 | } 2657 | ], 2658 | "license": "MIT", 2659 | "dependencies": { 2660 | "queue-microtask": "^1.2.2" 2661 | } 2662 | }, 2663 | "node_modules/scheduler": { 2664 | "version": "0.20.2", 2665 | "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz", 2666 | "integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==", 2667 | "license": "MIT", 2668 | "dependencies": { 2669 | "loose-envify": "^1.1.0", 2670 | "object-assign": "^4.1.1" 2671 | } 2672 | }, 2673 | "node_modules/semver": { 2674 | "version": "6.3.1", 2675 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", 2676 | "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", 2677 | "dev": true, 2678 | "license": "ISC", 2679 | "bin": { 2680 | "semver": "bin/semver.js" 2681 | } 2682 | }, 2683 | "node_modules/shebang-command": { 2684 | "version": "2.0.0", 2685 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", 2686 | "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", 2687 | "dev": true, 2688 | "license": "MIT", 2689 | "dependencies": { 2690 | "shebang-regex": "^3.0.0" 2691 | }, 2692 | "engines": { 2693 | "node": ">=8" 2694 | } 2695 | }, 2696 | "node_modules/shebang-regex": { 2697 | "version": "3.0.0", 2698 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", 2699 | "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", 2700 | "dev": true, 2701 | "license": "MIT", 2702 | "engines": { 2703 | "node": ">=8" 2704 | } 2705 | }, 2706 | "node_modules/signal-exit": { 2707 | "version": "4.1.0", 2708 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", 2709 | "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", 2710 | "dev": true, 2711 | "license": "ISC", 2712 | "engines": { 2713 | "node": ">=14" 2714 | }, 2715 | "funding": { 2716 | "url": "https://github.com/sponsors/isaacs" 2717 | } 2718 | }, 2719 | "node_modules/source-map-js": { 2720 | "version": "1.2.1", 2721 | "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", 2722 | "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", 2723 | "dev": true, 2724 | "license": "BSD-3-Clause", 2725 | "engines": { 2726 | "node": ">=0.10.0" 2727 | } 2728 | }, 2729 | "node_modules/string-width": { 2730 | "version": "5.1.2", 2731 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", 2732 | "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", 2733 | "dev": true, 2734 | "license": "MIT", 2735 | "dependencies": { 2736 | "eastasianwidth": "^0.2.0", 2737 | "emoji-regex": "^9.2.2", 2738 | "strip-ansi": "^7.0.1" 2739 | }, 2740 | "engines": { 2741 | "node": ">=12" 2742 | }, 2743 | "funding": { 2744 | "url": "https://github.com/sponsors/sindresorhus" 2745 | } 2746 | }, 2747 | "node_modules/string-width-cjs": { 2748 | "name": "string-width", 2749 | "version": "4.2.3", 2750 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2751 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2752 | "dev": true, 2753 | "license": "MIT", 2754 | "dependencies": { 2755 | "emoji-regex": "^8.0.0", 2756 | "is-fullwidth-code-point": "^3.0.0", 2757 | "strip-ansi": "^6.0.1" 2758 | }, 2759 | "engines": { 2760 | "node": ">=8" 2761 | } 2762 | }, 2763 | "node_modules/string-width-cjs/node_modules/ansi-regex": { 2764 | "version": "5.0.1", 2765 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2766 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2767 | "dev": true, 2768 | "license": "MIT", 2769 | "engines": { 2770 | "node": ">=8" 2771 | } 2772 | }, 2773 | "node_modules/string-width-cjs/node_modules/emoji-regex": { 2774 | "version": "8.0.0", 2775 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 2776 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 2777 | "dev": true, 2778 | "license": "MIT" 2779 | }, 2780 | "node_modules/string-width-cjs/node_modules/strip-ansi": { 2781 | "version": "6.0.1", 2782 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2783 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2784 | "dev": true, 2785 | "license": "MIT", 2786 | "dependencies": { 2787 | "ansi-regex": "^5.0.1" 2788 | }, 2789 | "engines": { 2790 | "node": ">=8" 2791 | } 2792 | }, 2793 | "node_modules/strip-ansi": { 2794 | "version": "7.1.0", 2795 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", 2796 | "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", 2797 | "dev": true, 2798 | "license": "MIT", 2799 | "dependencies": { 2800 | "ansi-regex": "^6.0.1" 2801 | }, 2802 | "engines": { 2803 | "node": ">=12" 2804 | }, 2805 | "funding": { 2806 | "url": "https://github.com/chalk/strip-ansi?sponsor=1" 2807 | } 2808 | }, 2809 | "node_modules/strip-ansi-cjs": { 2810 | "name": "strip-ansi", 2811 | "version": "6.0.1", 2812 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2813 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2814 | "dev": true, 2815 | "license": "MIT", 2816 | "dependencies": { 2817 | "ansi-regex": "^5.0.1" 2818 | }, 2819 | "engines": { 2820 | "node": ">=8" 2821 | } 2822 | }, 2823 | "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { 2824 | "version": "5.0.1", 2825 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 2826 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 2827 | "dev": true, 2828 | "license": "MIT", 2829 | "engines": { 2830 | "node": ">=8" 2831 | } 2832 | }, 2833 | "node_modules/strnum": { 2834 | "version": "1.0.5", 2835 | "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", 2836 | "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==", 2837 | "license": "MIT" 2838 | }, 2839 | "node_modules/sucrase": { 2840 | "version": "3.35.0", 2841 | "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", 2842 | "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", 2843 | "dev": true, 2844 | "license": "MIT", 2845 | "dependencies": { 2846 | "@jridgewell/gen-mapping": "^0.3.2", 2847 | "commander": "^4.0.0", 2848 | "glob": "^10.3.10", 2849 | "lines-and-columns": "^1.1.6", 2850 | "mz": "^2.7.0", 2851 | "pirates": "^4.0.1", 2852 | "ts-interface-checker": "^0.1.9" 2853 | }, 2854 | "bin": { 2855 | "sucrase": "bin/sucrase", 2856 | "sucrase-node": "bin/sucrase-node" 2857 | }, 2858 | "engines": { 2859 | "node": ">=16 || 14 >=14.17" 2860 | } 2861 | }, 2862 | "node_modules/supports-preserve-symlinks-flag": { 2863 | "version": "1.0.0", 2864 | "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", 2865 | "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", 2866 | "dev": true, 2867 | "license": "MIT", 2868 | "engines": { 2869 | "node": ">= 0.4" 2870 | }, 2871 | "funding": { 2872 | "url": "https://github.com/sponsors/ljharb" 2873 | } 2874 | }, 2875 | "node_modules/tailwindcss": { 2876 | "version": "3.4.17", 2877 | "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", 2878 | "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", 2879 | "dev": true, 2880 | "license": "MIT", 2881 | "dependencies": { 2882 | "@alloc/quick-lru": "^5.2.0", 2883 | "arg": "^5.0.2", 2884 | "chokidar": "^3.6.0", 2885 | "didyoumean": "^1.2.2", 2886 | "dlv": "^1.1.3", 2887 | "fast-glob": "^3.3.2", 2888 | "glob-parent": "^6.0.2", 2889 | "is-glob": "^4.0.3", 2890 | "jiti": "^1.21.6", 2891 | "lilconfig": "^3.1.3", 2892 | "micromatch": "^4.0.8", 2893 | "normalize-path": "^3.0.0", 2894 | "object-hash": "^3.0.0", 2895 | "picocolors": "^1.1.1", 2896 | "postcss": "^8.4.47", 2897 | "postcss-import": "^15.1.0", 2898 | "postcss-js": "^4.0.1", 2899 | "postcss-load-config": "^4.0.2", 2900 | "postcss-nested": "^6.2.0", 2901 | "postcss-selector-parser": "^6.1.2", 2902 | "resolve": "^1.22.8", 2903 | "sucrase": "^3.35.0" 2904 | }, 2905 | "bin": { 2906 | "tailwind": "lib/cli.js", 2907 | "tailwindcss": "lib/cli.js" 2908 | }, 2909 | "engines": { 2910 | "node": ">=14.0.0" 2911 | } 2912 | }, 2913 | "node_modules/thenify": { 2914 | "version": "3.3.1", 2915 | "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", 2916 | "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", 2917 | "dev": true, 2918 | "license": "MIT", 2919 | "dependencies": { 2920 | "any-promise": "^1.0.0" 2921 | } 2922 | }, 2923 | "node_modules/thenify-all": { 2924 | "version": "1.6.0", 2925 | "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", 2926 | "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", 2927 | "dev": true, 2928 | "license": "MIT", 2929 | "dependencies": { 2930 | "thenify": ">= 3.1.0 < 4" 2931 | }, 2932 | "engines": { 2933 | "node": ">=0.8" 2934 | } 2935 | }, 2936 | "node_modules/to-regex-range": { 2937 | "version": "5.0.1", 2938 | "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2939 | "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", 2940 | "dev": true, 2941 | "license": "MIT", 2942 | "dependencies": { 2943 | "is-number": "^7.0.0" 2944 | }, 2945 | "engines": { 2946 | "node": ">=8.0" 2947 | } 2948 | }, 2949 | "node_modules/ts-interface-checker": { 2950 | "version": "0.1.13", 2951 | "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", 2952 | "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", 2953 | "dev": true, 2954 | "license": "Apache-2.0" 2955 | }, 2956 | "node_modules/typescript": { 2957 | "version": "4.9.5", 2958 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", 2959 | "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", 2960 | "dev": true, 2961 | "license": "Apache-2.0", 2962 | "bin": { 2963 | "tsc": "bin/tsc", 2964 | "tsserver": "bin/tsserver" 2965 | }, 2966 | "engines": { 2967 | "node": ">=4.2.0" 2968 | } 2969 | }, 2970 | "node_modules/update-browserslist-db": { 2971 | "version": "1.1.2", 2972 | "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", 2973 | "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", 2974 | "dev": true, 2975 | "funding": [ 2976 | { 2977 | "type": "opencollective", 2978 | "url": "https://opencollective.com/browserslist" 2979 | }, 2980 | { 2981 | "type": "tidelift", 2982 | "url": "https://tidelift.com/funding/github/npm/browserslist" 2983 | }, 2984 | { 2985 | "type": "github", 2986 | "url": "https://github.com/sponsors/ai" 2987 | } 2988 | ], 2989 | "license": "MIT", 2990 | "dependencies": { 2991 | "escalade": "^3.2.0", 2992 | "picocolors": "^1.1.1" 2993 | }, 2994 | "bin": { 2995 | "update-browserslist-db": "cli.js" 2996 | }, 2997 | "peerDependencies": { 2998 | "browserslist": ">= 4.21.0" 2999 | } 3000 | }, 3001 | "node_modules/util-deprecate": { 3002 | "version": "1.0.2", 3003 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 3004 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", 3005 | "dev": true, 3006 | "license": "MIT" 3007 | }, 3008 | "node_modules/vite": { 3009 | "version": "6.1.1", 3010 | "resolved": "https://registry.npmjs.org/vite/-/vite-6.1.1.tgz", 3011 | "integrity": "sha512-4GgM54XrwRfrOp297aIYspIti66k56v16ZnqHvrIM7mG+HjDlAwS7p+Srr7J6fGvEdOJ5JcQ/D9T7HhtdXDTzA==", 3012 | "dev": true, 3013 | "license": "MIT", 3014 | "dependencies": { 3015 | "esbuild": "^0.24.2", 3016 | "postcss": "^8.5.2", 3017 | "rollup": "^4.30.1" 3018 | }, 3019 | "bin": { 3020 | "vite": "bin/vite.js" 3021 | }, 3022 | "engines": { 3023 | "node": "^18.0.0 || ^20.0.0 || >=22.0.0" 3024 | }, 3025 | "funding": { 3026 | "url": "https://github.com/vitejs/vite?sponsor=1" 3027 | }, 3028 | "optionalDependencies": { 3029 | "fsevents": "~2.3.3" 3030 | }, 3031 | "peerDependencies": { 3032 | "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", 3033 | "jiti": ">=1.21.0", 3034 | "less": "*", 3035 | "lightningcss": "^1.21.0", 3036 | "sass": "*", 3037 | "sass-embedded": "*", 3038 | "stylus": "*", 3039 | "sugarss": "*", 3040 | "terser": "^5.16.0", 3041 | "tsx": "^4.8.1", 3042 | "yaml": "^2.4.2" 3043 | }, 3044 | "peerDependenciesMeta": { 3045 | "@types/node": { 3046 | "optional": true 3047 | }, 3048 | "jiti": { 3049 | "optional": true 3050 | }, 3051 | "less": { 3052 | "optional": true 3053 | }, 3054 | "lightningcss": { 3055 | "optional": true 3056 | }, 3057 | "sass": { 3058 | "optional": true 3059 | }, 3060 | "sass-embedded": { 3061 | "optional": true 3062 | }, 3063 | "stylus": { 3064 | "optional": true 3065 | }, 3066 | "sugarss": { 3067 | "optional": true 3068 | }, 3069 | "terser": { 3070 | "optional": true 3071 | }, 3072 | "tsx": { 3073 | "optional": true 3074 | }, 3075 | "yaml": { 3076 | "optional": true 3077 | } 3078 | } 3079 | }, 3080 | "node_modules/which": { 3081 | "version": "2.0.2", 3082 | "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", 3083 | "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", 3084 | "dev": true, 3085 | "license": "ISC", 3086 | "dependencies": { 3087 | "isexe": "^2.0.0" 3088 | }, 3089 | "bin": { 3090 | "node-which": "bin/node-which" 3091 | }, 3092 | "engines": { 3093 | "node": ">= 8" 3094 | } 3095 | }, 3096 | "node_modules/wrap-ansi": { 3097 | "version": "8.1.0", 3098 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", 3099 | "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", 3100 | "dev": true, 3101 | "license": "MIT", 3102 | "dependencies": { 3103 | "ansi-styles": "^6.1.0", 3104 | "string-width": "^5.0.1", 3105 | "strip-ansi": "^7.0.1" 3106 | }, 3107 | "engines": { 3108 | "node": ">=12" 3109 | }, 3110 | "funding": { 3111 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3112 | } 3113 | }, 3114 | "node_modules/wrap-ansi-cjs": { 3115 | "name": "wrap-ansi", 3116 | "version": "7.0.0", 3117 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 3118 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 3119 | "dev": true, 3120 | "license": "MIT", 3121 | "dependencies": { 3122 | "ansi-styles": "^4.0.0", 3123 | "string-width": "^4.1.0", 3124 | "strip-ansi": "^6.0.0" 3125 | }, 3126 | "engines": { 3127 | "node": ">=10" 3128 | }, 3129 | "funding": { 3130 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 3131 | } 3132 | }, 3133 | "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { 3134 | "version": "5.0.1", 3135 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 3136 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 3137 | "dev": true, 3138 | "license": "MIT", 3139 | "engines": { 3140 | "node": ">=8" 3141 | } 3142 | }, 3143 | "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { 3144 | "version": "4.3.0", 3145 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 3146 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 3147 | "dev": true, 3148 | "license": "MIT", 3149 | "dependencies": { 3150 | "color-convert": "^2.0.1" 3151 | }, 3152 | "engines": { 3153 | "node": ">=8" 3154 | }, 3155 | "funding": { 3156 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 3157 | } 3158 | }, 3159 | "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { 3160 | "version": "8.0.0", 3161 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 3162 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 3163 | "dev": true, 3164 | "license": "MIT" 3165 | }, 3166 | "node_modules/wrap-ansi-cjs/node_modules/string-width": { 3167 | "version": "4.2.3", 3168 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 3169 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 3170 | "dev": true, 3171 | "license": "MIT", 3172 | "dependencies": { 3173 | "emoji-regex": "^8.0.0", 3174 | "is-fullwidth-code-point": "^3.0.0", 3175 | "strip-ansi": "^6.0.1" 3176 | }, 3177 | "engines": { 3178 | "node": ">=8" 3179 | } 3180 | }, 3181 | "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { 3182 | "version": "6.0.1", 3183 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 3184 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 3185 | "dev": true, 3186 | "license": "MIT", 3187 | "dependencies": { 3188 | "ansi-regex": "^5.0.1" 3189 | }, 3190 | "engines": { 3191 | "node": ">=8" 3192 | } 3193 | }, 3194 | "node_modules/yallist": { 3195 | "version": "3.1.1", 3196 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 3197 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", 3198 | "dev": true, 3199 | "license": "ISC" 3200 | }, 3201 | "node_modules/yaml": { 3202 | "version": "2.7.0", 3203 | "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.7.0.tgz", 3204 | "integrity": "sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==", 3205 | "dev": true, 3206 | "license": "ISC", 3207 | "bin": { 3208 | "yaml": "bin.mjs" 3209 | }, 3210 | "engines": { 3211 | "node": ">= 14" 3212 | } 3213 | } 3214 | } 3215 | } 3216 | -------------------------------------------------------------------------------- /webview-ui/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "hello-world", 3 | "version": "0.0.1", 4 | "private": true, 5 | "scripts": { 6 | "start": "vite", 7 | "build": "tsc && vite build", 8 | "preview": "vite preview" 9 | }, 10 | "dependencies": { 11 | "fast-xml-parser": "^4.3.2", 12 | "react": "^17.0.2", 13 | "react-dom": "^17.0.2", 14 | "react-hot-toast": "^2.4.1", 15 | "react-icons": "^4.12.0" 16 | }, 17 | "devDependencies": { 18 | "@types/react": "^17.0.33", 19 | "@types/react-dom": "^17.0.10", 20 | "@types/vscode-webview": "^1.57.0", 21 | "@vitejs/plugin-react": "^1.0.7", 22 | "autoprefixer": "^10.4.16", 23 | "postcss": "^8.4.32", 24 | "tailwindcss": "^3.3.6", 25 | "typescript": "^4.4.4", 26 | "vite": "^6.1.0" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /webview-ui/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /webview-ui/src/App.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | main { 6 | display: flex; 7 | flex-direction: column; 8 | justify-content: center; 9 | align-items: flex-start; 10 | height: 100%; 11 | } 12 | 13 | .tooltip { 14 | position: relative; 15 | display: inline-block; 16 | } 17 | 18 | .tooltip .tooltiptext { 19 | visibility: hidden; 20 | width: fit-content; 21 | padding: 5px; 22 | background-color: #555; 23 | color: #fff; 24 | text-align: center; 25 | border-radius: 6px; 26 | padding: 5px 0; 27 | position: absolute; 28 | z-index: 1; 29 | bottom: 125%; 30 | left: 50%; 31 | margin-left: -60px; 32 | opacity: 0; 33 | transition: opacity 0.3s; 34 | } 35 | 36 | .tooltip .tooltiptext::after { 37 | content: ""; 38 | position: absolute; 39 | top: 100%; 40 | left: 50%; 41 | margin-left: -5px; 42 | border-width: 5px; 43 | border-style: solid; 44 | border-color: #555 transparent transparent transparent; 45 | } 46 | 47 | .tooltip:hover .tooltiptext { 48 | visibility: visible; 49 | opacity: 1; 50 | } 51 | 52 | .scripts-scrollbar::-webkit-scrollbar { 53 | width: 12px; 54 | } 55 | 56 | .scripts-scrollbar::-webkit-scrollbar-track { 57 | background: #1F2937; 58 | } 59 | 60 | .scripts-scrollbar::-webkit-scrollbar-thumb { 61 | background-color: #71717a; 62 | border-radius: 9999px; 63 | } 64 | -------------------------------------------------------------------------------- /webview-ui/src/App.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from 'react'; 2 | import "./App.css"; 3 | import MainView from './Components/MainView'; 4 | import Footer from './Components/Footer'; 5 | import ErrorBoundary from './Components/ErrorBoundary'; 6 | import { Toaster } from 'react-hot-toast'; 7 | 8 | function App() { 9 | 10 | const [inputFile, setInputFile] = useState(''); 11 | const handleMessage = (event: MessageEvent) => { 12 | const message = event.data; 13 | switch (message.command) { 14 | case 'sendData': 15 | setInputFile(message.data); 16 | break; 17 | } 18 | }; 19 | 20 | useEffect(() => { 21 | window.addEventListener('message', handleMessage); 22 | 23 | return () => { 24 | window.removeEventListener('message', handleMessage); 25 | }; 26 | }, []); 27 | 28 | return ( 29 |
30 | 31 | 32 | 33 |
34 | 35 |
36 | ); 37 | } 38 | 39 | export default App; -------------------------------------------------------------------------------- /webview-ui/src/Components/CPEView.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const CPEView = (props : {cpe: string}) => { 4 | return ( 5 |
6 |

CPE

7 |

{props.cpe}

8 |
9 | ); 10 | }; 11 | 12 | export default CPEView; -------------------------------------------------------------------------------- /webview-ui/src/Components/ErrorBoundary.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | 4 | interface ErrorBoundaryState { 5 | hasError: boolean; 6 | errorMessage?: string; 7 | } 8 | 9 | interface ErrorBoundaryProps { 10 | } 11 | 12 | class ErrorBoundary extends React.Component { 13 | constructor(props: ErrorBoundaryProps) { 14 | super(props); 15 | this.state = { hasError: false }; 16 | } 17 | 18 | componentDidCatch(error: Error, errorInfo: React.ErrorInfo) { 19 | this.setState({ hasError: true, errorMessage: error.message }); 20 | } 21 | 22 | render() { 23 | if (this.state.hasError) { 24 | 25 | return (
26 | 27 |

Oops! Something went wrong. :(

28 |

The following error occured.

29 |

{this.state.errorMessage}

30 |

Please consider reporting this issue on our GitHub page to help improve nmap-peek.

31 | 32 |
); 33 | } 34 | 35 | return this.props.children; 36 | } 37 | } 38 | 39 | export default ErrorBoundary; 40 | -------------------------------------------------------------------------------- /webview-ui/src/Components/FPView.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | 3 | const FPView = (props: { fp: string }) => { 4 | 5 | const fptext = props.fp.split(":", 2)[1] + props.fp.substring(props.fp.indexOf(":") + 1); 6 | 7 | 8 | return ( 9 |
10 |

Fingerprinting

11 |
12 |
13 |

{sanitizeAndFormat(fptext)}

14 |
15 |
16 |
17 | ); 18 | }; 19 | 20 | const sanitizeAndFormat = (input: string): string => { 21 | 22 | const decodeXML = (text: string): string => { 23 | const parser = new DOMParser(); 24 | const doc = parser.parseFromString(text, "text/html"); 25 | return doc.documentElement.textContent || ""; 26 | }; 27 | 28 | const decoded = decodeXML(input); 29 | 30 | // Escape HTML to prevent XSS 31 | const escapeHTML = (text: string): string => 32 | text.replace(/[&<>"']/g, (char) => 33 | ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" }[char] || char) 34 | ); 35 | 36 | const sanitized = escapeHTML(decoded); 37 | 38 | // Replace % with new lines for readability 39 | let formatted = sanitized.replace(/%/g, "\n"); 40 | 41 | // Replace escaped spaces (\x20) with actual spaces 42 | formatted = formatted.replace(/\\x20/g, " "); 43 | 44 | // Ensure proper line breaks around common delimiters like `\r\n` 45 | formatted = formatted.replace(/\\r\\n/g, "\n"); 46 | 47 | return formatted; 48 | }; 49 | 50 | export default FPView; 51 | -------------------------------------------------------------------------------- /webview-ui/src/Components/Footer.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const Footer = () => { 4 | return ( 5 |
6 |

For bugs and feature requests please raise an issue on Github.

7 |
8 | ); 9 | }; 10 | 11 | export default Footer; -------------------------------------------------------------------------------- /webview-ui/src/Components/HostsView.tsx: -------------------------------------------------------------------------------- 1 | import React, { useEffect, useState } from 'react'; 2 | import { HostType } from '../utilities/types'; 3 | import { filterPort, findOS, generatePortScanInfo, getAddresses, getHostnames, copyToClip } from '../utilities/utils'; 4 | import { VscTriangleUp, VscBlank } from "react-icons/vsc"; 5 | import PortsView from './PortsView'; 6 | import Search from './Search'; 7 | import Tools from './Tools'; 8 | 9 | const HostsView = (props: { hosts: HostType | HostType[] }) => { 10 | 11 | const [allHosts, setAllHosts] = useState([]); 12 | const [filteredHosts, setFilteredHosts] = useState([]); 13 | 14 | useEffect(() => { 15 | const hostsArray = Array.isArray(props.hosts) ? props.hosts : [props.hosts]; 16 | setAllHosts(hostsArray); 17 | setFilteredHosts(hostsArray); 18 | }, [props.hosts]); 19 | 20 | const handleSearch = (searchQuery: string) => { 21 | const lowerCaseQuery = searchQuery.toLowerCase(); 22 | let filter = ""; 23 | let searchvalue = ""; 24 | 25 | if (lowerCaseQuery.includes(":")) { 26 | filter = lowerCaseQuery.split(":")[0].trim(); 27 | searchvalue = lowerCaseQuery.split(":")[1].trim(); 28 | } else { 29 | searchvalue = lowerCaseQuery; 30 | } 31 | 32 | const filtered = allHosts 33 | .map((host) => { 34 | let addresses = Array.isArray(host.address) ? host.address : [host.address]; 35 | const ipMatch = addresses.some((address) => address["@_addr"].toLowerCase().includes(searchvalue)); 36 | const hostnameMatch = getHostnames(host.hostnames).toLowerCase().includes(searchvalue); 37 | const status = host.status["@_state"] === searchvalue; 38 | 39 | if (filter === "pnumber") { 40 | const filteredPorts = host.ports?.port?.filter((port) => port["@_portid"] === searchvalue) || []; 41 | 42 | if (filteredPorts.length === 0) { 43 | return null; 44 | } 45 | 46 | return { 47 | ...host, 48 | ports: { port: filteredPorts } 49 | }; 50 | } 51 | 52 | if (filter === "host") { 53 | return ipMatch || hostnameMatch ? host : null; 54 | } 55 | 56 | if (filter === "status") { 57 | return status ? host : null; 58 | } 59 | 60 | const port = filterPort(host.ports, searchvalue, filter); 61 | return ipMatch || hostnameMatch || port || status ? host : null; 62 | }) 63 | .filter((host) => host !== null); // Remove null values 64 | 65 | setFilteredHosts(filtered as HostType[]); 66 | }; 67 | 68 | 69 | return ( 70 |
71 | 72 | 73 | 74 | {filteredHosts.map((hostItem, index) => ( 75 | 76 | ))} 77 |
78 | ); 79 | }; 80 | 81 | export default HostsView; 82 | 83 | const HostView = (props: { host: HostType }) => { 84 | 85 | const [expanded, setExpanded] = useState(false); 86 | 87 | const toggleExpanded = () => { 88 | setExpanded(!expanded); 89 | }; 90 | 91 | const addresses = Array.isArray(props.host.address) ? props.host.address : [props.host.address]; 92 | 93 | const parsedAddress = getAddresses(addresses); 94 | const portsData = props.host.ports ? props.host.ports.port : []; 95 | 96 | const ip = parsedAddress.ipv4; 97 | const ipv6 = parsedAddress.ipv6; 98 | const mac = parsedAddress.mac; 99 | const statusClasses = props.host.status['@_state'] === 'up' ? 'text-green-500 active:text-green-400' : 'text-red-500 active:text-red-400'; 100 | const hostnames = getHostnames(props.host.hostnames); 101 | 102 | const ports = generatePortScanInfo(props.host.ports); 103 | const openCount = ports.filter(item => item.state === "open").length; 104 | const os: { vendor: string, family: string } = findOS(props.host); 105 | 106 | const arrowClasses = expanded ? `rotate-0` : `rotate-180`; 107 | const arrowImageHover = ports.length !== 0 ? 'hover:cursor-pointer' : ''; 108 | 109 | return ( 110 |
111 |
112 |
113 |

copyToClip(ip)}>{ip}

114 | {hostnames !== "" &&

({hostnames})

} 115 |
116 |
117 |
118 | {ports.length !== 0 ? : } 119 |
120 |
121 |

OSOperating System

122 |

{os.vendor} {os.family}

123 |
124 |
125 |

IPSupported Address

126 | {ip !== "" && } 127 | {ipv6 !== "" && } 128 | {mac !== "" && } 129 |
130 |
131 |

OPOpen Ports

132 |

{openCount}

133 |
134 |
135 |
136 |
137 | {expanded && } 138 |
139 | 140 |
141 | ); 142 | }; 143 | 144 | 145 | const ItemView = (props: { title: string, value: string, titleTooltip: string }) => { 146 | return ( 147 |
148 |

{props.value}{props.titleTooltip !== "" && {props.titleTooltip}}

149 |
150 | ); 151 | }; -------------------------------------------------------------------------------- /webview-ui/src/Components/MainView.tsx: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ScanInfo from './ScanInfo'; 3 | import HostsView from './HostsView'; 4 | import { parseNmapScan } from '../utilities/utils'; 5 | import Tools from './Tools'; 6 | 7 | const MainView = (props: { nmapScan: string }) => { 8 | 9 | const parsedNmap = parseNmapScan(props.nmapScan); 10 | 11 | return ( 12 |
13 | {parsedNmap?.nmaprun?.scaninfo && } 14 | {parsedNmap?.nmaprun?.host && } 15 | 16 |
17 | ); 18 | }; 19 | 20 | export default MainView; -------------------------------------------------------------------------------- /webview-ui/src/Components/PortsView.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import { PortType } from '../utilities/types'; 3 | import { getCPE, getScripts } from '../utilities/utils'; 4 | import { VscCircleLargeFilled } from "react-icons/vsc"; 5 | import ScriptsView from './ScriptsView'; 6 | import CPEView from './CPEView'; 7 | import FPView from './FPView'; 8 | 9 | const PortsView = (props: { scanPorts: PortType[], host: string }) => { 10 | 11 | const portsArray = Array.isArray(props.scanPorts) ? props.scanPorts : [props.scanPorts]; 12 | 13 | const ports = portsArray.map((port, index) => 14 | 15 | ); 16 | 17 | return ( 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | {ports} 32 | 33 |
PortScriptsServiceVersionProduct
34 | 35 |
36 | ); 37 | }; 38 | 39 | export default PortsView; 40 | 41 | 42 | const PortView = (props: { scanPort: PortType }) => { 43 | 44 | if (props.scanPort === undefined) { 45 | return (<>); 46 | }; 47 | 48 | const [expandedScript, setExpandedScript] = useState(false); 49 | const [expandedCPE, setExpandedCPE] = useState(false); 50 | const [expandedFP, setExpandedFP] = useState(false); 51 | 52 | const toggleExpandedScript = () => { 53 | setExpandedScript(!expandedScript); 54 | setExpandedCPE(false); 55 | setExpandedFP(false); 56 | }; 57 | 58 | const toggleExpandedCPE = () => { 59 | setExpandedCPE(!expandedCPE); 60 | setExpandedScript(false); 61 | setExpandedFP(false); 62 | }; 63 | 64 | const toggleExpandedFP = () => { 65 | setExpandedFP(!expandedFP); 66 | setExpandedCPE(false); 67 | setExpandedScript(false); 68 | }; 69 | 70 | const state = props.scanPort?.state?.["@_state"] ?? ''; 71 | const serviceName = props.scanPort?.service?.['@_name'] ?? ''; 72 | const serviceOSType = props.scanPort?.service?.['@_ostype'] ?? ''; 73 | const serviceProduct = props.scanPort?.service?.['@_product'] ?? ''; 74 | const serviceVersion = props.scanPort?.service?.['@_version'] ?? ''; 75 | const serviceFP = props.scanPort?.service?.['@_servicefp'] ?? ''; 76 | const serviceCPE = props.scanPort?.service?.cpe ? getCPE(props.scanPort.service.cpe) : ''; 77 | const protocol = props.scanPort?.["@_protocol"] ?? ''; 78 | const portId = props.scanPort?.["@_portid"] ?? ''; 79 | const script = props.scanPort?.script ? getScripts(props.scanPort.script) : ''; 80 | 81 | 82 | const stateIcon = state === 'open' ? 'fill-green-500' : state === 'closed' ? 'fill-red-500' : 'fill-yellow-500'; 83 | const stateScript = expandedScript === true ? 'text-green-500' : 'text-white'; 84 | const stateCPE = expandedCPE === true ? 'text-green-500' : 'text-white'; 85 | const stateFP = expandedFP === true ? 'text-green-500' : 'text-white'; 86 | 87 | return ( 88 | <> 89 | 90 | 91 |

{portId}

92 | 93 |
94 | {script !== '' ?

S

:

N

} 95 | {serviceCPE !== '' ?

C

:

N

} 96 | {serviceFP !== '' ?

F

:

N

} 97 |
98 | 99 |

{serviceName}

100 |

{serviceVersion}

101 |

{serviceProduct}

102 | 103 | 104 | {expandedScript && script !== '' && ( 105 | 106 | 107 | 108 | 109 | 110 | )} 111 | {expandedCPE && serviceCPE !== '' && ( 112 | 113 | 114 | 115 | 116 | 117 | )} 118 | {expandedFP && serviceFP !== '' && ( 119 | 120 | 121 | 122 | 123 | 124 | )} 125 | 126 | ); 127 | }; 128 | -------------------------------------------------------------------------------- /webview-ui/src/Components/ScanInfo.tsx: -------------------------------------------------------------------------------- 1 | import { VscSymbolKeyword, VscLink, VscSparkle } from 'react-icons/vsc'; 2 | import { ScanInfoType } from '../utilities/types'; 3 | import { useState } from 'react'; 4 | 5 | const ScanInfo = (props: { scanInfo: ScanInfoType }) => { 6 | 7 | const type = props.scanInfo['@_type'] ? props.scanInfo['@_type'] : '-'; 8 | const protocol = props.scanInfo['@_protocol'] ? props.scanInfo['@_protocol'] : '-'; 9 | const ports = props.scanInfo['@_numservices'] ? props.scanInfo['@_numservices'] : '-'; 10 | 11 | const [visible, setVisible] = useState(false); 12 | 13 | const toggleVisible = () => { 14 | setVisible(prevVisible => !prevVisible); 15 | }; 16 | 17 | return ( 18 |
19 |
20 |
21 |

TypeScan Type

22 |

{type.toUpperCase()}

23 |
24 |
25 |

ProtocolScan Protocol

26 |

{protocol.toUpperCase()}

27 |
28 |
29 |

ScannedScanned Ports

30 |

{ports.toUpperCase()}

31 |
32 |
33 |
34 | ); 35 | }; 36 | 37 | export default ScanInfo; -------------------------------------------------------------------------------- /webview-ui/src/Components/ScriptsView.tsx: -------------------------------------------------------------------------------- 1 | import { PortScriptType } from '../utilities/types'; 2 | 3 | const ScriptsView = (props: { scripts: PortScriptType | PortScriptType[], port: string }) => { 4 | 5 | let scriptsArray: { "@_id": string, "@_output": string }[] = []; 6 | 7 | if (!Array.isArray(props.scripts)) { 8 | scriptsArray.push(props.scripts); 9 | } else { 10 | scriptsArray = props.scripts; 11 | } 12 | 13 | const scriptsView = scriptsArray.map((script, index) => ( 14 | 15 | )); 16 | 17 | return ( 18 |
19 |

Scripts

20 |
21 |
22 | {scriptsView} 23 |
24 | 25 |
26 |
27 | ); 28 | }; 29 | 30 | const ScriptView = (props: { script: PortScriptType }) => { 31 | 32 | const scriptLines = props.script['@_output'].split(" "); 33 | 34 | return ( 35 |
36 |

{props.script['@_id']}:

37 |
38 | {scriptLines.map((line, index) => ( 39 |

{line}

40 | ))} 41 | 42 |
43 |
44 | ); 45 | }; 46 | 47 | 48 | export default ScriptsView; -------------------------------------------------------------------------------- /webview-ui/src/Components/Search.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from 'react'; 2 | import { VscSearch, VscInfo } from "react-icons/vsc"; 3 | 4 | interface SearchProps { 5 | onSearch: (query: string) => void; 6 | } 7 | 8 | const Search = ({ onSearch }: SearchProps) => { 9 | 10 | const [visible, setVisible] = useState(false); 11 | 12 | const handleInputChange = (event: React.ChangeEvent) => { 13 | onSearch(event.target.value); 14 | }; 15 | 16 | const toggleVisible = () => { 17 | setVisible(prevVisible => !prevVisible); 18 | }; 19 | 20 | return ( 21 |
22 |
23 |
24 | 25 | 29 |
30 |
31 | 32 |
33 |
34 | 35 | 36 | {visible &&
37 |

Search Filters

38 |
39 |
40 |

The default search is matching for strings in every part of the nmap scan

41 |

By using the filter:search term it filters on the service section.

42 |

When you have a filter enabled, you can export only those services filtered.

43 |

Now the pnumber filter, shows only the matching port.

44 |
45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 |
FilterFieldsMatch
hostIP and Hostname: ex. 1.1.1.1 test.hostnamePartial
statusHost Status: up or downExact
statePort status: ex. open, closed, filtered. Partial
pnumberPort number: ex. 22, 445. Exact
snameService Name: ex. http, smtp, rdp. Partial
portEverything about ports: ex. rpcbind, PostgreSQL DB, v3.2Partial
scriptScript output information: ex. Supported Methods, ApachePartial
93 | 94 |
95 |
} 96 |
97 | ); 98 | }; 99 | 100 | export default Search; 101 | -------------------------------------------------------------------------------- /webview-ui/src/Components/Tools.tsx: -------------------------------------------------------------------------------- 1 | import React, { useState } from "react"; 2 | import { copyToClip, extractURLs, getAddresses, getCPE, getHostnames, getHostPorts, getScripts } from "../utilities/utils"; 3 | import { VscCopy, VscLink, VscSymbolKeyword, VscJson, VscTable, VscSettingsGear } from "react-icons/vsc"; 4 | import { HostType, PortScriptType } from "../utilities/types"; 5 | 6 | const Tools = (props: { filteredHosts: HostType[] }) => { 7 | const [selectedTool, setSelectedTool] = useState(null); 8 | const [settingsVisible, setSettingsVisible] = useState(false); 9 | const [text, setText] = useState(""); 10 | const [selectedFields, setSelectedFields] = useState>({ 11 | host: true, 12 | status: true, 13 | address: true, 14 | hostname: true, 15 | portID: true, 16 | state: true, 17 | service_name: true, 18 | service_product: true, 19 | service_version: true 20 | }); 21 | 22 | const toggleField = (field: string) => { 23 | setSelectedFields(prev => ({ ...prev, [field]: !prev[field] })); 24 | }; 25 | 26 | const handleSelection = (tool: string, action: () => void) => { 27 | setSelectedTool((prev) => (prev === tool ? null : tool)); 28 | action(); 29 | }; 30 | 31 | const getUrls = () => { 32 | const nmapString = JSON.stringify(props.filteredHosts); 33 | const extractedUrls = extractURLs(nmapString.replaceAll(" ","\n")); 34 | setText(extractedUrls ? extractedUrls.join("\n") : "No URLs extracted"); 35 | }; 36 | 37 | const extractHostPort = () => { 38 | const hostPortText = getHostPorts(props.filteredHosts); 39 | setText(hostPortText.join("\n")); 40 | }; 41 | 42 | const exportAsJson = () => { 43 | const filteredData = props.filteredHosts.map(host => { 44 | const filteredHost: any = {}; 45 | 46 | Object.keys(selectedFields).forEach(field => { 47 | if (selectedFields[field as keyof typeof selectedFields]) { 48 | switch (field) { 49 | case "hostname": 50 | filteredHost[field] = getHostnames(host.hostnames); 51 | break; 52 | case "status": 53 | filteredHost[field] = host.status["@_state"]; 54 | break; 55 | case "address": 56 | const addresses = getAddresses(host.address); 57 | filteredHost[field] = Object.values(addresses) 58 | .filter(value => value !== "") 59 | .join(","); 60 | break; 61 | default: 62 | filteredHost[field] = (host as any)[field]; 63 | } 64 | } 65 | }); 66 | 67 | if (host.ports && host.ports.port) { 68 | const portsArray = Array.isArray(host.ports.port) ? host.ports.port : [host.ports.port]; 69 | filteredHost.ports = portsArray.map(port => { 70 | const portData: any = {}; 71 | 72 | // Apply selectedFields filter to port data 73 | Object.keys(selectedFields).forEach(field => { 74 | if (selectedFields[field as keyof typeof selectedFields]) { 75 | switch (field) { 76 | case "portID": 77 | portData.portID = port["@_portid"]; 78 | break; 79 | case "state": 80 | portData.state = port.state["@_state"]; 81 | break; 82 | case "service_name": 83 | if (port.service) { 84 | portData.service = portData.service || {}; // Initialize if needed 85 | portData.service.name = port.service["@_name"] ?? ""; 86 | } 87 | break; 88 | case "service_product": 89 | if (port.service) { 90 | portData.service = portData.service || {}; 91 | portData.service.product = port.service["@_product"] ?? ""; 92 | } 93 | break; 94 | case "service_version": 95 | if (port.service) { 96 | portData.service = portData.service || {}; 97 | portData.service.version = port.service["@_version"] ?? ""; 98 | } 99 | break; 100 | 101 | } 102 | } 103 | }); 104 | return portData; 105 | }); 106 | } 107 | 108 | return filteredHost; 109 | }); 110 | 111 | setText(JSON.stringify(filteredData, null, 2)); 112 | }; 113 | 114 | 115 | const exportAsCSV = () => { 116 | const fields = Object.keys(selectedFields).filter(field => selectedFields[field as keyof typeof selectedFields]); 117 | const csvRows = [fields.join(",")]; 118 | 119 | props.filteredHosts.forEach(host => { 120 | const addresses = Array.isArray(host.address) ? host.address : [host.address]; // Normalize addresses 121 | const portsArray = host.ports && host.ports.port ? (Array.isArray(host.ports.port) ? host.ports.port : [host.ports.port]) : []; // Normalize ports 122 | 123 | if (portsArray.length > 0) { // Check if there are any ports 124 | portsArray.forEach(port => { 125 | const row = fields.map(field => { 126 | let value; 127 | 128 | switch (field) { // Use a switch for cleaner code 129 | case "address": 130 | const address = getAddresses(host.address); 131 | value = Object.values(address) 132 | .filter(value => value !== "") 133 | .join(" "); 134 | break; 135 | case "status": 136 | value = host.status["@_state"]; 137 | break; 138 | case "hostname": 139 | value = getHostnames(host.hostnames).replaceAll(","," "); 140 | break; 141 | case "portID": 142 | value = port["@_portid"]; 143 | break; 144 | case "state": 145 | value = port.state["@_state"]; 146 | break; 147 | case "service_name": 148 | value = port.service ? port.service["@_name"] : ""; 149 | break; 150 | case "service_product": 151 | value = port.service ? port.service["@_product"] : ""; 152 | break; 153 | case "service_version": 154 | value = port.service ? port.service["@_version"] : ""; 155 | break; 156 | case "host": 157 | value = addresses.length > 0 ? addresses[0]["@_addr"] : ""; 158 | break; 159 | default: 160 | value = ""; 161 | } 162 | return value ?? ""; 163 | }).join(","); 164 | csvRows.push(row); 165 | }); 166 | } else { // Handle hosts without ports 167 | const row = fields.map(field => { 168 | let value; 169 | switch (field) { 170 | case "address": 171 | const address = getAddresses(host.address); 172 | value = Object.values(address) 173 | .filter(value => value !== "") 174 | .join(" "); 175 | break; 176 | case "host": 177 | value = addresses.length > 0 ? addresses[0]["@_addr"] : ""; 178 | break; 179 | 180 | case "status": 181 | value = host.status["@_state"]; 182 | break; 183 | case "hostname": 184 | value = getHostnames(host.hostnames).replaceAll(","," "); 185 | break; 186 | default: 187 | value = (host as any)[field] ?? ""; 188 | } 189 | return value ?? ""; 190 | }).join(","); 191 | csvRows.push(row); 192 | } 193 | }); 194 | 195 | setText(csvRows.join("\n")); 196 | }; 197 | 198 | const getButtonClass = (tool: string) => 199 | `flex flex-row items-center p-2 m-2 rounded hover:bg-gray-700 hover:cursor-pointer hover:text-gray-200 ${ 200 | selectedTool === tool ? "bg-green-500 text-white" : "bg-gray-800 text-gray-400" 201 | }`; 202 | 203 | 204 | const showSettings = () => { 205 | setSettingsVisible(!settingsVisible); 206 | }; 207 | 208 | return ( 209 |
210 |
211 |
212 |

Extract

213 | 214 |
handleSelection("urls", getUrls)}> 215 | 216 |

URLs

217 |
218 | 219 |
handleSelection("hostPort", extractHostPort)}> 220 | 221 |

host:port

222 |
223 | 224 |
225 | 226 |
227 |

Export

228 | 229 |
handleSelection("json", exportAsJson)}> 230 | 231 |

JSON

232 |
233 | 234 |
handleSelection("csv", exportAsCSV)}> 235 | 236 |

CSV

237 |
238 | 239 |
handleSelection("settings", showSettings)}> 240 | 241 |
242 |
243 |
244 |
245 | 246 | {selectedTool && ( 247 |
248 |
249 |

Extracted

250 |
copyToClip(text)}> 252 | 253 |

COPY

254 |
255 |
256 | 257 |
258 |

{text}

259 |
260 |
261 | )} 262 | 263 | {settingsVisible && ( 264 |
265 |

Export Options

266 |
267 |

Host

268 |
269 |
270 | toggleField("status")} /> 271 |

Status

272 |
273 |
274 | toggleField("address")} /> 275 |

Address

276 |
277 |
278 | toggleField("hostname")} /> 279 |

Hostname

280 |
281 |
282 |
283 | 284 |
285 |

Post

286 |
287 |
288 | toggleField("portID")} /> 289 |

PortID

290 |
291 |
292 | toggleField("state")} /> 293 |

State

294 |
295 |
296 | toggleField("service_name")} /> 297 |

Service Name

298 |
299 |
300 | toggleField("service_product")} /> 301 |

Service Product

302 |
303 |
304 | toggleField("service_version")} /> 305 |

Service Version

306 |
307 |
308 |
309 | 310 |
311 | )} 312 |
313 | ); 314 | }; 315 | 316 | export default Tools; 317 | -------------------------------------------------------------------------------- /webview-ui/src/index.tsx: -------------------------------------------------------------------------------- 1 | import React from "react"; 2 | import ReactDOM from "react-dom"; 3 | import App from "./App"; 4 | 5 | ReactDOM.render( 6 | 7 | 8 | , 9 | document.getElementById("root") 10 | ); 11 | -------------------------------------------------------------------------------- /webview-ui/src/utilities/types.ts: -------------------------------------------------------------------------------- 1 | /* eslint-disable @typescript-eslint/naming-convention */ 2 | export type NmapRunType = { 3 | "nmaprun": { 4 | "scaninfo": ScanInfoType; 5 | "host": HostType | HostType[]; 6 | } 7 | }; 8 | 9 | export type ScanInfoType = { 10 | "@_type": string; 11 | "@_protocol": string; 12 | "@_numservices": string; 13 | "@_services":string; 14 | }; 15 | 16 | export type HostType = { 17 | "status": HostStatusType; 18 | "address": HostAddressType | HostAddressType[]; 19 | "hostnames": HostnameType | HostnameType[] | string; 20 | "ports": PortsType; 21 | "os"?: OSType; 22 | }; 23 | 24 | export type OSType = { 25 | "osmatch": OSMatchType[] 26 | }; 27 | 28 | export type OSMatchType = { 29 | "osclass": OSClass; 30 | }; 31 | 32 | export type OSClass = { 33 | "@_vendor": string; 34 | "@_osfamily": string; 35 | }; 36 | 37 | export type HostStatusType = { 38 | "@_state": string; 39 | "@_reason": string; 40 | "@_reason_ttl": string; 41 | }; 42 | 43 | export type HostAddressType = { 44 | "@_addr": string; 45 | "@_addrtype": string; 46 | }; 47 | 48 | export type HostnameType = { 49 | [x: string]: any; 50 | "@_name": string; 51 | "@_type": string; 52 | }; 53 | 54 | export type PortsType = { 55 | "port" : PortType[]; 56 | }; 57 | 58 | export type PortType = { 59 | "state": { 60 | "@_state": string; 61 | "@_reason": string; 62 | "@_reason_ttl": string; 63 | }; 64 | "service"?: PortServiceType; 65 | "script"?: PortScriptType[]; 66 | "@_protocol": string; 67 | "@_portid": string; 68 | }; 69 | 70 | export type PortServiceType = { 71 | "cpe": string | string[]; 72 | "@_name": string; 73 | "@_product": string; 74 | "@_version": string; 75 | "@_extrainfo": string; 76 | "@_ostype": string; 77 | "@_servicefp": string; 78 | }; 79 | 80 | export type PortScriptType = { 81 | "@_id": string; 82 | "@_output": string; 83 | }; -------------------------------------------------------------------------------- /webview-ui/src/utilities/utils.ts: -------------------------------------------------------------------------------- 1 | import { XMLParser } from "fast-xml-parser"; 2 | import toast from "react-hot-toast"; 3 | import { HostAddressType, HostType, HostnameType, NmapRunType, PortScriptType, PortType, PortsType, ScanInfoType } from "./types"; 4 | 5 | /** 6 | * Returns the parsed XML content to itterate on each host 7 | * @param nmapScan - string with the XML of nmap 8 | * @returns - parsed Object of Nmap | null 9 | */ 10 | export const parseNmapScan = (nmapScan: string): NmapRunType | null => { 11 | const parsingOptions = { 12 | ignoreAttributes: false, 13 | ignoreNameSpace: false 14 | }; 15 | const xmlParser = new XMLParser(parsingOptions); 16 | try { 17 | const parsedContent: NmapRunType = xmlParser.parse(nmapScan); 18 | return parsedContent; 19 | } catch (error) { 20 | return null; 21 | } 22 | }; 23 | 24 | 25 | /** 26 | * Returns values for ipv4, ipv6 and mac address 27 | * @param scanAddresses - Array of addresses and assigs each to it's category 28 | * @returns - returns values for each ipv4, ipv6 and mac address 29 | */ 30 | export const getAddresses = (scanAddresses: HostAddressType[] | HostAddressType) => { 31 | 32 | if (!Array.isArray(scanAddresses)) { 33 | scanAddresses = [scanAddresses]; 34 | } 35 | 36 | let ipv4 = ""; 37 | let mac = ""; 38 | let ipv6 = ""; 39 | 40 | scanAddresses.forEach((address) => { 41 | if (address["@_addrtype"] === 'mac') { 42 | mac = address["@_addr"]; 43 | } else if (address["@_addrtype"] === 'ipv4') { 44 | ipv4 = address["@_addr"]; 45 | } else if (address["@_addrtype"] === 'ipv6') { 46 | ipv6 = address["@_addr"]; 47 | } 48 | }); 49 | 50 | return { ipv4: ipv4, ipv6: ipv6, mac: mac }; 51 | }; 52 | 53 | 54 | /** 55 | * Returns all the hostnames in form of a single string 56 | * @param scanHostnames - hostnames field of nmap. Can have some or even be empty 57 | * @returns {string} - list of hosts 58 | */ 59 | export const getHostnames = (scanHostnames: any): string => { 60 | let hostnames: string[] = []; 61 | 62 | if (!Array.isArray(scanHostnames)) { 63 | hostnames = [scanHostnames]; 64 | } else { 65 | hostnames = scanHostnames; 66 | } 67 | 68 | let hostnamesList = new Set(); 69 | hostnames.forEach((hostname: any) => { 70 | if (typeof (hostname) === 'string') { 71 | hostnamesList.add(hostname); 72 | } else { 73 | // Check if hostname and its property exist before accessing '@_name' 74 | if (hostname && hostname.hostname) { 75 | if (typeof hostname.hostname === 'string') { 76 | hostnamesList.add(hostname.hostname); 77 | } else if (hostname.hostname['@_name']) { 78 | hostnamesList.add(hostname.hostname['@_name']); 79 | } 80 | 81 | if (Array.isArray(hostname.hostname)) { 82 | let hostnamesSet = new Set(); 83 | hostname.hostname.forEach((hostnameItem: HostnameType) => { 84 | if (hostnameItem && hostnameItem['@_name']) { 85 | hostnamesSet.add(hostnameItem['@_name']); 86 | } 87 | }); 88 | 89 | let hostnamesArray = Array.from(hostnamesSet); 90 | if (hostnamesArray.length === 1) { 91 | hostnamesList.add(hostnamesArray[0]); 92 | } else { 93 | hostnamesList.add(hostnamesArray.join(', ')); 94 | } 95 | } 96 | } else { 97 | console.log('Invalid hostname format:', hostname); 98 | } 99 | } 100 | }); 101 | 102 | const uniqueHostnamesList = [...new Set(hostnamesList)]; 103 | return uniqueHostnamesList.join(', '); 104 | }; 105 | 106 | 107 | 108 | /** 109 | * Returns the nuymber of ports and the ports of each host 110 | * @param scanPorts - Takes the ports field from the nmap scan object 111 | * @returns {{number: string, state: string}[]} - An array with the ports and their state of the scope 112 | */ 113 | export const generatePortScanInfo = (scanPorts: any): {number: string, state: string}[] => { 114 | let ports: {number: string, state: string}[] = []; 115 | 116 | if (scanPorts && scanPorts.port) { 117 | // Many ports are present 118 | if (Array.isArray(scanPorts.port)) { 119 | scanPorts.port.forEach((port: PortType) => { 120 | if (port && port['@_portid']) { 121 | ports.push({number: port['@_portid'], state: port.state["@_state"]}); 122 | } 123 | }); 124 | } else if (typeof scanPorts.port === 'object') { 125 | // There is a single port 126 | if (scanPorts.port['@_portid']) { 127 | ports.push({number: scanPorts.port['@_portid'], state: scanPorts.port.state["@_state"]}); 128 | } 129 | } 130 | } 131 | 132 | return ports; 133 | }; 134 | 135 | /** 136 | * Detects the OS based on the OS tag if it is present. 137 | * @param scanHost - The Host Object 138 | * @returns {vendor: string, family: string} - which shows the vendot and the family of the OS. 139 | */ 140 | export const findOS = (scanHost: HostType): { vendor: string, family: string } => { 141 | const osmatch = scanHost.os && scanHost.os.osmatch ? scanHost.os.osmatch[0] : null; 142 | const osclass = osmatch && osmatch.osclass ? osmatch.osclass : null; 143 | let vendor = osclass && osclass['@_vendor'] ? osclass['@_vendor'] : '?'; 144 | let family = osclass && osclass['@_osfamily'] ? osclass['@_osfamily'] : '?'; 145 | 146 | if (vendor === '?' && family === '?') { 147 | const detectedOS = getOSFromPorts(scanHost.ports); 148 | if (detectedOS !== '') { 149 | vendor = ''; 150 | family = detectedOS; 151 | } 152 | } 153 | 154 | return { vendor, family }; 155 | }; 156 | 157 | /** 158 | * Detectes the OS of the host based on service info 159 | * @param ports - The ports object of the host 160 | * @returns the OS or empty string if nothing was found. 161 | */ 162 | const getOSFromPorts = (ports: PortsType) => { 163 | if (!ports || !ports.port) { 164 | return ''; 165 | } 166 | 167 | const portsArray = Array.isArray(ports.port) ? ports.port : [ports.port]; 168 | 169 | for (const port of portsArray) { 170 | if (port && port.service && port.service["@_ostype"]) { 171 | return port.service["@_ostype"]; 172 | } 173 | } 174 | 175 | return ''; 176 | }; 177 | 178 | 179 | 180 | 181 | /** 182 | * Returns information from the scripts as a single string 183 | * @param scanScript 184 | * @returns {in: string, out: string}[] - Object with in and out of script executions 185 | */ 186 | export const getScripts = (scanScript: PortScriptType[]): PortScriptType[] => { 187 | if (scanScript === undefined) { 188 | return [{ "@_id": "", "@_output": "" }]; 189 | } 190 | let scriptsArray: { "@_id": string, "@_output": string }[] = []; 191 | 192 | if (Array.isArray(scanScript)) { 193 | scanScript.forEach((script: PortScriptType) => { 194 | scriptsArray.push({ "@_id": script["@_id"], "@_output": script["@_output"] }); 195 | }); 196 | } else if (typeof (scanScript) === 'object') { 197 | // there is single script 198 | scriptsArray.push({ "@_id": scanScript["@_id"], "@_output": scanScript["@_output"] }); 199 | } 200 | 201 | return scriptsArray; 202 | }; 203 | 204 | 205 | /** 206 | * Geths the CPE information and returns it in form of a single string 207 | * @param scanCPE 208 | * @returns {string} - String with values from the CPE fields 209 | */ 210 | export const getCPE = (scanCPE: string | string[]): string => { 211 | let cpes: string[] = []; 212 | 213 | if (!Array.isArray(scanCPE)) { 214 | cpes = [scanCPE]; 215 | } else { 216 | cpes = scanCPE; 217 | } 218 | 219 | let cpesList: string[] = []; 220 | cpes.forEach((cpe: any) => { 221 | cpesList.push(cpe); 222 | }); 223 | 224 | const uniqueCpeList = [...new Set(cpesList)]; 225 | return uniqueCpeList.join(', '); 226 | }; 227 | 228 | 229 | export const filterPort = (ports: PortsType, query: string, filter: string): boolean => { 230 | if (!ports || !ports.port) { 231 | return false; 232 | } 233 | 234 | const normalizedPorts = Array.isArray(ports.port) ? ports.port : [ports.port]; 235 | 236 | 237 | const lowerCaseQuery = query.toLowerCase(); 238 | 239 | return normalizedPorts.some(port => { 240 | const state = port?.state?.["@_state"] ?? ''; 241 | const serviceName = port?.service?.['@_name'] ?? ''; 242 | const serviceOSType = port?.service?.['@_ostype'] ?? ''; 243 | const serviceProduct = port?.service?.['@_product'] ?? ''; 244 | const serviceVersion = port?.service?.['@_version'] ?? ''; 245 | const serviceCPE = port?.service?.cpe ? getCPE(port.service.cpe) : ''; 246 | const protocol = port?.["@_protocol"] ?? ''; 247 | const portId = port?.["@_portid"] ?? ''; 248 | const script = port?.script ? getScripts(port.script) : ''; 249 | 250 | switch(filter) { 251 | case "state": 252 | return state.includes(lowerCaseQuery); 253 | 254 | case "pscript": 255 | return scriptContains(script, lowerCaseQuery); 256 | 257 | case "sname": 258 | return serviceName.includes(lowerCaseQuery); 259 | 260 | case "protocol": 261 | return protocol === lowerCaseQuery; 262 | 263 | case "port": 264 | return serviceName.toLowerCase().includes(lowerCaseQuery) || 265 | serviceOSType.toLowerCase().includes(lowerCaseQuery) || 266 | serviceProduct.toLowerCase().includes(lowerCaseQuery) || 267 | serviceVersion.toLowerCase().includes(lowerCaseQuery) || 268 | serviceCPE.toLowerCase().includes(lowerCaseQuery); 269 | 270 | default: 271 | return state.toLowerCase().includes(lowerCaseQuery) || 272 | serviceName.toLowerCase().includes(lowerCaseQuery) || 273 | serviceOSType.toLowerCase().includes(lowerCaseQuery) || 274 | serviceProduct.toLowerCase().includes(lowerCaseQuery) || 275 | serviceVersion.toLowerCase().includes(lowerCaseQuery) || 276 | serviceCPE.toLowerCase().includes(lowerCaseQuery) || 277 | protocol.toLowerCase().includes(lowerCaseQuery) || 278 | portId.toLowerCase().includes(lowerCaseQuery) || 279 | scriptContains(script, lowerCaseQuery); 280 | } 281 | }); 282 | }; 283 | 284 | 285 | export const scriptContains = (scripts: PortScriptType[] | "", query: string) : boolean => { 286 | if (scripts === "") { 287 | return false; 288 | } 289 | 290 | return scripts.some(script => { 291 | return script["@_output"].toLowerCase().includes(query); 292 | }); 293 | }; 294 | 295 | 296 | /** 297 | * Copies the selected text to clipboard 298 | * @param text 299 | */ 300 | export const copyToClip = (text: string) => { 301 | navigator.clipboard.writeText(text); 302 | toast('Copied to clipboard!', 303 | { duration: 700, 304 | position: 'top-right', 305 | icon: '📋', 306 | style: { 307 | borderRadius: '10px', 308 | background: '#333', 309 | color: '#fff', 310 | }, 311 | } 312 | ); 313 | }; 314 | 315 | /** 316 | * Returns the URLs extracted from the XML file 317 | * @param text : the whole XML content 318 | * @returns string[] | null: A list of strings or null if no urls were extracted. 319 | */ 320 | export const extractURLs = (text: string): string[] | null => { 321 | const urlRegex = /(?:https?|ftp):\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/\/=]*)|\b(?:https?|ftp):\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/\/=]*)/g; 322 | const matches = text.match(urlRegex); 323 | return matches ? matches.map(match => match.trim()) : null; 324 | }; 325 | 326 | 327 | /** 328 | * Returns the host:port format for all ports and hosts 329 | * @param hosts : hostType hosts object 330 | * @returns string[]: A list of host port format strings 331 | */ 332 | export const getHostPorts = (hosts: HostType[]): string[] => { 333 | const returnList: string[] = []; 334 | 335 | hosts.forEach(host => { 336 | const addresses = Array.isArray(host.address) ? host.address : [host.address]; 337 | let ports = host.ports?.port; 338 | 339 | if (ports) { 340 | if (!Array.isArray(ports)) { 341 | ports = [ports]; 342 | } 343 | 344 | addresses.forEach(address => { 345 | const ip = address["@_addr"]; 346 | 347 | ports.forEach(port => { 348 | returnList.push(`${ip}:${port["@_portid"]}`); 349 | }); 350 | }); 351 | } 352 | }); 353 | 354 | return returnList; 355 | }; 356 | -------------------------------------------------------------------------------- /webview-ui/src/utilities/vscode.ts: -------------------------------------------------------------------------------- 1 | import type { WebviewApi } from "vscode-webview"; 2 | 3 | /** 4 | * A utility wrapper around the acquireVsCodeApi() function, which enables 5 | * message passing and state management between the webview and extension 6 | * contexts. 7 | * 8 | * This utility also enables webview code to be run in a web browser-based 9 | * dev server by using native web browser features that mock the functionality 10 | * enabled by acquireVsCodeApi. 11 | */ 12 | class VSCodeAPIWrapper { 13 | private readonly vsCodeApi: WebviewApi | undefined; 14 | 15 | constructor() { 16 | // Check if the acquireVsCodeApi function exists in the current development 17 | // context (i.e. VS Code development window or web browser) 18 | if (typeof acquireVsCodeApi === "function") { 19 | this.vsCodeApi = acquireVsCodeApi(); 20 | } 21 | } 22 | 23 | /** 24 | * Post a message (i.e. send arbitrary data) to the owner of the webview. 25 | * 26 | * @remarks When running webview code inside a web browser, postMessage will instead 27 | * log the given message to the console. 28 | * 29 | * @param message Abitrary data (must be JSON serializable) to send to the extension context. 30 | */ 31 | public postMessage(message: unknown) { 32 | if (this.vsCodeApi) { 33 | this.vsCodeApi.postMessage(message); 34 | } else { 35 | console.log(message); 36 | } 37 | } 38 | 39 | /** 40 | * Get the persistent state stored for this webview. 41 | * 42 | * @remarks When running webview source code inside a web browser, getState will retrieve state 43 | * from local storage (https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage). 44 | * 45 | * @return The current state or `undefined` if no state has been set. 46 | */ 47 | public getState(): unknown | undefined { 48 | if (this.vsCodeApi) { 49 | return this.vsCodeApi.getState(); 50 | } else { 51 | const state = localStorage.getItem("vscodeState"); 52 | return state ? JSON.parse(state) : undefined; 53 | } 54 | } 55 | 56 | /** 57 | * Set the persistent state stored for this webview. 58 | * 59 | * @remarks When running webview source code inside a web browser, setState will set the given 60 | * state using local storage (https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage). 61 | * 62 | * @param newState New persisted state. This must be a JSON serializable object. Can be retrieved 63 | * using {@link getState}. 64 | * 65 | * @return The new state. 66 | */ 67 | public setState(newState: T): T { 68 | if (this.vsCodeApi) { 69 | return this.vsCodeApi.setState(newState); 70 | } else { 71 | localStorage.setItem("vscodeState", JSON.stringify(newState)); 72 | return newState; 73 | } 74 | } 75 | } 76 | 77 | // Exports class singleton to prevent multiple invocations of acquireVsCodeApi. 78 | export const vscode = new VSCodeAPIWrapper(); 79 | -------------------------------------------------------------------------------- /webview-ui/src/vite-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | -------------------------------------------------------------------------------- /webview-ui/tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | "./index.html", 5 | "./src/**/*.{js,ts,jsx,tsx}", 6 | ], 7 | theme: { 8 | extend: {}, 9 | }, 10 | plugins: [], 11 | } 12 | 13 | -------------------------------------------------------------------------------- /webview-ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "esnext", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "useDefineForClassFields": true, 6 | "allowJs": false, 7 | "skipLibCheck": true, 8 | "esModuleInterop": false, 9 | "allowSyntheticDefaultImports": true, 10 | "strict": true, 11 | "forceConsistentCasingInFileNames": true, 12 | "module": "esnext", 13 | "moduleResolution": "node", 14 | "resolveJsonModule": true, 15 | "isolatedModules": true, 16 | "noEmit": true, 17 | "jsx": "react-jsx", 18 | }, 19 | "include": ["./src", "../src/types.ts"] 20 | } 21 | -------------------------------------------------------------------------------- /webview-ui/vite.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from "vite"; 2 | import react from "@vitejs/plugin-react"; 3 | 4 | // https://vitejs.dev/config/ 5 | export default defineConfig({ 6 | plugins: [react()], 7 | build: { 8 | outDir: "build", 9 | rollupOptions: { 10 | output: { 11 | entryFileNames: `assets/[name].js`, 12 | chunkFileNames: `assets/[name].js`, 13 | assetFileNames: `assets/[name].[ext]`, 14 | }, 15 | }, 16 | sourcemap: true 17 | }, 18 | }); 19 | --------------------------------------------------------------------------------